【问题标题】:Tensorflow Model Input Shape Error: Input 0 of layer sequential_11 incompatible with layer: rank undefined, but the layer requires a defined rankTensorflow 模型输入形状错误:层序贯_11 的输入 0 与层不兼容:秩未定义,但层需要定义的秩
【发布时间】:2021-03-25 17:04:16
【问题描述】:

我正在尝试使用输入形状 (14400,1) 的数据在 TensorFlow 中训练一维 CNN 模型,但我收到输入形状与模型不兼容的错误。我已确保我的输入数据具有正确的形状。我正在使用 TensorFlow 版本 2.3.0

批次片段(每批次 32 个示例,数据形状 - (14400,1),标签形状 - (1,1))

batch:  0
Data shape:  (32, 14400, 1) (32, 1, 1)
batch:  1
Data shape:  (32, 14400, 1) (32, 1, 1)
batch:  2
Data shape:  (32, 14400, 1) (32, 1, 1)
batch:  3
Data shape:  (32, 14400, 1) (32, 1, 1)
batch:  4
Data shape:  (32, 14400, 1) (32, 1, 1)
batch:  5
Data shape:  (32, 14400, 1) (32, 1, 1)

CNN 模型

model = Sequential()
model.add(Conv1D(128, kernel_size=5, activation='relu', input_shape=(14400,1)))
model.add(BatchNormalization())
model.add(Dropout(.2))
model.add(Conv1D(32, kernel_size=5, activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(.2))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(.2))
model.add(Dense(64, activation='relu'))
model.add(Dropout(.2))
model.add(Dense(32, activation='relu'))
model.add(Dropout(.2))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.summary()

模型摘要

Model: "sequential_11"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d_19 (Conv1D)           (None, 14396, 128)        768       
_________________________________________________________________
batch_normalization_10 (Batc (None, 14396, 128)        512       
_________________________________________________________________
dropout_40 (Dropout)         (None, 14396, 128)        0         
_________________________________________________________________
conv1d_20 (Conv1D)           (None, 14392, 32)         20512     
_________________________________________________________________
batch_normalization_11 (Batc (None, 14392, 32)         128       
_________________________________________________________________
dropout_41 (Dropout)         (None, 14392, 32)         0         
_________________________________________________________________
flatten_8 (Flatten)          (None, 460544)            0         
_________________________________________________________________
dense_32 (Dense)             (None, 128)               58949760  
_________________________________________________________________
dropout_42 (Dropout)         (None, 128)               0         
_________________________________________________________________
dense_33 (Dense)             (None, 64)                8256      
_________________________________________________________________
dropout_43 (Dropout)         (None, 64)                0         
_________________________________________________________________
dense_34 (Dense)             (None, 32)                2080      
_________________________________________________________________
dropout_44 (Dropout)         (None, 32)                0         
_________________________________________________________________
dense_35 (Dense)             (None, 1)                 33        
=================================================================
Total params: 58,982,049
Trainable params: 58,981,729
Non-trainable params: 320
_________________________________________________________________

导致错误的代码

history = model.fit(train_ds, validation_data=val_ds, epochs=10)

错误信息

ValueError: in user code:

    /data/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py:806 train_function  *
        return step_function(self, iterator)
    /data/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py:796 step_function  **
        outputs = model.distribute_strategy.run(run_step, args=(data,))
    /data/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/distribute/distribute_lib.py:1211 run
        return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
    /data/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/distribute/distribute_lib.py:2585 call_for_each_replica
        return self._call_for_each_replica(fn, args, kwargs)
    /data/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/distribute/distribute_lib.py:2945 _call_for_each_replica
        return fn(*args, **kwargs)
    /data/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py:789 run_step  **
        outputs = model.train_step(data)
    /data/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py:747 train_step
        y_pred = self(x, training=True)
    /data/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/keras/engine/base_layer.py:976 __call__
        self.name)
    /data/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/keras/engine/input_spec.py:168 assert_input_compatibility
        layer_name + ' is incompatible with the layer: '

    ValueError: Input 0 of layer sequential_11 is incompatible with the layer: its rank is undefined, but the layer requires a defined rank.

非常感谢您的帮助。

【问题讨论】:

    标签: python tensorflow machine-learning keras deep-learning


    【解决方案1】:

    您可以在此处查看 Conv1D 的文档 [https://www.tensorflow.org/api_docs/python/tf/keras/layers/Conv1D]

    第一层的输入形状应包含批量大小。 (32,14440,1) 如果你在下面尝试这个脚本,你会遇到同样的错误

    input_shape = (14440,1)
    x = tf.random.normal(input_shape)
    y = tf.keras.layers.Conv1D(128, 5,   activation='relu',input_shape=input_shape)(x)
    y.shape
    

    但使用输入形状 (32,14440,1) 它可以工作。

    【讨论】:

    • 感谢您的帮助!由于我的数据可能无法完全被批次大小整除(在这种情况下,批次大小 = 32),我该如何处理批次小于预期批次大小的情况?
    【解决方案2】:

    我发现了我的问题。它来自我使用 tf.data.Dataset.from_generator 函数构建的自定义生成器。由于我没有指定数据和标签的输出形状,所以这些形状被定义为未知,网络的输入层无法弄清楚数据的形状。

    【讨论】:

      猜你喜欢
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      • 1970-01-01
      • 2020-11-14
      • 1970-01-01
      • 2021-03-27
      • 1970-01-01
      相关资源
      最近更新 更多