You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算自编码器的 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 13:05:18