ValueError: 检查目标时出错:期望dense_16的形状为(1,),但得到的数组形状为(30,)

我遇到了这个错误,从我看到的类似问题的答案来看,这是因为没有指定最后一层有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()时得到的结果:

enter image description here


回答:

如果你的目标(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'])

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注