提交 045dee58 编写于 作者: W wizardforcel

2020-10-19 21:48:57

上级 74f7d35a
...@@ -14,7 +14,7 @@ PyTorch 安装起来很简单, [它自家网页](https://www.pytorchtutorial.co ...@@ -14,7 +14,7 @@ PyTorch 安装起来很简单, [它自家网页](https://www.pytorchtutorial.co
然后根据上面的提示, 我只需要在我的 Terminal 当中输入以下指令就好了: 然后根据上面的提示, 我只需要在我的 Terminal 当中输入以下指令就好了:
``` ```py
$ pip install http://download.pytorch.org/whl/torch-0.1.11.post5-cp35-cp35m-macosx_10_7_x86_64.whl $ pip install http://download.pytorch.org/whl/torch-0.1.11.post5-cp35-cp35m-macosx_10_7_x86_64.whl
$ pip install torchvision $ pip install torchvision
``` ```
......
...@@ -6,7 +6,7 @@ Torch 自称为神经网络界的 Numpy, 因为他能将 torch 产生的 tensor ...@@ -6,7 +6,7 @@ Torch 自称为神经网络界的 Numpy, 因为他能将 torch 产生的 tensor
当然, 我们对 Numpy 还是爱不释手的, 因为我们太习惯 numpy 的形式了. 不过 torch 看出来我们的喜爱, 他把 torch 做的和 numpy 能很好的兼容. 比如这样就能自由地转换 numpy array 和 torch tensor 了: 当然, 我们对 Numpy 还是爱不释手的, 因为我们太习惯 numpy 的形式了. 不过 torch 看出来我们的喜爱, 他把 torch 做的和 numpy 能很好的兼容. 比如这样就能自由地转换 numpy array 和 torch tensor 了:
``` ```py
import torch import torch
import numpy as np import numpy as np
...@@ -24,7 +24,7 @@ print( ...@@ -24,7 +24,7 @@ print(
其实 torch 中 tensor 的运算和 numpy array 的如出一辙, 我们就以对比的形式来看. 如果想了解 torch 中其它更多有用的运算符, [API就是你要去的地方](https://www.pytorchtutorial.com/goto/http://pytorch.org/docs/torch.html#math-operations). 其实 torch 中 tensor 的运算和 numpy array 的如出一辙, 我们就以对比的形式来看. 如果想了解 torch 中其它更多有用的运算符, [API就是你要去的地方](https://www.pytorchtutorial.com/goto/http://pytorch.org/docs/torch.html#math-operations).
``` ```py
# abs 绝对值计算 # abs 绝对值计算
data = [-1, -2, 1, 2] data = [-1, -2, 1, 2]
tensor = torch.FloatTensor(data) # 转换成32位浮点 tensor tensor = torch.FloatTensor(data) # 转换成32位浮点 tensor
...@@ -51,7 +51,7 @@ print( ...@@ -51,7 +51,7 @@ print(
除了简单的计算, 矩阵运算才是神经网络中最重要的部分. 所以我们展示下矩阵的乘法. 注意一下包含了一个 numpy 中可行, 但是 torch 中不可行的方式. 除了简单的计算, 矩阵运算才是神经网络中最重要的部分. 所以我们展示下矩阵的乘法. 注意一下包含了一个 numpy 中可行, 但是 torch 中不可行的方式.
``` ```py
# matrix multiplication 矩阵点乘 # matrix multiplication 矩阵点乘
data = [[1,2], [3,4]] data = [[1,2], [3,4]]
tensor = torch.FloatTensor(data) # 转换成32位浮点 tensor tensor = torch.FloatTensor(data) # 转换成32位浮点 tensor
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
我们定义一个 Variable: 我们定义一个 Variable:
``` ```py
import torch import torch
from torch.autograd import Variable # torch 中 Variable 模块 from torch.autograd import Variable # torch 中 Variable 模块
...@@ -35,7 +35,7 @@ Variable containing: ...@@ -35,7 +35,7 @@ Variable containing:
我们再对比一下 tensor 的计算和 variable 的计算.\’ 我们再对比一下 tensor 的计算和 variable 的计算.\’
``` ```py
t_out = torch.mean(tensor*tensor) # x^2 t_out = torch.mean(tensor*tensor) # x^2
v_out = torch.mean(variable*variable) # x^2 v_out = torch.mean(variable*variable) # x^2
print(t_out) print(t_out)
...@@ -46,7 +46,7 @@ print(v_out) # 7.5 ...@@ -46,7 +46,7 @@ print(v_out) # 7.5
v_out = torch.mean(variable*variable) 就是在计算图中添加的一个计算步骤, 计算误差反向传递的时候有他一份功劳, 我们就来举个例子: v_out = torch.mean(variable*variable) 就是在计算图中添加的一个计算步骤, 计算误差反向传递的时候有他一份功劳, 我们就来举个例子:
``` ```py
v_out.backward() # 模拟 v_out 的误差反向传递 v_out.backward() # 模拟 v_out 的误差反向传递
# 下面两步看不懂没关系, 只要知道 Variable 是计算图的一部分, 可以用来传递误差就好. # 下面两步看不懂没关系, 只要知道 Variable 是计算图的一部分, 可以用来传递误差就好.
...@@ -64,7 +64,7 @@ print(variable.grad) # 初始 Variable 的梯度 ...@@ -64,7 +64,7 @@ print(variable.grad) # 初始 Variable 的梯度
直接 print(variable) 只会输出 Variable 形式的数据, 在很多时候是用不了的(比如想要用 plt 画图), 所以我们要转换一下, 将它变成 tensor 形式. 直接 print(variable) 只会输出 Variable 形式的数据, 在很多时候是用不了的(比如想要用 plt 画图), 所以我们要转换一下, 将它变成 tensor 形式.
``` ```py
print(variable) # Variable 形式 print(variable) # Variable 形式
""" """
Variable containing: Variable containing:
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
Torch 中的激励函数有很多, 不过我们平时要用到的就这几个.  relu, sigmoid, tanh, softplus . 那我们就看看他们各自长什么样啦. Torch 中的激励函数有很多, 不过我们平时要用到的就这几个.  relu, sigmoid, tanh, softplus . 那我们就看看他们各自长什么样啦.
``` ```py
import torch import torch
import torch.nn.functional as F # 激励函数都在这 import torch.nn.functional as F # 激励函数都在这
from torch.autograd import Variable from torch.autograd import Variable
...@@ -20,7 +20,7 @@ x = Variable(x) ...@@ -20,7 +20,7 @@ x = Variable(x)
接着就是做生成不同的激励函数数据: 接着就是做生成不同的激励函数数据:
``` ```py
x_np = x.data.numpy() # 换成 numpy array, 出图时用 x_np = x.data.numpy() # 换成 numpy array, 出图时用
# 几种常用的 激励函数 # 几种常用的 激励函数
...@@ -35,7 +35,7 @@ y_softplus = F.softplus(x).data.numpy() ...@@ -35,7 +35,7 @@ y_softplus = F.softplus(x).data.numpy()
![](img/f1108a1b6941305fa7a39e488c023fe9.png) ![](img/f1108a1b6941305fa7a39e488c023fe9.png)
``` ```py
import matplotlib.pyplot as plt # python 的可视化模块, 我有教程 (https://morvanzhou.github.io/tutorials/data-manipulation/plt/) import matplotlib.pyplot as plt # python 的可视化模块, 我有教程 (https://morvanzhou.github.io/tutorials/data-manipulation/plt/)
plt.figure(1, figsize=(8, 6)) plt.figure(1, figsize=(8, 6))
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
我们创建一些假数据来模拟真实的情况. 比如一个一元二次函数:  y = a * x^2 b , 我们给  y  数据加上一点噪声来更加真实的展示它. 我们创建一些假数据来模拟真实的情况. 比如一个一元二次函数:  y = a * x^2 b , 我们给  y  数据加上一点噪声来更加真实的展示它.
``` ```py
import torch import torch
from torch.autograd import Variable from torch.autograd import Variable
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
...@@ -28,7 +28,7 @@ plt.show() ...@@ -28,7 +28,7 @@ plt.show()
建立一个神经网络我们可以直接运用 torch 中的体系. 先定义所有的层属性( __init__() ), 然后再一层层搭建( forward(x) )层于层的关系链接. 建立关系的时候, 我们会用到激励函数, 如果还不清楚激励函数用途的同学, 这里有非常好的一篇动画教程 (如下). 建立一个神经网络我们可以直接运用 torch 中的体系. 先定义所有的层属性( __init__() ), 然后再一层层搭建( forward(x) )层于层的关系链接. 建立关系的时候, 我们会用到激励函数, 如果还不清楚激励函数用途的同学, 这里有非常好的一篇动画教程 (如下).
``` ```py
import torch import torch
import torch.nn.functional as F # 激励函数都在这 import torch.nn.functional as F # 激励函数都在这
...@@ -60,7 +60,7 @@ Net ( ...@@ -60,7 +60,7 @@ Net (
训练的步骤很简单, 如下: 训练的步骤很简单, 如下:
``` ```py
# optimizer 是训练的工具 # optimizer 是训练的工具
optimizer = torch.optim.SGD(net.parameters(), lr=0.5) # 传入 net 的所有参数, 学习率 optimizer = torch.optim.SGD(net.parameters(), lr=0.5) # 传入 net 的所有参数, 学习率
loss_func = torch.nn.MSELoss() # 预测值和真实值的误差计算公式 (均方差) loss_func = torch.nn.MSELoss() # 预测值和真实值的误差计算公式 (均方差)
...@@ -79,7 +79,7 @@ for t in range(100): ...@@ -79,7 +79,7 @@ for t in range(100):
为了可视化整个训练的过程, 更好的理解是如何训练, 我们如下操作: 为了可视化整个训练的过程, 更好的理解是如何训练, 我们如下操作:
``` ```py
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
plt.ion() # 画图 plt.ion() # 画图
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
我们创建一些假数据来模拟真实的情况. 比如两个二次分布的数据, 不过他们的均值都不一样. 我们创建一些假数据来模拟真实的情况. 比如两个二次分布的数据, 不过他们的均值都不一样.
``` ```py
import torch import torch
from torch.autograd import Variable from torch.autograd import Variable
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
...@@ -39,7 +39,7 @@ plt.show() ...@@ -39,7 +39,7 @@ plt.show()
建立一个神经网络我们可以直接运用 torch 中的体系. 先定义所有的层属性( __init__() ), 然后再一层层搭建( forward(x) )层于层的关系链接. 这个和我们在前面 regression 的时候的神经网络基本没差. 建立关系的时候, 我们会用到激励函数. 建立一个神经网络我们可以直接运用 torch 中的体系. 先定义所有的层属性( __init__() ), 然后再一层层搭建( forward(x) )层于层的关系链接. 这个和我们在前面 regression 的时候的神经网络基本没差. 建立关系的时候, 我们会用到激励函数.
``` ```py
import torch import torch
import torch.nn.functional as F # 激励函数都在这 import torch.nn.functional as F # 激励函数都在这
...@@ -70,7 +70,7 @@ Net ( ...@@ -70,7 +70,7 @@ Net (
训练的步骤很简单, 如下: 训练的步骤很简单, 如下:
``` ```py
# optimizer 是训练的工具 # optimizer 是训练的工具
optimizer = torch.optim.SGD(net.parameters(), lr=0.02) # 传入 net 的所有参数, 学习率 optimizer = torch.optim.SGD(net.parameters(), lr=0.02) # 传入 net 的所有参数, 学习率
# 算误差的时候, 注意真实值!不是! one-hot 形式的, 而是1D Tensor, (batch,) # 算误差的时候, 注意真实值!不是! one-hot 形式的, 而是1D Tensor, (batch,)
...@@ -91,7 +91,7 @@ for t in range(100): ...@@ -91,7 +91,7 @@ for t in range(100):
为了可视化整个训练的过程, 更好的理解是如何训练, 我们如下操作: 为了可视化整个训练的过程, 更好的理解是如何训练, 我们如下操作:
``` ```py
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
plt.ion() # 画图 plt.ion() # 画图
......
...@@ -6,7 +6,7 @@ Torch 中提供了很多方便的途径, 同样是神经网络, 能快则快, ...@@ -6,7 +6,7 @@ Torch 中提供了很多方便的途径, 同样是神经网络, 能快则快,
我们先看看之前写神经网络时用到的步骤. 我们用 net1  代表这种方式搭建的神经网络. 我们先看看之前写神经网络时用到的步骤. 我们用 net1  代表这种方式搭建的神经网络.
``` ```py
class Net(torch.nn.Module): class Net(torch.nn.Module):
def __init__(self, n_feature, n_hidden, n_output): def __init__(self, n_feature, n_hidden, n_output):
super(Net, self).__init__() super(Net, self).__init__()
...@@ -23,7 +23,7 @@ net1 = Net(1, 10, 1) # 这是我们用这种方式搭建的 net1 ...@@ -23,7 +23,7 @@ net1 = Net(1, 10, 1) # 这是我们用这种方式搭建的 net1
我们用 class 继承了一个 torch 中的神经网络结构, 然后对其进行了修改, 不过还有更快的一招, 用一句话就概括了上面所有的内容! 我们用 class 继承了一个 torch 中的神经网络结构, 然后对其进行了修改, 不过还有更快的一招, 用一句话就概括了上面所有的内容!
``` ```py
net2 = torch.nn.Sequential( net2 = torch.nn.Sequential(
torch.nn.Linear(1, 10), torch.nn.Linear(1, 10),
torch.nn.ReLU(), torch.nn.ReLU(),
...@@ -33,7 +33,7 @@ net2 = torch.nn.Sequential( ...@@ -33,7 +33,7 @@ net2 = torch.nn.Sequential(
我们再对比一下两者的结构: 我们再对比一下两者的结构:
``` ```py
print(net1) print(net1)
""" """
Net ( Net (
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
我们快速地建造数据, 搭建网络: 我们快速地建造数据, 搭建网络:
``` ```py
torch.manual_seed(1) # reproducible torch.manual_seed(1) # reproducible
# 假数据 # 假数据
...@@ -35,7 +35,7 @@ def save(): ...@@ -35,7 +35,7 @@ def save():
接下来我们有两种途径来保存 接下来我们有两种途径来保存
``` ```py
torch.save(net1, \'net.pkl\') # 保存整个网络 torch.save(net1, \'net.pkl\') # 保存整个网络
torch.save(net1.state_dict(), \'net_params.pkl\') # 只保存网络中的参数 (速度快, 占内存少) torch.save(net1.state_dict(), \'net_params.pkl\') # 只保存网络中的参数 (速度快, 占内存少)
``` ```
...@@ -44,7 +44,7 @@ torch.save(net1.state_dict(), \'net_params.pkl\') # 只保存网络中的参 ...@@ -44,7 +44,7 @@ torch.save(net1.state_dict(), \'net_params.pkl\') # 只保存网络中的参
这种方式将会提取整个神经网络, 网络大的时候可能会比较慢. 这种方式将会提取整个神经网络, 网络大的时候可能会比较慢.
``` ```py
def restore_net(): def restore_net():
# restore entire net1 to net2 # restore entire net1 to net2
net2 = torch.load(\'net.pkl\') net2 = torch.load(\'net.pkl\')
...@@ -55,7 +55,7 @@ def restore_net(): ...@@ -55,7 +55,7 @@ def restore_net():
这种方式将会提取所有的参数, 然后再放到你的新建网络中. 这种方式将会提取所有的参数, 然后再放到你的新建网络中.
``` ```py
def restore_params(): def restore_params():
# 新建 net3 # 新建 net3
net3 = torch.nn.Sequential( net3 = torch.nn.Sequential(
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
DataLoader  是 torch 给你用来包装你的数据的工具. 所以你要讲自己的 (numpy array 或其他) 数据形式装换成 Tensor, 然后再放进这个包装器中. 使用 DataLoader  有什么好处呢? 就是他们帮你有效地迭代数据, 举例: DataLoader  是 torch 给你用来包装你的数据的工具. 所以你要讲自己的 (numpy array 或其他) 数据形式装换成 Tensor, 然后再放进这个包装器中. 使用 DataLoader  有什么好处呢? 就是他们帮你有效地迭代数据, 举例:
``` ```py
import torch import torch
import torch.utils.data as Data import torch.utils.data as Data
torch.manual_seed(1) # reproducible torch.manual_seed(1) # reproducible
...@@ -45,7 +45,7 @@ Epoch: 2 | Step: 1 | batch x: [ 10\. 4\. 8\. 1\. 5.] | batch y: [ 1 ...@@ -45,7 +45,7 @@ Epoch: 2 | Step: 1 | batch x: [ 10\. 4\. 8\. 1\. 5.] | batch y: [ 1
真正方便的还不是这点. 如果我们改变一下 BATCH_SIZE = 8 , 这样我们就知道, step=0  会导出8个数据, 但是, step=1  时数据库中的数据不够 8个, 这时怎么办呢: 真正方便的还不是这点. 如果我们改变一下 BATCH_SIZE = 8 , 这样我们就知道, step=0  会导出8个数据, 但是, step=1  时数据库中的数据不够 8个, 这时怎么办呢:
``` ```py
BATCH_SIZE = 8 # 批训练的数据个数 BATCH_SIZE = 8 # 批训练的数据个数
... ...
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
![](img/2fc34594dcb247d4a3414467eed4a109.png) ![](img/2fc34594dcb247d4a3414467eed4a109.png)
``` ```py
import torch import torch
import torch.utils.data as Data import torch.utils.data as Data
import torch.nn.functional as F import torch.nn.functional as F
...@@ -42,7 +42,7 @@ loader = Data.DataLoader(dataset=torch_dataset, batch_size=BATCH_SIZE, shuffle=T ...@@ -42,7 +42,7 @@ loader = Data.DataLoader(dataset=torch_dataset, batch_size=BATCH_SIZE, shuffle=T
为了对比每一种优化器, 我们给他们各自创建一个神经网络, 但这个神经网络都来自同一个 Net 形式. 为了对比每一种优化器, 我们给他们各自创建一个神经网络, 但这个神经网络都来自同一个 Net 形式.
``` ```py
# 默认的 network 形式 # 默认的 network 形式
class Net(torch.nn.Module): class Net(torch.nn.Module):
def __init__(self): def __init__(self):
...@@ -67,7 +67,7 @@ nets = [net_SGD, net_Momentum, net_RMSprop, net_Adam] ...@@ -67,7 +67,7 @@ nets = [net_SGD, net_Momentum, net_RMSprop, net_Adam]
接下来在创建不同的优化器, 用来训练不同的网络. 并创建一个 loss_func  用来计算误差. 我们用几种常见的优化器, SGD , Momentum , RMSprop , Adam . 接下来在创建不同的优化器, 用来训练不同的网络. 并创建一个 loss_func  用来计算误差. 我们用几种常见的优化器, SGD , Momentum , RMSprop , Adam .
``` ```py
# different optimizers # different optimizers
opt_SGD = torch.optim.SGD(net_SGD.parameters(), lr=LR) opt_SGD = torch.optim.SGD(net_SGD.parameters(), lr=LR)
opt_Momentum = torch.optim.SGD(net_Momentum.parameters(), lr=LR, momentum=0.8) opt_Momentum = torch.optim.SGD(net_Momentum.parameters(), lr=LR, momentum=0.8)
...@@ -83,7 +83,7 @@ losses_his = [[], [], [], []] # 记录 training 时不同神经网络的 loss ...@@ -83,7 +83,7 @@ losses_his = [[], [], [], []] # 记录 training 时不同神经网络的 loss
接下来训练和 loss 画图. 接下来训练和 loss 画图.
``` ```py
for epoch in range(EPOCH): for epoch in range(EPOCH):
print(\\'Epoch: \\', epoch) print(\\'Epoch: \\', epoch)
for step, (batch_x, batch_y) in enumerate(loader): for step, (batch_x, batch_y) in enumerate(loader):
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
## MNIST手写数据 ## MNIST手写数据
``` ```py
import torch import torch
import torch.nn as nn import torch.nn as nn
from torch.autograd import Variable from torch.autograd import Variable
...@@ -40,7 +40,7 @@ train_data = torchvision.datasets.MNIST( ...@@ -40,7 +40,7 @@ train_data = torchvision.datasets.MNIST(
同样, 我们除了训练数据, 还给一些测试数据, 测试看看它有没有训练好. 同样, 我们除了训练数据, 还给一些测试数据, 测试看看它有没有训练好.
``` ```py
test_data = torchvision.datasets.MNIST(root=\\'./mnist/\\', train=False) test_data = torchvision.datasets.MNIST(root=\\'./mnist/\\', train=False)
# 批训练 50samples, 1 channel, 28x28 (50, 1, 28, 28) # 批训练 50samples, 1 channel, 28x28 (50, 1, 28, 28)
...@@ -55,7 +55,7 @@ test_y = test_data.test_labels[:2000] ...@@ -55,7 +55,7 @@ test_y = test_data.test_labels[:2000]
和以前一样, 我们用一个 class 来建立 CNN 模型. 这个 CNN 整体流程是 卷积( Conv2d ) -> 激励函数( ReLU ) -> 池化, 向下采样 ( MaxPooling ) -> 再来一遍 -> 展平多维的卷积成的特征图 -> 接入全连接层 ( Linear ) -> 输出 和以前一样, 我们用一个 class 来建立 CNN 模型. 这个 CNN 整体流程是 卷积( Conv2d ) -> 激励函数( ReLU ) -> 池化, 向下采样 ( MaxPooling ) -> 再来一遍 -> 展平多维的卷积成的特征图 -> 接入全连接层 ( Linear ) -> 输出
``` ```py
class CNN(nn.Module): class CNN(nn.Module):
def __init__(self): def __init__(self):
super(CNN, self).__init__() super(CNN, self).__init__()
...@@ -107,7 +107,7 @@ CNN ( ...@@ -107,7 +107,7 @@ CNN (
下面我们开始训练, 将  y 都用 Variable 包起来, 然后放入 cnn 中计算 output, 最后再计算误差. 下面代码省略了计算精确度 accuracy 的部分, 如果想细看 accuracy 代码的同学, 请去往我的 github 看全部代码. 下面我们开始训练, 将  y 都用 Variable 包起来, 然后放入 cnn 中计算 output, 最后再计算误差. 下面代码省略了计算精确度 accuracy 的部分, 如果想细看 accuracy 代码的同学, 请去往我的 github 看全部代码.
``` ```py
optimizer = torch.optim.Adam(cnn.parameters(), lr=LR) # optimize all cnn parameters optimizer = torch.optim.Adam(cnn.parameters(), lr=LR) # optimize all cnn parameters
loss_func = nn.CrossEntropyLoss() # the target label is not one-hotted loss_func = nn.CrossEntropyLoss() # the target label is not one-hotted
...@@ -134,7 +134,7 @@ Epoch: 0 | train loss: 0.0078 | test accuracy: 0.98 ...@@ -134,7 +134,7 @@ Epoch: 0 | train loss: 0.0078 | test accuracy: 0.98
最后我们再来取10个数据, 看看预测的值到底对不对: 最后我们再来取10个数据, 看看预测的值到底对不对:
``` ```py
test_output = cnn(test_x[:10]) test_output = cnn(test_x[:10])
pred_y = torch.max(test_output, 1)[1].data.numpy().squeeze() pred_y = torch.max(test_output, 1)[1].data.numpy().squeeze()
print(pred_y, \\'prediction number\\') print(pred_y, \\'prediction number\\')
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
## MNIST手写数据 ## MNIST手写数据
``` ```py
import torch import torch
from torch import nn from torch import nn
from torch.autograd import Variable from torch.autograd import Variable
...@@ -42,7 +42,7 @@ train_data = torchvision.datasets.MNIST( ...@@ -42,7 +42,7 @@ train_data = torchvision.datasets.MNIST(
同样, 我们除了训练数据, 还给一些测试数据, 测试看看它有没有训练好. 同样, 我们除了训练数据, 还给一些测试数据, 测试看看它有没有训练好.
``` ```py
test_data = torchvision.datasets.MNIST(root=\\'./mnist/\\', train=False) test_data = torchvision.datasets.MNIST(root=\\'./mnist/\\', train=False)
# 批训练 50samples, 1 channel, 28x28 (50, 1, 28, 28) # 批训练 50samples, 1 channel, 28x28 (50, 1, 28, 28)
...@@ -63,7 +63,7 @@ test_y = test_data.test_labels[:2000] ...@@ -63,7 +63,7 @@ test_y = test_data.test_labels[:2000]
4. (inputN, stateN)-> LSTM -> (outputN, stateN 1) ; 4. (inputN, stateN)-> LSTM -> (outputN, stateN 1) ;
5. outputN -> Linear -> prediction . 通过LSTM分析每一时刻的值, 并且将这一时刻和前面时刻的理解合并在一起, 生成当前时刻对前面数据的理解或记忆. 传递这种理解给下一时刻分析. 5. outputN -> Linear -> prediction . 通过LSTM分析每一时刻的值, 并且将这一时刻和前面时刻的理解合并在一起, 生成当前时刻对前面数据的理解或记忆. 传递这种理解给下一时刻分析.
``` ```py
class RNN(nn.Module): class RNN(nn.Module):
def __init__(self): def __init__(self):
super(RNN, self).__init__() super(RNN, self).__init__()
...@@ -103,7 +103,7 @@ RNN ( ...@@ -103,7 +103,7 @@ RNN (
我们将图片数据看成一个时间上的连续数据, 每一行的像素点都是这个时刻的输入, 读完整张图片就是从上而下的读完了每行的像素点. 然后我们就可以拿出 RNN 在最后一步的分析值判断图片是哪一类了. 下面的代码省略了计算 accuracy 的部分, 你可以在我的 github 中看到全部代码. 我们将图片数据看成一个时间上的连续数据, 每一行的像素点都是这个时刻的输入, 读完整张图片就是从上而下的读完了每行的像素点. 然后我们就可以拿出 RNN 在最后一步的分析值判断图片是哪一类了. 下面的代码省略了计算 accuracy 的部分, 你可以在我的 github 中看到全部代码.
``` ```py
optimizer = torch.optim.Adam(rnn.parameters(), lr=LR) # optimize all parameters optimizer = torch.optim.Adam(rnn.parameters(), lr=LR) # optimize all parameters
loss_func = nn.CrossEntropyLoss() # the target label is not one-hotted loss_func = nn.CrossEntropyLoss() # the target label is not one-hotted
...@@ -129,7 +129,7 @@ Epoch: 0 | train loss: 0.1868 | test accuracy: 0.96 ...@@ -129,7 +129,7 @@ Epoch: 0 | train loss: 0.1868 | test accuracy: 0.96
最后我们再来取10个数据, 看看预测的值到底对不对: 最后我们再来取10个数据, 看看预测的值到底对不对:
``` ```py
test_output = rnn(test_x[:10].view(-1, 28, 28)) test_output = rnn(test_x[:10].view(-1, 28, 28))
pred_y = torch.max(test_output, 1)[1].data.numpy().squeeze() pred_y = torch.max(test_output, 1)[1].data.numpy().squeeze()
print(pred_y, \\'prediction number\\') print(pred_y, \\'prediction number\\')
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
![](img/22309cd02ee52b3a65e1f0022e8b964e.png) ![](img/22309cd02ee52b3a65e1f0022e8b964e.png)
``` ```py
import torch import torch
from torch import nn from torch import nn
from torch.autograd import Variable from torch.autograd import Variable
...@@ -34,7 +34,7 @@ DOWNLOAD_MNIST = False # set to True if haven\'t download the data ...@@ -34,7 +34,7 @@ DOWNLOAD_MNIST = False # set to True if haven\'t download the data
这一次的 RNN, 我们对每一个 r_out  都得放到 Linear  中去计算出预测的 output , 所以我们能用一个 for loop 来循环计算. **这点是 Tensorflow 望尘莫及的!** 除了这点, 还有一些动态的过程都可以在这个教程中查看, 看看我们的 PyTorch 和 Tensorflow 到底哪家强. 这一次的 RNN, 我们对每一个 r_out  都得放到 Linear  中去计算出预测的 output , 所以我们能用一个 for loop 来循环计算. **这点是 Tensorflow 望尘莫及的!** 除了这点, 还有一些动态的过程都可以在这个教程中查看, 看看我们的 PyTorch 和 Tensorflow 到底哪家强.
``` ```py
class RNN(nn.Module): class RNN(nn.Module):
def __init__(self): def __init__(self):
super(RNN, self).__init__() super(RNN, self).__init__()
...@@ -70,7 +70,7 @@ RNN ( ...@@ -70,7 +70,7 @@ RNN (
其实熟悉 RNN 的朋友应该知道, forward  过程中的对每个时间点求输出还有一招使得计算量比较小的. 不过上面的内容主要是为了呈现 PyTorch 在动态构图上的优势, 所以我用了一个 for loop  来搭建那套输出系统. 下面介绍一个替换方式. 使用 reshape 的方式整批计算. 其实熟悉 RNN 的朋友应该知道, forward  过程中的对每个时间点求输出还有一招使得计算量比较小的. 不过上面的内容主要是为了呈现 PyTorch 在动态构图上的优势, 所以我用了一个 for loop  来搭建那套输出系统. 下面介绍一个替换方式. 使用 reshape 的方式整批计算.
``` ```py
def forward(self, x, h_state): def forward(self, x, h_state):
r_out, h_state = self.rnn(x, h_state) r_out, h_state = self.rnn(x, h_state)
r_out_reshaped = r_out.view(-1, HIDDEN_SIZE) # to 2D data r_out_reshaped = r_out.view(-1, HIDDEN_SIZE) # to 2D data
...@@ -84,7 +84,7 @@ def forward(self, x, h_state): ...@@ -84,7 +84,7 @@ def forward(self, x, h_state):
![](img/f38868821469cadc36810cfd827511d1.png) ![](img/f38868821469cadc36810cfd827511d1.png)
``` ```py
optimizer = torch.optim.Adam(rnn.parameters(), lr=LR) # optimize all rnn parameters optimizer = torch.optim.Adam(rnn.parameters(), lr=LR) # optimize all rnn parameters
loss_func = nn.MSELoss() loss_func = nn.MSELoss()
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
自编码只用训练集就好了, 而且只需要训练 training data 的 image, 不用训练 labels. 自编码只用训练集就好了, 而且只需要训练 training data 的 image, 不用训练 labels.
``` ```py
import torch import torch
import torch.nn as nn import torch.nn as nn
from torch.autograd import Variable from torch.autograd import Variable
...@@ -46,7 +46,7 @@ train_data = torchvision.datasets.MNIST( ...@@ -46,7 +46,7 @@ train_data = torchvision.datasets.MNIST(
AutoEncoder 形式很简单, 分别是 encoder  和 decoder , 压缩和解压, 压缩后得到压缩的特征值, 再从压缩的特征值解压成原图片. AutoEncoder 形式很简单, 分别是 encoder  和 decoder , 压缩和解压, 压缩后得到压缩的特征值, 再从压缩的特征值解压成原图片.
``` ```py
class AutoEncoder(nn.Module): class AutoEncoder(nn.Module):
def __init__(self): def __init__(self):
super(AutoEncoder, self).__init__() super(AutoEncoder, self).__init__()
...@@ -87,7 +87,7 @@ autoencoder = AutoEncoder() ...@@ -87,7 +87,7 @@ autoencoder = AutoEncoder()
![](img/c429fb827df769a542339e200e2ea20c.png) ![](img/c429fb827df769a542339e200e2ea20c.png)
``` ```py
optimizer = torch.optim.Adam(autoencoder.parameters(), lr=LR) optimizer = torch.optim.Adam(autoencoder.parameters(), lr=LR)
loss_func = nn.MSELoss() loss_func = nn.MSELoss()
...@@ -113,7 +113,7 @@ for epoch in range(EPOCH): ...@@ -113,7 +113,7 @@ for epoch in range(EPOCH):
3D 的可视化图挺有趣的, 还能挪动观看, 更加直观, 好理解. 3D 的可视化图挺有趣的, 还能挪动观看, 更加直观, 好理解.
``` ```py
# 要观看的数据 # 要观看的数据
view_data = Variable(train_data.train_data[:200].view(-1, 28*28).type(torch.FloatTensor)/255.) view_data = Variable(train_data.train_data[:200].view(-1, 28*28).type(torch.FloatTensor)/255.)
encoded_data, _ = autoencoder(view_data) # 提取压缩的特征值 encoded_data, _ = autoencoder(view_data) # 提取压缩的特征值
......
...@@ -8,7 +8,7 @@ Torch 是神经网络库, 那么也可以拿来做强化学习, 之前我用另 ...@@ -8,7 +8,7 @@ Torch 是神经网络库, 那么也可以拿来做强化学习, 之前我用另
这次除了 Torch 自家模块, 我们还要导入 Gym 环境库模块. 这次除了 Torch 自家模块, 我们还要导入 Gym 环境库模块.
``` ```py
import torch import torch
import torch.nn as nn import torch.nn as nn
from torch.autograd import Variable from torch.autograd import Variable
...@@ -33,7 +33,7 @@ N_STATES = env.observation_space.shape[0] # 杆子能获取的环境信息数 ...@@ -33,7 +33,7 @@ N_STATES = env.observation_space.shape[0] # 杆子能获取的环境信息数
DQN 当中的神经网络模式, 我们将依据这个模式建立两个神经网络, 一个是现实网络 (Target Net), 一个是估计网络 (Eval Net). DQN 当中的神经网络模式, 我们将依据这个模式建立两个神经网络, 一个是现实网络 (Target Net), 一个是估计网络 (Eval Net).
``` ```py
class Net(nn.Module): class Net(nn.Module):
def __init__(self, ): def __init__(self, ):
super(Net, self).__init__() super(Net, self).__init__()
...@@ -53,7 +53,7 @@ class Net(nn.Module): ...@@ -53,7 +53,7 @@ class Net(nn.Module):
简化的 DQN 体系是这样, 我们有两个 net, 有选动作机制, 有存经历机制, 有学习机制. 简化的 DQN 体系是这样, 我们有两个 net, 有选动作机制, 有存经历机制, 有学习机制.
``` ```py
class DQN(object): class DQN(object):
def __init__(self): def __init__(self):
# 建立 target net 和 eval net 还有 memory # 建立 target net 和 eval net 还有 memory
...@@ -72,7 +72,7 @@ class DQN(object): ...@@ -72,7 +72,7 @@ class DQN(object):
接下来就是具体的啦, 在 DQN 中每个功能都是怎么做的. 接下来就是具体的啦, 在 DQN 中每个功能都是怎么做的.
``` ```py
class DQN(object): class DQN(object):
def __init__(self): def __init__(self):
self.eval_net, self.target_net = Net(), Net() self.eval_net, self.target_net = Net(), Net()
...@@ -130,7 +130,7 @@ class DQN(object): ...@@ -130,7 +130,7 @@ class DQN(object):
按照 Qlearning 的形式进行 off-policy 的更新. 我们进行回合制更行, 一个回合完了, 进入下一回合. 一直到他们将杆子立起来很久. 按照 Qlearning 的形式进行 off-policy 的更新. 我们进行回合制更行, 一个回合完了, 进入下一回合. 一直到他们将杆子立起来很久.
``` ```py
dqn = DQN() # 定义 DQN 系统 dqn = DQN() # 定义 DQN 系统
for i_episode in range(400): for i_episode in range(400):
......
...@@ -12,7 +12,7 @@ GAN 是一个近几年比较流行的生成网络形式. 对比起传统的生 ...@@ -12,7 +12,7 @@ GAN 是一个近几年比较流行的生成网络形式. 对比起传统的生
新手画家 (Generator) 在作画的时候需要有一些灵感 (random noise), 我们这些灵感的个数定义为 N_IDEAS . 而一幅画需要有一些规格, 我们将这幅画的画笔数定义一下, N_COMPONENTS  就是一条一元二次曲线(这幅画画)上的点个数. 为了进行批训练, 我们将一整批话的点都规定一下( PAINT_POINTS ). 新手画家 (Generator) 在作画的时候需要有一些灵感 (random noise), 我们这些灵感的个数定义为 N_IDEAS . 而一幅画需要有一些规格, 我们将这幅画的画笔数定义一下, N_COMPONENTS  就是一条一元二次曲线(这幅画画)上的点个数. 为了进行批训练, 我们将一整批话的点都规定一下( PAINT_POINTS ).
``` ```py
import torch import torch
import torch.nn as nn import torch.nn as nn
from torch.autograd import Variable from torch.autograd import Variable
...@@ -35,7 +35,7 @@ PAINT_POINTS = np.vstack([np.linspace(-1, 1, ART_COMPONENTS) for _ in range(BATC ...@@ -35,7 +35,7 @@ PAINT_POINTS = np.vstack([np.linspace(-1, 1, ART_COMPONENTS) for _ in range(BATC
我们需要有很多画是来自著名画家的(real data), 将这些著名画家的画, 和新手画家的画都传给新手鉴赏家, 让鉴赏家来区分哪些是著名画家, 哪些是新手画家的画. 如何区分我们在后面呈现. 这里我们生成一些著名画家的画 (batch 条不同的一元二次方程曲线). 我们需要有很多画是来自著名画家的(real data), 将这些著名画家的画, 和新手画家的画都传给新手鉴赏家, 让鉴赏家来区分哪些是著名画家, 哪些是新手画家的画. 如何区分我们在后面呈现. 这里我们生成一些著名画家的画 (batch 条不同的一元二次方程曲线).
``` ```py
def artist_works(): # painting from the famous artist (real target) def artist_works(): # painting from the famous artist (real target)
a = np.random.uniform(1, 2, size=BATCH_SIZE)[:, np.newaxis] a = np.random.uniform(1, 2, size=BATCH_SIZE)[:, np.newaxis]
paintings = a * np.power(PAINT_POINTS, 2) (a-1) paintings = a * np.power(PAINT_POINTS, 2) (a-1)
...@@ -53,7 +53,7 @@ def artist_works(): # painting from the famous artist (real target) ...@@ -53,7 +53,7 @@ def artist_works(): # painting from the famous artist (real target)
D 会接收一幅画作 (一元二次曲线), 输出这幅画作到底是不是著名画家的画(是著名画家的画的概率). D 会接收一幅画作 (一元二次曲线), 输出这幅画作到底是不是著名画家的画(是著名画家的画的概率).
``` ```py
G = nn.Sequential( # Generator G = nn.Sequential( # Generator
nn.Linear(N_IDEAS, 128), # random ideas (could from normal distribution) nn.Linear(N_IDEAS, 128), # random ideas (could from normal distribution)
nn.ReLU(), nn.ReLU(),
...@@ -72,7 +72,7 @@ D = nn.Sequential( # Discriminator ...@@ -72,7 +72,7 @@ D = nn.Sequential( # Discriminator
接着我们来同时训练 D 和 G. 训练之前, 我们来看看G作画的原理. G 首先会有些灵感, G_ideas 就会拿到这些随机灵感 (可以是正态分布的随机数), 然后 G 会根据这些灵感画画. 接着我们拿着著名画家的画和 G 的画, 让 D 来判定这两批画作是著名画家画的概率. 接着我们来同时训练 D 和 G. 训练之前, 我们来看看G作画的原理. G 首先会有些灵感, G_ideas 就会拿到这些随机灵感 (可以是正态分布的随机数), 然后 G 会根据这些灵感画画. 接着我们拿着著名画家的画和 G 的画, 让 D 来判定这两批画作是著名画家画的概率.
``` ```py
for step in range(10000): for step in range(10000):
artist_paintings = artist_works() # real painting from artist artist_paintings = artist_works() # real painting from artist
G_ideas = Variable(torch.randn(BATCH_SIZE, N_IDEAS)) # random ideas G_ideas = Variable(torch.randn(BATCH_SIZE, N_IDEAS)) # random ideas
...@@ -84,14 +84,14 @@ for step in range(10000): ...@@ -84,14 +84,14 @@ for step in range(10000):
然后计算有多少来之画家的画猜对了, 有多少来自 G 的画猜对了, 我们想最大化这些猜对的次数. 这也就是 log(D(x)) log(1-D(G(z))  在[论文](https://www.pytorchtutorial.com/goto/https://arxiv.org/abs/1406.2661)中的形式. 而因为 torch 中提升参数的形式是最小化误差, 那我们把最大化 score 转换成最小化 loss, 在两个 score 的合的地方加一个符号就好. 而 G 的提升就是要减小 D 猜测 G 生成数据的正确率, 也就是减小 D_score1. 然后计算有多少来之画家的画猜对了, 有多少来自 G 的画猜对了, 我们想最大化这些猜对的次数. 这也就是 log(D(x)) log(1-D(G(z))  在[论文](https://www.pytorchtutorial.com/goto/https://arxiv.org/abs/1406.2661)中的形式. 而因为 torch 中提升参数的形式是最小化误差, 那我们把最大化 score 转换成最小化 loss, 在两个 score 的合的地方加一个符号就好. 而 G 的提升就是要减小 D 猜测 G 生成数据的正确率, 也就是减小 D_score1.
``` ```py
D_loss = - torch.mean(torch.log(prob_artist0) torch.log(1\. - prob_artist1)) D_loss = - torch.mean(torch.log(prob_artist0) torch.log(1\. - prob_artist1))
G_loss = torch.mean(torch.log(1\. - prob_artist1)) G_loss = torch.mean(torch.log(1\. - prob_artist1))
``` ```
最后我们在根据 loss  提升神经网络就好了. 最后我们在根据 loss  提升神经网络就好了.
``` ```py
opt_D.zero_grad() opt_D.zero_grad()
D_loss.backward(retain_variables=True) # retain_variables 这个参数是为了再次使用计算图纸 D_loss.backward(retain_variables=True) # retain_variables 这个参数是为了再次使用计算图纸
opt_D.step() opt_D.step()
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
我们拿 [这一节内容的 RNN](https://www.pytorchtutorial.com/4-3-rnn-for-regression/) 来解释动态计算图. 那节内容的[代码在这](https://www.pytorchtutorial.com/goto/https://github.com/MorvanZhou/PyTorch-Tutorial/blob/master/tutorial-contents/11_RNN_regressor.py). 我们拿 [这一节内容的 RNN](https://www.pytorchtutorial.com/4-3-rnn-for-regression/) 来解释动态计算图. 那节内容的[代码在这](https://www.pytorchtutorial.com/goto/https://github.com/MorvanZhou/PyTorch-Tutorial/blob/master/tutorial-contents/11_RNN_regressor.py).
``` ```py
.. ..
######################## 前面代码都一样, 下面开始不同 ######################### ######################## 前面代码都一样, 下面开始不同 #########################
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
这份 GPU 的代码是依据[之前这份CNN](https://www.pytorchtutorial.com/goto/https://github.com/MorvanZhou/PyTorch-Tutorial/blob/master/tutorial-contents/401_CNN.py)的代码修改的. 大概修改的地方包括将数据的形式变成 GPU 能读的形式, 然后将 CNN 也变成 GPU 能读的形式. 做法就是在后面加上 .cuda() , 很简单. 这份 GPU 的代码是依据[之前这份CNN](https://www.pytorchtutorial.com/goto/https://github.com/MorvanZhou/PyTorch-Tutorial/blob/master/tutorial-contents/401_CNN.py)的代码修改的. 大概修改的地方包括将数据的形式变成 GPU 能读的形式, 然后将 CNN 也变成 GPU 能读的形式. 做法就是在后面加上 .cuda() , 很简单.
``` ```py
... ...
test_data = torchvision.datasets.MNIST(root=\'./mnist/\', train=False) test_data = torchvision.datasets.MNIST(root=\'./mnist/\', train=False)
...@@ -21,7 +21,7 @@ test_y = test_data.test_labels[:2000].cuda() ...@@ -21,7 +21,7 @@ test_y = test_data.test_labels[:2000].cuda()
再来把我们的 CNN 参数也变成 GPU 兼容形式. 再来把我们的 CNN 参数也变成 GPU 兼容形式.
``` ```py
class CNN(nn.Module): class CNN(nn.Module):
... ...
...@@ -33,7 +33,7 @@ cnn.cuda() # Moves all model parameters and buffers to the GPU. ...@@ -33,7 +33,7 @@ cnn.cuda() # Moves all model parameters and buffers to the GPU.
然后就是在 train 的时候, 将每次的training data 变成 GPU 形式. .cuda() 然后就是在 train 的时候, 将每次的training data 变成 GPU 形式. .cuda()
``` ```py
for epoch ..: for epoch ..:
for step, ...: for step, ...:
# !!!!!!!! 这里有修改 !!!!!!!!! # # !!!!!!!! 这里有修改 !!!!!!!!! #
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
![](img/761c210ceb0fdd69c7e0f8bd85e39698.png) ![](img/761c210ceb0fdd69c7e0f8bd85e39698.png)
``` ```py
import torch import torch
from torch.autograd import Variable from torch.autograd import Variable
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
...@@ -42,7 +42,7 @@ plt.show() ...@@ -42,7 +42,7 @@ plt.show()
我们在这里搭建两个神经网络, 一个没有 dropout, 一个有 dropout. 没有 dropout 的容易出现 过拟合, 那我们就命名为 net_overfitting, 另一个就是 net_dropped.  torch.nn.Dropout(0.5)  这里的 0.5 指的是随机有 50% 的神经元会被关闭/丢弃. 我们在这里搭建两个神经网络, 一个没有 dropout, 一个有 dropout. 没有 dropout 的容易出现 过拟合, 那我们就命名为 net_overfitting, 另一个就是 net_dropped.  torch.nn.Dropout(0.5)  这里的 0.5 指的是随机有 50% 的神经元会被关闭/丢弃.
``` ```py
net_overfitting = torch.nn.Sequential( net_overfitting = torch.nn.Sequential(
torch.nn.Linear(1, N_HIDDEN), torch.nn.Linear(1, N_HIDDEN),
torch.nn.ReLU(), torch.nn.ReLU(),
...@@ -66,7 +66,7 @@ net_dropped = torch.nn.Sequential( ...@@ -66,7 +66,7 @@ net_dropped = torch.nn.Sequential(
训练的时候, 这两个神经网络分开训练. 训练的环境都一样. 训练的时候, 这两个神经网络分开训练. 训练的环境都一样.
``` ```py
optimizer_ofit = torch.optim.Adam(net_overfitting.parameters(), lr=0.01) optimizer_ofit = torch.optim.Adam(net_overfitting.parameters(), lr=0.01)
optimizer_drop = torch.optim.Adam(net_dropped.parameters(), lr=0.01) optimizer_drop = torch.optim.Adam(net_dropped.parameters(), lr=0.01)
loss_func = torch.nn.MSELoss() loss_func = torch.nn.MSELoss()
...@@ -92,7 +92,7 @@ for t in range(500): ...@@ -92,7 +92,7 @@ for t in range(500):
![](img/a545e4a49909bd7a80e042fd6d8267cb.png) ![](img/a545e4a49909bd7a80e042fd6d8267cb.png)
``` ```py
... ...
optimizer_ofit.step() optimizer_ofit.step()
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
![](img/fedaa24e2fcad876c77a2038c2d8d14d.png) ![](img/fedaa24e2fcad876c77a2038c2d8d14d.png)
``` ```py
import torch import torch
from torch.autograd import Variable from torch.autograd import Variable
from torch import nn from torch import nn
...@@ -60,7 +60,7 @@ plt.show() ...@@ -60,7 +60,7 @@ plt.show()
这里就教你如何构建带有 BN 的神经网络的. BN 其实可以看做是一个 layer ( BN layer ). 我们就像平时加层一样加 BN layer  就好了. 注意, 我还对输入数据进行了一个 BN 处理, 因为如果你把输入数据看出是 从前面一层来的输出数据, 我们同样也能对她进行 BN. 这里就教你如何构建带有 BN 的神经网络的. BN 其实可以看做是一个 layer ( BN layer ). 我们就像平时加层一样加 BN layer  就好了. 注意, 我还对输入数据进行了一个 BN 处理, 因为如果你把输入数据看出是 从前面一层来的输出数据, 我们同样也能对她进行 BN.
``` ```py
class Net(nn.Module): class Net(nn.Module):
def __init__(self, batch_normalization=False): def __init__(self, batch_normalization=False):
super(Net, self).__init__() super(Net, self).__init__()
...@@ -108,7 +108,7 @@ nets = [Net(batch_normalization=False), Net(batch_normalization=True)] ...@@ -108,7 +108,7 @@ nets = [Net(batch_normalization=False), Net(batch_normalization=True)]
训练的时候, 这两个神经网络分开训练. 训练的环境都一样. 训练的时候, 这两个神经网络分开训练. 训练的环境都一样.
``` ```py
opts = [torch.optim.Adam(net.parameters(), lr=LR) for net in nets] opts = [torch.optim.Adam(net.parameters(), lr=LR) for net in nets]
loss_func = torch.nn.MSELoss() loss_func = torch.nn.MSELoss()
...@@ -132,7 +132,7 @@ for epoch in range(EPOCH): ...@@ -132,7 +132,7 @@ for epoch in range(EPOCH):
![](img/cb2138c3f800c7ca4b5ae38076d09429.png) ![](img/cb2138c3f800c7ca4b5ae38076d09429.png)
``` ```py
f, axs = plt.subplots(4, N_HIDDEN 1, figsize=(10, 5)) f, axs = plt.subplots(4, N_HIDDEN 1, figsize=(10, 5))
def plot_histogram(l_in, l_in_bn, pre_ac, pre_ac_bn): def plot_histogram(l_in, l_in_bn, pre_ac, pre_ac_bn):
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册