Как поменять строки внутри 3d-тензора в тензорном потоке - PullRequest
0 голосов
/ 30 сентября 2019

Я занимаюсь этим уже два часа, и это такая простая проблема. Я строю оптимизатор для весов, используя GA, и для выполнения мутации мне нужно иметь возможность поменять ряд весов в одном NN на другой NN

У меня есть 3D-тензор для каждого слоя фигуры [население, тотал_интумент, total_output]. Я выбираю строку в 3d-тензоре, а затем два человека должны поменять местами значения одной и той же строки. Например, строка [nn1, row_to_swap] должна поменяться местами со строкой [nn2, row_to_swap].

Пример с тензором совокупности 3, входными узлами 3 и выходными узлами 2 имеет эту форму [3,3,2] где я хочу поменять местами [0,0] и [1,0]:

      [[[ -0.08140966 -0.04416275 ],
        [ 0.08669635, -0.1681123 ],
        [ 0.06804892,  0.05393898]],

       [[ 0.11369397, -0.0822193 ],
        [-0.08230941,  0.16685687],
        [-0.08133464, -0.02710806]],

       [[ 0.08381592, -0.07583494],
        [-0.08355351,  0.07891247],
        [ 0.0392112 , -0.07686558]]]

Это должно выглядеть следующим образом.

  [[[ -0.08140966 -0.04416275 ],
    [ 0.08669635, -0.1681123 ],
    [ 0.06804892,  0.05393898]],

   [[ 0.11369397, -0.0822193 ],
    [-0.08230941,  0.16685687],
    [-0.08133464, -0.02710806]],

   [[ 0.08381592, -0.07583494],
    [-0.08355351,  0.07891247],
    [ 0.0392112 , -0.07686558]]]

Просто на голову, я выиграл 'Не знаю, каковы точные формы для тензоров, так как они будут созданы с помощью переменной формы. Иногда методы могут сделать несколько перестановок. Скажем, [1,0] и [1,2] придется поменять местами с [0,0] и [0,2], так что если есть метод, который может сделать несколько перестановок за один раз, не создавая цикл, который был бы хорош,

Например:

      [[[ -0.08140966 -0.04416275 ],
        [ 0.08669635, -0.1681123 ],
        [ 0.06804892,  0.05393898]],

       [[ 0.11369397, -0.0822193 ],
        [-0.08230941,  0.16685687],
        [-0.08133464, -0.02710806]],

       [[ 0.08381592, -0.07583494],
        [-0.08355351,  0.07891247],
        [ 0.0392112 , -0.07686558]]]

Это должно выглядеть следующим образом.

      [[[ 0.11369397, -0.0822193 ],
        [-0.08230941,  0.16685687]
        [-0.08133464, -0.02710806]],

       [[ -0.08140966 -0.04416275 ],
        [-0.08230941,  0.16685687],
        [ 0.06804892,  0.05393898]],

       [[ 0.08381592, -0.07583494],
        [-0.08355351,  0.07891247],
        [ 0.0392112 , -0.07686558]]]

Казалось, у Numpy есть простое решение, в котором они использовали

npArray[[0,0]] = npArray[[1,0]]

Конечно, TensorFlow немного сложнее.

1 Ответ

0 голосов
/ 15 октября 2019

Это может быть достигнуто с помощью tf.scatter_nd_update. Пожалуйста, найдите образец фрагмента:

ref = tf.Variable([[[1, 2,3],[3, 4,5],[5, 6,7], [7, 8,9]]])
print(ref)
indices = tf.constant([[0,1,1], [0,1,0], [0,0,0] ,[0,0,1]])
updates = tf.constant([9, 10, 11, 12])
update = tf.scatter_nd_update(ref, indices, updates)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(sess.run(ref))
    print(sess.run(update))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...