crimsonsnow 发表于 2024-4-25 22:55

#AI挑战营第一站#MNIST手写数字识别的成功复现没有优化

本帖最后由 crimsonsnow 于 2024-4-25 22:55 编辑

<p>&nbsp;</p>

<p>首先说下配置,因为我N卡的电脑内存爆了...CUDA安装不上。最后我使用的电脑是A卡,没有GPU,直接使用CPU进行训练的类型。</p>

<p>然后python环境管理工具是anaconda,代码环境是pycharm。</p>

<p>不像大神们轻轻松松,我在配置环境的时候遭遇了数不胜数...的问题,光是成功复现实例都用尽全力了...辛酸泪尽在不言中,非常抱歉我懂是我菜。在这里只能着重给大家分享下踩坑经历了。</p>

<p>首先是经典matlabplot问题,没有深入去搜索,按照CSDN上找到的随便一篇帖子,是在设置中关闭在pycharm直接显示图像的功能,然后在下方加plt.show()函数。没解决。第二个问题是matlib和qt包版本可能不兼容,卸载重下。但问题依然没有解决。所以我就搁置了,换方法。</p>

<p>哦对了还有装包的时候注意去anaconda的命令行而不是主机的命令行(虽然好像也可以?)的问题,虽然大家的水平应该都不会犯我这么菜的错误了吧,哈哈...</p>

<p>然后我一开始是用VS的,后来发现还是pycharm才是python亲妈,插件也会主动提示帮你装,所以还是用pycharm开发python环境更好。不过这都不是我弃用vscode的直接原因,因为我又双叒叕在vs上遇到问题了。我用VS复现一个实例的时候,虽然能跑通,但是模型无法进行自动保存,白跑了。是换了pycharm的时候才解决的,这问题就比较诡异了我理解不了,只能建议大家都去用pycharm。</p>

<p>总而言之,大部分的问题装好包和配置好环境就能解决,然后复现就是比较简单的事情了。</p>

<p>然后代码部分我基本全是参考的优秀坛友教程,非常感谢前人探路,后人乘凉,大家都非常的优秀!</p>

<p>&nbsp;</p>

<p>环境配置就不再说了,anaconda基本就是打开官网下载然后安装就结束了,只要你的电脑内存够,基本啥事没有,老生常谈的问题就是注意配置环境变量path。而在安装的时候有个选项是可以直接勾选的,虽然勾选会给你飘红,但反正我是勾了,目前还没啥问题。</p>

<p>如果不进行官方勾选写入路径,就需要自己搜索找到路径文件然后写入几条了,具体内容网上教程很多,不再赘述。</p>

<p>&nbsp;</p>

<p>模型训练就不是很困难的部分了,我在这里也是给大家读优秀源码罢了。</p>

<p>&nbsp;第二个尝试也是参考(你们都懂得这是说话的艺术)坛友的模型设计,包含三个卷积层和两个全连接层。每个卷积层后面都跟着一个批量归一化(Batch Normalization)层和ReLU激活函数,然后是一个最大池化层。在全连接层之间,还有一个Dropout层用于防止过拟合。话说我是不是要@一下原作者比较好,但我不知道论坛怎么@人,只能先感谢所有的坛友了。。</p>

<pre>
<code>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
</code></pre>

<p>然后是超参数和损失函数,可以通过改这些参数来优化模型,即使是小白如我也知道(废话中的废话),不过单纯修改参数作用并不大,我是没看出什么来(又是一句废话)</p>

<pre>
<code># 定义超参数
learning_rate = 0.001
batch_size = 64
num_epochs = 10

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

</code></pre>

<p>还有就是我看到大家选择的引入mnist训练集和测试集的方法基本都是直接引入下载函数,download=True那个,相对来说,我还没有遇到过MNIST下载出现的问题,当然,这个也可以先下载好了然后本地引入。注意到MNIST本地引入的教程大多是20,19年之前的东西了,之后基本直接下载不再出现什么问题了,这说明了什么呢,可能是网变好了(对不起我真的不知道</p>

<pre>
<code>def load_mnist():
   
    path = r'C:\Users\Administrator\Desktop\study\mnist.npz' #放置mnist.py的目录。注意斜杠
    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()</code></pre>

<p>以及我看到很多人都做了GPU和CPU验证,以便在拥有GPU的情况能够挪到GPU上进行训练,当然我这边是一直只有CPU的了。。。</p>

Jacktang 发表于 2024-4-26 07:31

<p>玩这个MNIST手写数字识别,用环境是pycharm对电脑配置要求多高么</p>

crimsonsnow 发表于 2024-4-26 09:41

Jacktang 发表于 2024-4-26 07:31
玩这个MNIST手写数字识别,用环境是pycharm对电脑配置要求多高么

<p>我觉得理论来说能装win10的电脑就可以了...说不定从没做过的新机还更好,我的电脑是因为被我玩坏了经常有奇怪的问题</p><br/>

crimsonsnow 发表于 2024-5-9 15:39

<p></p>


<p>不知道为什么找不到帖子编辑的按钮:Sad:补充最佳测试准确率截图97.04%</p><br/>

freebsder 发表于 2024-5-11 17:34

Jacktang 发表于 2024-4-26 07:31
玩这个MNIST手写数字识别,用环境是pycharm对电脑配置要求多高么

<p>MNIST 要求不高,图片本身很小,CPU都能跑下来</p>

通途科技 发表于 2024-10-29 21:10

页: [1]
查看完整版本: #AI挑战营第一站#MNIST手写数字识别的成功复现没有优化