Отрегулируйте одно значение в тензоре - TensorFlow
Я смущенно спрашиваю об этом, но как вы настраиваете одно значение в тензоре? Предположим, вы хотите добавить '1' только к одному значению в своем тензоре?
Выполнение этого путем индексирования не работает:
TypeError: 'Tensor' object does not support item assignment
Один подход заключался бы в построении тензора одинаковой формы 0. А затем настройте 1 в нужном месте. Тогда вы добавите два тензора вместе. Снова это сталкивается с той же проблемой, что и раньше.
Я несколько раз читал документы API и не могу понять, как это сделать. Заранее спасибо!
Ответы
Ответ 1
UPDATE: TensorFlow 1.0 включает в себя tf.scatter_nd()
оператор, который можно использовать для создания delta
ниже без создания tf.SparseTensor
.
Это на самом деле удивительно сложно с существующими операциями! Возможно, кто-то может предложить более удобный способ обернуть следующее, но здесь один из способов сделать это.
Скажем, у вас есть тензор tf.constant()
:
c = tf.constant([[0.0, 0.0, 0.0],
[0.0, 0.0, 0.0],
[0.0, 0.0, 0.0]])
... и вы хотите добавить 1.0
в местоположение [1, 1]. Один из способов сделать это - определить tf.SparseTensor
, delta
, представляющий изменение:
indices = [[1, 1]] # A list of coordinates to update.
values = [1.0] # A list of values corresponding to the respective
# coordinate in indices.
shape = [3, 3] # The shape of the corresponding dense tensor, same as `c`.
delta = tf.SparseTensor(indices, values, shape)
Затем вы можете использовать tf.sparse_tensor_to_dense()
op для создания плотного тензора из delta
и добавить его в c
:
result = c + tf.sparse_tensor_to_dense(delta)
sess = tf.Session()
sess.run(result)
# ==> array([[ 0., 0., 0.],
# [ 0., 1., 0.],
# [ 0., 0., 0.]], dtype=float32)
Ответ 2
Как насчет tf.scatter_update(ref, indices, updates)
или tf.scatter_add(ref, indices, updates)
?
ref[indices[...], :] = updates
ref[indices[...], :] += updates
Смотрите это.
Ответ 3
tf.scatter_update
не имеет назначенного оператора градиентного спуска и будет tf.train.GradientDescentOptimizer
ошибку при обучении по крайней мере с tf.train.GradientDescentOptimizer
. Вы должны реализовать битовые манипуляции с низкоуровневыми функциями.
Ответ 4
Мне кажется, что тот факт, что функции tf.assign
, tf.scatter_nd
, tf.scatter_update
работают только на tf.Variables
, недостаточно подчеркнут. Так и есть.
А в более поздних версиях TensorFlow (протестировано с 1.14) вы можете использовать индексирование для tf.Variable
для присвоения значений определенным индексам (опять же, это работает только для объектов tf.Variable
).
v = tf.Variable(tf.constant([[1,1],[2,3]]))
change_v = v[0,0].assign(4)
with tf.Session() as sess:
tf.global_variables_initializer().run()
print(sess.run(change_v))