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