当前位置:   article > 正文

pytorch之过拟合的处理(Dropout)(笔记五)_python nn.sequential dropout

python nn.sequential dropout

使用Dropout解决过拟合的情况发生

修改代码

  1. import numpy as np
  2. import torch
  3. from torch import nn,optim
  4. from torch.autograd import Variable
  5. from torchvision import datasets,transforms
  6. from torch.utils.data import DataLoader
  7. #训练集
  8. train_dataset=datasets.MNIST(root='./', #存放到项目目录下
  9. train=True, #是训练数据
  10. transform=transforms.ToTensor(), #转换成基本类型tensor数据
  11. download=True) #需要下载
  12. #测试集
  13. test_dataset=datasets.MNIST(root='./',
  14. train=False,
  15. transform=transforms.ToTensor(),
  16. download=True)
  17. #每次训练图片的数量
  18. batch_size=64
  19. #装在训练集数据
  20. train_loader=DataLoader(dataset=train_dataset,
  21. batch_size=batch_size,
  22. shuffle=True
  23. )
  24. #加载训练集
  25. test_loader=DataLoader(dataset=test_dataset,
  26. batch_size=batch_size,
  27. shuffle=True
  28. )
  29. for i,data in enumerate(train_loader):
  30. inputs,labels=data
  31. print(inputs.shape)
  32. print(labels.shape)
  33. break
  34. #定义网络结构(使用Dropout)
  35. class Net(nn.Module):
  36. def __init__(self):
  37. super(Net,self).__init__()#调用父类方法
  38. #Dropout一部分神经元工作一部分不工作
  39. self.layer1=nn.Sequential(nn.Linear(784,500),nn.Dropout(p=0.5),nn.Tanh())#p=0.5表示50%的神经元不工作
  40. self.layer2 = nn.Sequential(nn.Linear(500, 300), nn.Dropout(p=0.5), nn.Tanh())
  41. self.layer3 = nn.Sequential(nn.Linear(300, 10), nn.Softmax(dim=1))
  42. def forward(self,x):
  43. #[64,1,28,28]----(64,784)四维数据编程2维数据
  44. x=x.view(x.size()[0],-1)#-1表示自动匹配
  45. x=self.layer1(x)
  46. x=self.layer2(x)
  47. x=self.layer3(x)
  48. return x
  49. LR=0.5
  50. #定义模型
  51. model=Net()
  52. #定义代价函数(均方差)
  53. mse_loss=nn.MSELoss()
  54. #定义优化器
  55. optimizer=optim.SGD(model.parameters(),LR)
  56. def train():
  57. # 表示训练状态, #Dropout一部分神经元工作一部分不工作
  58. model.train()
  59. for i,data in enumerate(train_loader):
  60. #获得一个皮次数据和标签
  61. inputs,labels=data
  62. #获得模型预测结果(64,10
  63. out=model(inputs)
  64. #to onehot,把数据编码变成独热编码
  65. #(64)编程(64,-1
  66. labels=labels.reshape(-1,1)
  67. #tensor.scatter(dim,index,src)
  68. #dim对那个维度进行独热编码
  69. #index:要将src中对应的值放到tensor的哪个位置
  70. #src:插入index的数值
  71. one_hot=torch.zeros(inputs.shape[0],10).scatter(1,labels,1)
  72. #计算loss,mse_loss的俩个数据的shape要一致
  73. loss=mse_loss(out,one_hot)
  74. #梯度清零
  75. optimizer.zero_grad()
  76. #计算梯度
  77. loss.backward()
  78. #修改权值
  79. optimizer.step()
  80. #测试
  81. def test():
  82. # 表示模型测试状态,#Dropout所有神经元都要工作
  83. model.eval()
  84. correct=0
  85. for i,data in enumerate(test_loader):
  86. #获取一个批次的数据和标签
  87. inputs,labels=data
  88. #获得模型的预测结果(64,10
  89. out=model(inputs)
  90. #获取最大值,以及最大值所在的位置
  91. _,predicted=torch.max(out,1)
  92. # 预测正确的数量
  93. correct += (predicted == labels).sum()
  94. print("Test acc:{0}".format(correct.item()/len(test_dataset)))
  95. correct = 0
  96. for i, data in enumerate(train_loader):
  97. # 获取一个批次的数据和标签
  98. inputs, labels = data
  99. # 获得模型的预测结果(64,10
  100. out = model(inputs)
  101. # 获取最大值,以及最大值所在的位置
  102. _, predicted = torch.max(out, 1)
  103. # 预测正确的数量
  104. correct += (predicted == labels).sum()
  105. print("Train acc:{0}".format(correct.item() / len(train_dataset)))
  106. for epoch in range(10):
  107. print("epoch:",epoch)
  108. train()
  109. test()

主要代码:

  1. #定义网络结构(使用Dropout)
  2. class Net(nn.Module):
  3. def __init__(self):
  4. super(Net,self).__init__()#调用父类方法
  5. #Dropout一部分神经元工作一部分不工作
  6. self.layer1=nn.Sequential(nn.Linear(784,500),nn.Dropout(p=0.5),nn.Tanh())#p=0.5表示50%的神经元不工作
  7. self.layer2 = nn.Sequential(nn.Linear(500, 300), nn.Dropout(p=0.5), nn.Tanh())
  8. self.layer3 = nn.Sequential(nn.Linear(300, 10), nn.Softmax(dim=1))
  9. def forward(self,x):
  10. #[64,1,28,28]----(64,784)四维数据编程2维数据
  11. x=x.view(x.size()[0],-1)#-1表示自动匹配
  12. x=self.layer1(x)
  13. x=self.layer2(x)
  14. x=self.layer3(x)
  15. return x

测试结果对比:

  1. F:\开发工具\pythonProject\tools\venv\Scripts\python.exe F:/开发工具/pythonProject/tools/pytools/pytools032.py
  2. torch.Size([64, 1, 28, 28])
  3. torch.Size([64])
  4. epoch: 0
  5. Test acc:0.8875
  6. Train acc:0.8811
  7. epoch: 1
  8. Test acc:0.9111
  9. Train acc:0.9065833333333333
  10. epoch: 2
  11. Test acc:0.9178
  12. Train acc:0.91535
  13. epoch: 3
  14. Test acc:0.9234
  15. Train acc:0.92
  16. epoch: 4
  17. Test acc:0.9259
  18. Train acc:0.9243166666666667
  19. epoch: 5
  20. Test acc:0.9285
  21. Train acc:0.9270833333333334
  22. epoch: 6
  23. Test acc:0.9296
  24. Train acc:0.9291
  25. epoch: 7
  26. Test acc:0.9331
  27. Train acc:0.9323
  28. epoch: 8
  29. Test acc:0.9357
  30. Train acc:0.9348
  31. epoch: 9
  32. Test acc:0.9366
  33. Train acc:0.93645
  34. Process finished with exit code 0

另外一种正则化解决过拟合方案:建议网络结构复杂的情况下使用

  1. LR=0.5
  2. #定义模型
  3. model=Net()
  4. #定义代价函数(均方差)
  5. mse_loss=nn.MSELoss()
  6. #定义优化器,weight_decay设置L2正则化
  7. optimizer=optim.SGD(model.parameters(),LR,weight_decay=0.001)

测试结果:

  1. F:\开发工具\pythonProject\tools\venv\Scripts\python.exe F:/开发工具/pythonProject/tools/pytools/pytools033.py
  2. torch.Size([64, 1, 28, 28])
  3. torch.Size([64])
  4. epoch: 0
  5. Test acc:0.883
  6. Train acc:0.8743166666666666
  7. epoch: 1
  8. Test acc:0.8962
  9. Train acc:0.8936833333333334
  10. epoch: 2
  11. Test acc:0.9044
  12. Train acc:0.9002833333333333
  13. epoch: 3
  14. Test acc:0.9043
  15. Train acc:0.90135
  16. epoch: 4
  17. Test acc:0.9051
  18. Train acc:0.9009
  19. epoch: 5
  20. Test acc:0.9035
  21. Train acc:0.9002166666666667
  22. epoch: 6
  23. Test acc:0.9067
  24. Train acc:0.9016833333333333
  25. epoch: 7
  26. Test acc:0.9052
  27. Train acc:0.9004166666666666
  28. epoch: 8
  29. Test acc:0.9036
  30. Train acc:0.9023333333333333
  31. epoch: 9

pytorch的优化器介绍:优化器原理都是随机梯度下降法


Adadelta、Adagrad、Adam、Adamx、AdamW、ASGD、LBFGS、RMSprop、Rprop、SGD、SparseAdam

 

总结:

Dropout和正则化看情况适用,建议网络复杂的情况下使用,用了不一定效果就好。

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

闽ICP备14008679号