自编码器是一种神经网络,它的输入与输出是一致的
它包含两个部分,第一部分是编码器(Encoder),第二部分是解码器(Decoder),编码器把图像转换为向量,解码器是将向量再转换为图像
下面我们使用手写数字数据集mnist创建自编码器
目录
1 导入库
2 加载数据集
由于我们这里只要图像,所以他们的label我们随便给一个,我们看一下x_train与x_test的shape
我们可以看到图像大小都是(28,28),数量分别是60000与10000
之后我们把图像内容转换为向量,这里我们使用reshape
我们再看一下x_train与x_test的shape
发现数量没变,第二个维度变为784(28x28)
之后我们将x_train与x_test转换为float32格式,并对其进行归一化
3 训练整体自编码器
我们现在的向量长度为784,我们想将其压缩为32,然后再将其转换为784,所以我们下面定义三个变量
我们使用函数式API创建自编码器,首先我们定义输入
3.1 编码过程
由长度为784的向量转变为长度为32的向量
3.2 解码过程
由长度为32的向量转变为长度为784的向量,由于我们的输入是进行过归一化的,取值范围在0-1之间,所以这里我们使用激活函数为sigmoid
定义完上面三个过程我们将其组合起来
之后我们对其进行编译,训练,保存
训练的速度很快,我们看一下最后几个epoch的结果
发现后面的几个epoch已经将loss讲到一个很低的值,说明这个模型还是可以的
4 只训练编码过程
只训练编码过程outputs截至到encode这一步即可,我们基于刚刚训练的all_autoencoder.h5保存只有编码过程的encode.h5
5 只训练解码过程
- 这里的输入层用的是新创建的层
6 测试编码与解码
首先我们先进行编码
先对x_test数据进行处理,之后读取编码模型并进行预测,预测之后的结果是展示不出来的,所以我们只能看一下它的shape
发现第二个维度确实是32,那么代表它的维度是正确的
之后我们进行解码,我们使用上面的encode_result进行解码
解码的结果是可以绘制出来的,我们画出来看一下
上面的一行是test的原图像,下面的一行是编码后解码的图像,我们看到是模糊了些,但是大致相似