教程地址:TensorFlow官方文档中文版
本文主要是在TensorFlow上搭建一个前馈神经网络(feed-forward neural network)来对TensorFlow的运作方式进行简单介绍。
代码在\examples\tutorials\mnist\中,主要使用两个文件:mnist.py和fully_connected_feed.py。
先看mnist.py,mnist.py的作用是构建一个完全连接的前馈网络,主要包含四个部分:inference(),loss()、trainging()以及evaluation()。
inference(),为满足促使神经网络向前反馈并做出预测的要求来构建模型,看代码:
def inference(images, hidden1_units, hidden2_units):
"""Build the MNIST model up to where it may be used for inference.
Args:
images: Images placeholder, from inputs().
hidden1_units: Size of the first hidden layer.
hidden2_units: Size of the second hidden layer.
Returns:
softmax_linear: Output tensor with the computed logits.
"""
# Hidden 1
with tf.name_scope('hidden1'):
weights = tf.Variable(
tf.truncated_normal([IMAGE_PIXELS, hidden1_units],
stddev=1.0 / math.sqrt(float(IMAGE_PIXELS))),
name='weights') #权重是标准方差为输入尺寸开根号分之一的正态分布
biases = tf.Variable(tf.zeros([hidden1_units]),
name='biases')
hidden1 = tf.nn.relu(tf.matmul(images, weights) + biases)
# Hidden 2
with tf.name_scope('hidden2'):
weights = tf.Variable(
tf.truncated_normal([hidden1_units, hidden2_units],
stddev=1.0 / math.sqrt(float(hidden1_units))),
name='weights')
biases = tf.Variable(tf.zeros([hidden2_units]),
name='biases')
hidden2 = tf.nn.relu(tf.matmul(hidden1, weights) + biases)
# Linear
with tf.name_scope('softmax_linear'):
weights = tf.Variable(
tf.truncated_normal([hidden2_units, NUM_CLASSES],
stddev=1.0 / math.sqrt(float(hidden2_units))),
name='weights')
biases = tf.Variable(tf.zeros([NUM_CLASSES]),
name='biases')
logits = tf.matmul(hidden2, weights) + biases
return logits
使用tf.name_scope()定义了名为“hidden1”、“hidden2”和“softmax_linear”的三个变量空间,即作用域 ,作用域中创建的元素将会带上scope名称的前缀,那这和我们之前文章中的tf.variable_scope()有什么区别呢,在网上你可以搜到很多关于这两者的区别,但是我认为,在tf.name_scope()中使用tf.Variable()来创建变量,tf.variable_scope()中使用tf.get_variable()来创建变量,而tf.Variable()和tf.get_variable()的区别就是,使用tf.get_variable()创建的变量可以用来共享,而tf.Variable()不行。
在初始化时,对weight的初始化使用标准方差为输入维度开根号分之一的正太分布,biase的初始化使用常量0,在“hidden1”和“hidden2”中使用ReLU的激活函数,“softmax_linear”是输出维度和分类的总数相同,在这里为10 ,它的输出也就与分类情况有关。
loss(),定义了模型的损失函数:
def loss(logits, labels):
"""Calculates the loss from the logits and the labels.
Args:
logits: Logits tensor, float - [batch_size, NUM_CLASSES].
labels: Labels tensor, int32 - [batch_size].
Returns:
loss: Loss tensor of type float.
"""
labels = tf.to_int64(labels)
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
logits, labels, name='xentropy')
loss = tf.reduce_mean(cross_entropy, name='xentropy_mean')
return loss<