2017-01-06 9 views
3

Я реализую операцию в keras, так что она может работать как на основе anano, так и на endorflow. Предположу, что на входе операции:tensorflow anano.tensor.set_subtensor эквивалент

array([[ 0, 1, 2], 
     [ 3, 4, 5], 
     [ 6, 7, 8], 
     [ 9, 10, 11]], dtype=int64) 

, то его выход должен быть:

array([[ 0, 1, 2, 3, 4, 5], 
     [ 3, 4, 5, 0, 1, 2], 
     [ 6, 7, 8, 9, 10, 11], 
     [ 9, 10, 11, 6, 7, 8]], dtype=int64) 

Моих кодов являются следующим:

from keras import backend as K 
def pairreshape(x,target_dim,input_shape): 
    x1, x2 = x[0::2,], x[1::2,] 
    x1_concate = K.concatenate((x1,x2), axis=target_dim) 
    x2_concate = K.concatenate((x2,x1), axis=target_dim) 
    if K.image_dim_ordering() == 'th': 
     import theano.tensor as T 
     x_new = T.repeat(x,2,axis=target_dim) 
     x_new = T.set_subtensor(x_new[0::2], x1_concate) 
     x_new = T.set_subtensor(x_new[1::2], x2_concate) 
    elif K.image_dim_ordering() == 'tf': 
     import tensorflow as tf 
     repeats = [1] * len(input_shape) 
     repeats[target_dim] = 2 
     x_new = tf.tile(x, repeats) 
     x_new[0::2] = x1_concate #TypeError: 'Tensor' object does not support item assignment 
     x_new[1::2] = x2_concate #TypeError: 'Tensor' object does not support item assignment 

Я успешно реализовал его Теан, но Я не могу понять, как назначить тензор тензорным потоком. Последние две строки тензорного назначения в тензорном потоке сообщают об ошибке. Существует ли эквивалентность T.set_subtensor в тензорном потоке? или можете ли вы, пожалуйста, рекомендовать более эффективную реализацию операции? Благодарю.

ответ

1

Тензоры TensorFlow доступны только для чтения. Для того, чтобы изменить вещи, которые нужно использовать переменные и .assign (= не может быть переопределен в Python)

tensor = tf.Variable(tf.ones((3,3))) 
sess.run(tf.initialize_all_variables()) 
sess.run(tensor[1:, 1:].assign(2*tensor[1:,1:])) 
print(tensor.eval()) 

Выход

[[ 1. 1. 1.] 
[ 1. 2. 2.] 
[ 1. 2. 2.]] 
+1

Привет, Ярослав. Спасибо за Ваш ответ. Я боюсь, что я не понимаю в своем вопросе. Входные данные x являются обучающими образцами в глубокой нейронной сети, и, насколько я знаю, он должен быть представлен как тензор. Так есть ли решение для этого? Благодарю. –

+0

Поскольку тензоры доступны только для чтения, единственный способ сделать «set_subtensor» - сначала скопировать его в переменную, а затем модифицировать эту переменную –

+0

, вы можете сделать 'tensor_copy.assign (тензор)' сделать копию и добавить чтобы убедиться, что это выполняется перед вашим аналогом 'set_subtensor' –

0

Потребовалось много поисков, но самые близкие функции к theano.tensor.set_subtensor являются gather, gather_nd, scatter, и scatter_nd. Если вы пытаетесь выполнить разреженные обновления переменной, другие ответы могут работать. Но если вы пытаетесь динамически создавать тензор из индексации другого тензора, это функции, которые нужно использовать.

Точка этих функций должна иметь возможность динамически создавать тензор (а не переменную) из чего-то другого. В моем случае я создаю плоский тензор, и я пытаюсь изменить его на различные треугольные матрицы.

gather - это то, что вы используете, если пытаетесь создать меньшую матрицу из большой разреженной матрицы. scatter - это то, что вы используете, если пытаетесь встроить меньшую матрицу в большую нулевую матрицу.

Некоторая комбинация gather, scatter и добавление и умножение могут воссоздать theano.tensor.set_subtensor.

https://www.tensorflow.org/api_docs/python/tf/scatter_nd https://www.tensorflow.org/api_guides/python/array_ops#Slicing_and_Joining

Вы можете также использовать очень сложный набор нарезка и конкатенации, но собирать и рассеивать бы предпочтительнее.

Cheers

 Смежные вопросы

  • Нет связанных вопросов^_^