书山有路勤为径,学海无涯苦作舟
一、神经网络的图像分类
1.1 MNIST的手写图像识别分类的任务
导入数据
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data",one_hot=True)
Extracting MNIST_data\train-images-idx3-ubyte.gz
Extracting MNIST_data\train-labels-idx1-ubyte.gz
Extracting MNIST_data\t10k-images-idx3-ubyte.gz
Extracting MNIST_data\t10k-labels-idx1-ubyte.gz
定义神经网络神经元的函数
#---------------------------------定义神经层---------------------------------
# 函数:输入变量 输入大小 输出大小 激励函数默认None
def add_layer(inputs, in_size, out_size, activation_function=None):
# 权重为随机变量矩阵
Weights = tf.Variable(tf.random_normal([in_size, out_size])) #行*列
# 定义偏置 初始值增加0.1 每次训练中有变化
biases = tf.Variable(tf.zeros([1, out_size]) + 0.1) #1行多列
# 定义计算矩阵乘法 预测值
Wx_plus_b = tf.matmul(inputs, Weights) + biases
# 激活操作
if activation_function is None:
outputs = Wx_plus_b
else:
outputs = activation_function(Wx_plus_b)
return outputs
设置输入
用placeholder占位,每张图片是28*28的所以列数为784,输出是10分类任务
xs = tf.placeholder(tf.float32,[None,784]) #输入有28*28
ys = tf.placeholder(tf.float32,[None,10]) #输出是10个类别
定义神经元
#定义输入层
prediction = add_layer(xs,784,10,activation_function=tf.nn.softmax)
定义误差和学习率
#------------------------------定义loss和训练-------------------------------
# 预测值与真实值误差 平均值->求和->ys*log(prediction)
cross_entropyloss = tf.reduce_mean(-tf.reduce_sum(ys * tf.log(prediction),
reduction_indices=[1])) #loss
# 训练学习 学习效率通常小于1 这里设置为0.5可以进行对比
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropyloss) #减小误差
全局初始化
sess = tf.Session()
init = tf.initialize_all_variables()
sess.run(init)
定义准确率的函数
#-------------------------------定义计算准确度函数------------------------------
# 参数:预测xs和预测ys
def compute_accuracy(v_xs, v_ys):
# 定义全局变量
global prediction
# v_xs数据填充到prediction变量中 生成预测值0到1之间的概率
y_pre = sess.run(prediction, feed_dict={xs:v_xs})
# 比较预测最大值(y_pre)和真实最大值(v_ys)的差别 如果等于就是预测正确,否则错误
correct_prediction = tf.equal(tf.argmax(y_pre,1), tf.argmax(v_ys,1))
# 计算正确的数量
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
# 输出结果为百分比 百分比越高越准确
result = sess.run(accuracy, feed_dict={xs:v_xs, ys:v_ys})
return result
训练
#---------------------------------神经网络学习---------------------------------
for i in range(1000):
# 提取一部分的xs和ys
batch_xs, batch_ys = mnist.train.next_batch(100) #从下载好的数据集提取100个样本
# 训练
sess.run(train_step, feed_dict={xs:batch_xs, ys:batch_ys})
# 每隔50步输出一次结果
if i % 50 == 0:
# 计算准确度
print(compute_accuracy(
mnist.test.images, mnist.test.labels))
0.1178
0.6424
0.7339
0.7752
0.7964
0.8187
0.8291
0.8379
0.8442
0.8464
0.8496
0.8541
0.8586
0.8608
0.8668
0.8683
0.8713
0.8731
0.868
0.8756