Tensorflow2.0学习笔记(一)

Tensorflow2.0学习笔记(一)——MNIST入门


前言

本次学习用到了储备知识中的Softmax回归模型


一、MNIST是什么?

MNIST是一个入门级的计算机视觉数据集,它包含各种手写的数字图片,学习它的使用就相当于编程入门学习中的打印 “Hello,World!“ 。

二、实现步骤及代码

1.引入库

代码如下:

#屏蔽警告
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
#tensorflow2.0无法用 import tensorflow as tf 导入库文件,所以使用下面的代码
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

由于我电脑的原因,每次运行都会警告需要升级到最新的tensorflow,所以我用上面的命令屏蔽掉了警告,对程序运行完全没有影响。

2.下载MNIST数据集

代码如下:

#加载MNIST数据
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets ("MNIST_data/",one_hot=True)

3.构建Softmax回归模型

代码如下:

x = tf.placeholder(tf.float32, [None, 784])            #构建占位符,代表输入的图像,None表示样本的数量可以是任意的
W = tf.Variable(tf.zeros([784,10]))                    #构建一个变量,代表训练目标W,初始化为0
b = tf.Variable(tf.zeros([10]))                        #构建一个变量,代表训练目标b,初始化为0
y = tf.nn.softmax(tf.matmul(x,W) + b)                  #构建了一个softmax的模型:y = softmax(Wx + b),y指样本标签的预测值
y_ = tf.placeholder("float", [None,10])                #构建占位符,代表样本标签的真实值
cross_entropy = -tf.reduce_sum(y_*tf.log(y))           #交叉熵代价函数
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)          #使用梯度下降法(0.01的学习率)来最小化这个交叉熵代价函数
init = tf.initialize_all_variables()

这里放出上篇笔记的图片
在这里插入图片描述
可以看出softmax模型的计算方法类似于线性代数的行列式的计算——Y=x*W+b,需要保证x的列与W的行数相同,在MNIST中就是保证图片的维度相同,即:x和W想乘后要与b的维度相同。

4.启动模型

代码如下:

#构建Session,在Session中启动模型
sess = tf.Session()                                    #构建会话
sess.run(init)                                         #初始化所有变量
......
......
sess.close()

Tensorflow依赖于一个高效的C++后端来进行计算。与后端的这个连接叫做session。一般而言,使用TensorFlow程序的流程是先创建一个图,然后在session中启动它。

TensorFlow在这里实际上所做的是,它会在后台给描述你的计算的那张图里面增加一系列新的计算操作单元用于实现反向传播算法和梯度下降算法。然后,它返回给你的只是一个单一的操作,当运行这个操作时,它用梯度下降算法训练你的模型,微调你的变量,不断减少成本。

5.训练和评估模型

代码如下:

#训练模型1000次
for i in range(1000):                                  #迭代次数为1000
  batch_xs, batch_ys = mnist.train.next_batch(100)                   #使用minibatch的训练数据,一个batch的大小为100
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})        #用训练数据替代占位符来执行训练
  #评估模型
  correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))     #tf.argmax()返回的是某一维度上其数据最大所在的索引值,在这里即代表预测值和真值
  accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))    #用平均值来统计测试准确率
  print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))    #打印测试信息

tf.argmax是非常重要的函数,后面会单独提到。

三、程序运行结果

在这里插入图片描述
正确率在91%左右,预测结果不太好,有很大改进空间。


总结

涉及指令整理

Placeholder:占位符,相当于函数自变量,用作输入
Variable:可修改的张量。
tf.matmul(a,b):矩阵a乘以矩阵b得到 矩阵a*b
tf.log():求对数
tf.reduce_sum:求和
tf.reduce_mean:用于计算张量tensor沿着指定数轴(图像某一维度)的平均值
tf.cast(a,b):数据类型转换函数,a为待转换的数据,b为目标数据类型。
tf.equal(a,b):判断a和b是否相等,逐个元素判断,每次判断对应一次true或false
tf.argmax(a):当a是一位矩阵时,输出是这个数组中最大参数的索引;
tf.argmax(a):当a是多维矩阵时,分类讨论:tf.argmax(a,0),0表示y方向,具体解释如下:
tf.argmax(a,1),1表示x方向

import tensorflow as tf
b = [[3,8,9],[2,15,0]]
a = tf.argmax(b,1)
with tf.Session() as sess:
	print(sess.run(a))

即 3 2
8 15
9 0
3>2,输出3的索引0,8<15,输出15的索引1,9>0,输出9的索引0
结果是[0,1,0],有几列就输出几个元素。
tf.argmax(a,1),1表示x方向

import tensorflow as tf
b = [[3,8,9],[2,15,0]]
a = tf.argmax(b,1)
with tf.Session() as sess:
	print(sess.run(a))

[3,8,9]最大的是9,索引为2;[2,15,0]最大的是15,索引1。
结果是[2,1]。有几行就输出几个元素。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值