【TensorFlow-windows】学习笔记五——自编码器

前言

上一篇博客介绍的是构建简单的CNN去识别手写数字,这一篇博客折腾一下自编码,理论很简单,就是实现对输入数据的重构,具体理论可以看我前面的【theano-windows】学习笔记十三——去噪自编码器

国际惯例,参考博客:

当我们在谈论 Deep Learning:AutoEncoder 及其相关模型

Autoencoders

训练代码实现

不说理论了,直接撸代码,包含两个隐层,因此网络的结构为四层:

单元数为784784的输入层单元数为256256的第一个隐层单元数为128128的第二个隐层单元数为784的重构输出层

接下来按照老样子构建整个训练流程:

读数据初始化相关参数定义接收数据的接口以便测试使用初始化权重和偏置定义基本模块(编码和解码)构建模型(先编码再解码)定义预测函数、损失函数、优化器训练

有几点一定要注意:

  • 一定要定义数据的输入接口,不然后期无法拿模型做预测
  • 一定要记得构建预测函数用于后期的测试阶段使用,不要只记得定义损失函数

读数据

注意初始化直接将所有像素除以255255,这与前面一篇博客不同

IMG_HEIGHT=28
IMG_WIDTH=28
CHANNELS=3
#读取数据集
def read_images(dataset_path,batch_size):imagepaths,labels=list(),list()data=open(dataset_path,'r').read().splitlines()for d in data:imagepaths.append(d.split(' ')[0])labels.append(int(d.split(' ')[1]))imagepaths=tf.convert_to_tensor(imagepaths,dtype=tf.string)labels=tf.convert_to_tensor(labels,dtype=tf.int32)image,label=tf.train.slice_input_producer([imagepaths,labels],shuffle=True)image=tf.read_file(image)image=tf.image.decode_jpeg(image,channels=CHANNELS)image=tf.image.rgb_to_grayscale(image)    image=tf.reshape(image,[IMG_HEIGHT*IMG_WIDTH])image=tf.cast(image,tf.float32)image = image / 255.0image=tf.convert_to_tensor(image)inputX,inputY=tf.train.batch([image,label],batch_size=batch_size,capacity=batch_size*8,num_threads=4)return inputX,inputY

初始化相关参数

learning_rate=0.01#学习率
num_steps=30000#训练次数
batch_size=256#每批数据大小
disp_step=1000#每迭代多少次显示训练日志
num_class=10#总类别
num_hidden1=256#第一层隐单元数
num_hidden2=128#第二层隐单元数
num_input=IMG_HEIGHT*IMG_WIDTH#输入、输出单元数

定义数据接收接口

#定义输入接口
X=tf.placeholder(tf.float32,[None,num_input],name='X')

初始化权重和偏置

#权重
weights={'encoder_h1':tf.Variable(tf.random_normal([num_input,num_hidden1])),'encoder_h2':tf.Variable(tf.random_normal([num_hidden1,num_hidden2])),'decoder_h1':tf.Variable(tf.random_normal([num_hidden2,num_hidden1])),'decoder_h2':tf.Variable(tf.random_normal([num_hidden1,num_input]))
}
#偏置
biases={'encoder_b1':tf.Variable(tf.random_normal([num_hidden1])),'encoder_b2':tf.Variable(tf.random_normal([num_hidden2])),'decoder_b1':tf.Variable(tf.random_normal([num_hidden1])),'decoder_b2':tf.Variable(tf.random_normal([num_input]))
}

定义基本模块

#编码器
def encoder(x):layer1=tf.nn.sigmoid(tf.add(tf.matmul(x,weights['encoder_h1']),biases['encoder_b1']))layer2=tf.nn.sigmoid(tf.add(tf.matmul(layer1,weights['encoder_h2']),biases['encoder_b2']))return layer2
def decoder(x):layer1=tf.nn.sigmoid(tf.add(tf.matmul(x,weights['decoder_h1']),biases['decoder_b1']))layer2=tf.nn.sigmoid(tf.add(tf.matmul(layer1,weights['decoder_h2']),biases['decoder_b2']))return layer2

构建模型

#构建模型
encoder_op=encoder(X)
decoder_op=decoder(encoder_op)

定义预测函数、损失函数、优化器

#预测函数
y_pred=decoder_op
y_true=X
tf.add_to_collection('recon',y_pred)
#定义损失函数和优化器
loss_op=tf.reduce_mean(tf.pow(y_true-y_pred,2))
optimizer=tf.train.RMSPropOptimizer(learning_rate=learning_rate).minimize(loss_op)

开始训练模型并保存结果

记得先初始化所有变量

#参数初始化
init=tf.global_variables_initializer()
input_image,input_label=read_images('./mnist/train_labels.txt',batch_size)

然后就可以训练了,每次从队列中取数据

#开始训练和保存模型
saver=tf.train.Saver()
with tf.Session() as sess:sess.run(init)coord=tf.train.Coordinator()tf.train.start_queue_runners(sess=sess,coord=coord)for step in range(1,num_steps+1):batch_x,batch_y=sess.run([input_image,tf.one_hot(input_label,num_class,1,0)])sess.run(optimizer,feed_dict={X:batch_x})if step%disp_step==0 or step==1:loss=sess.run(loss_op,feed_dict={X:batch_x                })print('step '+str(step)+' ,loss '+'{:.4f}'.format(loss))coord.request_stop()coord.join()print('optimization finished')saver.save(sess,'./AE_mnist_model/AE_mnist')

训练结果:

step 1 ,loss 0.4566
step 1000 ,loss 0.1465
step 2000 ,loss 0.1291
step 3000 ,loss 0.1206
step 4000 ,loss 0.1158
step 5000 ,loss 0.1110
step 6000 ,loss 0.1081
step 7000 ,loss 0.1052
step 8000 ,loss 0.1039
step 9000 ,loss 0.1024
step 10000 ,loss 0.0969
step 11000 ,loss 0.0934
step 12000 ,loss 0.0934
step 13000 ,loss 0.0932
step 14000 ,loss 0.0872
step 15000 ,loss 0.0840
step 16000 ,loss 0.0832
step 17000 ,loss 0.0843
step 18000 ,loss 0.0830
step 19000 ,loss 0.0821
step 20000 ,loss 0.0813
step 21000 ,loss 0.0800
step 22000 ,loss 0.0776
step 23000 ,loss 0.0771
step 24000 ,loss 0.0754
step 25000 ,loss 0.0727
step 26000 ,loss 0.0735
step 27000 ,loss 0.0754
step 28000 ,loss 0.0739
step 29000 ,loss 0.0737
step 30000 ,loss 0.0727
optimization finished

再贴一下使用上一篇博客的归一化方法得到的训练结果:

step 1 ,loss 2.1006
step 1000 ,loss 1.0853
step 2000 ,loss 1.0303
step 3000 ,loss 1.0057
step 4000 ,loss 0.9976
step 5000 ,loss 0.9814
step 6000 ,loss 0.9748
step 7000 ,loss 0.9687
step 8000 ,loss 0.9689
step 9000 ,loss 0.9576
step 10000 ,loss 0.9588
step 11000 ,loss 0.9571
step 12000 ,loss 0.9517
step 13000 ,loss 0.9495
step 14000 ,loss 0.9484
step 15000 ,loss 0.9432
step 16000 ,loss 0.9426
step 17000 ,loss 0.9378
step 18000 ,loss 0.9355
step 19000 ,loss 0.9347
step 20000 ,loss 0.9343
step 21000 ,loss 0.9322
step 22000 ,loss 0.9266
step 23000 ,loss 0.9267
step 24000 ,loss 0.9273
step 25000 ,loss 0.9269
step 26000 ,loss 0.9250
step 27000 ,loss 0.9257
step 28000 ,loss 0.9244
step 29000 ,loss 0.9199
step 30000 ,loss 0.9257
optimization finished

很容易发现第二个模型收敛速度很慢,而且最后其实并未收敛到最优解,而且效果很差,相对于直接除以255255的处理方法,模型收敛就快很多,而且更倾向于收敛到了最优解 。所以数据预处理方式对结果影响也很大

测试代码实现

现载入模型:

sess=tf.Session()
#加载图和模型参数
new_saver=tf.train.import_meta_graph('./AE_mnist_model/AE_mnist.meta')
new_saver.restore(sess,'./AE_mnist_model/AE_mnist')

得到我们的计算图,也就是模型结构:

graph=tf.get_default_graph()

我们也可以看看在模型中保存了什么

print(graph.get_all_collection_keys())
#['queue_runners', 'recon', 'summaries', 'train_op', 'trainable_variables', 'variables']

可以发现我们的重构函数recon已经保存在里面了,把它取出来,别忘了还有数据接收接口:

recon=graph.get_collection('recon')
X=graph.get_tensor_by_name('X:0')
print(recon)
#[<tf.Tensor 'Sigmoid_3:0' shape=(?, 784) dtype=float32>]

接下来读一张图片,并处理一下:

images = []
img = cv2.imread('./mnist/test/4/4_20.png')
image=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
images.append(image)
images = np.array(images, dtype=np.uint8)
images = images.astype('float32')
images = np.multiply(images, 1.0/255.0)
x_batch = images.reshape(1,28*28)

万事俱备,只需把处理后的图像丢入数据结构,使用函数重构即可

result=sess.run(recon,feed_dict={X:x_batch})
image_reco=np.multiply(result,255)
image_reco=image_reco.reshape(28,28)

可视化结果:

plt.imshow(image_reco)
plt.show()

重构图像
更新日志2018-8-15
看到变分自编码相关知识时,看到AE的一个缺点就是只能生成训练集类似的东东,也就是说如果我拿手写数字来训练,模型生成的东东一定就是手写数字,然后我就去拿着个模型试了一下,随便丢一张图片进来:
比如犬夜叉:
这里写图片描述
然后处理一下:

images = []
img = cv2.imread('./mnist/1.png')
image=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
image=cv2.resize(image,(28,28))
plt.imshow(image)
plt.show()
images.append(image)
images = np.array(images, dtype=np.uint8)
images = images.astype('float32')
images = np.multiply(images, 1.0/255.0)
x_batch = images.reshape(1,28*28)

也就是将彩图转为灰度图并resize成网络图片接受接口所需的维度,即28×2828×28大小,变成了这样
这里写图片描述
生成一下

result=sess.run(recon,feed_dict={X:x_batch})
image_reco=np.multiply(result,255)
image_reco=image_reco.reshape(28,28)
plt.imshow(image_reco)
plt.show()

这里写图片描述
果然重构的图片长得像数字,是个8还是个2。
事实证明:使用AE做图像重构,生成的结果一定是与训练集内容相似的东东

后记

下一篇就来看看何为变分自编码,并实现它

训练代码:链接:https://pan.baidu.com/s/1HLwWo6T4QBPJxtHE5InQeA 密码:64rg

测试代码:链接:https://pan.baidu.com/s/1wIjG9KFkDsB1XFB98URcmw 密码:x7v9

数据集:链接:https://pan.baidu.com/s/1UJTAavqEPTCetgMSf-hYTw 密码:klcl

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【TensorFlow-windows】学习笔记六——变分自编码器

#前言 对理论没兴趣的直接看代码吧&#xff0c;理论一堆&#xff0c;而且还有点复杂&#xff0c;我自己的描述也不一定准确&#xff0c;但是代码就两三句话搞定了。 国际惯例&#xff0c;参考博文 论文&#xff1a;Tutorial on Variational Autoencoders 【干货】一文读懂…

【TensorFlow-windows】学习笔记七——生成对抗网络

前言 既然学习了变分自编码(VAE)&#xff0c;那也必须来一波生成对抗网络(GAN)。 国际惯例&#xff0c;参考网址&#xff1a; 论文: Generative Adversarial Nets PPT:Generative Adversarial Networks (GANs) Generative Adversarial Nets in TensorFlow GAN原理学习笔记…

Openpose——windows编译(炒鸡简单)

前言 最近准备看看rtpose的代码&#xff0c;发现已经由openpose这个项目维护着了&#xff0c;由于经常在windows下调试代码&#xff0c;所以尝试了一下如何在windows下编译openpose源码&#xff0c;整体来说非常简单的。 国际惯例&#xff0c;参考博客&#xff1a; [OpenPos…

强化学习——Qlearning

前言 在控制决策领域里面强化学习还是占很重比例的&#xff0c;最近出了几篇角色控制的论文需要研究&#xff0c;其中部分涉及到强化学习&#xff0c;都有开源&#xff0c;有兴趣可以点开看看&#xff1a; A Deep Learning Framework For Character Motion Synthesis and Edit…

【TensorFlow-windows】keras接口学习——线性回归与简单的分类

前言 之前有写过几篇TensorFlow相关文章&#xff0c;但是用的比较底层的写法&#xff0c;比如tf.nn和tf.layers&#xff0c;也写了部分基本模型如自编码和对抗网络等&#xff0c;感觉写起来不太舒服&#xff0c;最近看官方文档发现它的教程基本都使用的keras API&#xff0c;这…

【TensorFlow-windows】keras接口——卷积手写数字识别,模型保存和调用

前言 上一节学习了以TensorFlow为底端的keras接口最简单的使用&#xff0c;这里就继续学习怎么写卷积分类模型和各种保存方法(仅保存权重、权重和网络结构同时保存) 国际惯例&#xff0c;参考博客&#xff1a; 官方教程 【注】其实不用看博客&#xff0c;直接翻到文末看我的c…

【TensorFlow-windows】keras接口——BatchNorm和ResNet

前言 之前学习利用Keras简单地堆叠卷积网络去构建分类模型的方法&#xff0c;但是对于很深的网络结构很难保证梯度在各层能够正常传播&#xff0c;经常发生梯度消失、梯度爆炸或者其它奇奇怪怪的问题。为了解决这类问题&#xff0c;大佬们想了各种办法&#xff0c;比如最原始的…

【TensorFlow-windows】keras接口——卷积核可视化

前言 在机器之心上看到了关于卷积核可视化相关理论&#xff0c;但是作者的源代码是基于fastai写的&#xff0c;而fastai的底层是pytorch&#xff0c;本来准备自己用Keras复现一遍的&#xff0c;但是尴尬地发现Keras还没玩熟练&#xff0c;随后发现了一个keras-vis包可以用于做…

【TensorFlow-windows】投影变换

前言 没什么重要的&#xff0c;就是想测试一下tensorflow的投影变换函数tf.contrib.image.transform中每个参数的含义 国际惯例&#xff0c;参考文档 官方文档 描述 调用方法与默认参数&#xff1a; tf.contrib.image.transform(images,transforms,interpolationNEAREST,…

【TensorFlow-windows】扩展层之STN

前言 读TensorFlow相关代码看到了STN的应用&#xff0c;搜索以后发现可替代池化&#xff0c;增强网络对图像变换(旋转、缩放、偏移等)的抗干扰能力&#xff0c;简单说就是提高卷积神经网络的空间不变性。 国际惯例&#xff0c;参考博客&#xff1a; 理解Spatial Transformer…

【TensorFlow-windows】MobileNet理论概览与实现

前言 轻量级神经网络中&#xff0c;比较重要的有MobileNet和ShuffleNet&#xff0c;其实还有其它的&#xff0c;比如SqueezeNet、Xception等。 本博客为MobileNet的前两个版本的理论简介与Keras中封装好的模块的对应实现方案。 国际惯例&#xff0c;参考博客&#xff1a; 纵…

【TensorFlow-windows】keras接口——ImageDataGenerator裁剪

前言 Keras中有一个图像数据处理器ImageDataGenerator&#xff0c;能够很方便地进行数据增强&#xff0c;并且从文件中批量加载图片&#xff0c;避免数据集过大时&#xff0c;一下子加载进内存会崩掉。但是从官方文档发现&#xff0c;并没有一个比较重要的图像增强方式&#x…

【TensorFlow-windows】TensorBoard可视化

前言 紧接上一篇博客&#xff0c;学习tensorboard可视化训练过程。 国际惯例&#xff0c;参考博客&#xff1a; MNIST机器学习入门 Tensorboard 详解&#xff08;上篇&#xff09; Tensorboard 可视化好帮手 2 tf-dev-summit-tensorboard-tutorial tensorflow官方mnist_…

深度学习特征归一化方法——BN、LN、IN、GN

前言 最近看到Group Normalization的论文&#xff0c;主要提到了四个特征归一化方法&#xff1a;Batch Norm、Layer Norm、Instance Norm、Group Norm。此外&#xff0c;论文还提到了Local Response Normalization(LRN)、Weight Normalization(WN)、Batch Renormalization(BR)…

【TensorFlow-windows】keras接口——利用tensorflow的方法加载数据

前言 之前使用tensorflow和keras的时候&#xff0c;都各自有一套数据读取方法&#xff0c;但是遇到一个问题就是&#xff0c;在训练的时候&#xff0c;GPU的利用率忽高忽低&#xff0c;极大可能是由于训练过程中读取每个batch数据造成的&#xff0c;所以又看了tensorflow官方的…

骨骼动画——论文与代码精读《Phase-Functioned Neural Networks for Character Control》

前言 最近一直玩CV&#xff0c;对之前学的动捕知识都忘得差不多了&#xff0c;最近要好好总结一下一直以来学习的内容&#xff0c;不能学了忘。对2017年的SIGGRAPH论文《Phase-Functioned Neural Networks for Character Control》进行一波深入剖析吧&#xff0c;结合源码。 额…

颜色协调模型Color Harmoniztion

前言 最近做换脸&#xff0c;在肤色调整的那一块&#xff0c;看到一个有意思的文章&#xff0c;复现一波玩玩。不过最后一步掉链子了&#xff0c;有兴趣的可以一起讨论把链子补上。 主要是github上大佬的那个复现代码和原文有点差异&#xff0c;而且代码复杂度过高&#xff0…

Openpose推断阶段原理

前言 之前出过一个关于openpose配置的博客&#xff0c;不过那个代码虽然写的很好&#xff0c;而且是官方的&#xff0c;但是分析起来很困难&#xff0c;然后再opencv相关博客中找到了比较清晰的实现&#xff0c;这里分析一波openpose的推断过程。 国际惯例&#xff0c;参考博…

换脸系列——眼鼻口替换

前言 想着整理一下换脸相关的技术方法&#xff0c;免得以后忘记了&#xff0c;最近脑袋越来越不好使了。应该会包含三个系列&#xff1a; 仅换眼口鼻&#xff1b;换整个面部&#xff1b;3D换脸 先看看2D换脸吧&#xff0c;网上已经有现成的教程了&#xff0c;这里拿过来整理一…

换脸系列——整脸替换

前言 前面介绍了仅替换五官的方法&#xff0c;这里介绍整张脸的方法。 国际惯例&#xff0c;参考博客&#xff1a; [图形算法]Delaunay三角剖分算法 维诺图&#xff08;Voronoi Diagram&#xff09;分析与实现 Delaunay Triangulation and Voronoi Diagram using OpenCV (…