Здравствуйте.
У меня есть проблема.На самом деле у меня есть список ( реальный список Python ) заполнителей.Мой список имеет длину n (= T в приведенном ниже коде) и выглядит следующим образом:
my_list = [[D0, K], [D1, K], ... [Dn, K]]
Где Di не нужны одинакового размера,Вот почему я использовал список (потому что я не могу преобразовать этот список в тензор без заполнения)
Я хочу сделать следующее:
temp = []
for step in range(T):
temp.append(tf.reduce_sum(x[step], axis=0))
sum_vn_t = tf.stack(temp)
Где x = my_list длины n , определенной ранее.Этот фрагмент кода просто преобразует мой список входных данных x , который выглядит следующим образом:
[[D0, K], [D1, K], ... [Dn, K]]
в
[n, K]
Где я фактически суммирую по каждой строке Di так, чтобы каждая j-ая строка моего нового тензора размера [n, K] содержит: sum ([Dj, K], axis = 0)
Проблема в том, чтоесли я использую python for ... loop Я не уверен, что обратное распространение действительно будет работать (я новичок в TensorFlow, но я думаю, что если я не использую while_loop function мои операции не будут добавлены в Graph, и поэтому делать нативный цикл python for не имеет смысла?).
Итак, я только что попытался перекодировать этот фрагмент кода, используя tenorflow while_loop.Код выглядит следующим образом:
def reduce_it(i, outputs):
i_row = tf.reduce_sum(x[i], axis=0) # x[i] throw an error as i is a Tensor
outputs = outputs.write(i, i_row)
return i+1, outputs
temp = tf.TensorArray(dtype=tf.float32, infer_shape=False, size=1,
dynamic_size=True)
_, temp = tf.while_loop(lambda i, *args: tf.less(i, T),
reduce_it, [0, temp])
temp = temp.stack()
Я уже видел, как кто-то спрашивал об этом, но никто не мог дать ему обходной путь.Я попытался преобразовать Tensor i в целое число, передав массив массивов, к которому я добавляю элемент во время цикла while, чтобы получить форму этого массива:
def reduce_it(arr, outputs):
idx = arr.shape[0] - 1 # use shape[0] of array as i
i_row = tf.reduce_sum(x[idx], axis=0)
outputs = outputs.write(tf.constant([idx]), i_row)
arr = np.append(arr, 0)
return arr, outputs
temp = tf.TensorArray(dtype=tf.float32, infer_shape=False, size=1,
dynamic_size=True)
_, temp = tf.while_loop(lambda arr, *args: tf.less(arr.shape[0], T),
reduce_it, [np.array([0]), temp])
temp = temp.stack()
, но это нене работает, потому что форма моего массива arr изменяется во время цикла, поэтому мне может понадобиться использовать параметр shape_invariants в while_loop, но мне не удалось получить рабочий код ...
Также я преобразовал свой список в Tensor, добавив отступ, так что мой тензор имеет размер: [T, max (Di), K] , но мне все еще нужно знать, на каком Dimension Di i 'Я работаю на каждой итерации моего цикла, это означает, что мне нужно создать тензор (1d-массив) размера n, имеющий Di в качестве числа на позиции i:
my_tensor = [D1, D2, ..., Dn]
, тогда мне нужно собрать Di в моем временицикл, но если я просто сделаю:
my_dim = tf.gather(my_tensor, i)
Я соберу только тензор и мне нужно целое число.
Не думаю, что смогу определить сеанс и восстановить my_dim.eval (), поскольку этот код является частью моего модуля, который затем вызывается во время обучения (и ясоздать сеанс в данный момент).
Некоторые эксперты TF могут подумать об обходном пути или взломе?
Заранее спасибо
Примечание Также заполнение - это решение, но на самом деле позже в моем коде мне нужно получить каждую исходную матрицу размера [Di, K], и поэтому, если я дополню свой [Di, K], чтобы я мог построить тензор формы:
[n, max(Dn), K]
тогда мне все еще нужно восстановить каждый [Di, K], чтобы иметь возможность использовать tf.matmul () (например, операции) с правильными размерами.Так что заполнение для меня на самом деле не решение.
Надеюсь, мой пост достаточно ясен.