代码之家  ›  专栏  ›  技术社区  ›  I. A Ziang Yan

在TensorFlow中训练时使用自定义损失值

  •  0
  • I. A Ziang Yan  · 技术社区  · 6 年前

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

    最后,我要做的是:

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

    有可能吗?我假设优化器依赖于损失,而损失本身依赖于输入。因此,我想输入到图中,但我想使用我的值来表示损失。

    2 回复  |  直到 6 年前
        1
  •  0
  •   I. A Ziang Yan    6 年前

    我想因为优化器依赖于激活,所以它们将被评估,换句话说,输入将被输入到网络中。下面是一个例子:

    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] 这意味着输入得到了评估。

        2
  •  0
  •   Ekaba Bisong    6 年前

    完全正确。
    当你训练 optimizer 使用梯度下降或任何其他优化算法,如 AdamOptimizer() ,优化器将 loss 函数,它可以是Softmax交叉熵 tf.nn.softmax_cross_entropy_with_logits 根据多类分类,或平方误差损失 tf.losses.mean_squared_error 在回归或你自己的习惯损失方面。这个 损失 使用模型假设来评估或计算函数。

    因此tensorflow使用这种级联方法通过调用 tf.Session().run() 优化器 是的。在多分类设置中,请参见以下粗略示例:

    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]})