Keras ValueError: 检查目标时出错:期望dense_15具有3个维度,但得到的数组形状为(301390, 8)

我想从输入文本中预测8个类别。以下是我预处理数据的代码:

num_max = 1000tok = Tokenizer(num_words=num_max)tok.fit_on_texts(x_train)mat_texts = tok.texts_to_matrix(x_train,mode='count')num_max = 1000tok = Tokenizer(num_words=num_max)tok.fit_on_texts(x_train)max_len = 100cnn_texts_seq = tok.texts_to_sequences(x_train)print(cnn_texts_seq[0])[12, 4, 303]# 填充序列cnn_texts_mat = sequence.pad_sequences(cnn_texts_seq,maxlen=max_len)print(cnn_texts_mat[0])print(cnn_texts_mat.shape)[  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  12   4 303](301390, 100)

以下是包含嵌入层的模型结构:

max_features = 20000max_features = cnn_texts_mat.shape[1]maxlen = 100embedding_size = 128model = Sequential()model.add(Embedding(max_features, embedding_size, input_length=maxlen))model.add(Dropout(0.2))model.add(Dense(5000, activation='relu'))model.add(Dropout(0.1))model.add(Dense(600, activation='relu'))model.add(Dropout(0.1))model.add(Dense(units=y_train.shape[1], activation='softmax'))sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)model.compile(loss='binary_crossentropy',              optimizer=sgd)

以下是模型摘要:

model.summary()_________________________________________________________________Layer (type)                 Output Shape              Param #   =================================================================embedding_5 (Embedding)      (None, 100, 128)          12800     _________________________________________________________________dropout_13 (Dropout)         (None, 100, 128)          0         _________________________________________________________________dense_13 (Dense)             (None, 100, 5000)         645000    _________________________________________________________________dropout_14 (Dropout)         (None, 100, 5000)         0         _________________________________________________________________dense_14 (Dense)             (None, 100, 600)          3000600   _________________________________________________________________dropout_15 (Dropout)         (None, 100, 600)          0         _________________________________________________________________dense_15 (Dense)             (None, 100, 8)            4808      =================================================================Total params: 3,663,208Trainable params: 3,663,208Non-trainable params: 0

在此之后,当我尝试运行模型时,出现了以下错误:

model.fit(x=cnn_texts_mat, y=y_train, epochs=2, batch_size=100)ValueError                                Traceback (most recent call last)<ipython-input-41-4b9da9914e7e> in <module>----> 1 model.fit(x=cnn_texts_mat, y=y_train, epochs=2, batch_size=100)~/.local/lib/python3.5/site-packages/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, **kwargs)    950             sample_weight=sample_weight,    951             class_weight=class_weight,--> 952             batch_size=batch_size)    953         # Prepare validation data.    954         do_validation = False~/.local/lib/python3.5/site-packages/keras/engine/training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_array_lengths, batch_size)    787                 feed_output_shapes,    788                 check_batch_axis=False,  # Don't enforce the batch size.--> 789                 exception_prefix='target')    790     791             # Generate sample-wise weight values given the `sample_weight` and~/.local/lib/python3.5/site-packages/keras/engine/training_utils.py in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)    126                         ': expected ' + names[i] + ' to have ' +    127                         str(len(shape)) + ' dimensions, but got array '--> 128                         'with shape ' + str(data_shape))    129                 if not check_batch_axis:    130                     data_shape = data_shape[1:]ValueError: 检查目标时出错:期望dense_15具有3个维度,但得到的数组形状为(301390, 8)

回答:

查看模型摘要中最后一层的输出形状:它是(None, 100, 8)。这并不是你想要的。每个样本的标签形状为(8,),而不是(100,8)。为什么会这样?这是因为Dense层应用于其输入的最后一个轴,因此由于嵌入层的输出是3D的,所有后续的Dense层的输出也将具有3个维度。

如何解决这个问题?一种方法是在模型的某个地方使用Flatten层(可能是在嵌入层之后)。这样你将得到一个形状为(None, 8)的2D输出,这是你想要的,并且与标签的形状一致。

但是,请注意,你可能会得到一个非常大的模型(即参数过多),这将很容易过拟合。要么减少Dense层中的单元数,要么选择使用Conv1DMaxPooling1D层,甚至是RNN层来处理嵌入并降低结果张量的维度(使用这些层也可能提高模型的准确性)。

Related Posts

在使用k近邻算法时,有没有办法获取被使用的“邻居”?

我想找到一种方法来确定在我的knn算法中实际使用了哪些…

Theano在Google Colab上无法启用GPU支持

我在尝试使用Theano库训练一个模型。由于我的电脑内…

准确性评分似乎有误

这里是代码: from sklearn.metrics…

Keras Functional API: “错误检查输入时:期望input_1具有4个维度,但得到形状为(X, Y)的数组”

我在尝试使用Keras的fit_generator来训…

如何使用sklearn.datasets.make_classification在指定范围内生成合成数据?

我想为分类问题创建合成数据。我使用了sklearn.d…

如何处理预测时不在训练集中的标签

已关闭。 此问题与编程或软件开发无关。目前不接受回答。…

发表回复

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