本人是tensorflow的一个小白, 理解了一天, 把代码弄明白一些,希望自己的理解能够给更多人帮助
大家都知道MNIST是一个比较简单的实例,相当于编程语言中的“hello word”,浅层神经网络也比较简单,所以也比较适合咱们新手。
话不多说,代码走起。
#coding:utf-8
import tensorflow as tf
# 我也不知道为什么要引用这个numpy,有知道的小伙伴在下面留言哦
import numpy as np
# 在tensorflow有一些基本的数据,不用我们下载,直接用就ok了
from tensorflow.examples.tutorials.mnist import input_data
# 添加一层神经网络,注意:我们设计的是浅层神经网络
# 有多浅呢? 一个输入层, 一个隐藏层,一个输出层(我们说有多少层,一般不算输入层)
#言归正传, add_layer一共有四个参数,
# input代表输入的数据 , in_size代表输入数据的形状, out_size代表当前层输出是什么形状,
# activation_function代表的是使用的激活函数
def add_layer(inputs, in_size, out_size, activation_function=None):
#tf.Variable()可以理解为用来存放标量,W和b都是我们要修改的
# W代表的是权重(weight),b是bias(偏置)的缩写
W = tf.Variable(tf.random_normal([in_size, out_size]))
b = tf.Variable(tf.zeros([1, out_size])+0.01)
Z = tf.matmul(inputs, W) + b
#if语句间接的判断了当前层是哪种层,如果是输出层,activation_function就是None,
#如果是隐藏层,就是 activation_function(Z)
if activation_function is None:
outputs = Z
else:
outputs = activation_function(Z)
return outputs
if __name__ == '__main__': #这个 条件是用来判断是否直接执行当前.py文件
MNIST = input_data.read_data_sets("./", one_hot=True)
learning_rate = 0.05 # 学习率
batch_size = 128 #每批大小
n_epoch = 10
X = tf.placeholder(tf.float32, [batch_size, 784])
Y = tf.placeholder(tf.float32, [batch_size, 10])
# 添加隐藏层1,
# 请注意add_layer()是我们上面编写的
l1 = add_layer(X, 784, 1000, activation_function=tf.nn.relu)
# 添加输出层
prediction = add_layer(l1, 1000, 10, activation_function=None)
entropy = tf.nn.softmax_cross_entropy_with_logits(labels=Y, logits=prediction)
loss = tf.reduce_mean(entropy)
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
# 表示在训练阶段, 一共有多少的batch
n_batch = int(MNIST.train.num_examples/batch_size)
# i用来代表当前第几轮
for i in range(n_epoch):
# j代表在第几个batch
for j in range(n_batch):
# next_batch()是已经写好的,直接用就可以,而且会返回两个值:一个是特征,一个是label
X_batch, Y_batch = MNIST.train.next_batch(batch_size)
# _可以理解是一个变量名,因为再后面的程序中,我们使用不到这个变量中的值,所以用‘_’来命名,
# 是python中的一种约定俗成的东西
_, loss_ = sess.run([optimizer, loss], feed_dict={X:X_batch, Y:Y_batch})
if j==0:
print("Loss of epoch[{0}] batch[{1}]:{2}".format(i, j, loss_))
# test the model
n_batches = init(MNIST.test.num_examples/batch_size)
#全部预测正确的数目
total_correct_preds = 0
for i in range(n_batches):
X_batch, Y_batch = MNIST.test.next_batch(batch_size)
preds = sess.run(prediction, feed_dict={X:X_batch, Y:Y_batch})
correct_preds = tf.equal(tf.argmax(preds, 1), tf.argmax(Y_batch, 1))
accuracy = tf.reduce_sum(tf.cast(correct_preds, tf.float32))
total_correct_preds += sess.run(accuracy)
print("Accuracy {0}".format(total_correct_preds/MNIST.test.num_examples))