执行 'binary-crossentropy' ==> 数组形状不匹配时出现 ValueError

ValueError while performing 'binary-crossentropy' ==> array shapes not matching

我在尝试实现 "Text classification" 模型来对不同类型的电影评论进行分类时使用了 tensorflow + keras。我 运行 遇到一个错误,提示形状不相等。

因为我不确定错误可能隐藏在哪里,所以我无法生成 reprex 示例,因为我不确定如何隔离问题。如果带有 variable(x_val) 的行在那里可能值得您花时间,因为分区可能有问题。

note this is not the final code. as I had already encountered an error at this point, i stopped writing it.

from __future__ import absolute_import, division, print_function
import numpy as np
import tensorflow as tf
from tensorflow import keras

imdb = keras.datasets.imdb
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)

#print ("The length if training data: "len(train_data[0]), "And labels: "len(test_data[0]))

word_index = imdb.get_word_index()
word_index = {k: (v+3) for k,v in word_index.items()}
word_index["<PAD>"] = 0
word_index["<START>"] = 1
word_index["<UNKNOWN>"] = 2
word_index["<END>"] = 3

reverse_word_index = dict([(value, key) for (key, value) in word_index.items() ])
def decode_review(text):
    return (' '.join([reverse_word_index.get(i , "?") for i in text ]))

print (decode_review(train_data[0]))

train_data = keras.preprocessing.sequence.pad_sequences(train_data, 
                                               value=word_index["<PAD>"],
                                               padding="post",
                                               maxlen=256)


test_data = keras.preprocessing.sequence.pad_sequences(test_data, 
                                               value=word_index["<PAD>"],
                                               padding="post",
                                               maxlen=256)

#print ('train length :' ,len(train_data[0]), 'test length: ', len(train_data[1]))

vocab_size = 10000

model = keras.Sequential()
model.add(keras.layers.Embedding(vocab_size , 16))
model.add(keras.layers.GlobalAveragePooling1D())
model.add(keras.layers.Dense(16, activation=tf.nn.relu))

model.add(keras.layers.Dense(16, activation=tf.nn.sigmoid))

print ("the model summary is :======>>" , model.summary())

model.compile(optimizer="adam" , loss="binary_crossentropy", metrics=["acc"])

x_val = train_data[:10000]

partial_x_train = train_data[10000:]

y_val = train_labels[:10000]

partial_y_train = train_labels[10000:]

history = model.fit(partial_x_train , partial_y_train , epochs=40 , batch_size=512, 
                    validation_data=(x_val, y_val), verbose=1)

这是我收到的错误消息:----- 型号:"sequential_1"

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
embedding_1 (Embedding)      (None, None, 16)          160000    
_________________________________________________________________
global_average_pooling1d_1 ( (None, 16)                0         
_________________________________________________________________
dense_2 (Dense)              (None, 16)                272       
_________________________________________________________________
dense_3 (Dense)              (None, 16)                272       
=================================================================
Total params: 160,544
Trainable params: 160,544
Non-trainable params: 0
_________________________________________________________________
the model summary is :======>> None
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/nn_impl.py:180: add_dispatch_support.<locals>.wrapper (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.where in 2.0, which has the same broadcast rule as np.where
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-18-02082e1f39d4> in <module>()
     57 
     58 history = model.fit(partial_x_train , partial_y_train , epochs=40 , batch_size=512, 
---> 59                     validation_data=(x_val, y_val), verbose=1)

ValueError: A target array with shape (15000, 1) was passed for an output of shape (None, 16) while using as loss `binary_crossentropy`. This loss expects targets to have the same shape as the output.

您需要更新模型的 final/output 层。由于这是一个二元分类问题,因此输出的 Dense 层应该有一个节点,如下所示:

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

您可能想在 text classification using IMDB dataset 上查看本教程。