tensorflow—例子

本文介绍了作者使用TensorFlow进行深度学习的实践过程,从简单的线性模型预测开始,逐步构建神经网络并添加隐藏层,对二次函数进行拟合,然后讨论了代码中的关键点如Variable与placeholder的区别。接着,通过可视化工具matplotlib展示拟合过程,并解决了在Anaconda环境下安装和使用matplotlib的问题。最后,作者转向了分类问题,用MNIST数据集进行数字识别,学习了one-hot编码和交叉熵损失函数,并实现了一个简单的神经网络模型对五类图片进行分类,过程中遇到了图片路径问题,通过解决这些问题,模型的准确率从19%提升到了87.5%。
摘要由CSDN通过智能技术生成

1、第一个例子:预测一个线性直线y=0.1*x+0.3

  还没来得及去学习tensorflow的基础,便直接上手例子了。有点小吃力,但参照着B站莫烦的python教学视频(https://www.bilibili.com/video/av16001891/?p=10 例子5反复看了至少3回,原谅奔三的我,日益消退的理解和消化能力。。),感谢天地,看懂了并亲手实现了第一个人工神经网络训练的例子。虽然实验室的老旧电脑机器跑了大概有两三分钟,而视频中苹果的电脑是瞬间出的结果,但还是有那么一丝的小成就感和喜悦之情不由自主地溢于言表。。起码为之后的AI学习和漫长的科研道路带来了信心和希望,愿世界和平,愿疾病离你我远远的。。。

先把试验成功的代码和结果贴上来,上面简单做了注释。

二、例子2:构建简单的神经网络结构之添加隐藏层。目的:拟合一个二次函数。例子中构建了一个隐藏层含有具有十个神经元的三层神经网络。激励函数用的relu。https://en.wikipedia.org/wiki/Activation_function维基百科上有很多激励函数可供选择。

关于代码的注释在截图中会有。需要注意的是:

@1、如果定义了变量Variable 就必须进行激活。init;否则就不需要init。

@2、关于区别Variable和placeholder可以这么理解:前者是已经规划好的初始值,而后者是可以在代码运行时才传入的初始值。

@3、隐藏层的节点数(即神经元个数)可以自由定义。

@4、[None,1]可以被理解为行不确定,列为1的列向量。

三、将例子二的拟合过程进行可视化。期间主要有两个问题。

@1、在anconda下,需要在tensorflow的环境里安装上matplotlib.才可以使用spyder(tensorflow)调用matplotlib画图进行结果的可视化操作。

@2、在spyder中run,默认的是在控制台窗口显示画图结果,如果想让它在新建fig窗口独立显示图像,需要在Tools-Preference-Ipython console-Graphic-Backend选择Qt5,之后重启spyder才可有效。

  现将代码段粘贴如下,并附有注释:

# -*- coding: utf-8 -*-
"""
Created on Thu Sep 13 19:36:15 2018
莫烦B站的教学视频P16的例子。拟合一个二次函数。构建了一个隐藏层含有具有十个神经元的三层神经网络。激励函数用的relu
本次主要是演示将结果可视化。
@author: Administrator
"""

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt#首先加载可视化模块


def add_layer(inputs,in_size,out_size,activation_function=None):#None的话,默认就是线性函数
    Weights=tf.Variable(tf.random_normal([in_size,out_size]))#生成In_size行和out_size列的矩阵。代表权重矩阵。
    biases=tf.Variable(tf.zeros([1,out_size])+0.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#outputs是add_layer的输出值。

x_data=np.linspace(-1,1,300)[:,np.newaxis]#linspace是创建一个从-1到1的300个数的等差数列
noise=np.random.normal(0,0.05,x_data.shape)
y_data=np.square(x_data)-0.5+noise

xs=tf.placeholder(tf.float32,[None,1])#1是x_data的属性为1.None指无论给多少个例子都ok。
ys=tf.placeholder(tf.float32,[None,1])

#开始建造第一层layer。典型的三层神经网络:输入层(有多少个输入的x_data就有多少个神经元,本例中,只有一个属性,所以只有一个神经元输入),假设10个神经元的隐藏层,输出层。
#由于在使用relu,该代码就是用十条线段拟合一个抛物线。
l1=add_layer(xs,1,10,activation_function=tf.nn.relu)#L1仅是单隐藏层,全连接网络。

#再定义一个输出层,即:prediction
#add_layer的输出值是l1,把l1放在prediction的input。input的size就是隐藏层的size:10.output的size就是y_data的size就是1.
prediction=add_layer(l1,10,1,activation_function=None)

loss=tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction),
                           reduction_indices=[1]))#reduction_indices=[1]:按行求和。reduction_indices=[0]按列求和。sum是将所有例子求和,再求平均(mean)。
#通过训练学习。提升误差。
train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss)#以0.1的学习效率来训练学习,来减小loss。

init=tf.global_variables_initializer()
sess=tf.Session()
sess.run(init)

fig=plt.figure()#申请一个图片框
ax=fig.add_subplot(1,1,1)#要实现连续性的画图,所以用ax
ax.scatter(x_data,y_data) #先把real_data以点的形式给画出来
plt.ion()
plt.ioff()
plt.show()

for i in range(1000):
    sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
    if i%50==0:
        #to seee the improvement
        #print(sess.run(loss,feed_dict={xs:x_data,ys:y_data}))
        #使用try是因为第一次抹除第一条线的话可能会报错,因为采用的是先擦除再plot的方法,第一条还不存在。
        try:
            ax.lines.remove(lines[0])#去除line的第一条线,再plot下一条。。
        except Exception:
            pass
        prediction_value=sess.run(prediction,feed_dict={xs:x_data})#prediction与输入的xs有关,所以,要feed_dict
       #然后把prediciotn的值用一条曲线的形式plot上去
        lines=ax.plot(x_data,prediction_value,'r-',lw=5)#lw=5是指线的宽度为5.
        #plot出一条线之后就要擦掉再plot另一条线。
        plt.pause(0.1)
        

另外,将运行结果整理如下:

四:classification。之前的是那个例子说的是线性回归的事情,接下来看分类的问题基于从MNIST下载数据,辨别数字

跟学比较顺利,现记录下几个知识点点:

@1、MNIST database=modified national institute of standards and technology databases

@2、one-hot编码 独热码,不同的位置表示不同的分类。

@3、在基于分类的神经网络中,计算loss要用到cross_entropy即交叉熵,它是一个相对比较复杂的算法。后续再做研究。用softmax和cross_entropy就可以自动生成分类算法?

例子代码如下(附有注释):

# -*- coding: utf-8 -*-
"""
Created on Tue Sep 18 10:08:29 2018
分类的问题.识别数字.基于MNIST数据集。
@author: Administrator
"""

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
#number 1to 10 data
mnist=input_data.read_data_sets('MNIST_data',one_hot=True)#如果电脑中没有MNIST包就会自动下载下来,第二次运行的时候就直接用了。


def add_layer(inputs,in_size,out_size,activation_function=None):#None的话,默认就是线性函数
    Weights=tf.Variable(tf.random_normal([in_size,out_size]))#生成In_size行和out_size列的矩阵。代表权重矩阵。
    biases=tf.Variable(tf.zeros([1,out_size])+0.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#outputs是add_layer的输出值。

def compute_accuracy(v_xs,v_ys):
    global prediction#先把prediciton定义成全局变量
    y_pre=sess.run(prediction,feed_dict={xs:v_xs})#把x_data send到prediciton里生成预测值(一行10列,处于1和0之间的值,表示的是概率大小.取值最大的一个位置即是本次预测值) 
    correct_prediction=tf.equal(tf.argmax(y_pre,1),tf.argmax(v_ys,1))#再将此数值与真实数值对比.取预测输出的1个数里面最大的索引和真实答案的索引比较奥,一样的话就是对的.
    accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))#计算这一组数据当中,对的个数,与错的个数
    result=sess.run(accuracy,feed_dict={xs:v_xs,ys:v_ys})#run一下accuracy就可以得到结果(百分比)
    return result
#define placeholder for inputs to network
xs=tf.placeholder(tf.float32,[None,784])#28*28
ys=tf.placeholder(tf.float32,[None,10])
    
 #add output layer
prediction=add_layer(xs,784,10,activation_function=tf.nn.softmax)

#the error between prediciton and real data
cross_entropy=tf.reduce_mean(-tf.reduce_sum(ys*tf.log(prediction),
                                            reduction_indices=[1])) #loss交叉熵
train_step=tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

sess=tf.Session()

#important step
sess.run(tf.global_variables_initializer())

for i in range(1000):
    batch_xs,batch_ys=mnist.train.next_batch(100)#提取出一部分的xs和ys的sample.如果每一次都学习全套的数据,计算能力会很低,很慢.
    sess.run(train_step,feed_dict={xs:batch_xs,ys:batch_ys})
    if i%50==0:#每隔50步计算准确度.
        print(compute_accuracy(
                mnist.test.images,mnist.test.labels))

运行结果如下:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值