我正在学习使用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'
。