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

时间:2017-07-25 07:56:58

标签: tensorflow

我正在尝试在Tensorflow中创建一个dice_loss函数。 我正面临着张量的问题。执行以下代码

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:没有为任何变量提供渐变:...

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:4)

执行annotation_pred = tf.to_float(tf.argmax(out, dimension=4, name='prediction'))时,会得到张量中最大值的索引。这个指数不能推导出来,因此梯度不能通过这个操作。

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

我不明确地知道骰子损失是如何工作的,但也许您想使用tf.max代替tf.argmax,或者您必须找到一种方法来使用可以让梯度流。