flow_from_dataframe 的 conv2D 输入形状错误

时间:2021-02-28 13:02:12

标签: python tensorflow keras conv-neural-network

我正在尝试训练一个可以检测的 CNN。因此,我在名为“allImages”的文件夹中有图像。我将相应图像的信息存储在一个 csv 文件中。为了处理大量数据,我使用了 flow_from_dataframe 函数。

CSV 文件如下所示: CSV_file

首先,我已经初始化了 flow_from_DataFrame 方法

traindf=pd.read_csv("face_features.csv",)

columns = ['LTX','LTY','LBX','LBY','RBX','RBY','RTX','RTY','TLLX','TLLY','TLRX','TLRY','BottomX','BottomY','TRLX','TRLY','TRRX','TRRY']

datagen=ImageDataGenerator(rescale=1./255.,validation_split=0.25)

train_generator=datagen.flow_from_dataframe(
dataframe=traindf,
directory="allImages/",
x_col='StringName',
y_col=columns,
subset="training",
batch_size=32,
seed=42,
class_mode = "input",
shuffle=True,
target_size=(158,163))

然后,我正在尝试构建和拟合模型。


model_layers = [
               
   tf.keras.layers.Conv2D( 158 , input_shape=(32, 158,163,3) , kernel_size=( 3 , 3 ), activation='relu' ),

   tf.keras.layers.Conv2D( 158 , kernel_size=( 3 , 3 ) , strides=2 , activation='relu' ),
   tf.keras.layers.BatchNormalization(),

   tf.keras.layers.Conv2D( 18 , kernel_size=( 3 , 3 ) , strides=1 , activation='relu' ),
   tf.keras.layers.Conv2D( 18 , kernel_size=( 3 , 3 ) , strides=1 , activation='relu' ),
   tf.keras.layers.Conv2D( 18 , kernel_size=( 3 , 3 ) , strides=1 ),

]
model = tf.keras.Sequential(model_layers)
model.compile( loss=tf.keras.losses.mean_squared_error , optimizer=tf.keras.optimizers.Adam( lr=0.0001 ) , metrics=[ 'mse' ] )



model.fit_generator(generator=train_generator,
                   steps_per_epoch=20,
                   epochs=20)

但不幸的是,keras 抛出了输入错误。

WARNING:tensorflow:Model was constructed with shape (None, 32, 158, 163, 
3) for input Tensor("conv2d_92_input:0", shape=(None, 32, 158, 163, 3), 
dtype=float32), but it was called on an input with incompatible shape (None, None, None, None).

当我尝试获取 train_generator 的 x 形状时。我收到 (32, 158, 163, 3)。

有人可以帮忙解决这个问题吗?

珍惜你的时间。

1 个答案:

答案 0 :(得分:1)

不需要在模型第一层的input_shape中提到batch size维度:

替换 -> tf.keras.layers.Conv2D( 158 , input_shape=(32, 158,163,3), kernel_size=( 3 , 3 ), activation='relu' )

与 -> tf.keras.layers.Conv2D( 158, kernel_size=( 3 , 3 ), activation='relu', input_shape=(158,163,3))

进一步阅读: 您可以查找 Shapes in Keras