TensorFlow: нарежьте Tensor и сохраните исходную форму

У меня есть тензор tensor формы (?, 1082), и я хочу разрезать этот тензор на части n в цикле for, но я хочу сохранить исходную форму, включая неизвестное измерение ?.

Пример:

lst = []
for n in range(15):
    sub_tensor = tensor[n] # this will reduce the first dimension
    print(sub_tensor.get_shape())

Вывод на печать, который я ищу:

(?, 1082) 
(?, 1082)

и т.п.

Как этого можно добиться в TensorFlow?

Есть ли у вас какие-либо ограничения, связанные с природой расщеплений, n частей должны быть равны? или n-1 равных частей и последняя часть осталась? tf.split можно легко применить здесь

Priyank Pathak 10.05.2019 08:30
Udacity Nanodegree Capstone Project: Классификатор пород собак
Udacity Nanodegree Capstone Project: Классификатор пород собак
Вы можете ознакомиться со скриптами проекта и данными на github .
0
1
418
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Учитывая, что ваша проблема может иметь много ограничений, я могу придумать как минимум 3 решения. Вы можете использовать tf.split. Я буду использовать tf.placeholder, но он также применим к тензорам и переменным.

p = tf.placeholder(shape=[None,10], dtype=tf.int32)
s1, s2 = tf.split(value=p, num_or_size_splits=2, axis=1)

Однако этот подход может стать неосуществимым, если требуется большое количество расщеплений. Обратите внимание, что он также может разделить ось None.

for n in range(15):
    sub_tensor = tensor[n, :] 
s = tf.slice(p, [0,2], [-1, 2])

Срез можно использовать для многомерных тензоров, но его довольно сложно использовать. И вы можете использовать метод tf.Tensor.getitem, почти как вы описали в своем вопросе. Он действует аналогично NumPy. Итак, это должно выполнять работу:

for n in range(10):
    print(p[n, :])

Однако использование этих методов сильно зависит от вашего конкретного приложения. Надеюсь это поможет.

Другие вопросы по теме