【问题标题】:InvalidArgumentError: Incompatible shapes: [32] vs. [8] - Keras Transfer LearningInvalidArgumentError:不兼容的形状:[32] 与 [8] - Keras 迁移学习
【发布时间】:2020-10-24 03:05:30
【问题描述】:

我正在尝试使用 Mobilenet 执行迁移学习 这是我的代码

from keras.applications.mobilenet import preprocess_input
from keras.applications.mobilenet import MobileNet
import keras.backend as K

x_train_final=preprocess_input(x_train)
x_test_final=preprocess_input(x_test)
pretrained_weights='imagenet'

#2
mobile=MobileNet(weights=pretrained_weights,include_top=False,input_shape=(416,416,3))
x=mobile.output
x=keras.layers.Flatten()(x)
x=keras.layers.Dense(512)(x)
x=keras.layers.Activation("relu")(x)
x=keras.layers.Dense(256)(x)
x=keras.layers.Activation("sigmoid")(x)
x=keras.layers.Dense(8)(x)
output=x
model=keras.models.Model(inputs=mobile.input,outputs=output)

def custom_loss(y_true, y_pred):

    loss = K.square(y_pred - y_true)  # (batch_size, 8)
    # summing both loss values along batch dimension
    loss = K.sum(loss, axis=0)        # (batch_size,)

    return loss

model.compile(optimizer = keras.optimizers.Adam(learning_rate=0.002), 
          loss = custom_loss,
          metrics = ['accuracy', 'mse'])

model.fit(x_train_final, y_train, epochs = 100)

但是我遇到了一个错误。

Epoch 1/100
---------------------------------------------------------------------------
InvalidArgumentError                      Traceback (most recent call last)
<ipython-input-37-55c4376c8a25> in <module>()
----> 1 model.fit(x_train_final, y_train, epochs = 100)

7 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/execute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
     58     ctx.ensure_initialized()
     59     tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
---> 60                                         inputs, attrs, num_outputs)
     61   except core._NotOkStatusException as e:
     62     if name is not None:

InvalidArgumentError:  Incompatible shapes: [32] vs. [8]
     [[node gradients_4/loss_4/dense_18_loss/custom_loss/weighted_loss/mul_grad/Mul_1 (defined at /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:3009) ]] [Op:__inference_keras_scratch_graph_111168]

Function call stack:
keras_scratch_graph

我的火车数据集形状是 (3066, 416, 416, 3)

测试数据集形状为 (100, 416, 416, 3)

我无法找出错误。

【问题讨论】:

  • x_train_final和y_train的形状是什么?
  • x_train_final - (3066, 416, 416, 3) y_train - (3066, 8)
  • 在您的自定义损失函数中打印张量 y_pred 和 y_true,然后再计算损失并检查它们是否具有相同的形状和相同的 dtype
  • 您正在加载预训练的权重。但是对于 416*416 的图像大小,keras 中不存在预训练的形状。所以,要么你应该训练你的模型来生成权重,要么改变你的图像大小。预训练的权重适用于 128*128、160*160、192*192 和 224*224 的图像大小。也许这会解决
  • @devSpartan 更改损失函数有帮助,谢谢

标签: python keras deep-learning transfer-learning


【解决方案1】:

我也遇到了同样的问题,发现我的池化层存在问题。它给出了不正确的输出。将 maxpool2d 更改为 globalaevaragepool 解决了该问题。如果你想坚持使用 maxpool,那就改变它的输出形状。

【讨论】:

    【解决方案2】:

    我是新手,反正我收到了同样的错误信息

    • tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name,op_name,tensorflow.python.framework.errors_impl.InvalidArgumentError: - - 不兼容的形状:[8,10] vs. [8,6] [[node categorical_crossentropy/mul ....

    了解

    • IT 是输出神经层形状的误差,而不是模型的输入。 即错误显示了输出神经 n/w 层的维度。
    • [应该是什么] vs [发现有问题的维度]

    我的问题

    1. 就我而言 - 我修改了旧代码:
      • 定义的类列表:10 - 正确
      • output_layer = Dense(units=6) - 这就是问题所在 答案:
    2. 更正 : output_layer = Dense(units=10) 因为我的班级长度是 10

    【讨论】:

      猜你喜欢
      • 2021-05-04
      • 1970-01-01
      • 2019-02-14
      • 2021-03-07
      • 1970-01-01
      • 2021-12-31
      • 2021-09-18
      • 2021-06-11
      • 1970-01-01
      相关资源
      最近更新 更多