我在TensorFlow中尝试训练一个1D CNN模型,输入数据的形状为(14400,1),但我收到了一个错误,指出输入形状与模型不兼容。我已经确保我的输入数据具有正确的形状。我使用的是TensorFlow版本2.3.0
批次片段(每批32个示例,数据形状 – (14400,1),标签形状 – (1,1))
batch: 0Data shape: (32, 14400, 1) (32, 1, 1)batch: 1Data shape: (32, 14400, 1) (32, 1, 1)batch: 2Data shape: (32, 14400, 1) (32, 1, 1)batch: 3Data shape: (32, 14400, 1) (32, 1, 1)batch: 4Data shape: (32, 14400, 1) (32, 1, 1)batch: 5Data 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,049Trainable params: 58,981,729Non-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.
我非常感激您的帮助。
回答:
我已经解决了我的问题。问题出在我使用tf.data.Dataset.from_generator函数构建的自定义生成器上。由于我没有指定数据和标签的输出形状,这些形状被定义为未知,网络的输入层无法确定数据的形状。