Keras添加数据增强后Dense层报输入最后一维未定义错误
报错原因
报错核心触发点是数据增强模块中的RandomHeight、RandomWidth两个层:
- 这两个层会随机调整输入图像的高度、宽度,输出的图像高、宽维度是动态可变值,在模型构建阶段会被标记为
None - 动态尺寸的特征经过卷积、池化层后,维度始终无法确定,传入Flatten层展平后,特征维度依然是
None - Dense全连接层在初始化权重时,要求输入的最后一维(特征维度)必须是固定明确的数值,接收到维度为
(None, None)的输入时就会抛出你看到的错误。
不加数据增强模块时,输入固定为(224,224,3),经过各层运算后展平的特征维度是固定可计算的,所以模型可以正常构建、运行,无论使用Sequential顺序结构还是函数式API都会触发相同错误,和建模写法无关。
修复方案
你可以任选以下一种方案修复:
- 移除数据增强模块中会改变图像尺寸的
RandomHeight、RandomWidth层,仅保留RandomFlip、RandomZoom、RandomRotation这类不改变输出尺寸的增强操作,全程保持特征维度固定。 - 如果需要保留随机调整高宽的增强逻辑,在数据增强模块之后添加
tf.keras.layers.Resizing(224, 224)层,把经过随机尺寸变换的图像重新统一为固定的224*224尺寸,保证后续层接收到的输入维度确定。 - 把随机尺寸调整的逻辑迁移到
ImageDataGenerator中实现,不要放在模型结构内部,ImageDataGenerator生成批次数据时会自动将所有图像统一resize到你指定的target_size,不会出现维度不确定的问题。
修正后参考代码(以方案2为例)
train_datagen = ImageDataGenerator(rescale=1./255) test_datagen = ImageDataGenerator(rescale=1./255) train_dir = 'C:/train' test_dir = 'C:/test' train_data = train_datagen.flow_from_directory(train_dir,target_size=(224,224),class_mode='binary',seed=42) test_data = test_datagen.flow_from_directory(test_dir,target_size=(224,224),class_mode='binary',seed=42) tf.random.set_seed(42) from tensorflow.keras.layers.experimental import preprocessing data_augmentation = keras.Sequential([ preprocessing.RandomFlip("horizontal"), preprocessing.RandomZoom(0.2), preprocessing.RandomRotation(0.2), preprocessing.RandomHeight(0.2), preprocessing.RandomWidth(0.2), ], name='data_augmentation') model_1 = tf.keras.Sequential([ tf.keras.layers.Input(shape=(224,224,3),name='input_layer'), data_augmentation, # 新增固定尺寸重置层,统一输出尺寸 tf.keras.layers.Resizing(224, 224), tf.keras.layers.Conv2D(20,3,activation='relu'), tf.keras.layers.MaxPool2D(pool_size=2), tf.keras.layers.Conv2D(20,3,activation='relu'), tf.keras.layers.MaxPool2D(pool_size=2), tf.keras.layers.Flatten(), tf.keras.layers.Dense(1,activation='sigmoid') ]) model_1.compile(loss=tf.keras.losses.binary_crossentropy, optimizer='Adam', metrics=['accuracy']) model_1.fit(train_data,epochs=10,validation_data=test_data)
内容的提问来源于stack exchange,提问作者Varintorn Sithisint
相关产品推荐
相关产品推荐

