学习笔记tf024:tensorflow实现softmaxregression(回归)识别手写数字

利炳根 利炳根     2022-09-07     372

关键词:

TensorFlow实现Softmax Regression(回归)识别手写数字。MNIST(Mixed National Institute of Standards and Technology database),简单机器视觉数据集,28X28像素手写数字,只有灰度值信息,空白部分为0,笔迹根据颜色深浅取[0, 1], 784维,丢弃二维空间信息,目标分0~9共10类。数据加载,data.read_data_sets, 55000个样本,测试集10000样本,验证集5000样本。样本标注信息,label,10维向量,10种类one-hot编码。训练集训练模型,验证集检验效果,测试集评测模型(准确率、召回率、F1-score)。

算法设计,Softmax Regression训练手写数字识别分类模型,估算类别概率,取概率最大数字作模型输出结果。类特征相加,判定类概率。模型学习训练调整权值。softmax,各类特征计算exp函数,标准化(所有类别输出概率值为1)。y = softmax(Wx+b)。

NumPy使用C、fortran,调用openblas、mkl矩阵运算库。TensorFlow密集复杂运算在Python外执行。定义计算图,运算操作不需要每次把运算完的数据传回Python,全部在Python外面运行。

import tensor flow as tf,载入TensorFlow库。less = tf.InteractiveSession(),创建InteractiveSession,注册为默认session。不同session的数据、运算,相互独立。x = tf.placeholder(tf.float32, [None,784]),创建Placeholder 接收输入数据,第一参数数据类型,第二参数代表tensor shape 数据尺寸。None不限条数输入,每条输入为784维向量。

tensor存储数据,一旦使用掉就会消失。Variable在模型训练迭代中持久化,长期存在,每轮迭代更新。Softmax Regression模型的Variable对象weights、biases 初始化为0。模型训练自动学习合适值。复杂网络,初始化方法重要。w = tf.Variable(tf.zeros([784, 10])),784特征维数,10类。Label,one-hot编码后10维向量。

Softmax Regression算法,y = tf.nn.softmax(tf.matmul(x, W) + b)。tf.nn包含大量神经网络组件。tf.matmul,矩阵乘法函数。TensorFlow将forward、backward内容自动实现,只要定义好loss,训练自动求导梯度下降,完成Softmax Regression模型参数自动学习。

定义loss function描述问题模型分类精度。Loss越小,模型分类结果与真实值越小,越精确。模型初始参数全零,产生初始loss。训练目标是减小loss,找到全局最优或局部最优解。cross-entropy,分类问题常用loss function。y预测概率分布,y‘真实概率分布(Label one-hot编码),判断模型对真实概率分布预测准确度。cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))。定义placeholder,输入真实label。tf.reduce_sum求和,tf.reduce_mean每个batch数据结果求均值。

定义优化算法,随机梯度下降SGD(Stochastic Gradient Descent)。根据计算图自动求导,根据反向传播(Back Propagation)算法训练,每轮迭代更新参数减小loss。提供封装优化器,每轮迭代feed数据,TensorFlow在后台自动补充运算操作(Operation)实现反向传播和梯度下降。train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)。调用tf.train.GradientDescentOptimizer,设置学习速度0.5,设定优化目标cross-entropy,得到训练操作train_step。

tf.global_variables_initializer().run()。TensorFlow全局参数初始化器tf.golbal_variables_initializer。

batch_xs,batch_ys = mnist.train.next_batch(100)。训练操作train_step。每次随机从训练集抽取100条样本构成mini-batch,feed给 placeholder,调用train_step训练样本。使用小部分样本训练,随机梯度下降,收敛速度更快。每次训练全部样本,计算量大,不容易跳出局部最优。

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmzx(y_,1)),验证模型准确率。tf.argmax从tensor寻找最大值序号,tf.argmax(y,1)求预测数字概率最大,tf.argmax(y_,1)找样本真实数字类别。tf.equal判断预测数字类别是否正确,返回计算分类操作是否正确。

accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32)),统计全部样本预测正确度。tf.cast转化correct_prediction输出值类型。

print(accuracy.eval({x: mnist.test.images,y_: mnist.test.labels}))。测试数据特征、Label输入评测流程,计算模型测试集准确率。Softmax Regression MNIST数据分类识别,测试集平均准确率92%左右。

TensorFlow 实现简单机器算法步骤:
1?定义算法公式,神经网络forward计算。
2?定义loss,选定优化器,指定优化器优化loss。
3?迭代训练数据。
4?测试集、验证集评测准确率。

定义公式只是Computation Graph,只有调用run方法,feed数据,计算才执行。

    from tensorflow.examples.tutorials.mnist import input_data
    mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
    print(mnist.train.images.shape, mnist.train.labels.shape)
    print(mnist.test.images.shape, mnist.test.labels.shape)
    print(mnist.validation.images.shape, mnist.validation.labels.shape)
    import tensorflow as tf
    sess = tf.InteractiveSession()
    x = tf.placeholder(tf.float32, [None, 784])
    W = tf.Variable(tf.zeros([784, 10]))
    b = tf.Variable(tf.zeros([10]))
    y = tf.nn.softmax(tf.matmul(x, W) + b)
    y_ = tf.placeholder(tf.float32, [None, 10])
    cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
    train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
    tf.global_variables_initializer().run()
    for i in range(1000):
        batch_xs, batch_ys = mnist.train.next_batch(100)
        train_step.run({x: batch_xs, y_: batch_ys})
    correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    print(accuracy.eval({x: mnist.test.images, y_: mnist.test.labels}))

 


参考资料:
《TensorFlow实践》

欢迎付费咨询(150元每小时),我的微信:qingxingfengzi

学习笔记tf038:实现估值网络

Q-Learning,学习Action对应期望值(ExpectedUtility)。1989年,Watkins提出。收敛性,1992年,Watkins和Dayan共同证明。学习期望价值,从当前一步到所有后续步骤,总期望获取最大价值(Q值、Value)。Action->Q函数,最佳策略,在每个state下,... 查看详情

学习笔记tf036:实现bidirectionallstmclassifier

双向循环神经网络(BidirectionalRecurrentNeuralNetworks,Bi-RNN),Schuster、Paliwal,1997年首次提出,和LSTM同年。Bi-RNN,增加RNN可利用信息。普通MLP,数据长度有限制。RNN,可以处理不固定长度时序数据,无法利用历史输入未来信息。Bi-RNN,... 查看详情

学习笔记tf034:实现word2vec

卷积神经网络发展趋势。Perceptron(感知机),1957年,FrankResenblatt提出,始祖。Neocognitron(神经认知机),多层级神经网络,日本科学家Kunihikofukushima,20世纪80年代提出,一定程度视觉认知功能,启发卷积神经网络。LeNet-5,CNN之父,Ya... 查看详情

ros学习笔记(18)tf坐标系广播与监听的编程实现

系统Ubuntu18.04ROS版本:Melodic1创建功能包cd~/catkin_ws/srccatkin_create_pkglearning_tfroscpprospytfturtlesim2创建Python文件1创建scripts文件夹和.py文件touchturtle_tf_broadcaster.pytouchturtle_tf_listener.py修改.py文件属性(允许作为执行文件)2实... 查看详情

学习笔记tf042:tf.learn分布式estimator深度学习estimator

TF.Learn,TensorFlow重要模块,各种类型深度学习及流行机器学习算法。TensorFlow官方ScikitFlow项目迁移,谷歌员工IlliaPolosukhin、唐源发起。Scikit-learn代码风格,帮助数据科学从业者更好、更快适应接受TensorFlow代码。囊括许多TensorFlow... 查看详情

学习笔记tf016:cnn实现数据集tfrecord加载图像模型训练调试

AlexNet(AlexKrizhevsky,ILSVRC2012冠军)适合做图像分类。层自左向右、自上向下读取,关联层分为一组,高度、宽度减小,深度增加。深度增加减少网络计算量。训练模型数据集Stanford计算机视觉站点StanfordDogshttp://vision.stanford.edu/aditya86/... 查看详情

学习笔记tf040:多gpu并行

TensorFlow并行,模型并行,数据并行。模型并行根据不同模型设计不同并行方式,模型不同计算节点放在不同硬伯上资源运算。数据并行,比较通用简便实现大规模并行方式,同时使用多个硬件资源计算不同batch数据梯度,汇总梯... 查看详情

学习笔记cb013:tensorflowtensorboardseq2seq

tensorflow基于图结构深度学习框架,内部通过session实现图和计算内核交互。tensorflow基本数学运算用法。importtensorflowastfsess=tf.Session()a=tf.placeholder("float")b=tf.placeholder("float")c=tf.constant(6.0)d=tf.mul(a,b)y=tf.mul(d,c)prints 查看详情

tensorflow实战google深度学习框架笔记codepart(代码片段)

深层神经网络线性模型的局限性激活函数实现去线性化a=tf.nn.relu(tf.matmul(x,w1)+biases1)y=tf.nn.relu(tf.matmul(a,w2)+biases2)经典损失函数#计算交叉熵cross_entropy=-tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,le-10,1.0)))#tf.clip_by_value样例 查看详情

学习笔记tf062:tensorflow线性代数编译框架xla

XLA(AcceleratedLinearAlgebra),线性代数领域专用编译器(demain-specificcompiler),优化TensorFlow计算。即时(just-in-time,JIT)编译或提前(ahead-of-time,AOT)编译实现XLA,有助于硬件加速。XLA还在试验阶段。https://www.tensorflow.org/versions/master/exper 查看详情

tensorflow函数学习笔记

##tf.Variable(??)  创建tf变量##tf.matmul(w,x)    矩阵乘法w=tf.Variable([[0.5,1.0]])x=tf.Variable([[2.0],[1.0]])y=tf.matmul(w,x)init_op=tf.global_variables_initializer()withtf.Ses 查看详情

tensorflow学习笔记

tensorflow一些函数:1、tf.ones(shape,type=tf.float32,name=None)   tf.ones([2,3],int32)==>[[1,1,1],[1,1,1]] 2、tf.zeros(shape,type=tf.float32,name=None)   tf.zeros([2,&nb 查看详情

学习笔记tf043:tf.learn机器学习estimatordataframe监督器monitors

线性、逻辑回归。input_fn()建立简单两个特征列数据,用特证列API建立特征列。特征列传入LinearClassifier建立逻辑回归分类器,fit()、evaluate()函数,get_variable_names()得到所有模型变量名称。可以使用自定义优化函数,tf.train.FtrlOptimiz... 查看详情

学习笔记tf039:tensorboard

首先向大家和《TensorFlow实战》的作者说句不好意思。我现在看的书是《TensorFlow实战》。但从TF024开始,我在学习笔记的参考资料里一直写的是《TensorFlow实践》,我自己粗心搞错了,希望不至于对大家造成太多误导。TensorBoard,Te... 查看详情

tensorflow学习笔记:共享变量

本文是根据TensorFlow官方教程翻译总结的学习笔记,主要介绍了在TensorFlow中如何共享参数变量。教程中首先引入共享变量的应用场景,紧接着用一个例子介绍如何实现共享变量(主要涉及到tf.variable_scope()和tf.get_variable()两个接口... 查看详情

tensorflow学习笔记(代码片段)

TensorFlow学习笔记一、常量表示importtensorflowastfm1=tf.constant([[3,3]])m2=tf.constant([[2],[3]])product=tf.matmul(m1,m2)print(product)sess=tf.Session()result=sess.run(product)print(result)sess.close()withtf.S 查看详情

学习笔记tf025:自编码器

传统机器学习依赖良好的特征工程。深度学习解决有效特征难人工提取问题。无监督学习,不需要标注数据,学习数据内容组织形式,提取频繁出现特征,逐层抽象,从简单到复杂,从微观到宏观。稀疏编码(SparseCoding),基本结... 查看详情

学习笔记tf063:tensorflowdebugger

TensorFlowDebugger(tfdbg),TensorFlow专用调试器。用断点、计算机图形化展现实时数据流,可视化运行TensorFlow图形内部结构、状态。有助训练推理调试模型错误。https://www.tensorflow.org/programmers_guide/debugger。常见错误类型,非数字(nan)、... 查看详情