使用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))