深度学习原理与框架-Tensorflow基本操作-mnist数据集的逻辑回归 1.tf.matmul(点乘操作) 2.tf.equal(对应位置是否相等) 3.tf.cast(将布尔类型转换为数值类型) 4.tf.argmax(返回最大值的索引) 5.tf.nn.softmax(计算softmax概率值) 6.tf.train.GradientDescentOptimizer(损失值梯度下降器)

时间:2023-03-08 19:23:59
深度学习原理与框架-Tensorflow基本操作-mnist数据集的逻辑回归  1.tf.matmul(点乘操作) 2.tf.equal(对应位置是否相等) 3.tf.cast(将布尔类型转换为数值类型) 4.tf.argmax(返回最大值的索引) 5.tf.nn.softmax(计算softmax概率值) 6.tf.train.GradientDescentOptimizer(损失值梯度下降器)

1. tf.matmul(X, w) # 进行点乘操作

参数说明:X,w都表示输入的数据,

2.tf.equal(x, y) # 比较两个数据对应位置的数是否相等,返回值为True,或者False

参数说明:x,y表示需要比较的两组数

3.tf.cast(y, 'float') # 将布尔类型转换为数字类型

参数说明:y表示输入的数据,‘float’表示转换的数据类型

4.tf.argmax(y, 1) # 返回每一行的最大值的索引

参数说明:y表示输入数据,1表示每一行的最大值的索引,0表示每一列最大值得索引

5.tf.nn.softmax(y) # 对每一行数据,按照softmax方式,计算其概率值

参数说明:y表示输入的数据

6.tf.train.GradientDescentOptimizer(0.05).minimize(loss) # 对损失值采用梯度下降的方法进行降低操作

参数说明:0.05表示学习率的大小,loss表示损失值

代码说明:相较于上一个线性拟合的代码,逻辑回归的代码,使用了tf.placeholder()进行数据输入的占位,

预测结果等价于tf.matmul(X, w) + b,作为预测结果

代码:

第一步:载入mnist数据集

第二步:超参数的设置,包括输入样本的维度,分类的类别数,一个batch的大小,以及迭代的次数

第三步:使用tf.placeholder() 构造X特征和y标签

第四步:使用tf.Variable(tf.random_normal([inputSize, num_classes]))构造W和b

第五步:使用tf.matmul获得预测得分值,使用tf.nn.softmax() 将得分值转换为概率值

第六步:使用L2损失值,即均分误差作为损失值

第七步:使用tf.train.GradientDescentOptimizer(learning_rate=0.05).minimize(loss), 对损失值进行梯度下降

第八步:使用tf.equal(tf.argmax(y_pred), tf.argmax(y)) 获得两个标签的最大值索引是否一致,再使用tf.reduce_mean(tf.cast()) 计算准确率

第九步:循环,使用mnist.train.next_batch进行训练数据的部分数据的读取

第十步:sess.run([optm, loss], feed_dict={X:batch[0], y:batch[1]}) # 执行损失值和梯度下降降低损失值,从而更新参数

第十一步:每迭代1000次,打印部分数据的准确率

第十二步:打印测试数据部分的准确率

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data # 第一步:mnist数据集的载入
mnist = input_data.read_data_sets('/data', one_hot=True) # 第二步:初始超参数的设置
# 输入层的维度
inputSize = 784
# 分类的类别数
num_classes = 10
# 每一次参数更新的batchSize
batch_size = 64
# 循环的次数
trainIteration = 50000 # 第三步:输入数据初始化操作, 进行一个占位操作
# X的维度为[-1, inputSize]
X = tf.placeholder(tf.float32, [None, inputSize])
# y的维度为[-1, num_classes]
y = tf.placeholder(tf.float32, [None, num_classes])
# 第四步:变量的初始化操作
# W1进行正态参数初始化,维度为[inputSize, num_classes]
W1 = tf.Variable(tf.random_normal([inputSize, num_classes], stddev=0.1))
# b1进行全零初始化,维度为[num_classes]
b1 = tf.Variable(tf.zeros([num_classes]))
# 第五步:使用tf.matmul进行预测操作, 使用softmax计算概率值,扩大类别差距
y_pred = tf.nn.softmax(tf.matmul(X, W1) + b1)
# 第六步:使用L2 loss计算损失值, tf.reduce_mean求出所有的损失值的平均值
loss = tf.reduce_mean(tf.square(y-y_pred))
# 第七步:使用梯度下降法,对loss进行降低
opt = tf.train.GradientDescentOptimizer(learning_rate=0.05).minimize(loss)
# 第八步:判断预测结果的最大值和真实值之间是否相等,使用True和False表示
correct_pred = tf.equal(tf.argmax(y_pred, 1), tf.argmax(y, 1))
# 使用tf.cast将布尔类型转换为float类型,使用reduce_mean求平均值
accr = tf.reduce_mean(tf.cast(correct_pred, 'float'))
# 变量初始化
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init) for i in range(trainIteration):
# 第九步:使用mnist.train.next_batch 获得一个batch的数据
bacth = mnist.train.next_batch(batch_size)
# 第十步:使用sess.run执行梯度下降和loss操作,输入的参数为batch_X和batch_y数据
_, loss = sess.run([opt, loss], feed_dict={X:bacth[0], y:bacth[1]})
# 第十一步:如果迭代1000次,打印当前训练数据的准确率
if i % 1000 == 0:
print('train accr %g'%(sess.run(accr, feed_dict={X:bacth[0], y:bacth[1]})))
# 第十二步:打印测试数据的batch_size的准确率
batch = mnist.test.next_batch(batch_size)
print('test accr %g'%(sess.run(accr, feed_dict={X: batch[0], y: batch[1]})))