【问题标题】:Getting a ValueError in tensorflow saying that my shapes are incompatible在张量流中得到一个 ValueError 说我的形状不兼容
【发布时间】:2020-05-29 07:30:57
【问题描述】:

错误:

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

我的模特:

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)

我正在尝试训练一个模型来识别不同的口袋妖怪,我的数据集有两张图片,每个 151 个口袋妖怪(正确标记和所有)。不知道我做错了什么。

当我打印 x.shape 和 y.shape 时会发生以下情况:

(301, 128, 128, 3) (301,)

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    使用损失tf.keras.losses.SparseCategoricalCrossEntropy,如下代码示例所示。

    损失函数tf.keras.losses.SparseCategoricalCrossEntropy 接受(n_samples,) 形状的参考标签和(n_samples, n_classes) 形状的预测标签,这将适用于您的数据。您不能使用categorical_crossentropy,因为它要求您的标签是一次性编码的(见答案底部)。

    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)
    

    另一种解决方案是在训练之前对标签进行一次热编码,例如使用函数tf.one_hot。如果你使用这种方法,那么你可以使用categorical_crossentropy

    【讨论】:

    • 谢谢! SparseCategoricalCrossentropy 工作,但是,我仍然有一个问题,因为它说我无法将 str 转换为 float。于是我把所有的标签都改成了pokemon编号,虽然有点烦人,但确实有效!
    • 是的,您需要将您的口袋妖怪从它们的字符串标签映射到某个整数或浮点数。很高兴这有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 2021-05-29
    • 2022-12-12
    • 2016-09-02
    • 2016-10-23
    相关资源
    最近更新 更多