indexing - que - Ajuste de valor único dentro de Tensor-TensorFlow
tensorflow keras tutorial (3)
¿Qué tal
tf.scatter_update(ref, indices, updates)
o
tf.scatter_add(ref, indices, updates)
?
ref[indices[...], :] = updates
ref[indices[...], :] += updates
Mira this .
Me da vergüenza preguntar esto, pero ¿cómo se ajusta un solo valor dentro de un tensor? ¿Suponga que desea agregar ''1'' a un solo valor dentro de su tensor?
Hacerlo indexando no funciona:
TypeError: ''Tensor'' object does not support item assignment
Un enfoque sería construir un tensor con forma idéntica de 0. Y luego ajustando un 1 en la posición que desee. Luego sumarías los dos tensores juntos. De nuevo, esto se encuentra con el mismo problema que antes.
He leído los documentos de la API varias veces y parece que no puedo entender cómo hacerlo. ¡Gracias por adelantado!
tf.scatter_update
no tiene
tf.scatter_update
ningún operador de descenso de gradiente y generará un error al aprender con al menos
tf.train.GradientDescentOptimizer
.
Debe implementar la manipulación de bits con funciones de bajo nivel.
ACTUALIZACIÓN:
TensorFlow 1.0 incluye un operador
tf.scatter_nd()
, que puede usarse para crear
delta
continuación sin crear un
tf.SparseTensor
.
¡Esto es realmente sorprendentemente complicado con las operaciones existentes! Quizás alguien pueda sugerir una mejor manera de concluir lo siguiente, pero aquí hay una forma de hacerlo.
Digamos que tiene un tensor
tf.constant()
:
c = tf.constant([[0.0, 0.0, 0.0],
[0.0, 0.0, 0.0],
[0.0, 0.0, 0.0]])
... y desea agregar
1.0
en la ubicación [1, 1].
Una forma de hacerlo es definir un
tf.SparseTensor
,
delta
, que representa el cambio:
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)
Luego puede usar el op
tf.sparse_tensor_to_dense()
para hacer un tensor denso desde
delta
y agregarlo a
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)