keras, модель все еще устанавливает ожидаемую форму ввода от обучения, несмотря на input_shape (None, ...) - PullRequest
0 голосов
/ 01 марта 2019

У меня есть простая модель CNN, написанная в среде tf.keras, которую я хочу использовать с переменным размером ввода.

Согласно этой «документации» я могу использовать переменный вводразмер, установив input_shape=(None, None, n_channels), и я использовал слой GlobalMaxPooling2D перед моим плотным слоем, чтобы стандартизировать ввод в плотный слой.

Тем не менее, когда я тренирую модель с одним размером изображения и пытаюсь предсказатьв другом размере я получаю сообщение об ошибке:

  File "multilabel_384.py", line 180, in main
probabilities = model.predict(test_data)
File "/usr/local/miniconda3/envs/deepchem/lib/python3.5/site-packages/tensorflow/python/keras/engine/training.py", line 1471, in predict
x, check_steps=True, steps_name='steps', steps=steps)
File "/usr/local/miniconda3/envs/deepchem/lib/python3.5/site-packages/tensorflow/python/keras/engine/training.py", line 868, in _standardize_user_data
exception_prefix='input')
File "/usr/local/miniconda3/envs/deepchem/lib/python3.5/site-packages/tensorflow/python/keras/engine/training_utils.py", line 191, in standardize_input_data
' but got array with shape ' + str(data_shape))
ValueError: Error when checking input: expected sequential_input to have shape (16, 24, 1) but got array with shape (32, 48, 1)

Этот код используется для определения моей модели:

from tensorflow.keras import layers
import tensorflow as tf

def make_model(num_classes=8):
    # type (int) -> tf.keras.model
    """implementation of SimpleNet in keras"""
    model = tf.keras.Sequential()
    # conv layers
    model.add(layers.ZeroPadding2D(2))
    model.add(layers.Conv2D(input_shape=(None, None, 1),
                            filters=32, kernel_size=5, activation="relu"))
    model.add(layers.BatchNormalization())
    model.add(layers.ZeroPadding2D(2))
    model.add(layers.Conv2D(filters=64,  kernel_size=5, activation="relu"))
    model.add(layers.Conv2D(filters=128, kernel_size=3, activation="relu"))
    model.add(layers.Conv2D(filters=256, kernel_size=3, activation="relu"))
    model.add(layers.Conv2D(filters=128, kernel_size=3, activation="relu"))
    model.add(layers.GlobalMaxPooling2D())
    # dense layers
    model.add(layers.Flatten())
    model.add(layers.Dense(128, activation="relu"))
    model.add(layers.Dropout(0.25))
    model.add(layers.Dense(256, activation="relu"))
    model.add(layers.Dropout(0.25))
    # use sigmoid for multiclass problems
    model.add(layers.Dense(num_classes, activation="sigmoid"))
    return model

Итак, по сути, мой вопрос, почему keras все еще определение ожидаемой формы ввода, и есть ли способ отключить это неявное standardize_input_data, что происходит?

1 Ответ

0 голосов
/ 01 марта 2019

Форма ввода должна быть в первом слое вашей модели, но вы помещаете ее во второй.Итак, Керас принимает форму из ваших тренировочных данных.

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