【问题标题】:keras, model still setting expected input shape from training despite input_shape(None, ...)keras,尽管 input_shape(None, ...),模型仍然从训练中设置预期的输入形状
【发布时间】: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


【解决方案1】:

输入形状应位于模型的第一层,但您将其放在第二层。所以 Keras 从你的训练数据中假设了一个形状。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 2021-07-03
    • 2019-10-20
    • 2023-03-13
    • 1970-01-01
    • 2021-03-30
    相关资源
    最近更新 更多