Форма заполнителя Tensorflow с двумя первыми фигурами как None - PullRequest
0 голосов
/ 21 апреля 2020

Я только начал изучать Tensorflow (v. 2.1.0) и Python (v. 3.7.7).

Я нашел следующие строки кодов:

import numpy as np
import tensorflow as tf

support_set = tf.placeholder(tf.float32, [None, None, img_height, img_width, channels])
query_set = tf.placeholder(tf.float32, [None, None, img_height, img_width, channels])

y = tf.placeholder(tf.int64, [None, None])

При преобразовании в версию 2 с этим кодом:

support_set = np.zeros([None, None, img_height, img_width, channels], tf.float32)
query_set = np.zeros([None, None, img_height, img_width, channels], tf.float32)
y = np.zeros([None, None], tf.int64)

я получаю ошибку:

TypeError: объект 'NoneType' не может быть интерпретирован как целое число

Что означают эти два значения None в начале фигуры-заполнителя?

Вы можете найти исходный код, на который я хочу перейти с помощью Tensorflow 2, здесь .

1 Ответ

0 голосов
/ 21 апреля 2020

У вас нет соответствующего кода в v2, или tf.keras.layers.Input () может быть тем. tf.placeholder - это API низкого уровня. Это было использовано в стиле «Определить и запустить». Вы определяете модель с помощью tf.placeholder. В версии 2 вы должны писать в стиле «Определить при запуске».

См. Фрагмент из Быстрый старт TensorFlow 2 для экспертов .

class MyModel(Model):
  def __init__(self):
    super(MyModel, self).__init__()
    self.conv1 = Conv2D(32, 3, activation='relu')
    self.flatten = Flatten()
    self.d1 = Dense(128, activation='relu')
    self.d2 = Dense(10)

  def call(self, x):
    x = self.conv1(x)
    x = self.flatten(x)
    x = self.d1(x)
    return self.d2(x)

# Create an instance of the model
model = MyModel()

Также Смотрите фрагмент из Effective TensorFlow 2 . Эти классы наследуются от tf.keras.Model.

class DynamicRNN(tf.keras.Model):

  def __init__(self, rnn_cell):
    super(DynamicRNN, self).__init__(self)
    self.cell = rnn_cell

  def call(self, input_data):
    # [batch, time, features] -> [time, batch, features]
    input_data = tf.transpose(input_data, [1, 0, 2])
    outputs = tf.TensorArray(tf.float32, input_data.shape[0])
    state = self.cell.zero_state(input_data.shape[1], dtype=tf.float32)
    for i in tf.range(input_data.shape[0]):
      output, state = self.cell(input_data[i], state)
      outputs = outputs.write(i, output)
    return tf.transpose(outputs.stack(), [1, 0, 2]), state

Вы также можете написать свою модель с помощью keras api.

import tensorflow as tf
x = tf.keras.layers.Input(input_shape)
h = tf.keras.layers.Conv2D(64, (3, 3), padding='SAME')(x)
h = tf.keras.layers.ReLU()(h)
h = tf.keras.layers.Conv2D(64, (3, 3), padding='SAME')(h)
h = tf.keras.layers.ReLU()(h)
h = tf.keras.layers.Conv2D(64, (3, 3), padding='SAME')(h)
h = tf.keras.layers.ReLU()(h)
h = tf.keras.layers.Flatten()(h)
y = tf.keras.layers.Dense(10)(h)
model = tf.keras.Model(x, y)

==== EDITED ====

support_set = tf.placeholder(tf.float32, [None, None, img_height, img_width, channels])
query_set = tf.placeholder(tf.float32, [None, None, img_height, img_width, channels])

можно заменить на

import tf
support_set = tf.keras.layers.Input(shape=[None, img_height, img_width, channels])
query_set = tf.keras.layers.Input(shape=[None, img_height, img_width, channels])

, где для ввода не требуется явный размер пакета. Вы можете найти больше информации на https://www.tensorflow.org/guide/keras/functional

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...