【导读】近期专知推出初学者系列,重点是介绍如何一步一步学习Tensorflow相关库的介绍,tensorflow.python.keras只是一个仅仅只有tensorflow一个后端的keras包。本文从一个初学者的角度使用tensorflow.python.keras实现一个自编码器(Autoencoder),并进行图片重构与图片分类。
作者:wjg
编辑:wjg
tensorflow.python.keras vs tensorflow.keras
tensorflow.python.keras只是一个仅仅只有tensorflow一个后端的keras包。
tensorflow.keras包包含完整的keras库,支持三个后端:tensorflow、theano和CNTK。如果希望在后端之间切换,那么应该选择keras包。这种方法也更加灵活,因为它允许独立于tensorflow安装更新keras (其中更新可能并不容易,因为下一个版本可能需要不同版本的CUDA驱动程序),反之亦然。
在API方面,目前没有区别,但是将来keras可能会更紧密地集成到tensorflow中。因此,keras中将来可能会只有tensorflow的特性,但即使如此,它也不会完全阻碍keras包的发展。
原理与结构
自编码器作为一种无监督或者自监督算法,其本质上是一种数据压缩算法。
自编码器就是一种利用反向传播使得输出值等于输入值的神经网络。它包含两部分:编码器和解码器。编码器将输入压缩成潜在的空间表征,解码器又将这种空间表征重构输出。
结构图如下:
自编码器的特征
数据相关,自动编码器只能压缩那些与训练数据类似的数据。例如用数字图片训练出来的自编码器用来压缩人脸图片,效果肯定很差。
有损压缩,压缩时会有信息损失。
自动学习,自编码器可以从数据样本中自动学习。
数据集
mnist手写数字数据集。
数据集下载地址:https://pan.baidu.com/s/1YecpC_beJ3euEyYcoTRD4g
提取码:df76
代码实现
5.1 首先导入需要的包
5.2 获取训练与测试数据
5.3 编码器模型
5.4 解码器模型
5.5 自编码器与训练
模型测试
6.1 图像重构测试
从测试集中随机选取10张图片,将通过自编码器生成的图片与原图进行对比。
6.2 图像重构测试结果
6.3图像分类测试
图像通过编码器将784个特征编码为2个特征,作为坐标,再结合图像的标签,以不同颜色在二维坐标上展示。
6.4图像分类测试结果
完整代码如下
import os
import numpy as np
from PIL import Image
from tensorflow.python import keras
from tensorflow.python.keras.layers import Dense
import matplotlib.pyplot as plt
mnist_train_data = "./mnist/mnist_train/"
def get_data(data_dir):
file_list = os.listdir(data_dir)
np.random.shuffle(file_list)
datas = []
labels = []
for file in file_list:
files = file.split(".")
if files[-1] == "jpg":
image = np.array(Image.open(data_dir + file))
image = image.flatten() # 将28x28的图片转为784为的向量
image = image / 255.
datas.append(image)
labels.append(int(files[0]))
datas = np.array(datas)
labels = np.array(labels)
return datas, labels
x_train, y_train = get_data(mnist_train_data)
# encoder
encoder = keras.Sequential([
Dense(256, activation='relu'),
Dense(64, activation='relu'),
Dense(16, activation='relu'),
Dense(2)
])
# decoder
decoder = keras.Sequential([
Dense(16, activation='relu'),
Dense(64, activation='relu'),
Dense(256, activation='relu'),
Dense(784, activation='sigmoid')
])
# autoencoder
autoencoder = keras.Sequential([
encoder,
decoder
])
# compile
autoencoder.compile(optimizer='adam', loss=keras.losses.binary_crossentropy)
autoencoder.fit(x_train, x_train, epochs=20, batch_size=256)
is_reconstruct = False
if is_reconstruct:
# 图像重构
examples_to_show = 10
rec = autoencoder.predict(x_train[:examples_to_show])
f, a = plt.subplots(2, 10, figsize=(10, 2))
for i in range(examples_to_show):
a[0][i].imshow(np.reshape(x_train[i], (28, 28)))
a[1][i].imshow(np.reshape(rec[i], (28, 28)))
plt.show()
else:
# classification
batch_x = x_train[:1000]
batch_y = y_train[:1000]
encoded = encoder.predict(batch_x)
plt.scatter(encoded[:, 0], encoded[:, 1], c=batch_y)
plt.show()
参考链接:
https://github.com/tensorflow
-END-
专 · 知
专知,专业可信的人工智能知识分发,让认知协作更快更好!欢迎登录www.zhuanzhi.ai,注册登录专知,获取更多AI知识资料!
欢迎微信扫一扫加入专知人工智能知识星球群,获取最新AI专业干货知识教程视频资料和与专家交流咨询!
请加专知小助手微信(扫一扫如下二维码添加),加入专知人工智能主题群,咨询技术商务合作~
专知《深度学习:算法到实战》课程全部完成!560+位同学在学习,现在报名,限时优惠!网易云课堂人工智能畅销榜首位!
点击“阅读原文”,了解报名专知《深度学习:算法到实战》课程