【问题标题】:pixel wise softmax with crossentropy for multiclass segmentation用于多类分割的具有交叉熵的像素级 softmax
【发布时间】:2019-03-08 10:42:13
【问题描述】:

我正在尝试使用 2 实现多类语义分割模型 类(人类,汽车)。这是我修改后的unet架构实现。 I 输出通道数为 3(3 类 - 人类、汽车、背景)。我如何获得逐像素分类? 这是我的基本事实掩码中的 2 个示例。

我为每个对象类使用 1 个通道,即。

  • class=汽车的频道 1
  • class=背景的通道 2
  • class=human 的频道 3

def conv_block(tensor, nfilters, size=3, padding='same', initializer="he_normal"):
    x = Conv2D(filters=nfilters, kernel_size=(size, size), padding=padding, kernel_initializer=initializer)(tensor)
    x = BatchNormalization()(x)
    x = Activation("relu")(x)
    x = Conv2D(filters=nfilters, kernel_size=(size, size), padding=padding, kernel_initializer=initializer)(x)
    x = BatchNormalization()(x)
    x = Activation("relu")(x)
    return x


def deconv_block(tensor, residual, nfilters, size=3, padding='same', strides=(2, 2)):
    y = Conv2DTranspose(nfilters, kernel_size=(size, size), strides=strides, padding=padding)(tensor)
    y = concatenate([y, residual], axis=3)
    y = conv_block(y, nfilters)
    return y

def Unet(img_height, img_width, nclasses=3, filters=64):
    input_layer = Input(shape=(img_height, img_width, 3), name='image_input')
    conv1 = conv_block(input_layer, nfilters=filters)
    conv1_out = MaxPooling2D(pool_size=(2, 2))(conv1)
    conv2 = conv_block(conv1_out, nfilters=filters*2)
    conv2_out = MaxPooling2D(pool_size=(2, 2))(conv2)
    conv3 = conv_block(conv2_out, nfilters=filters*4)
    conv3_out = MaxPooling2D(pool_size=(2, 2))(conv3)
    conv4 = conv_block(conv3_out, nfilters=filters*8)
    conv4_out = MaxPooling2D(pool_size=(2, 2))(conv4)
    conv4_out = Dropout(0.5)(conv4_out)
    conv5 = conv_block(conv4_out, nfilters=filters*16)
    conv5 = Dropout(0.5)(conv5)

    deconv6 = deconv_block(conv5, residual=conv4, nfilters=filters*8)
    deconv6 = Dropout(0.5)(deconv6)
    deconv7 = deconv_block(deconv6, residual=conv3, nfilters=filters*4)
    deconv7 = Dropout(0.5)(deconv7) 
    deconv8 = deconv_block(deconv7, residual=conv2, nfilters=filters*2)
    deconv9 = deconv_block(deconv8, residual=conv1, nfilters=filters)

    output_layer = Conv2D(filters=nclasses, kernel_size=(1, 1))(deconv9)
    output_layer = BatchNormalization()(output_layer)
    output_layer = Reshape((img_height*img_width, nclasses), input_shape=(img_height, img_width, nclasses))(output_layer)
    output_layer = Activation('softmax')(output_layer)

    model = Model(inputs=input_layer, outputs=output_layer, name='Unet')
    return model

【问题讨论】:

    标签: tensorflow machine-learning keras deep-learning computer-vision


    【解决方案1】:

    你差不多完成了,现在反向传播网络错误:

    loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=output_layer, labels=labels))   
    tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(loss) 
    

    您不必将基本事实转换为 one-hot 格式,sparse_softmax 会为您添加。

    【讨论】:

    • 我将我的 GT 掩码重塑为 (img_h * img_w , nclasses) 以匹配模型的输出尺寸。我用 categorical_crossentropy 训练,但模型似乎没有收敛。传统的“准确度”指标会是一个很好的监控指标吗?
    • 孤单准确率不能作为衡量模型是否收敛的好方法。如果你想检查你的模型是否正常工作,我建议只用一张训练图像训练你的网络,批量大小为 1。然后检查你的模型是否可以学习标签。
    • 是否可以不使用 tf.reduce_mean 函数将错误反向传播到特定激活?即有像素损失?
    猜你喜欢
    • 2017-06-01
    • 2020-04-23
    • 1970-01-01
    • 2019-06-05
    • 2020-03-16
    • 2018-12-23
    • 2018-09-12
    • 2017-12-22
    • 2017-12-26
    相关资源
    最近更新 更多