我在Keras中为MNIST数字数据集设置了一个神经网络,结构如下:
input_size = features_train.shape[1]hidden_size = 200output_size = 9lambda_reg = 0.2learning_rate = 0.01num_epochs = 50batch_size = 30model = Sequential()model.add(Dense(input_size, hidden_size, W_regularizer=l2(lambda_reg), init='normal'))model.add(Activation('tanh'))model.add(Dropout(0.5))model.add(Dense(hidden_size, output_size, W_regularizer=l2(lambda_reg), init='normal'))model.add(Activation('softmax'))sgd = SGD(lr=learning_rate, decay=1e-6, momentum=0.9, nesterov=True)model.compile(loss='mean_squared_error', optimizer=sgd)history = History()model.fit(features_train, labels_train, batch_size=batch_size, nb_epoch=num_epochs, show_accuracy=True, verbose=2, validation_split=0.2, callbacks=[history])score = model.evaluate(features_train, labels_train, show_accuracy=True, verbose=1)predictions = model.predict(features_train)print('Test score:', score[0])print('Test accuracy:', score[1])
features_train的形状为(1000,784),labels_train的形状为(1000,1),它们都是numpy数组。我希望有784个输入节点,200个隐藏节点和9个输出节点来对数字进行分类
我一直遇到输入维度不匹配的错误:
Input dimension mis-match. (input[0].shape[1] = 9, input[1].shape[1] = 1)Apply node that caused the error: Elemwise{Sub}[(0, 0)](AdvancedSubtensor1.0, AdvancedSubtensor1.0)Inputs types: [TensorType(float32, matrix), TensorType(float32, matrix)]Inputs shapes: [(30L, 9L), (30L, 1L)]Inputs strides: [(36L, 4L), (4L, 4L)]Inputs values: ['not shown', 'not shown']
我在试图找出维度可能出错的地方,但没有发现问题。有人能看出问题所在吗?
回答:
我训练两类分类模型已经很久了,我习惯于处理只有单一值的标签。对于这个问题(分类多于一个结果),我只需要将标签改为向量本身即可。
这解决了我的问题:
from keras.utils.np_utils import to_categoricallabels_train = to_categorical(labels_train)