我正在尝试在自己的自定义损失函数上运行梯度下降(或其他优化器算法)。目的是找到导致损失最小的输入数字。
我有一个使用常规python代码的自定义损失函数,不张量流tf.multiply()和tf.square()函数:
#inputs is a 6-element number array, getLoss returns a number
def getLoss(inputs):
val1 = inputs[0]
val2 = inputs[1]
val3 = inputs[2]
val4 = inputs[3]
val5 = inputs[4]
val6 = inputs[5]
...
<a bunch of physics calculations and for loops>
...
return loss
我一直在尝试运行以下代码:
w = tf.Variable(np.random.rand(6), name="w")
error = getLoss(w)
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(error)
model = tf.global_variables_initializer()
with tf.Session() as session:
session.run(model)
w_value = session.run(w)
print(w_value)
但这给我一个错误
slice index 2 of dimension 0 out of bounds. for 'strided_slice_14' (op: 'StridedSlice') with input shapes: [2], [1], [1], [1] and with computed input tensors: input[1] = <2>, input[2] = <3>, input[3] = <1>.
我假设的是使用tf.Variable()而不是np.array()的结果。我对tensorflow非常陌生,所以我预计可能会出现多个错误。如果有人可以向我展示优化这些变量的最佳方法,我将不胜感激。预先感谢!
编辑: xdurch0通过让我知道我正在使用[1.0,6.0](代码中固定)制作两个元素的数组来纠正了第一个错误。但是主要问题仍然存在,并带有其他错误消息:
TypeError: Using a `tf.Tensor` as a Python `bool` is not allowed. Use `if t is not None:` instead of `if t:` to test if a tensor is defined, and use TensorFlow ops such as tf.cond to execute subgraphs conditioned on the value of a tensor.
因为在getLoss代码中只有一点,所以我使用
if(inputs[0] > constVal):
...
我必须在自定义损失函数中使用tf.cond函数吗?另外,在这种情况下如何正确使用tf.cond?