Python 尝试在机器学习程序中使用MNIST/EMNIST字母数据集时出现值错误
我有一个机器学习程序,我正试图训练使用计算机识别手写字符。我一直收到一个错误 我已经尝试过改变描述数据集形状的元组,但没有成功Python 尝试在机器学习程序中使用MNIST/EMNIST字母数据集时出现值错误,python,machine-learning,keras,mnist,Python,Machine Learning,Keras,Mnist,我有一个机器学习程序,我正试图训练使用计算机识别手写字符。我一直收到一个错误 我已经尝试过改变描述数据集形状的元组,但没有成功 import os#用于修改文件、创建目录等。 导入keras#简化TensorFlow库 从pyplot导入matplotlib.pyplot作为plt#图像显示 将numpy导入为高等数学的np#numpy 导入随机#用于在MNIST数据集中拾取随机值 从keras.models导入顺序#为AI学习启用顺序层 从keras.layers导入稠密#启用稠密层 从ker
import os#用于修改文件、创建目录等。
导入keras#简化TensorFlow库
从pyplot导入matplotlib.pyplot作为plt#图像显示
将numpy导入为高等数学的np#numpy
导入随机#用于在MNIST数据集中拾取随机值
从keras.models导入顺序#为AI学习启用顺序层
从keras.layers导入稠密#启用稠密层
从keras.layers导入Conv2D#启用二维卷积神经网络层
从keras.layers导入MaxPoolig2D#启用最大池层
从keras.layers导入退出#启用退出层
从keras.layers导入展平#启用展平层
从keras.datasets导入mnist#导入mnist数据集
从emnist导入提取\训练\样本
从keras.callbacks导入ModelCheckpoint#导入ModelCheckpoint以保存进度
图像、标签=提取样本(“字母”)
图像=图像。重塑(-1,28,28,1)
打印(图像)
labels=keras.utils.to_category(labels,num_classes=27)
images=images.astype('float32')
图像/=255
labels=keras.utils.to_category(labels,num_classes=27)
model=Sequential()#使用顺序层进行人工智能培训
添加(Conv2D(32,(3,3),activation='relu',input_shape=(28,28,1)))
添加(Conv2D(64,(3,3),activation='relu'))
add(MaxPooling2D(池大小=(2,2)))
model.add(展平())
添加(密集(128,激活='relu'))
模型添加(辍学率=0.3))
添加(密集(27,激活='softmax'))
model.summary()
如果操作系统路径存在(“./saves/main\u EMNIST\u v2.hdf5”):
如果输入(“上一型号的负载重量合适?(Y/N)\t”).lower()=“Y”:
负载=真
其他:
加载=错误
其他:
加载=错误
如果操作系统路径不存在(“./saves/”):
os.makedirs(“保存”)
如果加载:
打印(“从以前的模型拟合加载重量…\t”,end=”“)
型号负载重量(“./saves/main\u EMNIST\u v2.hdf5”)
打印(“完成”)
如果输入(“保存最佳模型拟合的权重?(Y/N)\t”).lower()=“Y”:
save=True;
其他:
save=False;
images=images.reshape(images.shape[0],1,28,28)
"""
标签=keras.utils.to_分类(标签,6)
y_检验=keras.utils.to_分类(y_检验,6)
"""
plt.imshow(图像[54000][0],cmap='gray')
plt.show()
compile(loss=keras.loss.categorical_crossentropy,optimizer=keras.optimizers.Adadelta(),metrics=['accurity']))
回调\u列表=[]
如果保存:
filepath=“./saves/main\u EMNIST\u v2.hdf5”
checkpoint=ModelCheckpoint(文件路径,monitor='acc',verbose=1,save\u best\u only=True,mode='max')
回调\u列表=[检查点]
history=model.fit(图像、标签、批次大小=64、epochs=int(输入(“输入epochs number.建议值为5.\t”)、10)、verbose=1、callbacks=callbacks\u列表)
#为了简洁起见,省略了这一点之后的代码。
我收到了以下错误消息:
Traceback (most recent call last):
File "OCIR_EMNIST_v2.py", line 74, in <module>
history = model.fit(images, labels, batch_size=64, epochs=int(input("Input epochs number. Recommended value is 5.\t"), 10), verbose=1, callbacks=callbacks_list)
File "/home/user/.local/lib/python3.7/site-packages/keras/engine/training.py", line 952, in fit
batch_size=batch_size)
File "/home/user/.local/lib/python3.7/site-packages/keras/engine/training.py", line 751, in _standardize_user_data
exception_prefix='input')
File "/home/user/.local/lib/python3.7/site-packages/keras/engine/training_utils.py", line 138, in standardize_input_data
str(data_shape))
ValueError: Error when checking input: expected conv2d_1_input to have shape (28, 28, 1) but got array with shape (1, 28, 28)
回溯(最近一次呼叫最后一次):
文件“OCIR\u EMNIST\u v2.py”,第74行,在
history=model.fit(图像、标签、批次大小=64、epochs=int(输入(“输入epochs number.建议值为5.\t”)、10)、verbose=1、callbacks=callbacks\u列表)
文件“/home/user/.local/lib/python3.7/site-packages/keras/engine/training.py”,第952行,适合
批次大小=批次大小)
文件“/home/user/.local/lib/python3.7/site packages/keras/engine/training.py”,第751行,在用户数据中
异常(前缀为“输入”)
文件“/home/user/.local/lib/python3.7/site packages/keras/engine/training\u utils.py”,第138行,在标准化输入数据中
str(数据形状))
ValueError:检查输入时出错:预期conv2d_1_输入具有形状(28,28,1),但获得具有形状(1,28,28)的数组
错误很明显,它需要(28,28,1)
图像,而您提供的是(1,28,28)
图像。请看代码中的这两行:
images = images.reshape(-1, 28, 28, 1)
images = images.reshape(images.shape[0], 1, 28, 28)
这里的第一行是正确的,重塑为
(28,28,1)
,而第二行则相反,产生了错误。只需从代码中删除部分images=images.reformate(images.shape[0],1,28,28)
。您的错误消息不完整,请添加整个回溯。提供了整个回溯。回溯仍然相同,您没有添加新信息。回溯已经完成。否,回溯在末尾有一条异常消息,但在您的回溯中不存在。我说的是“我收到了这个错误信息:”下的回溯。请注意,没有这些信息,任何人都无法帮助您。这也会返回一个。它太大,无法在此处发布,但可以通过@Ben访问。在您的代码中,您对标签进行了两次热编码,只需要一次。