WEBVTT

00:00.180 --> 00:02.580
大家好, 欢迎学习本Python教程｡ 

00:02.730 --> 00:08.160
好了, 我们已经用网络类的init函数构建了神经网络的架构, 现在我们要创建第二个函数,

00:08.160 --> 00:12.870
也就是forward函数｡

00:12.870 --> 00:15.630
这就是激活神经元的功能｡ 

00:15.630 --> 00:19.200
也就是说, 它是将执行正向传播的函数｡ 

00:19.710 --> 00:20.730
所以我们开始吧｡ 

00:20.730 --> 00:25.500
让我们把这个函数, 向前调用, 就像我们刚才说的.

00:25.500 --> 00:29.420
这个函数有两个参数｡ 

00:29.430 --> 00:34.830
首先是self, 像往常一样, 你知道, 能够使用对象的变量, 因为我们将使用FC

00:34.830 --> 00:37.250
1和FC 2｡

00:37.260 --> 00:38.640
所以我们需要自我｡ 

00:39.320 --> 00:41.120
能够使用这些变量｡ 

00:41.120 --> 00:46.910
然后我们需要第二个参数, 也就是我们的输入, 我们称之为状态,

00:46.910 --> 00:50.480
因为状态就是我们神经网络的输入｡

00:50.720 --> 00:54.560
这些状态是进入神经网络的输入｡ 

00:54.560 --> 01:00.470
然后作为输出, 我们将有三个可能的动作向左, 直行或向右的提示值｡

01:00.470 --> 01:05.620
但是我们不需要在这里输入它作为参数因为这正是我们想要返回的｡ 

01:05.630 --> 01:11.270
所以这个正向函数不仅会激活神经元, 而且主要会根据这里的输入状态,

01:11.270 --> 01:15.860
返回每个可能动作的提示值｡

01:16.430 --> 01:18.920
这就是我们需要的两个论据｡ 

01:18.920 --> 01:24.020
现在让我们进入函数内部, 指定我们想要它做什么｡ 

01:24.650 --> 01:24.920
好吧, 我会的

01:24.920 --> 01:32.030
所以我们要做的第一件事就是激活隐藏的神经元我们用变量X来命名隐藏的神经元｡

01:32.030 --> 01:34.550
所以X代表隐藏的神经元｡ 

01:34.550 --> 01:36.620
那么我们要如何激活它们呢？

01:36.650 --> 01:39.890
当然, 我们要用输入神经元｡ 

01:39.920 --> 01:45.320
我们将使用第一个全连接FC 1来得到隐藏的神经元, 然后我们将对它们应用一个激活函数,

01:45.320 --> 01:49.430
这将是整流函数｡

01:49.580 --> 01:51.160
那我们要怎么做呢？

01:51.170 --> 01:59.720
还记得我们导入了包含PyTorch中所有函数的torch dot net

01:59.720 --> 02:02.570
dot函数模块来实现神经网络吗？我们给了它一个快捷方式｡

02:02.570 --> 02:08.060
所以我们现在要做的就是, 使用函数模块中的一个函数,

02:08.060 --> 02:11.180
这个函数是真实的.

02:11.180 --> 02:12.290
那么什么是价值呢？

02:12.320 --> 02:16.370
价值就是你们在直觉课上看到的矫正函数｡ 

02:16.370 --> 02:18.950
这只是整流器功能的名称｡ 

02:18.950 --> 02:26.060
但是因为这个函数是从一个函数中取出来的, 这个函数的快捷方式是f, 我们需要在这里输入第一个f点,

02:26.060 --> 02:31.730
然后我们就可以在那里取这个函数｡

02:31.730 --> 02:36.140
实际上如果我输入re, 我们就有了值函数｡ 

02:36.410 --> 02:41.600
这就是整流器的功能, 它会激活隐藏的神经元, 也就是X.

02:41.780 --> 02:46.160
在这个价值函数中, 我们完全理解了我们需要输入什么.

02:46.160 --> 02:50.570
这是我们想要激活的神经元, 也就是隐藏的神经元｡ 

02:50.570 --> 02:54.290
为了得到这些隐藏的神经元, 我们将进行第一次完整的连接｡ 

02:54.290 --> 03:01.430
我们将把它应用到输入神经元上, 从输入神经元到隐藏神经元｡ 

03:01.580 --> 03:03.710
让我们来看看第一个完整的连接｡ 

03:03.710 --> 03:07.970
但是我们的第一个全连接是对象的变量｡ 

03:07.970 --> 03:13.460
因此, 我们需要在这里输入第一个self. FC, 现在开始｡ 

03:13.460 --> 03:16.670
这是我们神经网络的第一次完整连接｡ 

03:16.700 --> 03:24.080
在第一个连接中, 我们要输入我们的输入状态, 从输入神经元到隐藏神经元｡

03:24.170 --> 03:30.530
既然我们给它起了state这个名字, 那么我们必须在这里输入state, 这样就可以了｡ 

03:30.530 --> 03:33.530
我们现在得到了激活的隐藏神经元｡ 

03:34.390 --> 03:34.900
好吧, 我会的

03:34.900 --> 03:40.300
现在我们有了隐藏的神经元, 我们将返回输出神经元｡ 

03:40.420 --> 03:46.180
下一行, 正如你们所理解的, 输出神经元对应于我们的动作｡ 

03:46.180 --> 03:48.060
但这些都不是直接的行动｡ 

03:48.070 --> 03:55.840
这些是Q值, 因为我们正在构建一个深度学习模型, 它结合了一个深度学习模型来保持学习｡

03:55.840 --> 04:00.820
因此我们在这里使用关键学习来得到我们每个动作的Q值｡ 

04:00.820 --> 04:05.770
然后使用软最大值或ARG最大值, 我们将得到最终的操作｡ 

04:06.590 --> 04:11.060
所以这里我将要引入的变量对应于输出神经元｡ 

04:11.060 --> 04:17.360
由于输出神经元是Q值, 我将把这个变量称为Q值｡ 

04:18.030 --> 04:18.710
我们走吧｡ 

04:18.720 --> 04:24.470
因此, 提示值, 现在我们直接取全连接, 也就是变量｡ 

04:24.480 --> 04:26.850
FC, 2, 但是我们的对象的一个变量.

04:26.850 --> 04:28.500
所以我们在这里自我取｡ 

04:28.920 --> 04:34.660
当然, 这里我们输入的是连接左侧的神经元｡ 

04:34.680 --> 04:38.010
这是我们从第一行得到的, 也就是x｡ 

04:38.010 --> 04:40.600
所以X, 我们开始吧｡ 

04:40.620 --> 04:42.510
现在我们得到Q值｡ 

04:42.510 --> 04:45.570
这是我们神经网络的输出神经元｡ 

04:46.800 --> 04:48.700
然后是最后一行代码

04:48.720 --> 04:57.840
当然, 第四个函数是用来返回这些Q值的, 所以我们只需要添加一个return和简单的Q｡

04:58.750 --> 05:03.370
值和, 这将为每个可能的操作返回Q值｡ 

05:03.370 --> 05:05.500
向左走, 直走或向右走｡ 

05:06.240 --> 05:08.280
好吧, 恭喜你｡ 

05:08.280 --> 05:09.990
我们的第一节课结束了｡ 

05:09.990 --> 05:13.440
实际上, 我们已经完成了神经网络的架构｡ 

05:13.470 --> 05:15.390
记住, 这不是一个完成的工作｡ 

05:15.390 --> 05:19.800
通过尝试不同的体系结构, 您始终可以改进神经网络的体系结构｡ 

05:19.800 --> 05:22.710
所以你可以在这里增加更多的神经元｡ 

05:22.710 --> 05:28.020
例如, 如果你想增加50个隐藏的神经元, 你可以用50,

05:28.020 --> 05:30.270
50和50来代替这里的30和这里的30｡

05:30.480 --> 05:34.740
然后你可以通过建立一些新的完整连接来添加更多的隐藏层｡ 

05:34.740 --> 05:37.440
这才是艺术家的工作

05:37.440 --> 05:41.790
对于每种情况下的最佳体系结构, 没有通用的规则｡ 

05:41.790 --> 05:43.620
这就是为什么我们要做实验｡ 

05:43.620 --> 05:45.780
但我们已经试过了｡ 

05:45.780 --> 05:49.530
你会看到我们最终会得到一辆相当不错的自动驾驶汽车｡ 

05:50.010 --> 05:50.520
好吧, 我会的

05:50.520 --> 05:54.570
现在我们要开始下一节课, 关于体验回放.

05:54.570 --> 05:57.420
我们将在接下来的三个教程中介绍｡ 

05:57.420 --> 05:58.620
在那之前, 好好享受吧｡ 

05:58.620 --> 05:59.160
一､ 
