奇数形状图像的卷积层

  • 本文关键字:卷积 图像 keras
  • 更新时间 :
  • 英文 :


我正在尝试构建一个卷积自动编码器,我使用的数据集由25 x 25个图像组成。

input_img = Input ( shape = (25 , 25, 1))
layer = input_img
layer = Conv2D (128 , kernel_size =(3 , 3) , activation = 'relu' , padding = 'same')( layer )
layer = MaxPooling2D ( pool_size =(2 , 2) , padding = 'same')( layer )
layer = Conv2D (128 , kernel_size =(3 , 3) ,activation = 'relu' , padding = 'same')( layer )
layer = MaxPooling2D ( pool_size =(2 , 2) , padding = 'same')( layer )
layer = Conv2D (128 , kernel_size =(3 , 3) ,activation = 'relu' , padding = 'same')( layer )
layer = Flatten ()( layer )
layer = Dense (32 , activation = 'relu')( layer )
layer = Dense (6)( layer )
encoded = layer
layer = Dense (32 , activation = 'relu')( encoded )
layer = Dense (6272 , activation = 'relu')( layer )
layer = Reshape ((7, 7, 128))( layer )
layer = Conv2D (128 , kernel_size =(3 , 3) ,activation = 'relu' , padding = 'same')( layer )
layer = UpSampling2D ((2 ,2))( layer )
layer = Conv2D (128 , kernel_size =(3 , 3) ,activation = 'relu' , padding = 'same')( layer )
layer = UpSampling2D ((2 ,2))( layer )
layer = Conv2D (1, kernel_size =(3 , 3) , padding = 'same')( layer )
autoencoder = Model ( input_img , layer )

然而,当我尝试这样做时,我得到了以下维度:

input_35 (InputLayer)        (None, 25, 25, 1)         0         
_________________________________________________________________
conv2d_208 (Conv2D)          (None, 25, 25, 128)       1280      
_________________________________________________________________
max_pooling2d_72 (MaxPooling (None, 13, 13, 128)       0         
_________________________________________________________________
conv2d_209 (Conv2D)          (None, 13, 13, 128)       147584    
_________________________________________________________________
max_pooling2d_73 (MaxPooling (None, 7, 7, 128)         0         
_________________________________________________________________
conv2d_210 (Conv2D)          (None, 7, 7, 128)         147584    
_________________________________________________________________
flatten_32 (Flatten)         (None, 6272)              0         
_________________________________________________________________
dense_125 (Dense)            (None, 32)                200736    
_________________________________________________________________
dense_126 (Dense)            (None, 6)                 198       
_________________________________________________________________
dense_127 (Dense)            (None, 32)                224       
_________________________________________________________________
dense_128 (Dense)            (None, 6272)              206976    
_________________________________________________________________
reshape_74 (Reshape)         (None, 7, 7, 128)         0         
_________________________________________________________________
conv2d_211 (Conv2D)          (None, 7, 7, 128)         147584    
_________________________________________________________________
up_sampling2d_72 (UpSampling (None, 14, 14, 128)       0         
_________________________________________________________________
conv2d_212 (Conv2D)          (None, 14, 14, 128)       147584    
_________________________________________________________________
up_sampling2d_73 (UpSampling (None, 28, 28, 128)       0         
_________________________________________________________________
conv2d_213 (Conv2D)          (None, 28, 28, 1)         1153      
_________________________________________________________________
reshape_75 (Reshape)         (None, 1, 784)            0         
_________________________________________________________________
activation_14 (Activation)   (None, 1, 784)            0         
_________________________________________________________________
reshape_76 (Reshape)         (None, 28, 28, 1)         0         

我希望输入和输出维度完全相同,我也不知道为什么非采样层选择(14,14128(,而卷积层选择(13,13128(。

您可以使用ZeroPadding2DCropping2D层。

input_img = Input ( shape = (25 , 25, 1))
layer = input_img
# layer = ZeroPadding(((3,0), (3,0)))( layer )
layer = Conv2D (128 , kernel_size =(3 , 3) , activation = 'relu' , padding = 'same')( layer )
layer = MaxPooling2D ( pool_size =(2 , 2) , padding = 'same')( layer )
layer = Conv2D (128 , kernel_size =(3 , 3) ,activation = 'relu' , padding = 'same')( layer )
layer = MaxPooling2D ( pool_size =(2 , 2) , padding = 'same')( layer )
layer = Conv2D (128 , kernel_size =(3 , 3) ,activation = 'relu' , padding = 'same')( layer )
layer = Flatten ()( layer )
layer = Dense (32 , activation = 'relu')( layer )
layer = Dense (6)( layer )
encoded = layer
layer = Dense (32 , activation = 'relu')( encoded )
layer = Dense (6272 , activation = 'relu')( layer )
layer = Reshape ((7, 7, 128))( layer )
layer = Conv2D (128 , kernel_size =(3 , 3) ,activation = 'relu' , padding = 'same')( layer )
layer = UpSampling2D ((2 ,2))( layer )
layer = Conv2D (128 , kernel_size =(3 , 3) ,activation = 'relu' , padding = 'same')( layer )
layer = UpSampling2D ((2 ,2))( layer )
layer = Conv2D (1, kernel_size =(3 , 3) , padding = 'same')( layer )
layer = Cropping2D(((3,0), (3,0)))( layer )
autoencoder = Model ( input_img , layer )

结果:

Model: "model_8"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_12 (InputLayer)        [(None, 25, 25, 1)]       0         
_________________________________________________________________
zero_padding2d_8 (ZeroPaddin (None, 28, 28, 1)         0         
_________________________________________________________________
conv2d_54 (Conv2D)           (None, 28, 28, 128)       1280      
_________________________________________________________________
max_pooling2d_18 (MaxPooling (None, 14, 14, 128)       0         
_________________________________________________________________
conv2d_55 (Conv2D)           (None, 14, 14, 128)       147584    
_________________________________________________________________
max_pooling2d_19 (MaxPooling (None, 7, 7, 128)         0         
_________________________________________________________________
conv2d_56 (Conv2D)           (None, 7, 7, 128)         147584    
_________________________________________________________________
flatten_9 (Flatten)          (None, 6272)              0         
_________________________________________________________________
dense_37 (Dense)             (None, 32)                200736    
_________________________________________________________________
dense_38 (Dense)             (None, 6)                 198       
_________________________________________________________________
dense_39 (Dense)             (None, 32)                224       
_________________________________________________________________
dense_40 (Dense)             (None, 6272)              206976    
_________________________________________________________________
reshape_9 (Reshape)          (None, 7, 7, 128)         0         
_________________________________________________________________
conv2d_57 (Conv2D)           (None, 7, 7, 128)         147584    
_________________________________________________________________
up_sampling2d_18 (UpSampling (None, 14, 14, 128)       0         
_________________________________________________________________
conv2d_58 (Conv2D)           (None, 14, 14, 128)       147584    
_________________________________________________________________
up_sampling2d_19 (UpSampling (None, 28, 28, 128)       0         
_________________________________________________________________
conv2d_59 (Conv2D)           (None, 28, 28, 1)         1153      
=================================================================
Total params: 1,000,903
Trainable params: 1,000,903
Non-trainable params: 0
_________________________________________________________________

最新更新