当前位置:   article > 正文

深度学习/联邦学习笔记(五)多层全连接神经网络实现MNIST手写数字分类+Pytorch代码_用联邦学习实现神经网络的python代码

用联邦学习实现神经网络的python代码

深度学习/联邦学习笔记(五)

多层全连接神经网络实现MNIST手写数字分类+Pytorch代码

神经网络是一个有神经元构成的无环图,神经网络一般以层来组织,最常见的是全连接神经网络,其中两个相邻层中每一个层的所有神经元和另外一个层的所有神经元相连,每个层内部的神经元不相连,如下图(隐藏层可以有多层):

先在一个net.py文件中,定义一些相关的神经网络和激活函数等等

  1. import torch
  2. from torch import nn, le
  3. from torch.autograd import Variable
  4. #简单的三层全连接神经网络
  5. class simpleNet(nn.Module):
  6. # 对于这个三层网络,需要传入的参数有:输入的维度,第一层网络的神经元个数,第二次网络神经元的个数、第三层网络(输出层)神经元的个数
  7. def __init__(self,in_dim,n_hidden_1,n_hidden_2,out_dim):
  8. super(simpleNet, self).__init__()
  9. self.layer1 = nn.Linear(in_dim,n_hidden_1)
  10. self.layer2 = nn.Linear(n_hidden_1,n_hidden_2)
  11. self.layer3 = nn.Linear(n_hidden_2,out_dim)
  12. def forward(self,x):
  13. x = self.layer1(x)
  14. x = self.layer2(x)
  15. x = self.layer3(x)
  16. return x
  17. #添加激活函数,增加网络的非线性
  18. class Activation_Net(nn.Module):
  19. def __init__(self,in_dim,n_hidden_1,n_hidden_2,out_dim):
  20. #只需要在每层网络的输出部分添加激活函数即可,此处用的是ReLU激活函数
  21. super(Activation_Net, self).__init__()
  22. self.layer1 = nn.Sequential( #nn.Sequential()是将网络的层组合在一起,如下面将nn.Linear()和nn.ReLU()组合到一起作为self.layer1
  23. nn.Linear(in_dim,n_hidden_1),nn.ReLU(True))
  24. self.layer2 = nn.Sequential(
  25. nn.Linear(n_hidden_1,n_hidden_2),nn.ReLU(True) )
  26. self.layer3 = nn.Sequential(nn.Linear(n_hidden_2,out_dim) ) #最后一层输出层不能添加激活函数
  27. def forward(self,x):
  28. x = self.layer1(x)
  29. x = self.layer2(x)
  30. x = self.layer3(x)
  31. return x
  32. #最后添加一个加快收敛的方法——批标准化
  33. class Batch_Net (nn.Module) :
  34. def init__ (self,in_dim,n_hidden_1,n_hidden_2,out_dim):
  35. super(Batch_Net, self).__init__()
  36. #同样使用nn.Sequential()将 nn .BatchNormld()组合到网络层中,注意批标准化一般放在全连接层的后面、非线性层(激活函数)的前面
  37. self.layerl = nn.Sequential(
  38. nn.Linear(in_dim,n_hidden_1),
  39. nn .BatchNormld(n_hidden_1), nn.ReLU(True))
  40. self.layer2 = nn. Sequential(
  41. nn.Linear(n_hidden_1,n_hidden_2),
  42. nn. BatchNormld(n_hidden_2), nn. ReLU(True))
  43. self.layer3 = nn.Sequential (nn.Linear (n_hidden_2,out_dim))
  44. def forward(self, x) :
  45. x = self.layer1(x)
  46. x = self.layer2(x)
  47. x = self.layer3 (x)
  48. return x

在另一个py文件中,训练网络,代码如下:

  1. import torch
  2. from torch import nn,optim
  3. from torch.autograd import Variable
  4. from torch.utils.data import DataLoader
  5. from torchvision import datasets,transforms
  6. import net
  7. #定义一些超参数
  8. batch_size = 64
  9. learning_rate = 1e-2
  10. num_epoches = 20
  11. #数据预处理,即将数据标准化,此处用的是torchvision.transforms
  12. data_tf = transforms.Compose( #transforms.Compose将各种预处理操作组合到一起
  13. [transforms.ToTensor(), #将图片转换成pytorch中处理的对象tensor
  14. transforms.Normalize([0.5],[0.5])] #该函数需要传入两个参数,第一个是均值,第二个是方差,其处理是减均值,再除以方差;即减去0.5再除以0.5,这样能把图片转化到-11
  15. )
  16. #下载训练集MNIST手写数字训练集
  17. train_dataset = datasets.MNIST( #通过pytorch内置函数torchvision.datasets.MNIST导入数据集
  18. root='./data', train=True, transform = data_tf, download = True)
  19. test_dataset = datasets.MNIST (root='./data', train = False, transform = data_tf,download = True)
  20. #使用torch.utils.data.DataLoader建立数据迭代器,传入数据集和batch_size,通过shuffle=True来表示每次迭代数据时是否将数据打乱
  21. train_loader = DataLoader (train_dataset, batch_size = batch_size, shuffle = True)
  22. test_loader = DataLoader (test_dataset, batch_size = batch_size, shuffle = False)
  23. #导入网络,定义损失函数和优化方法
  24. model = net.simpleNet(28 * 28, 300, 100, 10) #net.simpleNet是简单的三层网络,输入维度是28*28,两个隐藏层是300100,最后输出结果必须是10,有0-9个分类结果
  25. if torch. cuda.is_available():
  26. model = model.cuda ()
  27. criterion = nn. CrossEntropyLoss() #使用损失函数交叉熵来定义损失函数
  28. optimizer = optim.SGD (model.parameters(), lr=learning_rate) #用随机梯度下降来优化损失函数
  29. #开始训练模型
  30. model.eval()
  31. eval_loss = 0
  32. eval_acc = 0
  33. for data in test_loader:
  34. img, label = data
  35. img = img.view(img.size(0), -1)
  36. if torch. cuda.is_available() :
  37. img = Variable(img, volatile = True) . cuda()
  38. label = Variable(label, volatile = True) .cuda()
  39. else:
  40. img = Variable(img, volatile = True)
  41. label = Variable(label, volatile = True)
  42. out = model(img)
  43. loss = criterion(out, label)
  44. eval_loss += loss.item() * label.size(0)
  45. _, pred = torch.max(out, 1)
  46. num_correct = (pred == label).sum()
  47. eval_acc += num_correct.item()
  48. print('Test Loss: {:.6f}, Acc: {:.6f}'.format(
  49. eval_loss / (len(test_dataset)),
  50. eval_acc / (len(test_dataset))))

运行结果如下:

  1. C:\Users\Administrator\anaconda3\python.exe "D:/paper reading/code/learningcode/trainnet.py"
  2. D:/paper reading/code/learningcode/trainnet.py:52: UserWarning: volatile was removed and now has no effect. Use `with torch.no_grad():` instead.
  3. img = Variable(img, volatile = True)
  4. D:/paper reading/code/learningcode/trainnet.py:53: UserWarning: volatile was removed and now has no effect. Use `with torch.no_grad():` instead.
  5. label = Variable(label, volatile = True)
  6. Test Loss: 2.336183, Acc: 0.088200
  7. Process finished with exit code 0

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/239286?site
推荐阅读
相关标签
  

闽ICP备14008679号