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

使用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中创建了一个多类分类项目。该项目可以对…

发表回复

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