卷积、池化、全连接的基本认识及最简单的手写体识别:
简单的记录下学习笔记:
? 卷积神经网络跟普通的神经网络类似,都具有可学习的权重(w)和偏置(b)。每个神经元都可接收一些输入,并做一些运算,输出是每个分类的分数。
卷积神经网络通常包括:
数据输入层:
? 本层的作用是对图像进行预处理,例如:去均值、归一化、PCA/白化。
? 去均值:将图像的中心拉至0点,即将每一张图片的特征都减去全部训练集集合的均值,使图像各个维度的中心都为原点。
? 归一化:保证所有的维度数据变化都在一个变化幅度上,即对所有的维度的数据都除以所处维度的标准差。另一种方式是除以数据的最大值,保证变化幅度在0-1之间。
? PCA/白化:PCB用于降维,白化是对数据各个特征轴上的幅度归一化 PCA:数据在低维线性空间上的正交投影(投影线垂直于投影面),这个线性空间被称为主子空间,使得投影数据的方差被最大化。通过矩阵的乘法用于降维。
卷积层:
? 图片与卷积核重合区域内相对应的每一个像素值,乘卷积核内相对应点的权重,然后求和, 再加上偏置后,最后得到输出矩阵中的一个像素值。
池化层:
? 通常图片特征的维度很大,所以将特征切成几个区域,取其最大值或平均值,得到新的、维度较小的特征。分为最大池化和平均池化,最大池化和平均池化:
? 最大池化,取每一个区域矩阵中的最大值为此矩阵的特征值。
? 平均池化,取每一个区域矩阵中的平均值为此矩阵的特征值。
全连接层:
? 把所有局部特征结合变成全局特征,用来计算最后每一类的得分。
最简单的手写体识别:
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data/', one_hot=True)
def add_layer(inputs, in_size, out_size, activation_function=None):
Weights = tf.Variable(tf.random_normal([in_size, out_size]))
bises = tf.Variable(tf.zeros([1, out_size]) + 0.1)
Wx_plus_b = tf.matmul(inputs, Weights) + bises
if activation_function is None:
outputs = Wx_plus_b
else:
outputs = activation_function(Wx_plus_b)
return outputs
def compute_accuracy(x, y):
global prediction
y_pre = sess.run(prediction, feed_dict={xs: x})
correct_prediction = tf.equal(tf.argmax(y_pre, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
result = sess.run(accuracy, feed_dict={xs: x, ys: y})
return result
xs = tf.placeholder(tf.float32, [None, 784])
ys = tf.placeholder(tf.float32, [None, 10])
prediction = add_layer(xs, 784, 10, tf.nn.softmax)
cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys * tf.log(prediction), reduction_indices=[1]))
train = tf.train.GradientDescentOptimizer(0.3).minimize(cross_entropy)
sess = tf.Session()
sess.run(tf.initialize_all_variables())
for i in range(2000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train, feed_dict={xs: batch_xs, ys: batch_ys})
if i % 100 == 0:
print(compute_accuracy(mnist.test.images, mnist.test.labels))
这里注意,本文使用的是tensorflow2.0版本,如果想要使用1.0版本的话,需要将
import tensorflow.compat.v1 as tf
import tensorflow as tf
基本流程如下:
先定义相关结构:
? 1.训练的数据 ? 2.定义节点准备接收数据 ? 3.定义神经层:隐藏层和预测层 ? 4.定义 loss 表达式 ? 5.选择 optimizer 使 loss 达到最小
? 随后,用for循环迭代2000次循环(每20次循环输出一次),将输入的x,y通过feed_dict填充到节点xs、ys中,再用train进行训练,逐渐减小loss,再将xs、ys投入到compute_accuracy(x, y),计算出每轮的精度。
|