python - 为什么我会收到“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 个训练向量......
解决方案
你的最后一层dense
有 2 个神经元,而你的数据集有 10 个标签。因此,从技术上讲,最后一层的神经元数量必须与数据集中的类数相同,在您的情况下为 10。dense
只需将最后一层中的 2 替换为 10即可。
推荐阅读
- json - 无法在 JSON 模式中正确使用数组
- python - Encoutering OSError: [WinError 10038] 使用 python 设置基本 http 代理时,尝试对非套接字的操作进行操作
- sas - sas中的垂直列求和
- angular - 如何正确分叉离子模板组件
- css - 我可以覆盖 bootswatch 主题的工作方式吗?
- sql - 返回某些 IN 条件不匹配的默认值
- docker - Shared builder containers in Docker or Docker Compose
- django - 错误:字符 280 处不存在关系“auth_user”
- php - 查找最近 4 年
- excel - 动态 SumIF - 多种场景