丢失字典中的未知条目:仅应包含以下键['conv1d_4','conv1d_4']

2024-05-13 20:34:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个具有多个输出的模型。我想为每个损失函数和度量分配不同的标签。代码如下所示:

   input_img = Input(shape=(n_states,n_features))

   x = Conv1D(32, kernel_size=5, activation='relu', padding='same')(input_img)
   x = Conv1D(32, kernel_size=5, activation='relu', padding='same')(x)
   x = Conv1D(32, kernel_size=5, activation='relu', padding='same')(x)
   decoded = Conv1D(n_outputs, kernel_size=3, activation='linear', padding='same')(x)

   model = Model(inputs=input_img, outputs=[decoded,decoded])

   model.compile(loss={'regression': 'mean_squared_error', 
                       'diffusion': 'mean_absolute_error'},
                 loss_weights={'regression': 1.0,
                           'diffusion': 0.5},
                 optimizer='adam',
                 metrics={'regression': coeff_determination, 
                           'diffusion': coeff_determination})

   model.summary()

   history_callback = model.fit(x_train, 
         {'regression': y_train, 'diffusion': y_train},
         batch_size=batch_size,
         epochs=epochs,
         validation_data= (x_valid, {'regression': y_valid, 'diffusion': y_valid}),
         verbose=1)

如果我运行上面的模型,我会在丢失字典中得到一个未知条目的错误。具体来说,错误是Unknown entries in loss dictionary: ['diffusion', 'regression']. Only expected following keys: ['conv1d_4', 'conv1d_4']

如何为每个损失函数指定不同的名称?多谢各位


Tags: imginputsizemodeltrainactivationkernelrelu
1条回答
网友
1楼 · 发布于 2024-05-13 20:34:37

您需要将输出的名称与丢失字典键匹配。在这里,您没有命名输出,因此它们在名称空间中默认为conv1d_4。尝试:

decoded1 = Conv1D(n_outputs, kernel_size=3, activation='linear', 
    padding='same', name='diffusion')(x)
decoded2 = Conv1D(n_outputs, kernel_size=3, activation='linear', 
    padding='same', name='regression')(x)

我把你的产量增加了一倍,因为我认为你不能对同一产量施加两种不同的损失

下面是一个匹配输出/丢失字典键的最小示例:

from tensorflow.keras import Input, Model
from tensorflow.keras.layers import Dense
import numpy as np

x_train = np.random.rand(1000, 10)
y_train = np.random.rand(1000)

inputs = Input(shape=(10,))

x = Dense(32, activation='relu')(inputs)
out1 = Dense(1, name='first_output')(x)
out2 = Dense(1, name='second_output')(x)

model = Model(inputs=inputs, outputs=[out1, out2])

model.compile(loss={'first_output': 'mean_squared_error',
                    'second_output': 'mean_absolute_error'},
              optimizer='adam')

history_callback = model.fit(x_train,
                             {'first_output': y_train, 'second_output': y_train},
                             batch_size=8, epochs=1)

请注意,丢失字典键与输出键匹配。度量、损失权重、验证数据等也应如此

相关问题 更多 >