import torch
from sympy.physics.vector.printing import params
from torch.nn import CrossEntropyLoss
from torch.utils import data
from torch import nn
import d2l
import torchvision
from torchvision import transforms
import matplotlib.pyplot as plt
trans = transforms.ToTensor() #把图片转成预处理,转成张量
mnist_train = torchvision.datasets.FashionMNIST(
    root="D:\PycharmDocument\limu\data", train=True, transform=trans, download=True)
mnist_test = torchvision.datasets.FashionMNIST(
    root="D:\PycharmDocument\limu\data", train=False, transform=trans, download=True)
batch_size=256
train_iter = data.DataLoader(mnist_train, batch_size, shuffle=True,num_workers=0)
test_iter = data.DataLoader(mnist_test, batch_size, shuffle=True,num_workers=0)
net=nn.Sequential(nn.Flatten(),nn.Linear(784,256),nn.ReLU(),nn.Dropout(0.8),nn.Linear(256,256),
                  nn.ReLU(),nn.Dropout(0.2),nn.Linear(256,10))
def init_weights(m):
    if type(m) == nn.Linear:
        nn.init.normal_(m.weight, std=0.01)
net.apply(init_weights)
loss=CrossEntropyLoss(reduction='none')
num_epochs=50
trainer=torch.optim.SGD(net.parameters(),lr=0.5)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)
plt.ioff()
plt.show(block=True)

dropout1,dropout2分别设为(0,0)(1,1)(0.5,0.5)(0.2,0.8).为什么没有明显变化

训练时间太短:Dropout 通过随机丢弃神经元迫使模型在每次训练时采用不同的神经网络子集。网络在训练初期可能没有足够的时间适应这种“不稳定性”,因此它可能会在训练过程中表现得和没有使用 Dropout 时差不多。

学习率太小:太小的学习率使得收敛很慢

增加epoch=50

(0.2,0.8)(0,0)

每层神经元过多,导致网络在训练时变得过于复杂,无法有效地从数据中学习到有用的模式,出现过拟合。因此采用dropout使其变得更平滑

学习率过高:学习率过高时,模型在参数更新时会产生较大的变化,这可能导致训练过程不稳定,出现训练损失激增和波动的情况。尤其是对于 梯度更新,如果学习率太大,模型可能会在最小化损失时越过最优点,从而使损失出现剧烈波动。

更多推荐