首页 > 解决方案 > 为什么我会收到“logits and label must have the same shape”错误?

问题描述

我有以下一段代码,这是对我的实际代码的简化:

#!/usr/bin/env python3

import tensorflow as tf
import re
import numpy as np
import pandas as pd
from tensorflow.keras.preprocessing.text import Tokenizer #text to vector.
from keras.layers import Dense, Embedding, LSTM, SpatialDropout1D
from keras.models import Sequential

DATASIZE = 1000

model = Sequential()
model.add(Embedding(1000, 120, input_length = DATASIZE))
model.add(SpatialDropout1D(0.4))
model.add(LSTM(176, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(2,activation='sigmoid'))
model.compile(loss = 'binary_crossentropy', optimizer='adam', metrics = ['accuracy'])
print(model.summary())

training = [[0 for x in range(10)] for x in range (DATASIZE)] #random value
label = [[1 for x in range(10)] for x in range (DATASIZE)]    #random value
model.fit(training, label, epochs = 5, batch_size=32, verbose = 'auto')

我需要的:

我的最终目标是能够检查给定的输入向量(它是数据的数字表示)是正还是负,所以这是一个二进制分类问题。这里所有的 1000 个向量都是 10 位数长,但它可能会更长甚至更短,长度可能在整个数据集中有所不同

运行此程序时,我收到以下错误:

ValueError: logits and labels must have the same shape ((None, 2) vs (None, 10))

我必须如何构造我的向量才能避免出现此错误并实际正确拟合模型?

编辑: 我可以将model.add(Dense(2,activation='sigmoid'))呼叫更改为model.add(Dense(10,activation='sigmoid')). 但我认为这没有多大意义。因为 Dense 的第一个参数是输出可能性的实际数量。就我而言,只有两种可能性:正面或负面。所以 rnndomly 将此更改为 10,使程序运行,但对我来说没有意义。而且我什至不确定它是否使用了我的 1000 个训练向量......

标签: pythontensorflowkeras

解决方案


你的最后一层dense有 2 个神经元,而你的数据集有 10 个标签。因此,从技术上讲,最后一层的神经元数量必须与数据集中的类数相同,在您的情况下为 10。dense只需将最后一层中的 2 替换为 10即可。


推荐阅读