【发布时间】: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