Machine learning 训练从Keras检索的MNIST数据集时PyTorch MLP存在问题

Machine learning 训练从Keras检索的MNIST数据集时PyTorch MLP存在问题,machine-learning,neural-network,keras,pytorch,mnist,Machine Learning,Neural Network,Keras,Pytorch,Mnist,我已经完成了MNIST数据集的PyTorch MLP模型,但得到了两个不同的结果:使用Pytork的MNIST数据集时精度为0.90+,但使用Keras的MNIST数据集时精度为~0.10。 下面是我的依赖代码:PyTorch 0.3.0.post4、keras 2.1.3、tensorflow后端1.4.1 gpu版本 来自未来导入绝对导入 来自未来进口部 来自未来导入打印功能 将numpy作为np导入 进口火炬为pt 导入torchvision作为ptv 从keras.dataset导入mn

我已经完成了MNIST数据集的PyTorch MLP模型,但得到了两个不同的结果:使用Pytork的MNIST数据集时精度为0.90+,但使用Keras的MNIST数据集时精度为~0.10。 下面是我的依赖代码:PyTorch 0.3.0.post4、keras 2.1.3、tensorflow后端1.4.1 gpu版本

来自未来导入绝对导入
来自未来进口部
来自未来导入打印功能
将numpy作为np导入
进口火炬为pt
导入torchvision作为ptv
从keras.dataset导入mnist
从torch.nn导入功能为F
从torch.utils.data导入数据集,数据加载器
#PyTorch的培训数据
train\u set=ptv.dataset.MNIST(“./data/MNIST/train”,train=True,transform=ptv.transforms.ToTensor(),download=True)
test_set=ptv.dataset.MNIST(“./data/MNIST/test”,train=False,transform=ptv.transforms.ToTensor(),download=True)
序列数据集=数据加载器(序列集,批量大小=100,随机播放=True)
测试数据集=数据加载器(测试集,批量大小=10000,随机播放=真)
MLP类(零件号模块):
“多层感知器”
定义初始化(自):
超级(MLP,self)。\uuuu init\uuuuu()
self.fc1=pt.nn.Linear(784512)
self.fc2=pt.nn.Linear(512,128)
self.fc3=pt.nn.线性(128,10)
self.use\gpu=True
def前进档(自身、din):
din=din.视图(-1,28*28)
dout=F.relu(自fc1(din))
dout=F.relu(自身fc2(dout))
#返回F.softmax(自身fc3(dout))
返回自我。fc3(dout)
model=MLP().cuda()
打印(模型)
#损失函数与最优解
optimizer=pt.optim.SGD(model.parameters(),lr=1)
标准=pt.nn.CrossEntropyLoss().cuda()
def评估_acc(pred,标签):
pred=pred.cpu().data.numpy()
label=label.cpu().data.numpy()
test_np=(np.argmax(pred,1)=标签)
test\u np=np.float32(test\u np)
返回np.平均值(测试np)
def评估_加载器(加载器):
打印(“评估…”)
准确度列表=[]
对于枚举(加载器)中的i(输入、标签):
inputs=pt.autograd.Variable(inputs).cuda()
labels=pt.autograd.Variable(labels.cuda())
输出=模型(输入)
准确性列表。附加(评估附件(输出、标签))
打印(总和(准确度列表)/长度(准确度列表))
def培训(d,历代):
对于范围内的x(历元):
对于i,枚举(d)中的数据:
optimizer.zero_grad()
(输入、标签)=数据
inputs=pt.autograd.Variable(inputs).cuda()
labels=pt.autograd.Variable(labels.cuda())
输出=模型(输入)
损失=标准(输出、标签)
loss.backward()
optimizer.step()
如果i%200==0:
打印(i,“:”,评估(输出、标签))
#使用PyTorch的MNIST数据集为4个时代培训MLP
培训(培训数据集,4)
#精度约为0.96。
评估加载程序(测试数据集)
3月月日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日##########################
def load_mnist():
(x,y),(x_测试,y_测试)=mnist.load_data()
x=x.重塑(-1,1,28,28)).aType(np.32)
x_检验=x_检验。重塑(-1,1,28,28))。aType(np.32)
y=y.aType(np.int64)
y_test=y_test.astype(np.int64)
打印(“x.shape”,x.shape,“y.shape”,y.shape,
“\nx\u test.shape”、x\u test.shape、“y\u test.shape”、y\u test.shape、,
)
返回x,y,x_测试,y_测试
类TMPDataset(数据集):
“”“加载Keras MNIST数据集的日期集。”“”
定义初始化(self,a,b):
self.x=a
self.y=b
定义获取项目(自身,项目):
返回self.x[项目],self.y[项目]
定义(自我):
返回len(self.y)
x_列,y_列,x_测试,y_测试=负载列表()
#从Keras为MNIST数据集创建数据加载器。
test\u loader=DataLoader(TMPDataset(x\u测试,y\u测试),num\u workers=1,batch\u size=10000)
序列加载器=数据加载器(TMPDataset(x序列,y序列),随机播放=真,批量大小=100)
#评估在PyTorch数据集上训练的MLP的性能,accurach为~0.96。
评估装载机(测试装载机)
评估装载机(列车装载机)
model=MLP().cuda()
打印(模型)
optimizer=pt.optim.SGD(model.parameters(),lr=1)
标准=pt.nn.CrossEntropyLoss().cuda()
#现在就在Keras的MNIST数据集上训练。
培训(列车装载机,4)
#在来自Keras的MNIST数据集上评估试用模型,结果性能为~0.10。。。
评估装载机(测试装载机)
评估装载机(列车装载机)
我检查了Keras MNIST数据集中的一些样本,没有发现任何错误。 我想知道数据集出了什么问题?
代码可以毫无错误地运行,运行它以查看结果。

来自Keras的MNIST数据未标准化;按照,您应该手动执行,即您应该在
load_data()
函数中包含以下内容:

x /= 255
x_test /= 255
关于PyTorch不太确定,但是看起来MNIST数据来自它们自己的实用函数,已经被规范化了(就像Tensorflow的情况一样,请参见我回答中的第三点)


在输入数据不规范的情况下,10%的准确率(即相当于随机猜测)是完全一致的

您包含了太多的代码,很难区分哪些部分适用于哪些部分;请包括一些结果(即Keras、PyTorch的准确性)以及用于生成这些结果的特定代码片段(代码中的一些描述性注释也会很有帮助)。感谢您的评论,我在代码中添加了一些培训结果。