【问题标题】:ValueError: No gradients provided for any variable in TensorflowValueError:没有为 Tensorflow 中的任何变量提供梯度
【发布时间】:2017-07-25 07:56:57
【问题描述】:

我正在尝试在 Tensorflow 中创建一个 dice_loss 函数。 我正面临 tensorfow 的麻烦。执行以下代码

import tensorflow as tf
import tensorlayer as tl


def conv3d(x, inChans, outChans, kernel_size, stride, padding):
    weights = weight_variable([kernel_size, kernel_size, kernel_size, inChans, outChans])
    biases = bias_variable([outChans])
    conv = tf.nn.conv3d(x, weights, strides=[1, stride, stride, stride, 1], padding=padding)
    return tf.nn.bias_add(conv, biases)

def train(loss_val, var_list):
    optimizer = tf.train.AdamOptimizer(FLAGS.learning_rate)
    grads = optimizer.compute_gradients(loss_val, var_list=var_list)
    return optimizer.apply_gradients(grads)


def main(argv=None):
    image = tf.placeholder(tf.float32, shape=[None, SLICE_SIZE, IMAGE_SIZE, IMAGE_SIZE, 1], name="input_image")
    annotation = tf.placeholder(tf.float32, shape=[None, SLICE_SIZE, IMAGE_SIZE, IMAGE_SIZE, 1], name="annotation")

    logits, pred_annotation = vnet.VNet(image)
    loss = 1 - tl.cost.dice_coe(output=pred_annotation, target=annotation, axis=[1,2,3,4])

    trainable_var = tf.trainable_variables()
    train_op = train(loss, trainable_var)

    sess = tf.Session()
    ...

    ...

def VNet(x):
    ...
    out = tf.nn.elu(BatchNorm3d(conv3d(x, inChans, 2, kernel_size=5, stride=1, padding="SAME")))
    out = conv3d(out, 2, 2, kernel_size=1, stride=1, padding="SAME")
    annotation_pred = tf.to_float(tf.argmax(out, dimension=4, name='prediction'))
    return out, tf.expand_dims(annotation_pred, dim=4)

我收到以下错误:

ValueError:没有为任何变量提供渐变:...

有人可以帮助我吗?

【问题讨论】:

  • 没有足够的代码来解决它...你如何调用你的 grads 操作,vnet 中有什么等
  • 谢谢!@Arnaud De Broissia,我修改了代码,你有什么想法吗?

标签: tensorflow


【解决方案1】:

当您执行annotation_pred = tf.to_float(tf.argmax(out, dimension=4, name='prediction')) 时,您将获得张量中最大值的索引。该索引无法推导,因此梯度无法通过该操作。

因此,由于您的损失仅由该值定义,并且梯度无法流过它,因此无法为您的网络计算梯度。

我不知道具体的骰子损失是如何工作的,但也许你想使用tf.max 而不是tf.argmax,或者你必须找到一种方法来使用可以让梯度流动的操作。

【讨论】:

  • 我觉得你的分析很有道理!我会试试你的建议。非常感谢!
猜你喜欢
  • 2020-10-31
  • 2020-09-30
  • 2021-09-08
  • 2021-04-17
  • 1970-01-01
  • 2021-10-06
  • 2020-08-28
  • 2020-07-29
  • 2021-07-11
相关资源
最近更新 更多