第二节,TensorFlow 使用前馈神经网络实现手写数字识别

一 感知器

     感知器学习笔记:https://blog.csdn.net/liyuanbhu/article/details/51622695

     感知器(Perceptron)是二分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1。这种算法的局限性很大:

  1. 只能将数据分为 2 类
  2. 数据必须是线性可分的

虽然有这些局限,但是感知器是 ANN 和 SVM 的基础,理解了感知器的原理,对学习ANN 和 SVM 会有帮助,所以还是值得花些时间的。

感知器可以表示为 f:Rn -> {-1,+1}的映射函数,其中f的形式如下:

f(x) = sign(w.x+b)

其中w,b都是n维列向量,w表示权重,b表示偏置,w.x表示w和x的内积。感知器的训练过程其实就是求解w和b的过程,正确的w和b所构成的超平面

w.x + b=0恰好将两类数据点分割在这个平面的两侧。

二 神经网络

 今天,使用的神经网络就是由一个个类似感知器的神经元模型叠加拼接成的。目前常用的神经元包括S型神经元,ReLU神经元,tanh神经元,Softmax神

经元等等。

手写数字识别是目前在学习神经网络中普遍使用的案例。在这个案例中将的是简单的全连接网络实现手写数字识别,这个例子主要包括三个部分。

1.模型搭建

2.确定目标函数,设置损失和梯度值

3.选择算法,设置优化器选择合适的学习率更新权重和偏置。

手写数字识别代码如下:

# -*- coding: utf-8 -*-
"""
Created on Sun Apr  1 19:16:15 2018

@author: Administrator
"""

‘‘‘
使用TnsorFlow实现手写数字识别
‘‘‘

import numpy as np
import matplotlib.pyplot as plt

#绘制训练集准确率,以及测试卷准确率曲线
def plot_overlay_accuracy(training_accuracy,test_accuaracy):
    ‘‘‘
    test_accuracy,training_accuracy:训练集测试集准确率
    ‘‘‘
    #迭代次数
    num_epochs = len(test_accuaracy)

    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.plot(np.arange(0, num_epochs),
            [accuracy*100.0 for accuracy in test_accuaracy],
            color=‘#2A6EA6‘,
            label="Accuracy on the test data")
    ax.plot(np.arange(0, num_epochs),
            [accuracy*100.0 for accuracy in training_accuracy],
            color=‘#FFA933‘,
            label="Accuracy on the training data")
    ax.grid(True)
    ax.set_xlim([0, num_epochs])
    ax.set_xlabel(‘Epoch‘)
    ax.set_ylim([90, 100])
    plt.legend(loc="lower right")              #右小角
    plt.show()

#绘制训练集代价和测试卷代价函数曲线
def plot_overlay_cost(training_cost,test_cost):
    ‘‘‘
    test,reaining:训练集测试集代价  list类型
    ‘‘‘
    #迭代次数
    num_epochs = len(test_cost)

    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.plot(np.arange(0, num_epochs),
            [cost for cost in test_cost],
            color=‘#2A6EA6‘,
            label="Cost on the test data")
    ax.plot(np.arange(0, num_epochs),
            [cost for cost in training_cost],
            color=‘#FFA933‘,
            label="Cost on the training data")
    ax.grid(True)
    ax.set_xlim([0, num_epochs])
    ax.set_xlabel(‘Epoch‘)
    #ax.set_ylim([0, 0.75])
    plt.legend(loc="upper right")
    plt.show()

from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
‘‘‘
打印图片
images:list或者tuple,每一个元素对应一张图片
title:list或者tuple,每一个元素对应一张图片的标题
h:高度的像素数
w:宽度像素数
n_row:输出行数
n_col:输出列数
‘‘‘
def plot_gallery(images,title,h,w,n_row=3,n_col=4):
    #指定整个绘图对象的宽度和高度
    plt.figure(figsize=(1.8*n_col,2.4*n_row))
    plt.subplots_adjust(bottom=0,left=.01,right=.99,top=.90,hspace=.35)
    #绘制每个子图
    for i in range(n_row*n_col):
        #第i+1个子窗口 默认从1开始编号
        plt.subplot(n_row,n_col,i+1)
        #显示图片 传入height*width矩阵 https://blog.csdn.net/Eastmount/article/details/73392106?locationNum=5&fps=1
        plt.imshow(images[i].reshape((h,w)),cmap=plt.cm.gray)  #cmap Colormap 灰度
        #设置标题
        plt.title(title[i],size=12)
        plt.xticks(())
        plt.yticks(())

‘‘‘
打印第i个测试样本对应的标题
Y_pred:测试集预测结果集合 (分类标签集合)
Y_test: 测试集真实结果集合 (分类标签集合)
target_names:分类每个标签对应的名称
i:第i个样本
‘‘‘
def title(Y_pred,Y_test,target_names,i):
    pred_name = target_names[Y_pred[i]].rsplit(‘ ‘,1)[-1]
    true_name = target_names[Y_test[i]].rsplit(‘ ‘,1)[-1]
    return ‘predicted:%s\ntrue:    %s‘ %(pred_name,true_name)

import tensorflow as tf

#设置tensorflow对GPU使用按需分配
config = tf.ConfigProto()
config.gpu_options.allow_growth = True

sess = tf.InteractiveSession(config=config)

‘‘‘
一 导入数据
‘‘‘
from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets(‘MNIST-data‘,one_hot=True)

print(type(mnist)) #<class ‘tensorflow.contrib.learn.python.learn.datasets.base.Datasets‘>

print(‘Training data shape:‘,mnist.train.images.shape)           #Training data shape: (55000, 784)
print(‘Test data shape:‘,mnist.test.images.shape)                #Test data shape: (10000, 784)
print(‘Validation data shape:‘,mnist.validation.images.shape)    #Validation data shape: (5000, 784)
print(‘Training label shape:‘,mnist.train.labels.shape)          #Training label shape: (55000, 10)

‘‘‘
二 搭建前馈神经网络模型 搭建一个包含输入层分别为 784,1024,10个神经元的神经网络
‘‘‘

#初始化权值和偏重
def weight_variable(shape):
    #使用正太分布初始化权值
    initial = tf.truncated_normal(shape,stddev=0.1)    #标准差为0.1
    return tf.Variable(initial)

def bias_variable(shape):
    initial = tf.constant(0.1,shape=shape)
    return tf.Variable(initial)

#input layer
x_ = tf.placeholder(tf.float32,shape=[None,784])
y_ = tf.placeholder(tf.float32,shape=[None,10])

#隐藏层
w_h = weight_variable([784,1024])
b_h = bias_variable([1024])
hidden = tf.nn.relu(tf.matmul(x_,w_h) + b_h)

#输出层
w_o = weight_variable([1024,10])
b_o = bias_variable([10])
output = tf.nn.softmax(tf.matmul(hidden,w_o) + b_o)

‘‘‘
三 设置对数似然损失函数
‘‘‘
#代价函数 J =-(Σy.logaL)/n    .表示逐元素乘
cost = -tf.reduce_sum(y_*tf.log(output))

‘‘‘
四 求解
‘‘‘
train = tf.train.AdamOptimizer(0.001).minimize(cost)

#预测结果评估
#tf.argmax(output,1)  按行统计最大值得索引
correct = tf.equal(tf.argmax(output,1),tf.argmax(y_,1))       #返回一个数组 表示统计预测正确或者错误
accuracy = tf.reduce_mean(tf.cast(correct,tf.float32))   #求准确率

#创建list 保存每一迭代的结果
training_accuracy_list = []
test_accuracy_list = []
training_cost_list=[]
test_cost_list=[]

#使用会话执行图
sess.run(tf.global_variables_initializer())   #初始化变量
#开始迭代 使用Adam优化的随机梯度下降法
for i in range(5000):
    x_batch,y_batch = mnist.train.next_batch(batch_size = 64)
    #开始训练
    train.run(feed_dict={x_:x_batch,y_:y_batch})
    if (i+1)%200 == 0:
         #输出训练集准确率
        #training_accuracy = accuracy.eval(feed_dict={x_:mnist.train.images,y_:mnist.train.labels})
        training_accuracy,training_cost = sess.run([accuracy,cost],feed_dict={x_:mnist.train.images,y_:mnist.train.labels})
        training_accuracy_list.append(training_accuracy)
        training_cost_list.append(training_cost)
        print(‘{0}:Training set accuracy {1},cost {2}.‘.format(i+1,training_accuracy,training_cost))
        #输出测试机准确率
        #test_accuracy = accuracy.eval(feed_dict={x_:mnist.test.images,y_:mnist.test.labels})
        test_accuracy,test_cost = sess.run([accuracy,cost],feed_dict={x_:mnist.test.images,y_:mnist.test.labels})
        test_accuracy_list.append(test_accuracy)
        test_cost_list.append(test_cost)
        print(‘{0}:Test set accuracy {1},cost {2}.‘.format(i+1,test_accuracy,test_cost))
#绘制曲线图
plot_overlay_cost(training_cost_list,test_cost_list)
plot_overlay_accuracy(training_accuracy_list,test_accuracy_list)

#取24个样本,可视化显示预测效果
x_batch,y_batch = mnist.test.next_batch(batch_size = 24)
#获取x_batch图像对象的数字标签
y_test = np.argmax(y_batch,1)
#获取预测结果
y_pred = np.argmax(output.eval(feed_dict={x_:x_batch,y_:y_batch}),1)

#显示与分类标签0-9对应的名词
target_names = [‘number 0‘,‘number 1‘,‘number 2‘,‘number 3‘,‘number 4‘,‘number 5‘,‘number 6‘,‘number 7‘,‘number 8‘,‘number 9‘]
#需要测试的真实的标签和预测作为比较 显示主要的分类指标,返回每个类标签的精确、召回率及F1值
print(classification_report(y_test,y_pred,target_names = target_names))
#建立一个n*n 分别对应每一组真实的和预测的值 用于呈现一种可视化效果
print(confusion_matrix(y_test,y_pred,labels = range(len(target_names))))

#标题
prediction_titles = [title(y_pred,y_test,target_names,i) for i in range(y_pred.shape[0])]
#打印图片
plot_gallery(x_batch,prediction_titles,28,28,6,4)
plt.show()

运行结果如下:

f:RN→{?1,

原文地址:https://www.cnblogs.com/zyly/p/8687999.html

时间: 2024-12-12 04:14:17

第二节,TensorFlow 使用前馈神经网络实现手写数字识别的相关文章

BP神经网络(手写数字识别)

1实验环境 实验环境:CPU [email protected],内存8G,windows10 64位操作系统 实现语言:python 实验数据:Mnist数据集 程序使用的数据库是mnist手写数字数据库,数据库有两个版本,一个是别人做好的.mat格式,训练数据有60000条,每条是一个784维的向量,是一张28*28图片按从上到下从左到右向量化后的结果,60000条数据是随机的.测试数据有10000条.另一个版本是图片版的,按0~9把训练集和测试集分为10个文件夹.这里选取.mat格式的数据

【机器学习】BP神经网络实现手写数字识别

最近用python写了一个实现手写数字识别的BP神经网络,BP的推导到处都是,但是一动手才知道,会理论推导跟实现它是两回事.关于BP神经网络的实现网上有一些代码,可惜或多或少都有各种问题,在下手写了一份,连带着一些关于性能的分析也写在下面,希望对大家有所帮助. 本博文不含理论推导,如对BP的理论推导感兴趣百度即可,或参考<模式识别>. 一.数据库 程序使用的数据库是mnist手写数字数据库,这个数据库我有两个版本,一个是别人做好的.mat格式,训练数据有60000条,每条是一个784维的向量,

神经网络用于手写数字识别

一:人工神经网络 人类之所以能够思考,学习,判断,大部分都要归功于人脑中复杂的神经网络.虽然现在人脑的机理还没有完全破译,但是人脑中神经元之间的连接,信息的传递都已为人所知晓.于是人们就想能否模拟人脑的功能用于解决其他问题,这就发展出人工神经网络. 人工神经网络(artificial neural network,缩写ANN),是一种模仿生物神经网络的结构和功能的数学模型或计算模型.神经网络由大量的人工神经元联结进行计算.大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统

基于BP神经网络的手写数字识别

一.BP神经网络原理及结构 本部分先介绍神经网络基本单元神经元的结构和作用,再主要介绍BP神经网络的结构和原理. 1.神经元 神经元作为神经网络的基本单元,对于外界输入具有简单的反应能力,在数学上表征为简单的函数映射.如下图是一个神经元的基本结构,  神经元结构 图中是神经元的输入,是神经元输入的权重,是神经元的激活函数,y是神经元的输出,其函数映射关系为 激活函数来描述层与层输出之间的关系,从而模拟各层神经元之间的交互反应.激活函数必须满足处处可导的条件.常用的神经元函数有四种,分别是线性函数

简单的神经网络算法-手写数字识别

本文通过BP神经网络实现一个简单的手写识别系统. 一.基础知识 1环境 python2.7 需要numpy等库 可利用sudo apt-get install python-安装 2神经网络原理 http://www.hankcs.com/ml/back-propagation-neural-network.html 讲的特别清楚,本实验过程中涉及矩阵运算都用numpy库的函数 3.js的基础知识 http://www.w3school.com.cn/tags/html_ref_canvas.a

TensorFlow(九):卷积神经网络实现手写数字识别以及可视化

上代码: import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets('MNIST_data',one_hot=True) #每个批次的大小 batch_size = 100 #计算一共有多少个批次 n_batch = mnist.train.num_examples // batch_size #参数概要 def vari

Andrew Ng 机器学习课程笔记 ———— 通过初步的神经网络实现手写数字的识别(尽力去向量化实现)

上一篇我总结了自己在学完逻辑回归后,实现了对手写数字的初步识别 , 在学完了Andrew教授的神经网络简易教程后,趁着知识刚学完没多久,记下了自己在运用简易神经网络实现手写数字识别过程中的总结和问题 ^_^  菜鸡QP的第二篇学习笔记 ~ 错误在所难免 ,希望自己可以通过一篇篇菜鸡的笔记心得 ,取得一点点的进步 ~\(≧▽≦)/~    ) 依旧是给定 5000个20 * 20像素点的手写数字图片 ,与前几天自己完成的逻辑回归完成任务不同 ,这次自己终于要用到极富魅力的神经网络啦(虽然只是最基础

第三节,TensorFlow 使用CNN实现手写数字识别

上一节,我们已经讲解了使用全连接网络实现手写数字识别,其正确率大概能达到98%,着一节我们使用卷积神经网络来实现手写数字识别, 其准确率可以超过99%,程序主要包括以下几块内容 [1]: 导入数据,即测试集和验证集 [2]: 引入 tensorflow 启动InteractiveSession(比session更灵活) [3]: 定义两个初始化w和b的函数,方便后续操作 [4]: 定义卷积和池化函数,这里卷积采用padding,使得 输入输出图像一样大,池化采取2x2,那么就是4格变一格 [5]

Tensorflow实践 mnist手写数字识别

minst数据集                                         tensorflow的文档中就自带了mnist手写数字识别的例子,是一个很经典也比较简单的入门tensorflow的例子,非常值得自己动手亲自实践一下.由于我用的不是tensorflow中自带的mnist数据集,而是从kaggle的网站下载下来的,数据集有些不太一样,所以直接按照tensorflow官方文档上的参数训练的话还是踩了一些坑,特此记录. 首先从kaggle网站下载mnist数据集,一份是