我正在使用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
给 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 中使用自定义损失来训练模型。