千家信息网

如何进行TensorFlow深度自动编码器入门和实践

发表于:2024-11-27 作者:千家信息网编辑
千家信息网最后更新 2024年11月27日,如何进行TensorFlow深度自动编码器入门和实践,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。包含从头开始构建Autoencod
千家信息网最后更新 2024年11月27日如何进行TensorFlow深度自动编码器入门和实践

如何进行TensorFlow深度自动编码器入门和实践,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

包含从头开始构建Autoencoders模型的完整代码。
我们一起来探索一个非监督学习神经网络--Autoencoders(自动编码器)。
自动编码器是用于在输出层再现输入数据的深度神经网络,所以输出层中的神经元的数量与输入层中的神经元的数量完全相同。
如下图所示:

该图像展示了典型的深度自动编码器的结构。自动编码器网络结构的目标是在输出层创建输入的表示,使得两者尽可能接近(相似)。 但是,自动编码器的实际使用是用来得到具有最低数据丢失量的输入数据的压缩版本。 在机器学习项目中的作用类似于主成分分析( Principle Component Analysis,PCA),PCA的作用是在有大量属性的数据集上训练模型时找到最佳和最相关属性。

自动编码器以类似的方式工作。 其编码器部分将输入数据压缩,确保重要数据不会丢失,但数据的整体大小会显著减小。 这个概念称为降维( Dimensionality Reduction)。
降维的缺点是,压缩数据是一个黑盒子,即我们无法确定其压缩后数据中的数据结构的具体含义。 比如,假设我们有一个包含5个参数的数据集,我们在这些数据上训练一个自动编码器。 编码器不会为了获得更好的表示而省略某些参数,它会将参数融合在一起(压缩后的变量时综合变量)以创建压缩版本,使得参数更少(比如从5个压缩到3个)。
自动编码器有两个部分,即编码器和解码器。

编码器压缩输入数据,而解码器则基于压缩表示的数据反过来恢复数据的未压缩版本,以尽可能准确地创建输入的重建。

我们将使用Tensorflow的layers API创建自动编码器神经网络,并在mnist数据集上对其进行测试。

首先,我们导入相关的Python库,并读入mnist数据集。 如果数据集存在于本地计算机上,那么它将自动读取,否则将通过运行以下命令自动下载。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
from tensorflow.contrib.layers import fully_connectedmnist=input_data.read_data_sets("/MNIST_data/",one_hot=True)

接下来,我们为方便起见创建一些常量,并事先声明我们的激活函数。 mnist数据集中的图像大小为28×28像素,即784像素,我们将其压缩为196像素。 当然你也可以更进一步缩小像素大小。 但是,压缩太多可能会导致自动编码器丢失信息。

num_inputs=784    #28x28 pixels
num_hid1=392
num_hid2=196
num_hid3=num_hid1num_output=num_inputslr=0.01
actf=tf.nn.relu

现在,我们为每一层的weights 和 biases创建变量。 然后,我们使用先前声明的激活函数创建layer。

X=tf.placeholder(tf.float32,shape=[None,num_inputs])initializer=tf.variance_scaling_initializer()w1=tf.Variable(initializer([num_inputs,num_hid1]),dtype=tf.float32)w2=tf.Variable(initializer([num_hid1,num_hid2]),dtype=tf.float32)w3=tf.Variable(initializer([num_hid2,num_hid3]),dtype=tf.float32)w4=tf.Variable(initializer([num_hid3,num_output]),dtype=tf.float32)b1=tf.Variable(tf.zeros(num_hid1))b2=tf.Variable(tf.zeros(num_hid2))b3=tf.Variable(tf.zeros(num_hid3))b4=tf.Variable(tf.zeros(num_output))hid_layer1=actf(tf.matmul(X,w1)+b1)hid_layer2=actf(tf.matmul(hid_layer1,w2)+b2)hid_layer3=actf(tf.matmul(hid_layer2,w3)+b3)output_layer=actf(tf.matmul(hid_layer3,w4)+b4)

在一般情况下,TensorFlow的工程通常不使用tf.variance_scaling_initializer()。 但是,我们在这里使用它是因为我们正在处理不断变化大小的输入。 因此,placeholder张量形状(placeholder用于输入批处理)根据输入大小的形状调整自身,从而防止我们遇到任何维度错误。 通过简单地将先前带有相关weights 和 biases 的隐藏层作为输入输送到激活函数(ReLu)中来创建后面的隐藏层。

我们将使用RMSE损失函数用于此神经网络并将其传递给Adam优化器。你也可以替换这些来获得更多结果。

loss=tf.reduce_mean(tf.square(output_layer-X))optimizer=tf.train.AdamOptimizer(lr)train=optimizer.minimize(loss)init=tf.global_variables_initializer()

现在,我们定义epochs和batch size并运行session。 我们使用mnist类的mnist.train.next_batch()来获取每个新的batch。 此外,我们将在每个epoch之后输出训练loss以监控其训练。

num_epoch=5
batch_size=150
num_test_images=10
with tf.Session() as sess: sess.run(init)
for epoch in range(num_epoch): num_batches=mnist.train.num_examples//batch_size for iteration in range(num_batches): X_batch,y_batch=mnist.train.next_batch(batch_size) sess.run(train,feed_dict={X:X_batch}) train_loss=loss.eval(feed_dict={X:X_batch}) print("epoch {} loss {}".format(epoch,train_loss))

最后,我们将编写一个小的绘图函数来绘制原始图像和重建图,以查看我们训练得到的模型的工作情况。

results=output_layer.eval(feed_dict={X:mnist.test.images[:num_test_images]})        #Comparing original images with reconstructions    f,a=plt.subplots(2,10,figsize=(20,4))    
for i in range(num_test_images): a[0][i].imshow(np.reshape(mnist.test.images[i],(28,28))) a[1][i].imshow(np.reshape(results[i],(28,28)))

在这里,我们可以看到重建并不完美,但非常接近原始图像。 注意上图中,2的重建看起来像是3,这是由于压缩时信息丢失造成的。

我们可以通过超参数调整来改进自动编码器模型,并且还可以通过在GPU上运行训练来提高速度。

关于如何进行TensorFlow深度自动编码器入门和实践问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

数据 编码 编码器 输入 神经 训练 函数 参数 大小 网络 深度 像素 图像 模型 神经网络 输出 变量 更多 激活 版本 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 美国的印度裔互联网科技高层 滁州边缘计算工控机服务器 网络安全宣传人武部 求生之路2服务器观战怎么加入 工会服务器如何返回离线玩家数据 购买rdas数据库 abap修改数据库表某一字段值 厦门软件开发需求 数据库同步后续 时间变化 光传输网络技术读书笔记 web数据库技术理论 网络安全大赛效果图ps git 云服务器 数据安全 想学软件开发上什么培训班 电气工程软件开发招聘 数据库中表格的字段名的更改 光遇服务器为什么登不进 网络安全小报复杂一点 天津道可道物流信息网络技术 邮件从电脑传输到邮件服务器中 网络安全对经济的重要性 天涯明月刀移动服务器 软件开发试题机考 数据库是前端 安装服务器2008系统 数据库时间筛选 乐游网络技术有限公司官网 基于构建的软件开发方法 阿里的数据库链接技术 中小学做家庭教育与网络安全教育
0