假期抽空了解了一下PyTorch,感觉用起来特别特别顺手。作为一个直追TensorFlow并与之相抗衡的深度学习框架,感觉使用起来要比TensorFlow简洁许多。
在TensorFlow中,总是需要先构建一个计算图,一旦计算图构建下来还不能随便改变,这是挺难受的。后面的数据还得用占位符占着,,万一想改又重新开始写,总的来说这是个静态的框架,功能毋庸置疑的强大,但是计算流程的灵活性难以保证。
而PyTorh就不一样,是个动态框架,在编程上和python的逻辑几乎一样,干啥都很灵活,这让我很是享受啊哈哈哈。可能是我了解还不够深入,反正就现在的体验来看,更喜欢PyTorch一些。
下面就记录一下基于PyTorch分别用DNN,CNN,RNN等等,实现以下手写数字识别这个简单小实验:
首先,导入模块
import torch
from torch import nn,optim
from torch.autograd import Variable
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
接下来就是定义各种各样的网络:
#定义简单的三层全连接网络,这个网络不包含激活函数,可以做对比
#传入参数包括:输入维度、第一层神经元个数、第二层神经元个数、输出层神经元个数
class simpleNet(nn.Module):
def __init__(self, in_dim, n_hidden_1, n_hidden_2, out_dim):
super(simpleNet, self).__init__()
self.layer1 = nn.Linear(in_dim, n_hidden_1)
self.layer2 = nn.Linear(n_hidden_1, n_hidden_2)
self.layer3 = nn.Linear(n_hidden_2, out_dim)
def forward(self, x):
x = self.layer1(x)
x = self.layer2(x)
x = self.layer3(x)
return x
#对于上面的简单三层全连接网络加上添加激活函数,用以对比
class Activation_Net(nn.Module):
def __init__(self, in_dim, n_hidden_1, n_hidden_2, out_dim):
super(Activation_Net, self).__init__()
#Sequential是将网络的层组合到一起,如将Linear和ReLU组合到一起作为self.layer
self.layer1 = nn.Sequential(
nn.Linear(in_dim, n_hidden_1), nn.ReLU(True))
self.layer2 = nn.Sequential(
nn.Linear(n_hidden_1, n_hidden_2), nn.ReLU(True))
self.layer3 = nn.Sequential(nn.L