大家好, 欢迎学习本Python教程｡
在本教程中, 我们将迈出实施深度学习模型的第一步｡
所以基本上我们即将实现深度学习算法的整个过程｡
所以我们将使用之前创建的｡
这是神经网络的架构来回放记忆, 将其整合到整个深度学习过程中｡
而整个深度学习算法将适合于一个类｡
这是我们要做的实现人工智能的最后一门课｡
这个类只包含不同的函数｡
因此,
我们将使用init函数来创建和初始化附加到我们未来的深度学习对象的所有变量, 这些对象将代表深度学习模型本身, 并将具有一些其他函数｡
其中之一当然是每次都选择正确的行动｡
我们还将有一个更新函数, 一个得分函数来得到分数, 并了解学习的进展情况｡
如果进展顺利, 如果探索进展顺利,
如果它可以继续进行开发, 那么我们就会有一个保存函数来保存模型, 也就是保存汽车的大脑, 然后最终会有一个加载函数｡
所以我们有几个函数要做｡
我们将为每个教程创建一个函数, 今天我们将像往常一样, 从init函数开始创建类.
但首先我们不要忘了介绍这个类, 所以我们将它命名为D, Q, N表示深Q网络, 然后是一些括号,
冒号, 这是我们的第一个函数｡
让我们这样做def然后在里面加双下划线, 再加双下划线和括号｡
正如你在init函数中所理解的, 我们将引入附加到对象上的变量｡
我们将有几行代码, 它们都是单独启动的,
我们将创建并初始化实现深Q网络所需的所有变量｡
例如, 我们将创建一个网络对象, 因为我们当然需要深层神经网络,
然后我们将需要我们的记忆｡
我们将为内存创建另一个变量｡
所以我们会有另一个变量self那个记忆｡
但这并不是我们要创造的全部｡
一些变量为最后一个状态､ 最后一个区段和最后一个奖励｡
当然, 这就是你在深度学习算法中看到的变量｡
然后呢？
我们还需要一个优化器来执行随机梯度下降,
以便在人工智能出错时, 根据权重对错误的贡献程度来更新权重｡
然后我想这基本上就是我们现在需要创建一个初始化的变量了｡
但是在这个init函数中, 我们将输入几个参数｡
第一, 作为通常的自我, 这是论证所指的我们的对象｡
既然你已经知道了, 我们就创建一个网络类的对象｡
因为网络类在init函数中将input､ size和end操作作为参数｡
这里也一样｡
当创建网络类的对象时, 我们需要在NB操作参数中选择一个输入大小参数｡
因此我们可以复制它们｡
还有｡
在这里面对他们
我们开始吧｡
所以这些论证现在也将成为不同类的一些论证｡
每当我们创建当前类的一些未来对象时, 也就是一些未来的深度学习模型时, 我们需要指定输入大小,
我提醒一下,
这是向量中编码状态的维数, 输入状态, 以及动作的数量, 也就是汽车可以做出的可能动作的数量｡
所以我提醒你, 要么左转, 要么直行, 要么右转｡
好的, 很好｡
然后, 我们将创建一个replay memory类的对象,
以创建内存对象来获取转换的内存｡
在init函数中我们有capacity参数, 但是因为我们只使用它一次,
实际上是在我们创建内存的时候, 而不是在之后的任何地方, 我们不需要指定capacity参数｡
我们可以这样做, 但我们将直接输入我们希望内存具有的转换数｡
但这样我们就少了一个参数, 那就是深度学习模型中的gamma参数｡
请记住, 此gamma参数是延迟系数｡
这是方程的参数｡
所以我们把它放在这里, 因为我们以后还会用到它｡
所以我们把它放在这里｡
我们就叫它伽马｡
所以这只是参数的名字, 这里是init函数需要的所有参数.
这意味着每当我们创建深度学习模型时, 也就是每当我们创建当前类的新对象时｡
我们需要指定输入大小, 动作数和gamma参数, 我们很快就会输入它们的真实的值｡
好吧, 我会的
现在我们来看看init函数｡
好吧, 我会的
所以现在基本上这是很容易的｡
我们要创建一个初始化, 所有需要的变量.
让我们从第一个开始｡
让我们从延迟系数gamma开始｡
既然这是一个变量, 我们想要依附于我们的对象, 我们从自我开始｡
所以gamma是我们当前模型的一个变量｡
所以self that gamma等于在创建类的对象时输入的参数｡
这是第二个参数｡
所以第二个论点是奖励窗口｡
那么这个奖励窗口是什么呢？
这是最近100次奖励的平均值的滑动窗口, 我们将用它来评估人工智能性能的演变｡
你知道, 我们会有平均的奖励进入这个奖励窗口, 将滑动随着时间的推移｡
我们要观察的是最后100个奖励的平均值随时间而增加｡
所以我们用self点reward初始化它, 下划线window｡
因为这是一个滑动窗口, 显示最近100个奖励的平均值, 我们把它初始化为一个空列表,
然后我们把奖励的平均值随时间的推移添加进去.
好吧, 那么, 更令人兴奋｡
让我们创建神经网络｡
所以我们称之为self点模型, 因为基本上这是模型的核心｡
所以我称之为模特｡
这个模型就是网络类的一个对象.
为了创建这样一个对象, 我们取我们的类network, 然后括号, 这里我们只输入network类的参数｡
但是我们把这些参数放在了init函数的参数中, 所以我们只需要把它们复制到这里,
然后粘贴到网络类中.
好了
通过这行代码, 我们为深度学习模型创建了一个神经网络｡
好极了｡
那我们就创造一个回忆吧｡
我们再创建一个新的变量, 我们称之为self, 点记忆｡
同样, 这是一个重放内存类的对象.
我们把我们的类名, 复制一下, 粘贴到这里.
在括号中我们需要输入容量, 因为容量是init函数的一个参数, 这是我们需要输入的唯一参数｡
那么, 我们要选择什么样的容量呢？
记住, 对应于转变的次数, 事件的次数, 较少的状态, 新的状态,
较少的行动和较少的奖励｡
就像前面的教程中提到的, 我们将把100, 000个, 100, 000个转换放入内存中,
然后我们将从内存中采样, 以获得少量的随机转换, 这就是模型将学习的基础｡
好吧, 我会的
现在我们有了记忆｡
好极了｡
现在, 让我们来看看优化器｡
因此, 我们创建了一个新的变量self, 称为optimizer｡
因此, 优化器是我们未来GQ的另一个变量, 一个自我优化的对象｡
现在, 如果我们返回, 您可以看到我们导入了torch, 即Optim, 它是torch的一个模块,
包含了执行随机梯度下降的所有工具｡
当然, 它包含一些优化器, 我们给了它一个快捷方式optim,
因此, 这里我们要做的是采用模型Optim, 它是Optim的火炬, 从这个模块中, 我们要采用一个优化器｡
如您所见, 它们都列在这里｡
他们中的许多人都很优秀｡
例如, 武器道具是一个很好的优化器｡
例如, 强烈建议将其用于常规神经网络或无监督深度学习｡
但是另一个非常好的, 我们将选择的是原子优化器｡
这就是你会看到的, 与这一个将得到一个很好的自动驾驶汽车｡
但是, 同样, 完全欢迎你尝试其他的｡
你可以试试武器道具, 但对于我们的模型, 我们将选择原子｡
我按下回车键, 你会注意到这里有一个大写字母A.
这是因为我们正在创建一个atom类的对象｡
这是一个类, 但对象本身将是一个原子优化器｡
但由于这是一个类, 我们需要输入一些参数｡
Atom类的参数和参数都是可以自定义您的Atom优化器的参数｡
例如, 这通常是学习速率､ 衰减或其他参数｡
除了获取模型的所有参数外, 我们还将指定一个学习率｡
因此, 说到我们模型的参数, 我们可以用self dot模型来得到它们｡
这就是我们在这里创建的模型, 来自我们网络课程的自学模型｡
如此自学成才的典范｡
然后为了评估模型的参数, 我们添加了另一个点, 然后简单地用括号括起参数｡
这只是将原子优化器连接到我们的神经网络, 就是我们在这里创建的那个｡
然后, 就像我们刚才提到的, 我们要加上一个学习率,
它的自变量是l, r, 我们要把它设为一个值, 这样学习就不会发生得太快｡
如果我们的学习率太大, 那么人工智能就不能正确学习｡
我们想给予人工智能一些时间去探索, 从它的错误中学习｡
你知道, 当我们惩罚它的时候, 当它犯了一些错误的时候,
比如走到沙子上或者太靠近一堵墙的时候, 我们想给予人工智能一些时间来学习｡
我们希望等待神经网络正确更新｡
所以我在尝试了几种方法后得到的学习率的一个很好的值是0｡ 01.
好吧, 我会的
这就是我们创建优化器所需要的一切｡
所以基本上我们是在创建一个atom类的对象｡
好极了｡
最后三个变量是构成过渡事件的变量｡
这是最后一个状态, 最后一个部分, 最后一个奖励｡
这基本上就是我们现在要创建的, 我们只需要初始化它们｡
我们从上次约会开始吧｡
最后一个日期, 我们称之为self, 点, 最后一个下划线状态, 然后我们如何初始化它？
记住, 最后一个状态是一个五维向量, 一个编码环境中一个状态的向量｡
提醒一下, 这五个维度是三个传感器的三个信号左, 直, 右,
方向和负方向｡
所以这是一个直观意义上的向量, 但是对于PyTorch来说, 它需要比向量更大的意义｡
它实际上需要一个火炬张量｡
但它不仅需要是一个火炬张量, 而且还需要多一个维度, 我喜欢称之为假维度,
对应于批次｡
这是因为最后一个状态将是神经网络的输入｡
但是, 在使用神经网络时, 无论是使用TensorFlow carries还是PyTorch,
输入向量本身都不能是简单向量｡
一定是一批的｡
网络只能接受一批输入观测值, 因此我们不仅要为输入状态向量创建一个张量,
还要创建与该批观测值对应的伪维数｡
让我们这样做, 我们从初始化火炬张量开始｡
所以要做到这一点, 没有什么比这更简单的了｡
我们用火炬库, 然后点, 然后我们要用张量类, 因为你可能已经猜到了,
这将创建一个新的张量类对象, 也就是张量对象｡
在这个张量类中｡
我们需要输入一个参数来指定张量的大小｡
你可以把张量想象成一个只有一种类型的数组｡
但基本上, 这表示的是输入状态, 你可以看到它是一个向量｡
所以要指定这个张量必须包含的元素数｡
当然, 我们需要使用输入大小,
因为输入大小正好是输入状态向量的维数｡
现在我应该说是传感器｡
所以我们只需要在张量类中输入, 就可以创建张量对象｡
这是输入大小｡
稍后, 输入大小将等于5｡
好吧, 那很好｡
这是第一件事｡
我们刚刚初始化了一个张量, 它应该是这样的｡
但是, 记住, 我们需要做另一件事｡
我们需要创建一个伪维度, 因为这是网络期望的输入, 我们需要创建一个伪维度,
顺便说一句, 它必须是第一个维度｡
你知道, 对应于批次的伪维度将是最后一个变量的第一个维度｡
要做到这一点, 我们只需要加上点然后挤压｡
然后在一些括号里, 我们需要输入这个模糊维度的索引｡
就像我刚才说的, 这个假维度必须是状态的第一维度｡
由于Python中的索引从零开始, 我们需要输入零, 这样这个新的维度就成为了第一个维度｡
所以我们有一个对应于批次的第一维, 然后是对应于张量的第一维,
它包含了你输入状态的五个元素｡
有三个信号方向和负方向｡
然后, 我们开始, 我们初始化我们的输入状态, 使之完全完美｡
还有两个变数｡
因为下一个变量是最后一个操作, 所以这就容易多了｡
这是一个新的变量, 我们为对象的上一个动作创建的｡
记住, 在本节的第一个教程中, 我告诉过你们,
动作要么是01, 要么是2, 然后使用动作2的旋转向量, 我们将把这些动作的索引转换成旋转的角度,
我提醒你们, 是020或-20｡
我们可以用它来刷新我们的记忆｡
它就在这里
通过旋转动作｡
如果action为零, 那么, 这将对应于这里的第一个索引｡
所以0, 如果作用量是1, 这将对应于索引, 这个向量的1｡
所以20度｡
如果作用力是2, 我们会得到-20度｡
这将是我们的车的旋转角度, 当我们玩的行动｡
好吧, 我会的
因此, 因为作用量是01或2, 所以作用量是一个简单的数｡
所以很简单, 我们可以将它初始化为零｡
我们不需要在这里创建任何张量或其他任何东西｡
我们只需要把它初始化为零｡
最后, 嗯, 这是最后的奖励｡
所以自我打点最后的奖励｡
我们走吧｡
同样, 奖励是一个浮点数, 我提醒你, 它在负1和正1之间｡
又是这个号码｡
至于这个动作, 我们将它初始化为零, 就这样｡
祝贺您init函数已准备就绪｡
所以现在我们准备好进入令人兴奋的部分了｡
实际上对我来说最重要的事情就是决定每次玩哪个动作｡
这正是我们在下一个教程中要做的, 通过创建Select Action方法｡
我们将在下一个教程中进行此操作｡
在那之前, 好好享受我｡