多种输出和损失,实现多类图像分割

时间:2018-09-25 07:53:55

标签: python tensorflow keras

我将Keras与Tensorflow结合使用来解决多类图像分割问题。对于每个训练对type root struct { XMLName xml.Name `xml:"root"` Files []ConfigFile `xml:",any"` } type ConfigFile struct { Configs []Config `xml:"config"` } type Config struct { Name string `xml:"name"` Value string `xml:"value"` Description string `xml:"description"` } ,我的模型都有不同的辅助损失({(x_i,y_i)}^N),这些损失与一个主要(out_aux)损失函数加在一起。

out_main

此刻,我对所有输出( Input(256,256,5) | | something happening here / | | | \ | | | | | out_main out_aux(0) out_aux(1) out_aux(2) out_aux(3) )使用相同的损耗,因此,基本上,对所有损耗都评估一个(x,y)对。定义模型时遇到一些问题。产生辅助损失的方法如下:

categorical_crossentropy

以及用于创建和编译模型的方法定义为:

def aux_branch(self, x, nb_labels=5):
    # x is a list of feature maps.
    x_aux = []
    for nf in range(len(x)):
        x_in = x[nf]
        out_aux = _conv(filters=nb_labels, kernel_size=(1, 1), activation='linear')(x_in)
        out_aux = Reshape((im_rows * im_cols, nb_labels))(out_aux)
        out_aux = Activation('softmax')(out_aux)
        out_aux = Reshape((im_rows, im_cols, nb_labels), name='out_aux_{}'.format(nf))(out_aux)

        x_aux.append(out_aux)

    return x_aux

关于损失函数,我使用的是来自keras的标准categorical_crossentropy函数。 我收到的错误消息是:

def create_model(self, x, lossfunc, nb_labels=5):
    ...
    ... 

    out_aux = self.aux_branch(x)
    ...
    out_main = _conv(filters=nb_labels, kernel_size=(1, 1), activation='linear')(out_main)
    out_main = Reshape((im_rows * im_cols, nb_labels))(out_main)
    out_main = Activation('softmax')(out_main)
    out_main = Reshape((im_rows, im_cols, nb_labels), name='out_main')(out_main)

    model = Model(inputs=inputs, outputs=[out_main, out_aux[0], out_aux[1], out_aux[2], out_aux[3], out_aux[4]])


    model.compile(loss={'out_aux_0': lossfunc,
                        'out_aux_1': lossfunc,
                        'out_aux_2': lossfunc,
                        'out_aux_3': lossfunc,
                        'out_aux_4': lossfunc,
                        'out_main': lossfunc},
                  # loss_weights={'out_aux_0': 1.0,
                  #               'out_aux_1': 1.0,
                  #               'out_aux_2': 1.0,
                  #               'out_aux_3': 1.0,
                  #               'out_aux_4': 1.0,
                  #               'out_main': 1.0},
                    optimizer=optimizer,
                    metrics={'out_main': 'accuracy',
                           'out_aux_0': 'accuracy',
                           'out_aux_1': 'accuracy',
                           'out_aux_2': 'accuracy',
                           'out_aux_3': 'accuracy',
                           'out_aux_4': 'accuracy'})

    ...
    results = model.fit_generator(
        generator=train_generator,
        steps_per_epoch=steps_per_epoch,
        epochs=args.epochs,
        callbacks=callbacks,
        validation_data=val_generator,
        #nb_val_samples = nb_val_samples,
        validation_steps=validation_steps,
        #class_weight=class_weight
        initial_epoch=epoch_num+1
       )

关于我在做什么错的任何想法吗?

0 个答案:

没有答案