如何计算自编码器的 latent space 维度?附实现代码
计算Autoencoder的Latent Space维度及调整为3D向量的方法
一、当前Latent Space维度计算
你的编码器输出的h就是latent空间的载体,逐步骤推导形状变化:
- 输入
x:(28, 28, 1) Conv2D(16, (3,3), padding='same'):same padding保持宽高,通道变为16 →(28, 28, 16)MaxPooling2D((2,2)):宽高减半 →(14, 14, 16)Conv2D(8, (3,3), padding='same'):宽高不变,通道变为8 →(14, 14, 8)MaxPooling2D((2,2)):宽高减半 →(7, 7, 8)Conv2D(8, (3,3), padding='same'):宽高不变,通道保持8 →(7, 7, 8)MaxPooling2D((2,2)):宽高向下取整(7//2=3)→(3, 3, 8)
当前latent空间的总维度是 3×3×8=72,它是一个空间特征图形式的latent,而非你想要的一维向量型3D latent。
二、调整为一维向量型3D Latent Space
如果要得到维度为3的latent向量,需修改编码器和解码器结构:
修改后的编码器
在最后一个池化层后添加展平和全连接层:
x = Input(shape=(28, 28,1)) # Encoder conv1_1 = Conv2D(16, (3, 3), activation='relu', padding='same')(x) pool1 = MaxPooling2D((2, 2))(conv1_1) conv1_2 = Conv2D(8, (3, 3), activation='relu', padding='same')(pool1) pool2 = MaxPooling2D((2, 2))(conv1_2) conv1_3 = Conv2D(8, (3, 3), activation='relu', padding='same')(pool2) h = MaxPooling2D((2, 2))(conv1_3) # 新增:将特征图展平并映射到3维向量 flatten_h = Flatten()(h) latent = Dense(3)(flatten_h) # 可根据需求添加activation
修改后的解码器
先将3维向量还原为原特征图形状,再继续解码:
# Decoder # 新增:从3维向量还原为(3,3,8)特征图 dense_h = Dense(3*3*8, activation='relu')(latent) reshape_h = Reshape((3, 3, 8))(dense_h) conv2_1 = Conv2D(8, (3, 3), activation='relu', padding='same')(reshape_h) up1 = UpSampling2D((2, 2))(conv2_1) conv2_2 = Conv2D(8, (3, 3), activation='relu', padding='same')(up1) up2 = UpSampling2D((2, 2))(conv2_2) conv2_3 = Conv2D(16, (3, 3), activation='relu')(up2) up3 = UpSampling2D((2, 2))(conv2_3) r = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(up3)
完整模型定义
autoencoder = Model(inputs=x, outputs=r) autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')
这样修改后,latent空间就是维度为3的一维向量,满足你的需求。
内容的提问来源于stack exchange,提问作者Anand_is_goat
相关产品推荐
相关产品推荐

