Почему размер пакета None в вызове метода слоя Keras? - PullRequest
1 голос
/ 28 апреля 2019

Я реализую пользовательский слой в Keras.Если я распечатаю форму ввода, переданную методу call, я получу None в качестве первого элемента.Это почему?Разве первый элемент не должен иметь размер пакета?

def call(self, x):
    print(x.shape)  # (None, ...)

Когда я звоню model.fit, я передаю размер пакета

batch_size = 50
model.fit(x_train, y_train, ..., batch_size=batch_size)

Итак, когда метод call на самом деле называется?И каков рекомендуемый способ получения размера партии в методе call?

1 Ответ

1 голос
/ 28 апреля 2019

None означает, что это динамическая форма.Может принимать любое значение в зависимости от выбранного размера партии.

Когда вы определяете модель по умолчанию, она определяется для поддержки любого размера партии, который вы можете выбрать.Вот что означает NoneTensorFlow 1.* вход для вашей модели является экземпляром tf.placeholder().

Если вы не используете keras.InputLayer() с указанным размером партии, вы получите первое измерение None по умолчанию:

import tensorflow as tf

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(units=2, input_shape=(2, )))
print(model.inputs[0].get_shape().as_list()) # [None, 2]
print(model.inputs[0].op.type == 'Placeholder') # True

Когда вы используете keras.InputLayer() с указанной партиейРазмер вы можете определить входной заполнитель с фиксированным размером пакета:

import tensorflow as tf

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.InputLayer((2,), batch_size=50))
model.add(tf.keras.layers.Dense(units=2, input_shape=(2, )))
print(model.inputs[0].get_shape().as_list()) # [50, 2]
print(model.inputs[0].op.type == 'Placeholder') # True

Когда вы указываете размер пакета для метода model.fit(), эти входные заполнители уже определены, и вы не можете изменить их форму.Размер пакета для model.fit() используется только для разделения предоставленных вами данных на партии.

Если вы определяете свой входной слой с размером пакета 2, а затем передаете другое значение размера пакета в model.fit() метод, который вы получите ValueError:

import tensorflow as tf
import numpy as np

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.InputLayer((2,), batch_size=2)) # <--batch_size==2
model.add(tf.keras.layers.Dense(units=2, input_shape=(2, )))
model.compile(optimizer=tf.keras.optimizers.Adam(),
              loss='categorical_crossentropy')
x_train = np.random.normal(size=(10, 2))
y_train = np.array([[0, 1] for _ in range(10)])

model.fit(x_train, y_train, batch_size=3) # <--batch_size==3

Это повысит: ValueError: The batch_size argument value 3 is incompatible with the specified batch size of your Input Layer: 2

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