使用tensorflow构造神经网络用来进行mnist数据集的分类

相比与上一节讲到的逻辑回归,神经网络比逻辑回归多了隐藏层,同时在每一个线性变化后添加了relu作为激活函数, 

神经网络使用的损失值为softmax概率损失值,即为交叉熵损失值

代码:使用的是mnist数据集作为分类的测试数据,数据的维度为50000*784 

第一步:载入mnist数据集

第二步:超参数的设置,输入图片的大小,分类的类别数,迭代的次数,每一个batch的大小

第三步:使用tf.placeholder() 进行输入数据的设置,进行数据的占位

第四步:使用tf.Variable() 设置里面设置tf.truncated_normal([inputSize, num_hidden], sttdv=0.1) 设置w的初始值,使用tf.Variable(tf.constant(0.1, [num_hidden])) 设置b,这一步主要是进行初始参数设置

第五步:使用tf.nn.relu(tf.matmul()+b) 构造第一层的网络,tf.nn.relu(tf.matmul() + b) 构造第二层的网络, tf.matmul() + b 构造输出层的得分

第六步:使用tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=score)) 来构造损失函数

第七步:使用tf.train.GradientDescentOptimizer().minimize(loss) 使用下降梯度降低损失值

第八步:使用tf.equal(tf.argmax(y, 1), tf.argmax(score, 1)) 即 tf.reduce_mean(tf.cast) 进行准确率的求解

第九步:进行循环,使用mnist.train.next_batch(batchSize) 读取部分数据

第十步:使用sess.run()执行梯度下降操作

第十一步:循环一千次,执行准确率的操作,并打印准确率

第十二步:使用验证集进行结果的验证

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data

# 第一步数据读取
mnist = input_data.read_data_sets('/data', one_hot=True)

# 第二步:超参数的设置
# 输入图片的大小
inputSize = 784
# 分类的类别数
num_classes = 10
# 隐藏层的个数
num_hidden = 50
# 迭代的次数
trainIteration = 10000
# 每一个batch值的大小
batch_size = 100
# 第二个隐藏层的个数
num_hidden_2 = 100

# 第三步:使用tf.placeholder()构造输入数据X 和 y
X = tf.placeholder(tf.float32, shape=[None, inputSize])
y = tf.placeholder(tf.float32, shape=[None, num_classes])

#第四步:初始化W和b参数
W1 = tf.Variable(tf.random_normal([inputSize, num_hidden], stddev=0.1), name='W1')
b1 = tf.Variable(tf.zeros([num_hidden]), name='b1')
# b1 = tf.Variable(tf.constant(0.1), [num_hidden])
W2 = tf.Variable(tf.random_normal([num_hidden, num_hidden_2], stddev=0.1), name='W2')
# b2 = tf.Variable(tf.constant(0.1), [num_classes])
b2 = tf.Variable(tf.zeros([num_hidden_2]), name='b2')
W3 = tf.Variable(tf.random_normal([num_hidden_2, num_classes], stddev=0.1), name='W3')
b3 = tf.Variable(tf.zeros([num_classes]))

# 第五步:使用点乘获得第一层,第二层和最后的得分值
h1 = tf.nn.relu(tf.matmul(X, W1) + b1)
h2 = tf.nn.relu(tf.matmul(h1, W2) + b2)
y_pred = tf.matmul(h2, W3) + b3
# 第六步:使用tf.nn.softmax_cross_entropy_with_logits计算交叉熵损失值
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=y_pred))
# 第七步:使用tf.train.GradientDescentOptimizer降低损失值loss
opt = tf.train.GradientDescentOptimizer(learning_rate=0.05).minimize(loss)
# 第八步:使用tf.argmax(y_pred, 1)找出每一行的最大值索引,tf.equal判断索引是否相等
correct_pred = tf.equal(tf.argmax(y_pred, 1), tf.argmax(y, 1))
# tf.cast将索引转换为float类型,使用tf.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):
    # 第九步:获得一个batch的数据
    batch = mnist.train.next_batch(batch_size)
    # 第十步:使用sess.run()对损失值降低操作和损失值进行执行,从而进行参数更新
    _, data_loss = sess.run([opt, loss], feed_dict={X: batch[0], y: batch[1]})
    # 第十一步:每迭代1000次就进行打印准确率和损失值
    if i % 1000 == 0:
        accurracy = sess.run(accr, feed_dict={X: batch[0], y: batch[1]})
        print('loss: %g accr: %g' % (data_loss, accurracy))
# 第十二步:使用测试数据进行训练结果的验证
batch = mnist.test.next_batch(batch_size)
accurracy = sess.run(accr, feed_dict={X: batch[0], y: batch[1]})
print('test accr %g'%(accurracy))

posted on 2019-03-13 23:16  python我的最爱  阅读(227)  评论(0编辑  收藏  举报