我一直在使用" CMU电影摘要语料库";对于电影类型的分类,因为我对NLP比较陌生。这是一个多标签分类任务。我使用TF-IDF进行词矢量化,然后将输出输入神经网络,但当我尝试训练模型时,我得到以下错误:
ValueError: logits and labels must have the same shape ((None, 1) vs (None, 363))
我在StackOverflow上读过,并试图实现同样的,但问题仍然存在。然而,我能够使用相同的TF-IDF特征训练机器学习模型,但无法训练神经网络。
下面是代码片段:create TF-IDF features
xtrain_tfidf = tfidf_vectorizer.fit_transform(xtrain)
xval_tfidf = tfidf_vectorizer.transform(xval)
xtrain_tfidf[0]
//xtrain_tfidf[0] <1x10000 sparse matrix of type '<class 'numpy.float64'>'with 63 stored elements in Compressed Sparse Row format>
构建神经网络
xtrain_tfidf = xtrain_tfidf.toarray()
xval_tfidf = xval_tfidf.toarray()
通过使用padding将所有数组设置为相同的大小来预处理数据
train_data = keras.preprocessing.sequence.pad_sequences(xtrain_tfidf,
value=0,
padding='post',
maxlen=2000)
test_data = keras.preprocessing.sequence.pad_sequences(xval_tfidf,
value=0,
padding='post',
maxlen=2000)
输入形状是用于电影评论的词汇量计数(10,000字)
vocab_size = 10000
model = keras.models.Sequential([
keras.layers.Dense(20, kernel_regularizer=keras.regularizers.l2(0.001),
activation=tf.nn.relu, input_shape=(2000,)),
keras.layers.Dense(16, kernel_regularizer=keras.regularizers.l2(0.001),
activation=tf.nn.relu),
keras.layers.Dense(1, activation=tf.nn.sigmoid)
])
<<p>模型特性/strong>model.compile(optimizer=tf.optimizers.Adam(),
loss='binary_crossentropy',
metrics=['accuracy'])
创建交叉验证集
x_val = train_data[:1000]
partial_x_train = train_data[1000:]
y_val = y_train[:1000]
partial_y_train = y_train[1000:]
训练模型40 epoch
history = model.fit(partial_x_train,
partial_y_train,
epochs=40,
batch_size=512,
validation_data=(x_val, y_val),
verbose=2)
如果它是一个多类分类任务,那么
keras.layers.Dense(1, activation=tf.nn.sigmoid)
应该有和类一样多的输出(363?),你应该使用softmax,而不是sigmoid(除非一个点可以属于多个类?)
keras.layers.Dense(363, activation=tf.nn.softmax)
同样的原因,你方的损失不应该是binary_crossentropy
,而应该是categorical_crossentropy
。