很抱歉,我无法在单个段落中对此问题进行描述,因此需要分几个步骤来描述问题。
我有一个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_model
和def 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
时,就没有错误。
任何人都可以帮助我找出问题所在吗?