2

tf.estimatorAPIを使用して CNN モデルを実装しています。

簡単に言えば、コスト/損失関数は入力依存であり、トレーニング中に更新される変数が含まれています。add_loss()損失のためにトレーニング可能な変数を呼び出して保持するためだけに、同一のマッピングを使用してカスタムレイヤーを実装しました。

しかし、train_opfor EstimatorSpec( を使用してAdamOptimizer) を指定しようとすると、損失を取得して にフィードする方法がわかりませんoptimizer.minimize()

Kendall_CVPR2018で提案されている Multi-Max-Gaussian-Likelihood 損失を実装しようとしたときに、問題が発生しました。論文の著者がGithubで提供しているコード例として、一般的なアプローチを採用しました。これは、損失のカスタム レイヤーを定義しています。

残念ながら、前述のコードでは を使用していますが、より具体的には でKerasテストしようとしています。Keras では、model.compile() を呼び出すときに、引数としてフィードできます。しかし、テンソルフローではオプティマイザーに渡すことができないと思います。tensorflowtf.estimatorNonelossNone

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ます。

4

0 に答える 0