【发布时间】:2019-03-01 13:27:01
【问题描述】:
我有一个用 tf.keras 框架编写的简单 CNN 模型,我希望将其与可变输入大小一起使用。
根据this“文档”,我可以通过设置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?
【问题讨论】:
-
输入形状应该放在模型的第一层,但不是你的情况。
-
@MatiasValdenegro 你是对的,如果你能把它作为答案发布,我会接受。为什么零填充不是 Conv2D 的一部分对我来说是个谜。
标签: python tensorflow keras