我完全是机器学习的新手,我想从一个相当简单的项目开始:使用mnist数据集进行数字识别。我使用的是keras和tensorflow,并且我开始使用我在这里找到的代码。网络已经正确构建和训练,现在我想做一个简单的预测。首先,我简单地使用了数据集中用于测试的一部分图片中的一张,我希望我的输出是那个数字。(在这种情况下,输出应该是7。)这是我的代码:
# Baseline MLP for MNIST datasetfrom tensorflow.keras.datasets import mnistfrom tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import Densefrom keras.utils import np_utilsimport numpy as np# load data(X_train, y_train), (X_test, y_test) = mnist.load_data()# flatten 28*28 images to a 784 vector for each imagenum_pixels = X_train.shape[1] * X_train.shape[2]X_train = X_train.reshape((X_train.shape[0], num_pixels)).astype('float32')X_test = X_test.reshape((X_test.shape[0], num_pixels)).astype('float32')# normalize inputs from 0-255 to 0-1X_train = X_train / 255X_test = X_test / 255# one hot encode outputsy_train = np_utils.to_categorical(y_train)y_test = np_utils.to_categorical(y_test)num_classes = y_test.shape[1]# define baseline modeldef baseline_model(): # create model model = Sequential() model.add(Dense(num_pixels, input_dim=num_pixels, kernel_initializer='normal', activation='relu')) model.add(Dense(num_classes, kernel_initializer='normal', activation='softmax')) # Compile model model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) return model# build the modelmodel = baseline_model()print("created model")# Fit the modelmodel.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=10, batch_size=200, verbose=2) print("did model.fit")image_index=0print("correct result : ", y_test[image_index])print("shape of the array: ", X_test[0].shape)print("predicted result : ", model.predict(X_test[image_index]))
现在我得到了以下错误:
ValueError: Error when checking input: expected dense_input to have shape (784,) but got array with shape (1,)
尽管我的数组确实具有正确的形状!如你所见,我打印了print("shape of the array: ", X_test[0].shape)
,它确实返回了shape of the array: (784,)
。784正是我们想要的维度,但我仍然得到了那个错误。
我花了几个小时试图解决这个问题,但无论我尝试什么(例如重塑数组),似乎都不起作用。显然,对于keras的predict函数或数组存在一些误解。你能帮我理解并解决这个问题吗?提前感谢你。
回答:
所以predict函数仍然期望第0维是样本维度。
当你索引X_test[0]时,你基本上移除了这个维度,这导致predict函数现在有784个1像素的样本!
将你的代码更改为:
print("predicted result : ", model.predict(X_test[0].reshape(-1,num_pixels)))
现在你应该能得到结果概率。
编辑:
如果你只想得到预测的最大概率数字:
print("predicted result : ", np.argmax(model.predict(X_test[0].reshape(-1,num_pixels)), axis = 1))