如何使用Keras API解决“层“conv1d”的输入0与层“不兼容”的问题?

cetgtptt  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(133)

我想学习如何用AI制作聊天机器人。我找到了这个tutorial。我使用一个小文本文件来检查我的Python脚本是否工作,现在我想使用一个更大的文本输入。文件内容如下:

This compiler has no dedicated message for sign compare.
Code lines with implicit cast due to sign conversion usually generate an informational message "C0005 (I)  
Precision lost".Renesas sign -compare equivalent

在第一步,我执行预处理,删除停止词,小写等。最后,我得到了文件第2行和第3行的列表,如下所示:

['code', 'line', 'implicit', 'cast', 'due', 'sign', 'conversion', 'usually', 'generate', 'informational', 'message', '``', 'c0005']

接下来,我执行标记化,结果如下:

{'<OOV>': 1, 'sign': 2, 'message': 3, 'compiler': 4, 'dedicated': 5, 'compare': 6, 'code': 7, 'line': 8, 'implicit': 9, 'cast': 10, 'due': 11, 'conversion': 12, 'usually': 13, 'generate': 14, 'informational': 15, '``': 16, 'c0005': 17, 'precision': 18, 'lost': 19, "''": 20, '.renesas': 21, '-compare': 22, 'equivalent': 23}

然后,我有序列和填充序列,输出如下:

[[4, 5, 3, 2, 6], [7, 8, 9, 10, 11, 2, 12, 13, 14, 15, 3, 16, 17], [18, 19, 20, 21, 2, 22, 23]]

并填充:

[[ 4  5  3  2  6  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
    0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
    0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
    0  0  0  0]
 [ 7  8  9 10 11  2 12 13 14 15  3 16 17  0  0  0  0  0  0  0  0  0  0  0
    0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
    0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
    0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
    0  0  0  0]
 [18 19 20 21  2 22 23  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
    0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
    0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
    0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
    0  0  0  0]]

最后,我使用这个命令来训练模型:

training_data = padded_sequences[:training_size] 
training_labels = padded_sequences[:training_size]

history = model.fit(training_data, training_labels,batch_size=1, epochs=num_epochs, verbose=3)

但我收到以下错误:

ValueError: labels.shape must equal logits.shape except for the last dimension.
Received: labels.shape=(100,) and logits.shape=(1, 100)

谁能解释一下这个错误是什么,并帮助我修复它?我认为数组大小有问题,但我不能确切地理解问题是什么。
你也可以找到所有的Python代码here

juud5qan

juud5qan1#

我认为这是一个简单的问题,它可以通过为标签提供正确的形状来解决(请提供training_data和training_labels的形状),所以我可以看到你在training_labels中缺少了batch(batch_size=1)维度,这可以通过以下方式完成:

training_data = padded_sequences[:training_size] 
training_labels = padded_sequences[:training_size]
training_labels = np.expand_dims(training_labels, axis=0)  # add batch axis

所以我会试试这个,看看它是否能解决这个问题。
否则请始终提供您的模型摘要阅读层和他们的形状,这可以通过写

model.summary()

编辑:我从你的代码中打印了模型摘要(它与你在评论中给出的完全不同):

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
embedding (Embedding)        (None, 100, 64)           6400      
_________________________________________________________________
dropout (Dropout)            (None, 100, 64)           0         
_________________________________________________________________
conv1d (Conv1D)              (None, 96, 64)            20544     
_________________________________________________________________
max_pooling1d (MaxPooling1D) (None, 24, 64)            0         
_________________________________________________________________
lstm (LSTM)                  (None, 64)                33024     
_________________________________________________________________
dense (Dense)                (None, 64)                4160      
_________________________________________________________________
dense_1 (Dense)              (None, 100)               6500      
=================================================================
Total params: 70,628
Trainable params: 70,628
Non-trainable params: 0

正如你所看到的,你的模型的输出必须是100,而你的标签现在是20,所以你会再次检查这个。

相关问题