TensorFlow передает целое число

#python #neural-network #tensorflow #convolution #conv-neural-network

#python #нейронная сеть #tensorflow #свертка #conv-нейронная сеть

Вопрос:

Я пытаюсь выполнить свертку по переменным входным размерам. Для достижения этой цели я использую размер пакета 1. Однако один из узлов является максимальным объединяющим узлом, которому требуется форма ввода в виде списка ksize :

  pooled = tf.nn.max_pool(
                h,
                ksize=[1, self.input_size - filter_size   1, 1, 1],
                strides=[1, 1, 1, 1],
                padding='VALID',
                name="pool")
  

Теперь, очевидно, что input_size может быть выведен из ввода (который является заполнителем):

 self.input_x = tf.placeholder(tf.int32, [None, None], name="input_x")
  

Но я не могу использовать self.input_x.get_shape()[0] , потому что форма является динамической. Поэтому я намерен передавать входной размер как feed_dict на каждом шаге. Однако я не могу понять, как передать целое число в feed_dict. Каждый заполнитель является тензором, поэтому, если я:

 self.input_size = tf.placeholder(tf.int32, shape=(), name="input_size")
  

Мне нужно было бы сделать self.input_size.eval() , чтобы получить значение int, которое выдает мне ошибку, которую мне нужно передать input_size . Я предполагаю, что это происходит потому, что eval запускает вычисление ДО того, как произойдет этап обучения, и в этот момент для input_size нет значения.

Есть ли способ, которым я могу динамически получить op, который вычисляет форму входных данных, или способ передать целое число на шаг обучения?

Ответ №1:

Я не уверен, что это лучший способ, но вы можете динамически получать форму self.input_x в списке с помощью :

 input_shape = tf.unpack(tf.shape(self.input_x))
  

tf.shape(self.input_x) дайте вам тензор, представляющий форму self.input_x и f.unpack преобразуйте его в список тензоров.

Теперь вы можете создать свой максимальный узел объединения с :

 pooled = tf.nn.max_pool(
                h,
                ksize=tf.pack([1, input_size[1] - filter_size   1, 1, 1]),
                strides=[1, 1, 1, 1],
                padding='VALID',
                name="pool")
  

(если вам нужно 2-е измерение input_x)

Комментарии:

1. Он по-прежнему возвращает список тензоров. Мне нужно фактическое значение (целое число) второго измерения и во время выполнения. Вот почему я думаю о «подаче» этого в качестве параметра, однако, похоже, я могу подавать только тензоры?

2. Можете ли вы передать целое число с помощью » input_size = tf.placeholder(tf.int32) » ? Это работает для меня, но я использую TF r0.8, и я не пробовал использовать последнюю версию. Для проблемы списка тензоров я изменил свой ответ. Я не понимаю, почему, но tf.pack массив ksize должен работать…

3. Это проблема в TF. Независимо от того, что вы делаете — ksize будет оцениваться во время построения, поэтому это недостижимо.

4. Ах, хорошо, извините. Обычно я динамически получаю форму тензора для функций tf.reshape или tf.image.resize_images. Я надеялся, что это сработает для tf.nn.max_pool…

5. Просто примечание: tf.pack был переименован в tf.stack в Tensorflow 1.0