Tensorflow实现自动编码器

本文介绍了使用Tensorflow实现自动编码器的过程,包括编码解码的实现、模型的保存和数据替换。通过true.txt数据训练模型,然后用false数据进行测试,评估成本差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在帮助师兄完成毕设,涉及到了tensorflow和机器学习的知识,下面的代码描述了自动编码器编码解码的过程;同时,实现了模型的保存和数据替换的过程。首先,利用true.txt中的数据进行模型的训练,然后在利用false的数据进行测试,比较两次cost的差值。具体代码如下:

"""
Created on Wed Jan 23 12:29:56 2019

@author: 肖俊怡
"""



import tensorflow as tf
#import matplotlib.pyplot as plt
import numpy as np

#from tensorflow.examples.tutorials.mnist import input_data
#mnist = input_data.read_data_sets("MNIST_data/", one_hot=False)

train_data = np.loadtxt("true.txt")
#train_label = np.loadtxt("true.txt")
test_data = np.loadtxt("true.txt")
#test_label = np.loadtxt("true.txt")
#test_xs = np.ones((test_data.shape[0],28*28))
#test_ys = np.ones((test_data.shape[0],2))
#test_ys = test_label


#学习率决定了参数移动到最优值的速度快慢
learning_rate = 0.01
#指数据集中每一个样本都跑过一遍
training_epochs = 1
#每次选取的样本个数
batch_size = 200

display_step = 1
n_input = 18
#分配必要的内存,占位;类型:float;行数不定,列数为784
X = tf.placeholder("float", [None, n_input])
 
n_hidden_1 = 16
n_hidden_2 = 8
n_hidden_3 = 4
n_hidden_4 = 2
#设置权重值,并存入字典#从截断的正态分布中输出随机值
weights = {
    'encoder_h1': tf.Variable(tf.truncated_normal([n_input, n_hidden_1],)),
    'encoder_h2': tf.Variable(tf.truncated_normal([n_hidden_1, n_hidden_2],)),
    'encoder_h3': tf.Variable(tf.truncated_normal([n_hidden_2, n_hidden_3],)),
    'encoder_h4': tf.Variable(tf.truncated_normal([n_hidden_3, n_hidden_4],)),
    'decoder_h1': tf.Variable(tf.truncated_normal([n_hidden_4, n_hidden_3],)),
    'decoder_h2': tf.Variable(tf.truncated_normal([n_hidden_3, n_hidden_2],)),
    'decoder_h3': tf.Variable(tf.truncated_normal([n_hidden_2, n_hidden_1],)),
    'decoder_h4': tf.Variable(tf.truncated_normal([n_hidden_1, n_input],)),
}
#设置偏重值,并存入字典,从正态分布中生成随机值
biases = {
    'encoder_b1': tf.Variable(tf.random_normal([n_hidden_1])),
    'encoder_b2': tf.Variable(tf.random_normal([n_hidden_2])),
    'encoder_b3': tf.Variable(tf.random_normal([n_hidden_3])),
    'encoder_b4': tf.Variable(tf.random_normal([n_hidden_4])),
    'decoder_b1': tf.Variable(tf.random_normal([n_hidden_3])),
    'decoder_b2': tf.Variable(tf.random_normal([n_hidden_2])),
    'decoder_b3': tf.Variable(tf.random_normal([n_hidden_1])),
    'decoder_b4': tf.Variable(tf.random_normal([n_input])),
}
#进行函数运算,构建编码器
def encoder(x):
    layer_1 = tf.nn.relu(tf.add(tf.matmul(x, weights['encoder_h1']),
                                   biases['encoder_b1']))
    layer_2 = tf.nn.relu(tf.add(tf.matmul(layer_1, weights['encoder_h2']),
                                   biases['encoder_b2']))
    layer_3 = tf.nn.relu(tf.add(tf.matmul(layer_2, weights['encoder_h3']),
                                   biases['encoder_b3']))
    # 为了便于编码层的输出,编码层随后一层不使用激活函数
    layer_4 = tf.add(tf.matmul(layer_3, weights['encoder_h4']),
                                    biases['encoder_b4'])
    return layer_4
#构建解码器 
def decoder(x):
    layer_1 = tf.nn.relu(tf.add(tf.matmul(x, weights['decoder_h1']),
                                   biases['decoder_b1']))
    layer_2 = tf.nn.relu(tf.add(tf.matmul(layer_1, weights['decoder_h2']),
                                   biases['decoder_b2']))
    layer_3 = tf.nn.relu(tf.add(tf.matmul(layer_2, weights['decoder_h3']),
                                biases['decoder_b3']))
    layer_4 = tf.nn.relu(tf.add(tf.matmul(layer_3, weights['decoder_h4']),
                                biases['decoder_b4']))
    return layer_4
#构建模型
encoder_op = encoder(X)
decoder_op = decoder(encoder_op)

#预测 
y_pred = decoder_op
y_true = X
 
#定义代价函数和优化器
cost = tf.reduce_mean(tf.pow(y_true - y_pred, 2))
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost)
 
with tf.Session() as sess:
    # tf.initialize_all_variables() no long valid from
    # 2017-03-02 if using tensorflow >= 0.12
    if int((tf.__version__).split('.')[1]) < 12 and int((tf.__version__).split('.')[0]) < 1:
        init = tf.initialize_all_variables()
    else:
        init = tf.global_variables_initializer()
    
    
    sess.run(init)
  # 首先计算总批数,保证每次循环训练集中的每个样本都参与训练,不同于批量训练  
    train_writer = tf.summary.FileWriter("E://logs//train",sess.graph)
    total_batch = int(60000/batch_size)
    
    
#保存
    is_train=False
    saver=tf.train.Saver(max_to_keep=1)
    
    if is_train:       
        for epoch in range(training_epochs):
            start = 0
            for i in range(total_batch):
                batch_xs = batch_xs = np.ones((batch_size,18)) 
                j = 0               
                while j<batch_size:
                    batch_xs[j][:] = train_data[i*batch_size+j][:]#epoch*total_batch+
                    j = j+1
                start+=1
                #batch_ys =  np.ones((batch_size,2))
                # max(x) = 1, min(x) = 0
                _, c = sess.run([optimizer, cost], feed_dict={X: batch_xs})
                print("Epoch:", '%04d' % (i+1), "cost=", "{:.9f}".format(c))
            #if epoch % display_step == 0:
               # print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(c))
        saver.save(sess,'ckpt/data1.ckpt',global_step=i+1)        
        print("Optimization Finished!")

        #encoder_result = sess.run(encoder_op, feed_dict={X: mnist.test.images})
        #encoder_result[:, 0],encoder_result[:, 1]分别代表x,y的数据点
       # plt.scatter(encoder_result[:, 0], encoder_result[:, 1], c=mnist.test.labels)
        #设置颜色渐变条
       # plt.colorbar()
        #显示图像
       # plt.show()
        #sess.close()
    else:
        model_file=tf.train.latest_checkpoint('ckpt/')
        saver.restore(sess,model_file)
        #for epoch in range(training_epochs):
            #start = 0
        for i in range(60000):
            batch_xs = batch_xs = np.ones((1,18)) 
            #j = 0               
            #while j<batch_size:
            batch_xs[0][:] = test_data[i][:]#epoch*total_batch+
               # j = j+1
                    #start+=1
                    #batch_ys =  np.ones((batch_size,2))
                    # max(x) = 1, min(x) = 0
            c = sess.run(cost, feed_dict={X: batch_xs})
            print("Epoch:", '%04d' % (i+1), "cost=", "{:.9f}".format(c))
        #encoder_result = sess.run(encoder_op, feed_dict={X: mnist.test.images})
        #encoder_result[:, 0],encoder_result[:, 1]分别代表x,y的数据点
        #plt.scatter(encoder_result[:, 0], encoder_result[:, 1], c=mnist.test.labels)
        #设置颜色渐变条
       # plt.colorbar()
        #显示图像
        #plt.show()
 #sess.close()       
                
                

刚刚入手,真的很难理解,以后有时间一定要仔细学习一下tensorflow,不过收获还是很多的~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值