当目标数据和模型输出层的形状不同时,会产生Keras不兼容的形状

时间:2019-07-11 17:56:02

标签: tensorflow keras loss-function

很抱歉,我无法在单个段落中对此问题进行描述,因此需要分几个步骤来描述问题。

我有一个main_model定义如下:

input_layer=Input(shape=(896,896,3))
new_layer = Conv2D(filters=32, kernel_size=(3,3), padding="same")(input_layer)
new_layer = MaxPooling2D(pool_size=(2, 2), strides=(2,2), padding='same')(new_layer)
new_layer = Conv2D(filters=100, kernel_size=(k,k), dilation_rate=4, padding="same", name="dilation_1")(new_layer)
main_model = Model(input_layer, new_layer)

输出层的形状为(448,448,100),但我没有该形状的任何目标矢量(Y_train)。我从输入张量生成张量形式的目标数据,并使用它使用自定义损失函数来计算损失。损失函数使用另一个Keras模型,该模型具有所有常数内核,并应用于main_model的相同输入张量以生成目标张量。

y=input_layer #same input tensor from the main_model
y = Conv2D(filters=100, kernel_size=(3,3), padding="same", trainable=False, kernel_initializer='some_custom_method', name="non_trainable_layer")(y)
y=MaxPooling2D(pool_size=(2, 2), strides=(2,2), padding='same')(y)
constant_model=Model(input_layer, y)

constant_model.trainable=False
for l in constant_model.layers:
    l.trainable=False

对于自定义损失函数,由于我没有y_true形式的(448,448,100)数据,因此我使用{{ 1}}显示如下:

y_true

然后我input_layer constant_modeldef custom_loss_wrapper(constant_model): def custom_loss(y_true, y_pred): eval_true=constant_model(y_true) l= keras.losses.mean_absolute_error(eval_true, y_pred) return d return custom_loss

compile

重要的是,我需要提供fit(实际上是损失函数中的main_model),因为此main_model.compile(optimizer='adam', loss=custom_loss_wrapper(constant_model), metrics=['accuracy']) history = model.fit(x=X_train, y=X_train, batch_size=2, ...) 实际上用于生成y=X_train大小为y_true

的标签

但是,在训练过程中,出现以下错误:

X_train

我认为main_model(448,448,100)中的大小不匹配存在问题。

但是,当我在........... tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [2,896,896] vs. [2,448,448] [[Node: metrics_1/acc/Equal = Equal[T=DT_INT64, _device="/job:localhost/replica:0/task:0/device:GPU:0"](metrics_1/acc/ArgMax, metrics_1/acc/ArgMax_1)]] [[Node: loss_1/mul/_99 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_440_loss_1/mul", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]] y_true中不使用任何y_pred层时,即输出层形状为MaxPooling时,就没有错误。

任何人都可以帮助我找出问题所在吗?

0 个答案:

没有答案