Python 获取tensorflow中的值错误,表示我的形状不兼容

Python 获取tensorflow中的值错误,表示我的形状不兼容,python,tensorflow,keras,Python,Tensorflow,Keras,错误: 我的模型: return K.categorical_crossentropy(y_true, y_pred, from_logits=from_logits) C:\Users\selvaa\miniconda3\envs\tensorflow\lib\site-packages\tensorflow\python\keras\backend.py:4619 categorical_crossentropy target.shape.assert_is_comp

错误:

我的模型:

return K.categorical_crossentropy(y_true, y_pred, from_logits=from_logits)
    C:\Users\selvaa\miniconda3\envs\tensorflow\lib\site-packages\tensorflow\python\keras\backend.py:4619 categorical_crossentropy
        target.shape.assert_is_compatible_with(output.shape)
    C:\Users\selvaa\miniconda3\envs\tensorflow\lib\site-packages\tensorflow\python\framework\tensor_shape.py:1128 assert_is_compatible_with
        raise ValueError("Shapes %s and %s are incompatible" % (self, other))

    ValueError: Shapes (None, 1) and (None, 151) are incompatible
我试图训练一个模型来识别不同的口袋妖怪,我有两张151个口袋妖怪的图片用于我的数据集(正确标记和全部)。不知道我做错了什么

以下是打印x.shape和y.shape时发生的情况:

x = np.array(x)
y = np.array(y)

x = x/255.0

model = Sequential()
model.add(Conv2D(3, (3,3), input_shape=(128,128,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Flatten())
model.add(Dense(302, activation='relu'))
model.add(Dense(151, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x, y, batch_size=32, epochs=5, verbose=1, validation_split=0.1)
使用损失,如下面的代码示例所示

损失函数
tf.keras.loss.SparseCategoricalCrossEntropy
接受形状
(n_样本,)
中的参考标签和形状
(n_样本,n_类)
中的预测标签,这对您的数据有效。您不能使用
categorical\u crossentropy
,因为这要求您的标签是一个热编码标签(请参见答案底部)



另一个解决方案是在培训之前对标签进行热编码,例如使用函数。如果您使用这种方法,那么您可以使用
categorical\u crossentropy

谢谢!SparseCategoricalCrossentropy有效,但是,我仍然有一个问题,因为它说我无法将str转换为float。所以我把所有的标签都改成了口袋妖怪的号码,这有点烦人,但它确实管用!是的,你需要将你的口袋妖怪从字符串标签映射到某个整数或浮点数。很高兴这有帮助。
(301, 128, 128, 3) (301,)
x = np.array(x)
y = np.array(y)

x = x / 255.0

model = Sequential()
model.add(Conv2D(3, (3,3), input_shape=(128,128,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(302, activation='relu'))
model.add(Dense(151, activation='softmax'))

model.compile(
    loss=tf.keras.losses.SparseCategoricalCrossentropy(), 
    optimizer='adam', 
    metrics=['accuracy'])

model.fit(x, y, batch_size=32, epochs=5, verbose=1, validation_split=0.1)