在张量流中训练时使用自定义损失值

时间:2018-07-13 00:06:13

标签: python tensorflow

我想使用自己的自定义损失值训练我的神经网络。因此,我想对一个小批量执行前馈传播以将激活存储在内存中,然后使用我自己的损失值执行向后传播。这将使用张量流来完成。

最后,我需要做类似的事情:

sess.run(optimizer, feed_dict={x: training_data, loss: my_custom_loss_value}

有可能吗?我假设优化器取决于损耗,损耗本身取决于输入。因此,我希望将输入输入到图中,但是我要使用损失值。

2 个答案:

答案 0 :(得分:0)

我猜想,由于优化器取决于激活,因此将对它们进行评估,换句话说,输入将被馈送到网络中。这是一个示例:

import tensorflow as tf

a = tf.Variable(tf.constant(8.0))
a = tf.Print(input_=a, data=[a], message="a:")
b = tf.Variable(tf.constant(6.0))
b = tf.Print(input_=b, data=[b], message="b:")

c = a * b

optimizer = tf.train.AdadeltaOptimizer(learning_rate=0.1).minimize(c)
init_op = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init_op)

    value, _ = sess.run([c, optimizer], feed_dict={c: 1})
    print(value)

最后,打印值为1.0,而控制台显示:a:[8]b:[6],这意味着对输入进行了评估。

答案 1 :(得分:0)

就是这样。
当您使用梯度下降或任何其他优化算法(例如optimizer)训练AdamOptimizer()时,优化程序会最小化您的loss函数,这可能是Softmax交叉熵tf.nn.softmax_cross_entropy_with_logits多类分类,或者根据回归或您自己的自定义损失计算平方误差损失tf.losses.mean_squared_errorloss函数是使用模型假设进行评估或计算的。

因此,TensorFlow使用此级联方法通过在tf.Session().run()上调用optimizer来训练模型假设。请参阅以下作为多分类设置中的粗略示例:

batch_size = 128

# build the linear model
hypothesis = tf.add(tf.matmul(input_X, weight), bias)

# softmax cross entropy loss or cost function for logistic regression
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=targets,
                          logits=hypothesis))

# optimizer to minimize loss
optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.001).minimize(loss)

# execute in Session
with tf.Session() as sess:
     # initialize all variables
     tf.global_variables_initializer().run()
     tf.local_variables_initializer().run()

     # Train the model
     for steps in range(1000):
         mini_batch = zip(range(0, X_train.shape[0],  batch_size),
                    range(batch_size, X_train.shape[0]+1, batch_size))

         # train using mini-batches
         for (start, end) in mini_batch:
             sess.run(optimizer, feed_dict = {input_X: X_features[start:end],
                                               input_y: y_targets[start:end]})