我想使用自己的自定义损失值训练我的神经网络。因此,我想对一个小批量执行前馈传播以将激活存储在内存中,然后使用我自己的损失值执行向后传播。这将使用张量流来完成。
最后,我需要做类似的事情:
sess.run(optimizer, feed_dict={x: training_data, loss: my_custom_loss_value}
有可能吗?我假设优化器取决于损耗,损耗本身取决于输入。因此,我希望将输入输入到图中,但是我要使用损失值。
答案 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_error
。 loss
函数是使用模型假设进行评估或计算的。
因此,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]})