Tensorflow学习日志与心得(二)

Tensorflow学习日志与心得(二)

上一篇说了关于tensorflow的一些基础简单操作与用到python中的简单函数,本部分为作者根据网络中的教程进行的一些tensorflow中的简单小项目的编写,是之后神经网络算法实现的基础,在这里还是会给出一些代码并附有详细注释与自己的见解,供初学者交流使用

1.非线性回归

本部分使用了简单的神经网络,其中心思想还是与上一节的梯度下降法类似,首先使用numpy生成一些随机点与噪声,构建了一个带有噪声的二次模型,使用简单的神经网络进行非线性回归的计算,在程序中定义了一个三层的神经网络,中间层有10个神经元参与计算。

#定义头文件
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
#使用numpy生成200个随机点
x_data = np.linspace(-0.5,0.5,200)[:,np.newaxis]  #使用np.linspace生成了200个数据,通过[:,np.newaxis]变成一个200行,1列的数据
noise = np.random.normal(0,0.02,x_data.shape)  #加入一个随机噪音
y_data = np.square(x_data) + noise
#定义两个placeholder
x = tf.placeholder(tf.float32,[None,1])  #外界输入数据
y = tf.placeholder(tf.float32,[None,1])

#定义神经网络中间层
Weights_L1 = tf.Variable(tf.random_normal([1,10]))  #这里定义了10个神经元进行分析处理
biases_L1 = tf.Variable(tf.zeros([1,10]))  #输入一个数通过10个神经元
Wx_plus_b_L1 = tf.matmul(x,Weights_L1) + biases_L1
L1 = tf.nn.tanh(Wx_plus_b_L1)  #双曲正切函数作为激活函数

#定义神经网络输出层
Weights_L2 = tf.Variable(tf.random_normal([10,1]))
biases_L2 = tf.Variable(tf.zeros([1,1]))
Wx_plus_b_L2 = tf.matmul(L1,Weights_L2) + biases_L2
prediction = tf.nn.tanh(Wx_plus_b_L2)

上述代码的神经网络模型
上述代码的神经网络模型

#二次代价函数
loss = tf.reduce_mean(tf.square(y-prediction))
#使用梯度下降法训练
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

with tf.Session() as sess:
    #变量初始化
    sess.run(tf.global_variables_initializer())
    for _ in range(2000):  #训练2000次
        sess.run(train_step,feed_dict={x:x_data,y:y_data})
        
    #获得预测值
    prediction_value = sess.run(prediction,feed_dict={x:x_data})
    #画图
    plt.figure()
    plt.scatter(x_data,y_data)
    plt.plot(x_data,prediction_value,'r-',lw=5)
    plt.show()

在这里插入图片描述
拟合曲线
梯度下降法学习率
1)学习率设置太小,需要花费过多的时间来收敛
2)学习率设置较大,在最小值附近震荡却无法收敛到最小值
3)进入局部极值点就收敛,没有真正找到的最优解
4)停在鞍点处,不能够在另一维度继续下降

2.MINIST数据集分类

MINIST是一个手写数字库,包含训练集与测试集,每一张图片包含2828个像素,我们把一个数组展开成一个向量,长度是2828=784。因此在MNIST训练数据集中mnist.train.images是一个形状力[60000,784]的张量,第一个维度数字用来索引图片,第二个维度数字库某索引每张图片中的像素点。图片里的某个像素的强度值介于0-1之间。本部分使用了简单的神经网络对手写数字图片进行识别,其中依然用到了之前的二次代价函数、梯度下降法等方法,同时还使用到了Softmax归一化函数,将输入的结果通过概率的形式表现出来,Softmax函数可通过本节最后的链接进行学习。输出神经元有10个,代表识别出是0-9每个数字的概率。最终为了直观的表现出本节设计神经网络的识别率,设计了一个求准确率函数,使用tf.argmax函数找出10个输出神经元中最大的一个,与测试集中的原图片进行比较,进而求出识别率。

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data  #从tensorflow.examples.tutorials.mnist库中导入input_data文件
mnist = input_data.read_data_sets("MNIST_data",one_hot=True)  #载入数据集,“MNIST_data”文件存放在与代码的同一路径下,所以不需要加入完整路径
batch_size = 50  #每个批次的大小 一次输入50张图片进行训练
n_batch=mnist.train.num_examples // batch_size  #计算一共有多少个批次
#定义两个placeholder
x = tf.placeholder(tf.float32,[None,784])
y = tf.placeholder(tf.float32,[None,10])
#创建一个简单的神经网络
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
prediction = tf.nn.softmax(tf.matmul(x,W)+b)
#二次代价函数
loss = tf.reduce_mean(tf.square(y-prediction))
#使用梯度下降法
train_step = tf.train.GradientDescentOptimizer(0.3).minimize(loss)
#初始化变量
init = tf.global_variables_initializer()
#结果存放在一个布尔型列表中
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))#argmax返回一维张量中最大的值所在的位置
#求准确率
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

with tf.Session() as sess:  #建立会话,执行训练与准确率的计算
    sess.run(init)
    for epoch in range(21):
        for batch in range(n_batch):
            batch_xs,batch_ys =  mnist.train.next_batch(batch_size)
            sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys})
        
        acc = sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels})
        print("Iter " + str(epoch) + ",Testing Accuracy " + str(acc))

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
Iter 0,Testing Accuracy 0.8827
Iter 1,Testing Accuracy 0.8968
Iter 2,Testing Accuracy 0.9039
Iter 3,Testing Accuracy 0.9072
Iter 4,Testing Accuracy 0.9094
Iter 5,Testing Accuracy 0.913
Iter 6,Testing Accuracy 0.9138
Iter 7,Testing Accuracy 0.916
Iter 8,Testing Accuracy 0.9162
Iter 9,Testing Accuracy 0.9179
Iter 10,Testing Accuracy 0.9193
Iter 11,Testing Accuracy 0.9192
Iter 12,Testing Accuracy 0.919
Iter 13,Testing Accuracy 0.9193
Iter 14,Testing Accuracy 0.9203
Iter 15,Testing Accuracy 0.9214
Iter 16,Testing Accuracy 0.9212
Iter 17,Testing Accuracy 0.9221
Iter 18,Testing Accuracy 0.9223
Iter 19,Testing Accuracy 0.9224
Iter 20,Testing Accuracy 0.9231

从执行结果看,在训练21次后识别率达到92%以上,这只是一个简单的两层神经网络,92%的识别率还是比较低的,在提高准确率方面可以通过如下方式进行改进:
1)修改批次大小
2)增加隐藏层,使用sigmoid或tanh作为激活函数
3)修改权重与偏置量的初始值
4)改变代价函数
5)更新梯度下降法的学习率
6)增加训练次数
作者通过简单的摸索,增加了一个有100个神经元的隐藏层并使用tanh函数作为激活函数对神经网络进行了修改,更改代码如下:

#定义一个中间层
W_L1 = tf.Variable(tf.zeros([784,100]))
b_L1 = tf.Variable(tf.zeros([1,100]))
Wx_plus_L1 = tf.matmul(x,W_L1) + b_L1
L1 = tf.nn.tanh(Wx_plus_L1)
#定义输出层
W_L2 = tf.Variable(tf.random_normal([100,10]))
b_L2 = tf.Variable(tf.zeros([1,10]))
Wx_plus_L2 = tf.matmul(L1,W_L2) + b_L2
prediction = tf.nn.softmax(Wx_plus_L2)

本部分主要说明的softmax函数的用法,如果没有看懂程序的话可以参考下方的几篇文章

https://blog.csdn.net/bitcarmanlee/article/details/82320853 小白都能看懂的softmax详解
https://blog.csdn.net/lz_peter/article/details/84574716 一分钟理解softmax函数(超简单)
https://lumingdong.cn/setting-strategy-of-gradient-descent-learning-rate.html 梯度下降学习率的设定策略

3.交叉熵函数

二次代价函数的不足
在这里插入图片描述
在这里插入图片描述
上式为二次代价函数的公式与导数公式,在使用梯度下降法调整权值参数的大小时,z表示神经元的输入,σ表示激活函数。w和b的梯度跟激活函数成正比,激活函数的梯度越大,w和b的大小调整得越快,训练收敛也越快。在部分情况下会降低训练效率,由此便引出了交叉熵代价函数
在这里插入图片描述
在这里插入图片描述
在交叉熵函数中,权值和偏置值得调整与σ(z)得倒数无关。在误差越大时,梯度就越大,参数w和b得调整就越快,训练得速度也就越快。
如果输出神经元时线性得,那么二次代价函数是一种合适得选择。如果输出神经元是S型函数,那比较适合使用交叉熵代价函数。
在程序中得调用如下所示

loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction))
Iter 0,Testing Accuracy 0.8241
Iter 1,Testing Accuracy 0.8943
Iter 2,Testing Accuracy 0.902
Iter 3,Testing Accuracy 0.9053
Iter 4,Testing Accuracy 0.9088
Iter 5,Testing Accuracy 0.9102
Iter 6,Testing Accuracy 0.9122
Iter 7,Testing Accuracy 0.9144
Iter 8,Testing Accuracy 0.9141
Iter 9,Testing Accuracy 0.916
Iter 10,Testing Accuracy 0.9179
Iter 11,Testing Accuracy 0.9182
Iter 12,Testing Accuracy 0.9187
Iter 13,Testing Accuracy 0.9191
Iter 14,Testing Accuracy 0.9193
Iter 15,Testing Accuracy 0.9204
Iter 16,Testing Accuracy 0.9203
Iter 17,Testing Accuracy 0.9207
Iter 18,Testing Accuracy 0.9211
Iter 19,Testing Accuracy 0.9207
Iter 20,Testing Accuracy 0.9217

可以看出在模型得收敛速度比之前使用的二次代价函数要快,在此类S型函数中。

结束语

Tensorflow的简单用法已经差不多了解,接下来会使用Tensor flow中的可视化工具——tensorboard来进行可视化的操作,下一节将会进入神奇的tensorboard的学习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值