我是链接
第一次用pytorch写机器学习,不得不说是真的好用
pytorch的学习可以看这里,看看基本用法就行,个人感觉主要还是要看着实践代码来学习
总结了几个点:
1.loss出现nan
这个让我头疼了好久,主要有两个方面吧:一是学习率可能太高了,可以调低一点试试。二是对于这个数据,黑白值颜色深度是用0到255来表示的,让每个颜色深度除以255变成0到1来表示,结果会好很多,准确率也会高很多。
另外听说训练数据里有nan inf 除以0 也会出现nan
2.训练的时候犯傻了,好几万的数据训练的时候只用了前几百个。我还纳闷为啥准确率那么低(89%左右),后来发现barch挺大,但只有几百个训练了。
把上面说的改了后正确率到达98.2%,后面慢慢来改进
神经网络的模型是看着网上的搭建的,2个卷积层和池化层,2个全连接层
import torch
import torch.nn as nn
import pandas as pd
import numpy as np
class WYJ_CNN(nn.Module):
def __init__(self):
super(WYJ_CNN, self).__init__()
self.conv1 = nn.Conv2d(in_channels=1, out_channels=16,
kernel_size=(3, 3),
stride=(1, 1),
padding=1)
self.pool1 = nn.MaxPool2d(kernel_size=2)
self.conv2 = nn.Conv2d(16, 32, 3, 1, 1)
self.pool2 = nn.MaxPool2d(2)
self.zhankai = nn.Flatten()
self.lin1 = nn.Linear(32 * 7 * 7, 16)
self.jihuo = nn.ReLU()
self.lin2 = nn.Linear(16, 10)
def forward(self, x):
x = self.conv1(x)
x = self.pool1(x)
x = self.conv2(x)
x = self.pool2(x)
x = self.zhankai(x)
x = self.lin1(x)
x = self.jihuo(x)
x = self.lin2(x)
return x
myTrain = pd.read_csv('train.csv')
vals = np.array(myTrain.values)
labels = torch.from_numpy(myTrain.values[:, 0])
net = WYJ_CNN()
CalcLoss = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(net.parameters(), lr=0.2)
batch = 128
for cnt in range(10):
for i in range(len(vals) // batch):
tmp = vals[i * batch:(i + 1) * batch, 1:] / 255
tmp = tmp.reshape(batch, 1, 28, 28)
tmp = torch.from_numpy(tmp).float()
outputs = net(tmp)
loss = CalcLoss(outputs, labels[i * batch:(i + 1) * batch])
optimizer.zero_grad()
loss.backward()
optimizer.step()
if i * batch % 1000 == 0:
print("training", i * batch)
torch.save(net, "my_cnn.nn")
myTest = pd.read_csv('test.csv')
ImageId = [];
Label = [];
for i in range(len(myTest)):
tmp = np.array(myTest.values[i][:]) / 255
tmp = tmp.reshape(1, 1, 28, 28)
tmp = torch.from_numpy(tmp).float()
b = net(tmp)
ImageId.append(i + 1)
Label.append(b.argmax().item())
if i % 1000 == 0:
print("testing", i)
myAns = pd.DataFrame({'ImageId': ImageId, 'Label': Label})
myAns.to_csv("myAns.csv", index=False, sep=',')
最近在学飞桨,放一个飞桨版本
import paddle
import paddle.nn as nn
import pandas as pd
import numpy as np
class WYJ_CNN(nn.Layer):
def __init__(self):
super(WYJ_CNN, self).__init__()
self.conv1 = nn.Conv2D(in_channels=1, out_channels=16,
kernel_size=(3, 3),
stride=(1, 1),
padding=1)
self.pool1 = nn.MaxPool2D(kernel_size=2)
self.conv2 = nn.Conv2D(16, 32, 3, 1, 1)
self.pool2 = nn.MaxPool2D(2)
self.zhankai = nn.Flatten()
self.lin1 = nn.Linear(32 * 7 * 7, 16)
self.jihuo = nn.ReLU()
self.lin2 = nn.Linear(16, 10)
def forward(self, x):
x = self.conv1(x)
x = self.pool1(x)
x = self.conv2(x)
x = self.pool2(x)
x = self.zhankai(x)
x = self.lin1(x)
x = self.jihuo(x)
x = self.lin2(x)
return x
myTrain = pd.read_csv('train.csv')
vals = np.array(myTrain.values)
labels = paddle.to_tensor(myTrain.values[:, 0])
net = WYJ_CNN()
CalcLoss = nn.CrossEntropyLoss()
optimizer = paddle.optimizer.SGD(learning_rate =0.2 , parameters=net.parameters() )
batch = 128
for cnt in range(10):
for i in range(len(vals) // batch):
tmp = vals[i * batch:(i + 1) * batch, 1:] / 255
tmp = tmp.reshape(batch, 1, 28, 28)
tmp = paddle.to_tensor(tmp).astype(np.float32)
outputs = net(tmp)
loss = CalcLoss(outputs, labels[i * batch:(i + 1) * batch])
optimizer.clear_grad()
loss.backward()
optimizer.step()
if i * batch % 1000 == 0:
print("training", i * batch)
myTest = pd.read_csv('test.csv')
ImageId = [];
Label = [];
for i in range(len(myTest)):
tmp = np.array(myTest.values[i][:]) / 255
tmp = tmp.reshape(1, 1, 28, 28)
tmp = paddle.to_tensor(tmp).astype(np.float32)
b = net(tmp)
ImageId.append(i + 1)
Label.append(b.argmax().item())
if i % 1000 == 0:
print("testing", i)
myAns = pd.DataFrame({'ImageId': ImageId, 'Label': Label})
myAns.to_csv("myAns.csv", index=False, sep=',')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
2020-03-05 [武汉加油] luogu P6178 【模板】Matrix-Tree 定理