另一个“检查目标时发生错误:预期density_2的形状为4,,但数组的形状为1,”

问题描述

我正在Python 3中使用Keras。我遇到的问题似乎与许多其他问题类似,尽管我没有看到如何设置该问题,但我能告诉我的最好情况是我可能需要使用Flatten()。参数正确。我收到错误消息:

ValueError:检查目标时出错:预期density_2具有形状 (4,)但形状为(1,)

的数组

我的数据还不是图像,但它们是我已经放入数据帧的序列。

model = Sequential()
model.add(Dense(30,input_dim=16,activation='relu'))
model.add(Dense(len(TheBinsizeList),activation='softmax'))
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])


model.fit(Train_Columns,TrainTarget_Columns.to_frame(),epochs=100,batch_size=64)

print(Train_Columns.shape)
# Gives a value of (1627,16)


print((TrainTarget_Columns.to_frame()).shape)
# Gives a value of (1627,1)

现在TrainTarget_Columns的值是这两个元组的1627:

(1494,3)(1080,2)(1863,2)(919,4)(1700,2)(710,4)(1365,4)(1815,3)(1477,2)(1618) ,1)...

主题编号是每个小管中的第一个条目,第二个条目是作为训练目标的值。

虽然我看到将density_2中的TheBinsizeList从4更改为2会导致期望的形状从(4,)变为(2,),但我看不到如何正确使用Flatten(如果需要)格式化值。

Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None,30)                510       
_________________________________________________________________
dense_2 (Dense)              (None,4)                 124       
=================================================================
Total params: 634
Trainable params: 634
Non-trainable params: 0

感谢您的任何帮助。

解决方法

考虑到模型摘要,模型需要输入形状(batch_size,16)和目标形状(batch_size,4)

如果目标的形状为(1627,1),则说明您有问题。

解决方案:将其更改为一个热门变量(例如,使用tf.one_hot(y,n_classes)),错误应消失

import numpy as np
import tensorflow as tf

input_dim = 16
hidden_dim = 30
n_classes = 4

model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(hidden_dim,input_dim=input_dim,activation='relu'))
model.add(tf.keras.layers.Dense(n_classes,input_dim=hidden_dim,activation='relu'))
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])

X = np.random.randn(100,input_dim)
y = np.random.randint(0,n_classes,size=(100,))

model.fit(X,y)
# ValueError: Shapes (None,1) and (None,4) are incompatible

y = tf.one_hot(y,n_classes)
model.fit(X,y)
# Works !