调用预训练变分自编码器编码器时出现层形状不兼容错误求助
问题原因分析
报错本质是编码器第一个全连接层的输入维度不匹配:预训练时编码器卷积层输出flatten后维度为1048576,而你当前调用时实际传入的flatten特征维度为8192,核心诱因是输入编码器的样本缺少batch维度。
你加载单张图片后得到的data形状为(256, 256, 1),Keras模型默认将输入的第一维识别为batch维度,会误判输入为「batch size=256,单样本形状为(256, 1)」,经过卷积层处理后flatten得到的特征形状刚好就是报错提示的(256, 8192),和全连接层预期的输入维度完全不匹配。
解决方法
- 给输入样本添加batch维度,修改编码器调用代码:
把encoder(data, training=False)替换为如下代码:# 新增batch维度,形状变为(1, 256, 256, 1),符合模型输入要求 data = np.expand_dims(data, axis=0) mu, sigma, z = encoder(data, training=False) - 额外检查项:
- 确认加载的JPG图片实际尺寸确实为256*256,可在
data = np.asarray(image)后添加print(data.shape)验证,避免图像处理工具自动修改尺寸 - 取消代码中
vae.load_weights(checkpoint_path)的注释,否则当前实例化的模型是随机初始化权重,无法使用预训练效果 - 你当前
CustomLayer中直接引用了全局变量z_mu和z_sigma,如果加载权重时出现变量找不到的报错,可将这两个参数改为类初始化参数传入,避免全局变量依赖导致的加载异常
- 确认加载的JPG图片实际尺寸确实为256*256,可在
内容的提问来源于stack exchange,提问作者Daniel Sherman
相关产品推荐
相关产品推荐

