2

我正在使用tf.estimatorAPI 实现一个 CNN 模型。

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

但是,当我尝试指定train_opEstimatorSpec使用AdamOptimizer)时,我不知道如何检索损失并将其提供给optimizer.minimize().

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

不幸的是,上述代码使用Keras,而我正在尝试使用tensorflow,更具体地说,使用tf.estimator. 在 Keras 中,当调用 model.compile() 时,我们可以None作为loss参数输入。但我想我们不能传递None给 tensorflow 中的优化器。

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(...):
    ...

我希望通过tf.estimator在 tensorflow 中使用自定义损失来训练模型。

4

0 回答 0