Keras: 输入层和正确传递输入数据

我正在学习使用Keras的函数式API,并且已经成功构建并编译了一个模型。但是,当我调用model.fit并传入数据X和标签y时,出现了错误。看来我还没有完全理解它的工作原理。

任务是将句子分类为6种类型,代码如下:

X_ = ... # 形状:(2787, 100) 每行是一个句子,每列是一个特征
y_= ... # 形状:(2787,)
word_matrix_weights= ... # 初始化词汇嵌入查找矩阵的代码。形状:(9825,300)
deep_inputs = Input(shape=(100,))
embedding = Embedding(9825, 300, input_length=100, weights=[word_matrix_weights], trainable=False)(deep_inputs)
flat = Flatten()(embedding)
hidden = Dense(6, activation="softmax")(flat)
model = Model(inputs=deep_inputs, outputs=hidden)
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x=X_,y=y_,epochs=100, batch_size=10, verbose=0) # 此处报错

最后一行产生了错误:

  File "/home/zz/Programs/anaconda3/lib/python3.6/site-packages/keras/engine/training.py", line 1555, in fit    batch_size=batch_size)
  File "/home/zz/Programs/anaconda3/lib/python3.6/site-packages/keras/engine/training.py", line 1413, in _standardize_user_data    exception_prefix='target')
  File "/home/zz/Programs/anaconda3/lib/python3.6/site-packages/keras/engine/training.py", line 154, in _standardize_input_data    str(array.shape))
ValueError: 检查目标时出错:期望dense_1的形状为(None, 6),但得到的数组形状为(2878, 1)

有什么建议吗?


回答:

你的最后一层是一个具有6个单元和softmax激活函数的Dense层。因此,它的输出形状将是(?,6),其中这6个值分别表示属于相应类别的概率。由于你使用了categorical_crossentropy作为损失函数,标签(即y_)也应该具有相同的形状(即(2787,6))。你可以使用to_categorical方法对y_进行独热编码:

from keras.utils import to_categorical
y_ = to_categorical(y_)

这种独热编码会将标签转换,例如将3转换为[0,0,0,1,0,0](假设标签编号从零开始)。

如果你不想对标签进行独热编码,你可以将loss参数更改为'sparse_categorical_crossentropy'

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

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