当损耗与输入有关并通过自定义损耗层实现时,如何使用tf估计器API为train_op设置损耗?

时间:2019-04-23 13:13:12

标签: python-3.x tensorflow tensorflow-estimator tf.keras

我正在使用tf.estimator API实现CNN模型。

简而言之,成本/损失函数取决于输入,并且包含要在培训期间更新的变量。我实现了具有相同映射的自定义层,仅用于调用add_loss()并保留损失的可训练变量。

但是,当我尝试为train_op指定EstimatorSpec(使用AdamOptimizer)时,我不知道如何获取损失并将其馈送到optimizer.minimize()

当我尝试实现Kendall_CVPR2018中提出的Multi-Max-Gaussian-Likelihood损失时,问题就发生了。 我采用了一般方法作为论文作者在Github上提供的示例代码,该代码定义了损失的自定义层。

不幸的是,上述代码使用Keras,而我正在尝试使用tensorflow,更具体地说是tf.estimator对其进行测试。在Keras中,调用model.compile()时,我们可以将None作为loss的参数。但是我想我们无法在张量流中将None传递给优化器。

def model_fn(features, labels, mode, params):
    ...
    xs = ts.reshape(xs, shape=[-1, ...])
    nn_params = dict(...)
    ys_out = cnn_blabla(x, mode, ** nn_params)
    ...

    loss=???

    ...
    if mode == tf.estimator.ModeKeys.TRAIN:
        optimizer = tf.train.AdamOptimmizer(params['LEARNING_RATE'])
        train_op = optimizer.minimize(loss)
    ...
    return tf.estimator.EstimatorSpec(...)


def cnn_blabla(x, mode, n_outputs, ...):
    with tf.variable_scope("blabla", reuse=tf.AUTO_REUSE):
        layer_out_1 = conv(x, ..., activation=..., name=...)
        layer_out_2 = conv(layer_out_1, ..., activation=..., name=...)
        ...
        layer_out_v = conv(layer_out_u, ..., activation=..., name=...)
        out = CustomLossLayer(n_outputs=n_outputs, name="loss_blabla")(layer_out_v)
    return out


def conv(...):
    ...

我希望通过tensorflow中的tf.estimator来训练具有自定义损失的模型。

0 个答案:

没有答案