【问题标题】:Keras-logits and labels must have the same shape ((None, 1) vs (None, 363))Keras-logits 和标签必须具有相同的形状 ((None, 1) vs (None, 363))
【发布时间】:2021-10-18 21:27:09
【问题描述】:

我一直在使用“CMU 电影摘要语料库”进行电影类型分类,以供自己学习,因为我对 NLP 比较陌生。这是一个多标签分类任务。我正在使用 TF-IDF 进行词向量化,然后将输出输入神经网络,但是当我尝试训练我的模型时出现以下错误:

ValueError: logits and labels must have the same shape ((None, 1) vs (None, 363))

我已阅读 StackOverflow 并尝试实现相同但问题仍然存在。但是,我能够使用相同的 TF-IDF 特征训练机器学习模型,但无法训练神经网络。

下面是代码sn-p:

创建 TF-IDF 特征

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()

通过使用填充将所有数组设置为相同大小来预处理数据

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)
])

模型特征

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)

【问题讨论】:

    标签: python tensorflow keras neural-network nlp


    【解决方案1】:

    如果是多类分类任务那么这个

        keras.layers.Dense(1, activation=tf.nn.sigmoid)
    

    应该有与类一样多的输出(363 个?),你应该使用 softmax,而不是 sigmoid(除非一个点可以属于多个类?)

        keras.layers.Dense(363, activation=tf.nn.softmax)
    

    同样你的损失不应该是binary_crossentropy,而是categorical_crossentropy

    【讨论】:

    • OP 说这是多标签分类。
    • @lejlot 是的,我在我的神经网络中进行了相同的配置,但没有成功。
    猜你喜欢
    • 2021-03-23
    • 2020-09-30
    • 2020-12-06
    • 2021-07-27
    • 2021-10-28
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    相关资源
    最近更新 更多