У меня есть простая модель 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
, что происходит?