4.下面的是在每一个神经元中的操作y=X⋅W+b y=X·W+b ,使用向量化运算计算输入与权重的和运算
5.最后就是激活函数的选择了
下面我们就开始像搭建积木一样创建我们的神经网络了,每一层的输入为上一层的输出:
with tf.name_scope("dnn"): hidden1 = neuron_layer(X,n_hidden1,"hidden1",activation="relu") hidden2 = neuron_layer(hidden1,n_hidden2,"hidden2",activation="relu") logits = neuron_layer(hidden2,n_output,"output")上面这一段代码的输出层并没有经过softmax激活函数,这是考虑到后续优化求解原因,在后续工作中单独做处理。上面这段代码就是一个神经网络全连接的简化版本,当然TF的contrib模块也提供了全连接的函数fully_connected。
from tensorflow.contrib.layers import fully_connected with tf.name_scope("dnn"): hidden1 = fully_connected(X, n_hidden1, scope="hidden1")#激活函数默认为relu hidden2 = fully_connected(hidden1, n_hidden2, scope="hidden2") logits = fully_connected(hidden2, n_outputs, scope="outputs",activation_fn=None)现在,模型已经有了。接下来套路就是设计损失函数,优化损失函数求解参数。输出层softmax输出的为在各个类别上面的得分,损失函数使用交叉熵
−∑y ′ log(y ′ ) −∑y′log(y′) 。在这里我们使用TF提供的tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, name=None)来计算损失函数,该方法先计算softmax再计算cross entropy,主要有两个参数需要考虑
1.labels:输入的为标签的index,例如本例子有10个类别,取值范围为0-9
2.logits:为输入到softmax激活函数之前的模型的输出
最后再使用reduce_mean()计算loss。
with tf.name_scope("loss"): xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y,logits=logits)#labels允许的数据类型有int32, int64 loss = tf.reduce_mean(xentropy,name="loss")note:TF还提供了softmax_cross_entropy_with_logits(),和上面方法的区别该方法输入的label为一个one-hot向量。
到这里我们的模型和损失函数已经都有了,就到了优化阶段,本文使用梯度下降方法
模型有了结果,就需要对得到的模型进行衡量。简单起见,这里使用accuracy作为评估指标,判断模型输出结果的最高值的index是否和label的index相等
with tf.name_scope("eval"): correct = tf.nn.in_top_k(logits,y,1) #取值最高的一位 accuracy = tf.reduce_mean(tf.cast(correct,tf.float32)) #结果boolean转为0,1模型构建阶段最后一个工作就是初始化里面的变量
init = tf.global_variables_initializer() saver = tf.train.Saver() 执行计算流图