我正在写一个张量流代码,我想在每次更新后规范化变量向量。以下代码效果很好:
sess = tf.InteractiveSession()
y = tf.Variable(tf.random_uniform([2], -0.5, 0.5))
init = tf.initialize_all_variables()
sess.run(init)
a = [2, 3]
loss = tf.reduce_sum(tf.square(a - y))
y = y / tf.sqrt(tf.reduce_sum(tf.square(y)))
optimizer = tf.train.GradientDescentOptimizer(0.05)
train = optimizer.minimize(loss)
for step in range(100):
sess.run(train)
temp2= sess.run(y)
print(temp2)
并给出所需的答案,即[0.55469805 0.83205169],[2,3]方向的归一化向量
但是,如果我改变
y = tf.Variable(tf.random_uniform([2], -0.5, 0.5))
到
y = tf.Variable(tf.random_uniform([2,2], -0.5, 0.5))
和
y = y / tf.sqrt(tf.reduce_sum(tf.square(y)))
到
y[0] = y[0] / tf.sqrt(tf.reduce_sum(tf.square(y[0])))
然后我收到错误,上面写着"'变量'对象不支持项目分配"。我还将损失函数改为
loss = tf.reduce_sum(tf.square(a - y[0]))
有人可以帮助我如何规范化张量流中变量类型y [0]的向量列吗?
答案 0 :(得分:0)
由于y
是张量对象,因此您无法像过程那样将值分配给张量。因此,您应该处理张量数组,然后将值分配如下:
yArray = y.eval()
a = [2, 3]
loss = tf.reduce_sum(tf.square(a - y.eval()[0][:]))
yArray[0][:] = yArray[0][:] / tf.sqrt(tf.reduce_sum(tf.square(yArray[0][:]))).eval()
y.assign(yArray)
在上面,使用eval
函数获取张量数组。然后,计算损失函数,并yArray
归一化。最后,将yArray
的值分配到y
。