tensorflow+自编码器

自编码器包括编码器和解码器,编码器提供按规则编码的功能,解码器将编码器的输出扩展为与编码器输入具有相同的维度的输出。在这个过程中,自编码器通过数据重组进行机器学习。 

import tensorflow as tf 
import tensorflow.keras as keras 
import tensorflow.keras.layers as layers 
from IPython.display import SVG 
print(tf.__version__)
(x_train,y_train),(x_test,y_test) = keras.datasets.mnist.load_data()
x_train = x_train.reshape((-1,28*28))/255.0 
x_test = x_test.reshape((-1,28*28))/255.0 
code_dim = 32 
inputs = layers.Input(shape=(x_train.shape[1],),name='inputs')
code = layers.Dense(code_dim,activation='relu',name='code')(inputs)
outputs = layers.Dense(x_train.shape[1],activation='softmax',name='outputs')(code)

# 构建自编码器
auto_encoder = keras.Model(inputs,outputs)

# 使用自编码器对设置的层进行编码
keras.utils.plot_model(auto_encoder,show_shapes=True)
encoder = keras.Model(inputs,code)
keras.utils.plot_model(encoder,show_shapes=True)

# 构建解码器
decoder_input = keras.Input((code_dim,))
decoder_output = auto_encoder.layers[-1](decoder_input)
decoder = keras.Model(decoder_input, decoder_output)
keras.utils.plot_model(decoder,show_shapes=True)

# 使用编码器对编码后的层进行编码
auto_encoder.compile(optimizer='adam',loss='binary_crossentropy')

# 对设置的模型进行训练
history = auto_encoder.fit(x_train,x_train,batch_size=64,epochs=10,validation_split=0.1)

# 对自编码器与解码器进行预测
encoded=encoder.predict(x_test)
decoded=decoder.predict(encoded)
import matplotlib.pyplot as plt 
plt.figure(figsize=(10.4))

(2)卷积自编码器

与前面自编码器不同的是,卷积自编码器使用卷积层代替全连接层,目的是降低输入特征的维度,使得速度更快,准确率更高。 

import tensorflow as tf 
import tensorflow.keras as keras 
import tensorflow.keras.layers as layers 
from IPython.display import SVG 
print(tf.__version__)
(x_train,y_train),(x_test,y_test) = keras.datasets.mnist.load_data()
x_train = x_train.reshape((-1,28*28))/255.0 
x_test = x_test.reshape((-1,28*28))/255.0 
code_dim = 32 
inputs = layers.Input(shape=(x_train.shape[1],x_train[2],x_train.shape[3]),name='inputs')
code = layers.Conv2D(16,(3,3),activation='relu',padding='same')(inputs)
code = layers.MaxPool2D((2,2),padding='same')(code)
decoded = layers.Conv2D(16,(3,3),activation='relu',padding='same')(code)
decoded = layers.UpSampling2D((2,2))(decoded)

outputs = layers.Conv2D(1,(3,3),activation='sigmoid',padding='same')(decoded)

# 构建自编码器
auto_encoder = keras.Model(inputs,outputs)
auto_encoder.complie(
optimizer=keras.optimizer.Adam(),loss = keras.losses.BinaryCrossentropy)
# 使用自编码器对设置的层进行编码
keras.utils.plot_model(auto_encoder,show_shapes=True)
early_stop = keras.callbacks.EarlyStopping(patience=2,monitor='loss')


# 对设置的模型进行训练
history = auto_encoder.fit(x_train,x_train,batch_size=64,epochs=10,validation_split=0.1,callbacks=[early_stop])

# 对自编码器与解码器进行预测
encoded=encoder.predict(x_test)
decoded=decoder.predict(encoded)
import matplotlib.pyplot as plt 
plt.figure(figsize=(10.4))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
正则自编码器是一种基于正则化的自编码器,它在自编码器的基础上加入了正则化项以控制模型的复杂度,从而避免过拟合。在tensorflow中,可以通过定义损失函数来实现正则自编码器。 下面是一个简单的正则自编码器tensorflow实现: ```python import tensorflow as tf # 定义输入数据维度 input_dim = 784 # 定义隐藏层维度 hidden_dim = 128 # 定义正则化系数 lambda_reg = 0.01 # 定义输入数据占位符 input_x = tf.placeholder(dtype=tf.float32, shape=[None, input_dim], name='input_x') # 定义编码器 encoder = tf.layers.dense(inputs=input_x, units=hidden_dim, activation=tf.nn.relu) # 定义解码器 decoder = tf.layers.dense(inputs=encoder, units=input_dim, activation=tf.nn.sigmoid) # 定义重构误差 reconstruction_loss = tf.reduce_mean(tf.square(input_x - decoder)) # 定义正则化项 regularization_loss = tf.reduce_sum(tf.abs(encoder)) # 定义总损失 total_loss = reconstruction_loss + lambda_reg * regularization_loss # 定义优化器 optimizer = tf.train.AdamOptimizer(learning_rate=0.001) # 定义训练操作 train_op = optimizer.minimize(total_loss) # 开始训练 with tf.Session() as sess: # 初始化变量 sess.run(tf.global_variables_initializer()) # 训练1000个epoch for epoch in range(1000): # 执行训练操作 _, loss = sess.run([train_op, total_loss], feed_dict={input_x: input_data}) # 每100个epoch打印一次损失 if epoch % 100 == 0: print("Epoch: {}, Loss: {:.4f}".format(epoch, loss)) ``` 在这个例子中,我们使用了一个单隐藏层的自编码器,并加入了一个L1正则化项控制模型复杂度。训练过程中,我们使用Adam优化器来最小化总损失。每100个epoch打印一次损失,可以看到损失逐渐减小,说明模型逐渐学习到了数据的特征。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值