【问题标题】:How to modify output in keras for back propagation如何在 keras 中修改输出以进行反向传播
【发布时间】:2021-06-16 07:26:45
【问题描述】:

我有一个用 tensorflow 编写的 U-Net 模型来解决分割问题。我想用相同数量的训练数据改进我的分割,我正在考虑在输出中添加一个水平集方法模块,然后计算损失。像这样https://arxiv.org/pdf/1705.06260.pdf

但是不知道怎么修改tensorflow中最后一层的输出

def amodel(pretrained_weights=None,
           input_size=(512, 512, 1),
           act="relu"):
    inputs = tf.keras.layers.Input(input_size)
    conv1 = tf.keras.layers.Conv2D(1, 1, activation='sigmoid')(inputs)
    model = tf.keras.Model(inputs=inputs, outputs=conv1)
    
    # model.compile(optimizer = Adam(lr = 1e-4), 
    loss = 'binary_crossentropy', metrics = ['accuracy'])
    model.compile(optimizer=tf.keras.optimizers.Adam(lr_scheduler),
                  loss=combo_loss(alpha=0, beta=0.4),
                  metrics=[dice_accuracy])

在转发到 tf.keras.Model 之前如何对 conv1 应用转换?

谢谢你

【问题讨论】:

    标签: tensorflow keras deep-learning image-segmentation unity3d-unet


    【解决方案1】:

    好像你想使用 lambda 层:

    https://keras.io/api/layers/core_layers/lambda/

    创建新层后,您只需将 conv1 层作为输入传递给他, 像这样:

    inputs = tf.keras.layers.Input(input_size)
    conv1 = tf.keras.layers.Conv2D(1, 1, activation='sigmoid')(inputs)
    lambda_layer = Lambda(normalizer)(norm_concat)
    model = tf.keras.Model(inputs=inputs, outputs=lambda_layer)
    
    

    您只需要定义 Lambda 层必须调用的函数:

    例如:

    def normalizer(x):
      a = x[:, :, :, :, 1]
      b = x[:, :, :, :, 2]
      asum = tf.keras.backend.sum(a)
      bsum = tf.keras.backend.sum(b)
      ratio = tf.math.divide(asum, bsum)
      ratio = tf.cast(ratio, dtype=tf.float32) 
      return tf.multiply(b, ratio)
    

    其中 x 是 conv1 的输出

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多