我遇到了这个错误,从我看到的类似问题的答案来看,这是因为没有指定最后一层有30个神经元,因为你期望的输出是一个大小为30的数组。但这不是我的情况,我已经指定了,所以我觉得很奇怪,如果神经元数量和输出形状完全匹配,为什么还会出现这个错误。下面是可能导致此错误的代码部分(images_gray
是一个由灰度图像组成的numpy数组,形状为(2000, 128, 128),result_array
是一个包含大小为30的numpy数组的列表)。
images_gray = np.reshape(images_gray, (len(images_gray), img_rows, img_cols, 1))to_shuffle = list(zip(images_gray, result_array))random.shuffle(to_shuffle)im_input, res_output = zip(*to_shuffle)im_input, res_output = np.array(im_input[:10]), np.array(res_output[:10])img_rows, img_cols, _ = np.shape(im_input[0])input_shape = (img_rows, img_cols, 1)if K.image_data_format() == 'channels_first': input_shape = (1, img_rows, img_cols)model = buildCNN(input_shape)adadelta = keras.optimizers.Adadelta(lr=0.5)model.compile(loss="sparse_categorical_crossentropy",optimizer=adadelta,metrics=['accuracy'])model.fit(im_input, res_output, batch_size=128, epochs=10, verbose=1)
这是buildCNN()
函数:
def buildCNN(input_shape): model = Sequential() model.add(Conv2D(32, kernel_size=(3,3),activation='relu',input_shape=input_shape)) model.add(Conv2D(64, (3,3), activation='relu')) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128,activation='relu')) model.add(Dropout(0.5)) model.add(Dense(30, activation='sigmoid')) return model
当我使用model.sumary()
时得到的结果:
回答:
如果你的目标(y值)的长度为30,那么我假设你想进行多类分类。在这种情况下,你在输出层使用的激活函数是错误的,应该使用softmax
而不是sigmoid
。
model.add(Dense(30, activation='softmax'))
sigmoid
用于二元分类。
如果你想进行二元分类,那么你的目标(y值)的长度应该是1,而不是30。
另外要注意,如果你的目标值是一热编码的(假设它们是长度为30的数组),那么你选择的正确损失函数应该是categorical_crossentropy
。
sparse_categorical_crossentropy
损失函数用于多类分类,当标签以整数形式提供时(不是一热编码)。
所以在使用一热编码标签的情况下,compile
方法应该这样调用
model.compile(loss="categorical_crossentropy",optimizer=adadelta,metrics=['accuracy'])