【问题标题】:concatenating two outputs of conv net连接 conv net 的两个输出
【发布时间】:2023-03-10 07:36:01
【问题描述】:

我正在使用 CNN 构建具有定位功能的图像分类器。

我的 CNN 有图像作为输入,但是在最后一个 CONV 层之后,我想将其分成两部分,一部分用于图像分类,下一部分用于图像定位。 不用说一部分应该使用均方误差,另一部分应该使用二进制 binary_crossentropy。我的结构是这样的:

input_image = Input(shape=(IMG_W, IMG_H, 3))

# Layer 1
x = Conv2D(32, (3,3), strides=(1,1), padding='same', name='conv_1', use_bias=False)(input_image)
x = BatchNormalization(name='norm_1')(x)
x = LeakyReLU(alpha=0.1)(x)


# Layer 2
x = Conv2D(64, (3,3), strides=(1,1), padding='same', name='conv_2', use_bias=False)(x)
x = BatchNormalization(name='norm_2')(x)
x = LeakyReLU(alpha=0.1)(x)

现在我想把它分成两个密集(FC)层

   class_layer = x
   class_layer = Dense(256,activation="relu")(class_layer)
   class_layer = Dense(2,activation="softmax")(class_layer)
   model_one = Model(input_image,class_layer)
  model_one.compile(loss="binary_crossentrophy", optimizer=keras.optimizers.Adam(),metrics=['accuracy'])

图像定位层

     x = Dense(1024,activation="relu")(x)
     x = Dense(256,activation="relu")(x)
     x = Dense(4,activation="relu")(x)
     model = Model(input_image,x)
model.compile(loss="mean_squared_error", optimizer=keras.optimizers.Adam(),metrics=['accuracy'])

但是,我如何连接图层,使结果向量为 (2 + 4)? 我什至可以实现这样的分裂吗?

我知道model.concatenate 但是这应该在编译之前调用,所以每个部分不会有不同的损失函数

感谢您的帮助和回答

【问题讨论】:

    标签: python machine-learning neural-network keras conv-neural-network


    【解决方案1】:

    您可以使用多个输出初始化模型,并为每个输出指定损失。如果您希望 model_one 的损失具有权重 a,而模型的损失具有权重 b,那么您的总损失看起来像 a*mse + b*binary_ce,那么您将有类似

    model = Model(input_image, [x, class_layer])
    model.compile(loss=['mean_squared_error', 'binary_crossentropy'],
                  loss_weights=[a, b],
                  optimizer=keras.optimizers.Adam())
    

    有关更多详细信息,请参阅 Model.compile 文档中的 lossloss_weights 参数https://keras.io/models/model/

    【讨论】:

      猜你喜欢
      • 2021-09-25
      • 1970-01-01
      • 2013-08-13
      • 2013-06-22
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      • 2017-03-06
      相关资源
      最近更新 更多