numpy 自动编码器的编码器中Conv2D的意外输出形状

jhdbpxl9  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(112)

我在使用Keras的卷积自动编码器的编码器中遇到了Conv 2D层的输出形状问题。编码器的输出形状出乎意料,例如(None,50,28,1)而不是预期的(None,28,28,50)。
下面是我的代码的简化版本:

from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D
from tensorflow.keras.models import Model
import numpy as np

def build_encoder(input_shape):
    encoder_input = Input(shape=input_shape)
    x = Conv2D(filters=50, kernel_size=(3, 3), activation='relu', padding='same')(encoder_input)
    x = MaxPooling2D((2, 2), padding='same')(x)
    x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
    encoded = MaxPooling2D((2, 2), padding='same')(x)
    encoder = Model(encoder_input, encoded)
    return encoder

# ... other code ...

# Input image shape
input_shape = (28, 28, 1)

# Build the autoencoder
autoencoder, encoder, decoder = build_autoencoder(input_shape)
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')
autoencoder.fit(train_dataset, train_dataset, epochs=10, batch_size=32, shuffle=True)

当我在编码过程中打印形状时,我看到:

(None, 50, 28, 1)
(None, 50, 14, 1)
(None, 16, 14, 1)
(None, 16, 7, 1)

我希望在第一个Conv 2D层之后输出的形状是(None,28,28,50)。我使用(28,28,1)图像作为输入。有人能帮助我理解为什么Conv 2D层的filters参数似乎会像这样影响输出形状吗?如何实现预期的输出形状(None,28,28,50)?
任何见解或建议将不胜感激!

_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 input_1 (InputLayer)        [(None, 28, 28, 1)]       0         
                                                                 
 conv2d (Conv2D)             (None, 50, 28, 1)         12650     
                                                                 
 max_pooling2d (MaxPooling2D  (None, 50, 14, 1)        0         
 )                                                               
                                                                 
 conv2d_1 (Conv2D)           (None, 16, 14, 1)         7216      
                                                                 
 max_pooling2d_1 (MaxPooling  (None, 16, 7, 1)         0         
 2D)                                                             
                                                                 
=================================================================
Total params: 19,866
Trainable params: 19,866
Non-trainable params: 0
ocebsuys

ocebsuys1#

你好,欢迎来到社区。可能下面的片段会有所帮助。

def build_encoder(input_shape):
    # Define the input layer
    encoder_input = Input(shape=input_shape)
    
    # First convolutional layer with 50 filters
    x = Conv2D(filters=50, kernel_size=(3, 3), activation='relu', padding='same')(encoder_input)
    
    # Max pooling layer to reduce dimensions
    x = MaxPooling2D((2, 2), padding='same')(x)
    
    # Second convolutional layer with 16 filters
    x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
    
    # Second max pooling layer
    encoded = MaxPooling2D((2, 2), padding='same')(x)
    
    # Define the encoder model
    encoder = Model(encoder_input, encoded)
    return encoder

相关问题