Pytorch:VGG16训练CIFAR10数据集出现bug之总结

@Pytorch:VGG16训练CIFAR10数据集出现bug之总结

从github上下载的源码是LeNet训练Mnist数据集,我寻思着我用vgg16网络训练一下cifar10数据集试试呗。然后就是疯狂的出现各种各样的bug,de完一个又一个,人生真的是不停的debug啊。还好,经过不懈的努力与坚持,终于vgg16训练cifar10获得了成功。现在总结一下我实现过程中出现的问题,供我后面复习以及大家学习。

bug1:网络可以跑起来,但是无论训练多少epoch,训练时损失率不下降,准确率保持不变,一直是10%。

这个问题困扰了我很久,后来查看各种资料,原因可能如下:
1、学习率设置不当,通常情况下设为:0.01-0.1,设置过小,学习慢。
2、损失函数设置不当,可以考虑选用交叉熵损失函数(criterion = torch.nn.CrossEntropyLoss().cuda())
3、网络结构网络结构不对。(我选的vgg16网络吧,害,直接copy了网上的一段,但是根本不适用于我的情况,提醒小伙伴们,要根据实际做适当修改哦)

网络修改:前面卷积层提取特征都一样,无需改动。全连接层需要根据自己的输入数据集大小做出改变。

官方的输入图片是224×224,经过卷积和池化,到全连接层的第一层是大小变为512×7×7,当用32×32的CIFAR10图片时,经过卷积和池化,到全连接层的第一层是大小变为512乘1乘1。因此在下方全连接层的第一层nn.Linear(512×7×7, 4096)处,需改为nn.Linear(512×1×1, 4096)。其中4096是自己设置的神经元的个数。官方的为4096,是一个经验值,我们在设置时,不小于分类大小就行(此处num_classes = 10,我设为512)。

以下是官方VGG16代码:

vgg16 = [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M']

class VGG(nn.Module):
	def __init__(self, in_channels=3, num_classes=10):
		super(VGG, self).__init__()
		self.in_channels = in_channels
		self.conv = self._make_layer(vgg16)

		self.fc = nn.Sequential(
			nn.Linear(512*7*7, 4096),
			nn.ReLU(),
			nn.Dropout(p=0.5),
			nn.Linear(4096, 4096),
			nn.ReLU(),
			nn.Dropout(p=0.5),
			nn.Linear(4096, num_classes)
			)

	def forward(self, x):
		x = self.conv(x)
		x = x.reshape(x.shape
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值