我遇到错误:“当我将张量转换为float32时,没有为任何变量提供渐变” . 但是没有强制转换,我得到的错误是期望的类型是float而不是int . 所以,无论哪种方式,我似乎无法找到继续前进的方法......
在我的设置中,我试图最小化两个张量的差异的平方误差 .
softmax_w = tf.Variable(tf.zeros([SIZE_LSTM_UNITS, NUM_CLASSES], dtype=tf.float32))
softmax_b = tf.Variable(tf.zeros([NUM_CLASSES], dtype=tf.float32))
logits = tf.matmul(out, softmax_w) + softmax_b
如果我用铸造计算损失如下:
predDiff = tf.cast(tf.sub(tf.arg_max(logits, 1), tf.arg_max(train_labels, 1)), tf.float32)
l2loss = tf.nn.l2_loss(predDiff)
trainStep = tf.train.GradientDescentOptimizer(LEARNING_RATE).minimize(l2loss)
其中,logits和train_labels是1-hot向量,然后我得到以下错误:
trainStep = tf.train.GradientDescentOptimizer(LEARNING_RATE).minimize(l2loss)文件“/usr/local/lib/python2.7/dist-packages/tensorflow/python/training/optimizer.py”,第198行,最小化名称= name)文件“/usr/local/lib/python2.7/dist-packages/tensorflow/python/training/optimizer.py”,第309行,在apply_gradients(converted_grads_and_vars,)中)ValueError:没有为任何变量提供渐变: ((无,<tensorflow.python.ops.variables.Variable对象位于0x7f2c7363bf90>),(无,<tensorflow.python.ops.variables.Variable对象位于0x7f2ce284e9d0>),(无,<tensorflow.python.ops.variables .Variable object at 0x7f2ce284e510>),(None,<tensorflow.python.ops.variables.Variable object at 0x7f2ce26cf050>),(None,<tensorflow.python.ops.variables.Variable object at 0x7f2ce26cf450>),(None,< tensorflow.python.ops.variables.Variable object at 0x7f2ce2c9d510>),(None,<tensorflow.python.ops.variables.Variable object at 0x7f2ce287ae90>))
相反,如果我计算损失而不进行铸造,如下所示:
predDiff = tf.sub(tf.arg_max(logits, 1), tf.arg_max(train_labels, 1))
然后,我收到以下错误:
trainStep = tf.train.GradientDescentOptimizer(LEARNING_RATE).minimize(l2loss)文件“/usr/local/lib/python2.7/dist-packages/tensorflow/python/training/optimizer.py”,第196行,最小化grad_loss = grad_loss)文件“/usr/local/lib/python2.7/dist-packages/tensorflow/python/training/optimizer.py”,第238行,在compute_gradients中self._assert_valid_dtypes([loss])文件“/ usr / local /lib/python2.7/dist-packages/tensorflow/python/training/optimizer.py“,第379行,_assert_valid_dtypes dtype,t.name,[v for valid in_ valid]中的v))ValueError:无效的类型tf.int64 for L2Loss:0,预期:[tf.float32,tf.float64,tf.float16] .
但是,如果我像下面这样使用Cross Entropy,那么一切都很顺利 .
crossEnt = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits, train_labels))
但是,我想使用L2Loss,因为最终我正在计算RMSE来比较性能 . 我不确定我是否遗漏了一些明显的东西 . 任何帮助,将不胜感激 .
2 回答
网络中的所有权重都必须是可学习的 . 为了实现这一点,操作必须是可区分的 - 我们必须能够应用渐变 . 我们不能在
x - y
函数上从整数到整数应用渐变,所以我认为问题在于你要转换为浮动的位置 .而不是这个:
在应用
arg_max
和sub
之前尝试投射:这样,我们实际上可以计算并应用sub和arg_max的渐变 .
不确定这是否会有所帮助,但由于您的预测和目标已经整齐,这可能会起作用,因为tf.subtract和tf.multiply都可以使用整数: