#AI挑战营第一站#MNIST手写数字识别的成功复现没有优化
[复制链接]
本帖最后由 crimsonsnow 于 2024-4-25 22:55 编辑
首先说下配置,因为我N卡的电脑内存爆了...CUDA安装不上。最后我使用的电脑是A卡,没有GPU,直接使用CPU进行训练的类型。
然后python环境管理工具是anaconda,代码环境是pycharm。
不像大神们轻轻松松,我在配置环境的时候遭遇了数不胜数...的问题,光是成功复现实例都用尽全力了...辛酸泪尽在不言中,非常抱歉我懂是我菜。在这里只能着重给大家分享下踩坑经历了。
首先是经典matlabplot问题,没有深入去搜索,按照CSDN上找到的随便一篇帖子,是在设置中关闭在pycharm直接显示图像的功能,然后在下方加plt.show()函数。没解决。第二个问题是matlib和qt包版本可能不兼容,卸载重下。但问题依然没有解决。所以我就搁置了,换方法。
哦对了还有装包的时候注意去anaconda的命令行而不是主机的命令行(虽然好像也可以?)的问题,虽然大家的水平应该都不会犯我这么菜的错误了吧,哈哈...
然后我一开始是用VS的,后来发现还是pycharm才是python亲妈,插件也会主动提示帮你装,所以还是用pycharm开发python环境更好。不过这都不是我弃用vscode的直接原因,因为我又双叒叕在vs上遇到问题了。我用VS复现一个实例的时候,虽然能跑通,但是模型无法进行自动保存,白跑了。是换了pycharm的时候才解决的,这问题就比较诡异了我理解不了,只能建议大家都去用pycharm。
总而言之,大部分的问题装好包和配置好环境就能解决,然后复现就是比较简单的事情了。
然后代码部分我基本全是参考的优秀坛友教程,非常感谢前人探路,后人乘凉,大家都非常的优秀!
环境配置就不再说了,anaconda基本就是打开官网下载然后安装就结束了,只要你的电脑内存够,基本啥事没有,老生常谈的问题就是注意配置环境变量path。而在安装的时候有个选项是可以直接勾选的,虽然勾选会给你飘红,但反正我是勾了,目前还没啥问题。
如果不进行官方勾选写入路径,就需要自己搜索找到路径文件然后写入几条了,具体内容网上教程很多,不再赘述。
模型训练就不是很困难的部分了,我在这里也是给大家读优秀源码罢了。
第二个尝试也是参考(你们都懂得这是说话的艺术)坛友的模型设计,包含三个卷积层和两个全连接层。每个卷积层后面都跟着一个批量归一化(Batch Normalization)层和ReLU激活函数,然后是一个最大池化层。在全连接层之间,还有一个Dropout层用于防止过拟合。话说我是不是要@一下原作者比较好,但我不知道论坛怎么@人,只能先感谢所有的坛友了。。
- class OptimizedConvNet(nn.Module):
- def __init__(self, num_classes=10):
- super(OptimizedConvNet, self).__init__()
- self.layer1 = nn.Sequential(
- nn.Conv2d(1, 16, kernel_size=5, stride=1, padding=2),
- nn.BatchNorm2d(16),
- nn.ReLU(),
- nn.MaxPool2d(kernel_size=2, stride=2))
- self.layer2 = nn.Sequential(
- nn.Conv2d(16, 32, kernel_size=5, stride=1, padding=2),
- nn.BatchNorm2d(32),
- nn.ReLU(),
- nn.MaxPool2d(kernel_size=2, stride=2))
- self.layer3 = nn.Sequential(
- nn.Conv2d(32, 64, kernel_size=5, stride=1, padding=2),
- nn.BatchNorm2d(64),
- nn.ReLU(),
- nn.MaxPool2d(kernel_size=2, stride=2))
- self.fc1 = nn.Linear(3 * 3 * 64, 500)
- self.dropout = nn.Dropout(0.5)
- self.fc2 = nn.Linear(500, num_classes)
-
- def forward(self, x):
- out = self.layer1(x)
- out = self.layer2(out)
- out = self.layer3(out)
- out = out.reshape(out.size(0), -1)
- out = self.fc1(out)
- out = self.dropout(out)
- out = self.fc2(out)
- return out
-
然后是超参数和损失函数,可以通过改这些参数来优化模型,即使是小白如我也知道(废话中的废话),不过单纯修改参数作用并不大,我是没看出什么来(又是一句废话)
-
- learning_rate = 0.001
- batch_size = 64
- num_epochs = 10
-
-
- criterion = nn.CrossEntropyLoss()
- optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
-
-
还有就是我看到大家选择的引入mnist训练集和测试集的方法基本都是直接引入下载函数,download=True那个,相对来说,我还没有遇到过MNIST下载出现的问题,当然,这个也可以先下载好了然后本地引入。注意到MNIST本地引入的教程大多是20,19年之前的东西了,之后基本直接下载不再出现什么问题了,这说明了什么呢,可能是网变好了(对不起我真的不知道
- def load_mnist():
-
- path = r'C:\Users\Administrator\Desktop\study\mnist.npz'
- f = np.load(path)
- x_train, y_train = f['x_train'], f['y_train']
- x_test, y_test = f['x_test'], f['y_test']
- f.close()
- return (x_train, y_train), (x_test, y_test)
-
- (train_image,train_label),(test_image,test_label) = load_mnist()
以及我看到很多人都做了GPU和CPU验证,以便在拥有GPU的情况能够挪到GPU上进行训练,当然我这边是一直只有CPU的了。。。
|