学习笔记TF057:TensorFlow MNIST,卷积神经网络、循环神经网络、无监督学习 – 利炳根

yizhihongxing


学习笔记TF057:TensorFlow MNIST,卷积神经网络、循环神经网络、无监督学习

MNIST 卷积神经网络。https://github.com/nlintz/TensorFlow-Tutorials/blob/master/05_convolutional_net.py 。
TensorFlow搭建卷积神经网络(CNN)模型,训练MNIST数据集。

构建模型。

定义输入数据,预处理数据。读取数据MNIST,得到训练集图片、标记矩阵,测试集图片标记矩阵。trX、trY、teX、teY 数据矩阵表现。trX、teX形状变为[-1,28,28,1],-1 不考虑输入图片数量,28x28 图片长、宽像素数,1 通道(channel)数量。MNIST 黑白图片,通道1。RGB彩色图像,通道3。
初始化权重,定义网络结构。卷积神经网络,3个卷积层、3个池化层、1个全连接层、1个输出层。
定义dropout占位符keep_conv,神经元保留比例。生成网络模型,得到预测值。
定义损失函数,tf.nn.softmax_cross_entropy_with_logits 比较预测值、真实值差异,做均值处理。
定义训练操作(train_op),RMSProp算法优化器tf.train.RMSPropOptimizer,学习率0.001,衰减值0.9,优化损失。
定义预测操作(predict_op)。
会话启动图,训练、评估。

#!/usr/bin/env python
import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data
batch_size = 128 # 训练批次大小
test_size = 256 # 评估批次大小
# 定义初始化权重函数
def init_weights(shape):
return tf.Variable(tf.random_normal(shape, stddev=0.01))
# 定义神经网络模型函数
# 入参:X 输入数据,w 每层权重,p_keep_conv、p_keep_hidden dropout保留神经元比例
def model(X, w, w2, w3, w4, w_o, p_keep_conv, p_keep_hidden):
# 第一组卷积层及池化层,dropout部分神经元
l1a = tf.nn.relu(tf.nn.conv2d(X, w, # l1a shape=(?, 28, 28, 32)
strides=[1, 1, 1, 1], padding='SAME'))
l1 = tf.nn.max_pool(l1a, ksize=[1, 2, 2, 1], # l1 shape=(?, 14, 14, 32)
strides=[1, 2, 2, 1], padding='SAME')
l1 = tf.nn.dropout(l1, p_keep_conv)
# 第二组卷积层及池化层,dropout部分神经元
l2a = tf.nn.relu(tf.nn.conv2d(l1, w2, # l2a shape=(?, 14, 14, 64)
strides=[1, 1, 1, 1], padding='SAME'))
l2 = tf.nn.max_pool(l2a, ksize=[1, 2, 2, 1], # l2 shape=(?, 7, 7, 64)
strides=[1, 2, 2, 1], padding='SAME')
l2 = tf.nn.dropout(l2, p_keep_conv)
# 第三组卷积层及池化层,dropout部分神经元
l3a = tf.nn.relu(tf.nn.conv2d(l2, w3, # l3a shape=(?, 7, 7, 128)
strides=[1, 1, 1, 1], padding='SAME'))
l3 = tf.nn.max_pool(l3a, ksize=[1, 2, 2, 1], # l3 shape=(?, 4, 4, 128)
strides=[1, 2, 2, 1], padding='SAME')
l3 = tf.reshape(l3, [-1, w4.get_shape().as_list()[0]]) # reshape to (?, 2048)
l3 = tf.nn.dropout(l3, p_keep_conv)
# 全连接层,dropout部分神经元
l4 = tf.nn.relu(tf.matmul(l3, w4))
l4 = tf.nn.dropout(l4, p_keep_hidden)
# 输出层
pyx = tf.matmul(l4, w_o)
return pyx # 返回预测值
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
trX, trY, teX, teY = mnist.train.images, mnist.train.labels, mnist.test.images, mnist.test.labels
# 数据预处理
trX = trX.reshape(-1, 28, 28, 1) # 28x28x1 input img
teX = teX.reshape(-1, 28, 28, 1) # 28x28x1 input img
X = tf.placeholder("float", [None, 28, 28, 1])
Y = tf.placeholder("float", [None, 10])
# 卷积核大小 3x3
# patch大小3x3,输入维度1,输出维度32
w = init_weights([3, 3, 1, 32]) # 3x3x1 conv, 32 outputs
# patch大小3x3,输入维度32,输出维度64
w2 = init_weights([3, 3, 32, 64]) # 3x3x32 conv, 64 outputs
# patch大小3x3,输入维度64,输出维度128
w3 = init_weights([3, 3, 64, 128]) # 3x3x32 conv, 128 outputs
# 全连接层,输入维度128*4*4 上层输数据三维转一维,输出维度625
w4 = init_weights([128 * 4 * 4, 625]) # FC 128 * 4 * 4 inputs, 625 outputs
# 输出层,输入维度625,输出维度10 代表10类(labels)
w_o = init_weights([625, 10]) # FC 625 inputs, 10 outputs (labels)
# 定义dropout占位符
p_keep_conv = tf.placeholder("float")
p_keep_hidden = tf.placeholder("float")
py_x = model(X, w, w2, w3, w4, w_o, p_keep_conv, p_keep_hidden) # 得到预测值
# 定义损失函数
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=py_x, labels=Y))
# 定义训练操作
train_op = tf.train.RMSPropOptimizer(0.001, 0.9).minimize(cost)
# 定义预测操作
predict_op = tf.argmax(py_x, 1)
# Launch the graph in a session
#会话启动图
with tf.Session() as sess:
# you need to initialize all variables
tf.global_variables_initializer().run()
for i in range(100):
# 训练模型
training_batch = zip(range(0, len(trX), batch_size),
range(batch_size, len(trX)+1, batch_size))
for start, end in training_batch:
sess.run(train_op, feed_dict={X: trX[start:end], Y: trY[start:end],
p_keep_conv: 0.8, p_keep_hidden: 0.5})
# 评估模型
test_indices = np.arange(len(teX)) # Get A Test Batch
np.random.shuffle(test_indices)
test_indices = test_indices[0:test_size]
print(i, np.mean(np.argmax(teY[test_indices], axis=1) ==
sess.run(predict_op, feed_dict={X: teX[test_indices],
p_keep_conv: 1.0,
p_keep_hidden: 1.0})))

MNIST 循环神经网络。 https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/3_NeuralNetworks/recurrent_network.py 。

RNN 自然语言处理领域成功应用,机器翻译、语音识别、图像描述生成(图像特征生成描述)、语言模型与文本生成(生成模型预测下一单词概率)。Alex Graves《Supervised Sequence Labelling with Recurrent Neural Networks》 http://www.cs.toronto.edu/~graves/preprint.pdf 。

构建模型。设置训练超参数,设置学习率、训练次数、每轮训练数据大小。
RNN分类图片,每张图片行,像素序列(sequence)。MNIST图片大小28x28,28个元素序列 X 28行,每步输入序列长度28,输入步数28步。
定义输入数据、权重。
定义RNN模型。
定义损失函数、优化器(AdamOptimizer)。
定义模型预测结果、准确率计算方法。
会话启动图,开始训练,每20次输出1次准确率大小。

from __future__ import print_function
import tensorflow as tf
from tensorflow.contrib import rnn
# Import MNIST data
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)
# Training Parameters
# 设置训练超参数
learning_rate = 0.001
training_steps = 10000
batch_size = 128
display_step = 200
# Network Parameters
# 神经网络参数
num_input = 28 # MNIST data input (img shape: 28*28) 输入层
timesteps = 28 # timesteps 28 长度
num_hidden = 128 # hidden layer num of features 隐藏层神经元数
num_classes = 10 # MNIST total classes (0-9 digits) 输出数量,分类类别 0~9
# tf Graph input
# 输入数据占位符
X = tf.placeholder("float", [None, timesteps, num_input])
Y = tf.placeholder("float", [None, num_classes])
# Define weights
# 定义权重
weights = {
'out': tf.Variable(tf.random_normal([num_hidden, num_classes]))
}
biases = {
'out': tf.Variable(tf.random_normal([num_classes]))
}
# 定义RNN模型
def RNN(x, weights, biases):
# Unstack to get a list of 'timesteps' tensors of shape (batch_size, n_input)
# 输入x转换成(128 batch * 28 steps, 28 inputs)
x = tf.unstack(x, timesteps, 1)
# Define a lstm cell with tensorflow
# 基本LSTM循环网络单元 BasicLSTMCell
lstm_cell = rnn.BasicLSTMCell(num_hidden, forget_bias=1.0)
# Get lstm cell output
outputs, states = rnn.static_rnn(lstm_cell, x, dtype=tf.float32)
# Linear activation, using rnn inner loop last output
return tf.matmul(outputs[-1], weights['out']) + biases['out']
logits = RNN(X, weights, biases)
prediction = tf.nn.softmax(logits)
# Define loss and optimizer
# 定义损失函数
loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(
logits=logits, labels=Y))
# 定义优化器
optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate)
train_op = optimizer.minimize(loss_op)
# Evaluate model (with test logits, for dropout to be disabled)
correct_pred = tf.equal(tf.argmax(prediction, 1), tf.argmax(Y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
# Initialize the variables (i.e. assign their default value)
init = tf.global_variables_initializer()
# Start training
with tf.Session() as sess:
# Run the initializer
sess.run(init)
for step in range(1, training_steps+1):
batch_x, batch_y = mnist.train.next_batch(batch_size)
# Reshape data to get 28 seq of 28 elements
batch_x = batch_x.reshape((batch_size, timesteps, num_input))
# Run optimization op (backprop)
sess.run(train_op, feed_dict={X: batch_x, Y: batch_y})
if step % display_step == 0 or step == 1:
# Calculate batch loss and accuracy
loss, acc = sess.run([loss_op, accuracy], feed_dict={X: batch_x,
Y: batch_y})
print("Step " + str(step) + ", Minibatch Loss= " +
"{:.4f}".format(loss) + ", Training Accuracy= " +
"{:.3f}".format(acc))
print("Optimization Finished!")
# Calculate accuracy for 128 mnist test images
test_len = 128
test_data = mnist.test.images[:test_len].reshape((-1, timesteps, num_input))
test_label = mnist.test.labels[:test_len]
print("Testing Accuracy:",
sess.run(accuracy, feed_dict={X: test_data, Y: test_label}))

MNIST 无监督学习。自编码器(autoencoder)。

自编码网络。UFLDL http://ufldl.stanford.edu/wiki/index.php/Autoencoders_and_Sparsity 。
监督学习数据有标记。
自编码网络,输入样本压缩到隐藏层,解压,输出端重建样本。最终输出层神经元数量等于输入层神经元数据量。压缩,输入数据(图像、文本、声音)存在不同程度冗余信息,自动编码网络学习去掉冗余信息,有用特征输入到隐藏层。找到可以代表源数据的主要成分。激活函数不使用sigmoid等非线性函数,用线性函数,就是PCA模型。
主成分分析(principal components analysis, PCA),分析、简化数据集技术。减少数据集维数,保持数据集方差贡献最大特征。保留低阶主成分,忽略高阶主成分。最常用线性降维方法。
压缩过程,限制隐藏神经元数量,学习有意义特征。希望神经元大部分时间被抑制。神经元输出接近1为被激活,接近0为被抑制。部分神经元处于被抑制状态,稀疏性限制。
多个隐藏层,输入数据图像,第一层学习识别边,第二层学习组合边,构成轮廓、角,更高层学习组合更有意义特征。

TensorFlow自编码网络实现。 https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/3_NeuralNetworks/autoencoder.py 。

构建模型。设置超参数,学习率、训练轮数(epoch)、每次训练数据多少、每隔多少轮显示一次训练结果。
定义输入数据,无监督学习只需要图片数据,不需要标记数据。
初始化权重,定义网络结构。2个隐藏层,第一个隐藏层神经元256个,第二个隐藏层神经元128个。包括压缩、解压过程。
构建损失函数、优化器。损失函数“最小二乘法”,原始数据集和输出数据集平方差取均值运算。优化器用RMSPropOptimizer。
训练数据、评估模型。对测试集应用训练好的自动编码网络。比较测试集原始图片和自动编码网络重建结果。

from __future__ import division, print_function, absolute_import
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
# Import MNIST data
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)
# Training Parameters
# 设置训练超参数
learning_rate = 0.01 # 学习率
num_steps = 30000 # 训练轮数
batch_size = 256 # 每次训练数据多少
display_step = 1000 # 每隔多少轮显示训练结果
examples_to_show = 10 # 测试集选10张图片验证自动编码器结果
# Network Parameters
# 网络参数
# 第一个隐藏层神经元个数,特征值个数
num_hidden_1 = 256 # 1st layer num features
# 第二个隐藏层神经元个数,特征值个数
num_hidden_2 = 128 # 2nd layer num features (the latent dim)
# 输入数据特征值个数 28x28=784
num_input = 784 # MNIST data input (img shape: 28*28)
# tf Graph input (only pictures)
# 定义输入数据,只需要图片,不要需要标记
X = tf.placeholder("float", [None, num_input])
# 初始化每层权重和偏置
weights = {
'encoder_h1': tf.Variable(tf.random_normal([num_input, num_hidden_1])),
'encoder_h2': tf.Variable(tf.random_normal([num_hidden_1, num_hidden_2])),
'decoder_h1': tf.Variable(tf.random_normal([num_hidden_2, num_hidden_1])),
'decoder_h2': tf.Variable(tf.random_normal([num_hidden_1, num_input])),
}
biases = {
'encoder_b1': tf.Variable(tf.random_normal([num_hidden_1])),
'encoder_b2': tf.Variable(tf.random_normal([num_hidden_2])),
'decoder_b1': tf.Variable(tf.random_normal([num_hidden_1])),
'decoder_b2': tf.Variable(tf.random_normal([num_input])),
}
# Building the encoder
# 定义压缩函数
def encoder(x):
# Encoder Hidden layer with sigmoid activation #1
layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['encoder_h1']),
biases['encoder_b1']))
# Encoder Hidden layer with sigmoid activation #2
layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['encoder_h2']),
biases['encoder_b2']))
return layer_2
# Building the decoder
# 定义解压函数
def decoder(x):
# Decoder Hidden layer with sigmoid activation #1
layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['decoder_h1']),
biases['decoder_b1']))
# Decoder Hidden layer with sigmoid activation #2
layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['decoder_h2']),
biases['decoder_b2']))
return layer_2
# Construct model
# 构建模型
encoder_op = encoder(X)
decoder_op = decoder(encoder_op)
# Prediction
# 得出预测值
y_pred = decoder_op
# Targets (Labels) are the input data.
# 得出真实值,即输入值
y_true = X
# Define loss and optimizer, minimize the squared error
# 定义损失函数、优化器
loss = tf.reduce_mean(tf.pow(y_true - y_pred, 2))
optimizer = tf.train.RMSPropOptimizer(learning_rate).minimize(loss)
# Initialize the variables (i.e. assign their default value)
init = tf.global_variables_initializer()
# Start Training
# Start a new TF session
with tf.Session() as sess:
# Run the initializer
sess.run(init)
# Training
# 开始训练
for i in range(1, num_steps+1):
# Prepare Data
# Get the next batch of MNIST data (only images are needed, not labels)
batch_x, _ = mnist.train.next_batch(batch_size)
# Run optimization op (backprop) and cost op (to get loss value)
_, l = sess.run([optimizer, loss], feed_dict={X: batch_x})
# Display logs per step
# 每一轮,打印出一次损失值
if i % display_step == 0 or i == 1:
print('Step %i: Minibatch Loss: %f' % (i, l))
# Testing
# Encode and decode images from test set and visualize their reconstruction.
n = 4
canvas_orig = np.empty((28 * n, 28 * n))
canvas_recon = np.empty((28 * n, 28 * n))
for i in range(n):
# MNIST test set
batch_x, _ = mnist.test.next_batch(n)
# Encode and decode the digit image
g = sess.run(decoder_op, feed_dict={X: batch_x})
# Display original images
for j in range(n):
# Draw the original digits
canvas_orig[i * 28:(i + 1) * 28, j * 28:(j + 1) * 28] =
batch_x[j].reshape([28, 28])
# Display reconstructed images
for j in range(n):
# Draw the reconstructed digits
canvas_recon[i * 28:(i + 1) * 28, j * 28:(j + 1) * 28] =
g[j].reshape([28, 28])
print("Original Images")
plt.figure(figsize=(n, n))
plt.imshow(canvas_orig, origin="upper", cmap="gray")
plt.show()
print("Reconstructed Images")
plt.figure(figsize=(n, n))
plt.imshow(canvas_recon, origin="upper", cmap="gray")
plt.show()

参考资料:
《TensorFlow技术解析与实战》

欢迎推荐上海机器学习工作机会,我的微信:qingxingfengzi

发表于
2017-11-04 03:38 
利炳根 
阅读(1992
评论(0
编辑 
收藏 
举报
 

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:学习笔记TF057:TensorFlow MNIST,卷积神经网络、循环神经网络、无监督学习 – 利炳根 - Python技术站

(0)
上一篇 2023年4月6日
下一篇 2023年4月6日

相关文章

  • 偶数卷积核大小(even-sized)与填充(padding)的副作用

    Part1      even-sized kernel 偶数大小卷积核 《Convolution with even-sized kernels and symmetric padding》 清华,NeurIPS,2019 一、 偶数大小卷积核定义 指方形卷积核,变长为偶数,例如2 * 2,4 * 4 …… 在以往,偶数卷积核一般也使用步长2来调整图片、特…

    2023年4月8日
    00
  • 机器学习与Tensorflow(5)——循环神经网络、长短时记忆网络

      1.循环神经网络的标准模型 前馈神经网络能够用来建立数据之间的映射关系,但是不能用来分析过去信号的时间依赖关系,而且要求输入样本的长度固定 循环神经网络是一种在前馈神经网络中增加了分亏链接的神经网络,能够产生对过去数据的记忆状态,所以可以用于对序列数据的处理,并建立不同时段数据之间的依赖关系 循环神经网络是一类允许节点连接成有向环的人工神经网络。如下图:…

    2023年4月8日
    00
  • tensorflow(三十一):数据分割与K折交叉验证

    一、数据集分割 1、训练集、测试集    2、训练集、验证集、测试集 步骤: (1)把训练集60K分成两部分,一部分50K,另一部分10K。 (2)组合成dataset,并打乱。 二、训练过程评估 1、训练的过程评估 其中,第二行是训练,总轮数是5,每两轮做一次评估,达到的效果好的话提前停止。    2、在测试集上再次评估 三、K折交叉验证 (1)第一种方式…

    tensorflow 2023年4月7日
    00
  • Python/Keras如何将给定的数据集打乱

    给定数据集data,数据集对应的标签label index = [i for i in range(len(data))] random.shuffle(index) data = data[index] label = label[index] (1)首先,获得数据集的所有index,其实就是0,1,2,….,num-1(这里的num是数据集中含有的e…

    2023年4月7日
    00
  • 如何设计卷积神经网络架构和卷积、池化后图片大小的计算

     (1)如何设计卷积神经网络架构    下面的正则化公式总结了一些经典的用于图片分类问题的卷积神经网络架构:                         输入层→(卷积层+→池化层?)+→全连接层+       “+”表示一层或多层,“?”表示有或者没有      除了LeNet-5模型,2012年ImageNet ILSVRC图像分类挑战的第一名Ale…

    卷积神经网络 2023年4月8日
    00
  • keras写模型时遇到的典型问题,也是最基础的类与对象问题

    自己定义了一个卷积类,现在需要把卷积加入model中,我的操作是这样的: model.add(Convolution1dLayer) 这样就会报错: 正确的写法是: model.add(Convolution1dLayer()) 原因是Convolution1dLayer仅仅是一个类,但model需要添加的层必须是实例(对象),必须把类实例化后才能添加。 实…

    Keras 2023年4月6日
    00
  • 一个发现图像里卷积的作用—-平移算子

    在当今深度学习火热的今天,图像处理的卷积算子必不可少。 可是卷积算子的含义是什么呢? 在图像检测里,通常要考虑平移,缩放,旋转。那么这些操作是怎么通过卷积实现的呢。 仅仅把网络当成函数拟合器是不够的。 今天发现特定的卷积算子就是平移操作!以下以原图像padding一个像素宽度,灰度为0。 对平移算子写出来: 1 0 0 0 0 0 0 0 0        …

    卷积神经网络 2023年4月5日
    00
  • 【机器学习】卷积层,池化层,全连接层,BN层作用;CNN 网络参数数量的计算

    官方文档:https://keras.io/layers/convolutional/#zeropadding2d https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html VGG16架构 https://www.cnblog…

    2023年4月6日
    00
合作推广
合作推广
分享本页
返回顶部