一、写"添加层"函数
1.1 明确各个节点的个数
input_node = 784 #输入层的节点数 相当于图片的像素28*28
output_node = 10 #输出层的节点数 相当于分类器的类别的个数
L1_node = 500 #隐藏层节点的个数
1.2 定义权重初始化函数
def get_weight_variable(shape,regularizer): weights = tf.get_variable("weights",shape,initializer=tf.truncated_normal_initializer(stddev = 0.1)) if regularizer!=None: tf.add_to_collection('losses',regularizer(weights)) #将当前变量的正则化损失加入losses集合 return weights
1.3 构建整个网络结构 共两层
#添加两个层 输出采用relu作为激活函数 实现列去线性化 def inference(input_tensor,regularizer): #声明第一层变量并完成前向传播的过程 with tf.variable_scope('layer1'): weights = get_weight_variable([input_node,L1_node],regularizer) bias = tf.get_variable("bias",[L1_node],initializer = tf.constant_initializer(0.0)) layer1 = tf.nn.relu(tf.matmul(input_tensor,weights)+bias) #声明第二层变量并完成前向传播的过程 with tf.variable_scope('layer2'): weights = get_weight_variable([L1_node ,output_node ],regularizer) bias = tf.get_variable("bias",[output_node ],initializer = tf.constant_initializer(0.0)) layer2 = tf.nn.relu(tf.matmul(layer1,weights)+bias) return layer2
layer1中 输入为1*input_node w为 input_node*L1_node 的矩阵 b为1*L1_node 输出结果为1*L1_node
layer1中 输入为1*L1_node w为 L1_node*output_node的矩阵 b为1*output_node输出结果为1*output_node
二、定义训练过程
2.1 定义输入输出的placeholder
x = tf.placeholder(tf.float32, [None, mnist_inference.input_node], name='x_input')
y_ = tf.placeholder(tf.float32, [None, mnist_inference.output_node], name='y_input')
2.2 定义正则函数
regularizer = tf.contrib.layers.l2_regularizer(regularization_rate)
2.3 构建神经网络结构
y = mnist_inference.inference(x,regularizer) #构建神经网络结构
这里调用了在第一章定义的inference函数
2.4 初始化滑动平均类 加快早期变量的更新速度
#初始化滑动平均类 加快早期变量的更新速度 衰减率0.99
global_step = tf.Variable(0,trainable = False)
variable_averages = tf.train.ExponentialMovingAverage(moving_average_decay,global_step)
variables_averages_op = variable_averages.apply(tf.trainable_variables())
这两句话是一个固定的套路格式 用于滑动平均
2.5 计算cross_entropy的均值
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits = y, labels= tf.argmax(y_,1))
cross_entropy_mean = tf.reduce_mean(cross_entropy)
2.6 总损失 = 交叉熵损失 + 正则化损失
loss = cross_entropy_mean + tf.add_n(tf.get_collection('losses'))
2.7 设置衰减的学习率
learining_rate = tf.train.exponential_decay(learning_rate_base,global_step,mnist.train.num_examples/batch_size , learning_rate_decay)
2.8 采用GradientDescentOptimizer的优化算法
train_step = tf.train.GradientDescentOptimizer(learining_rate).minimize(loss,global_step = global_step)
2.9 反向传播来更新神经网络的参数 更新每一个参数的滑动平均值
train_op = tf.group(train_step,variables_averages_op)
2.10 设置保存
saver = tf.train.Saver()
2.11 开始循环训练
xs,ys = mnist.train.next_batch(batch_size) #每次取出100个数进行训练
_,loss_value,step = sess.run([train_op,loss,global_step],feed_dict={x:xs,y_:ys})
2.12 打印、保存训练结果
print("%d traing step,loss is %g"%(step,loss_value))
saver.save(sess,os.path.join(SAVE_PATH,SAVE_MODEL_NAME),global_step = global_step)
训练结果:
1 traing step,loss is 2.68094
1001 traing step,loss is 0.214418
2001 traing step,loss is 0.243217
3001 traing step,loss is 0.252535
4001 traing step,loss is 0.174281
5001 traing step,loss is 0.213977
6001 traing step,loss is 0.221109
注意 参数学习率learning_rate_base不宜设置太高 开始我按照书上写的0.8 发现学习不收敛 我改为0.1之后才有收敛结果
三、定义测试过程
利用已经训练好的模型 进行模型的验证
3.1 定义输入输出
x = tf.placeholder(tf.float32, [None, mnist_inference.input_node], name='x_input') y_ = tf.placeholder(tf.float32, [None, mnist_inference.output_node], name='y_input') validate_feed = {x:mnist.validation.images, y_:mnist.validation.labels}
3.2 构建神经网络
3.3 计算准确率 判断预测结果y是否和真实值y_一致y = mnist_inference.inference(x,None) #构建神经网络结构 正则化损失函数为none
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1)) #判断是否和真实值y_相等 1代表仅在第一个维度上进行
#tf.cast将数据转换成float32 再利用reduce_mean求平均数
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
3.4 滑动平均
variable_averages = tf.train.ExponentialMovingAverage(mnist_train.moving_average_decay) variables_to_restore = variable_averages.variables_to_restore() saver = tf.train.Saver(variables_to_restore)
3.5 加载训练出来的模型
saver.restore(sess,ckpt.model_checkpoint_path)
3.6 计算准确度
accuracy_score = sess.run(accuracy,feed_dict = validate_feed)
最终结果:
实验设置 每10秒验证一次模型的准确度
after model.ckpt-1001 training accuracy is 0.9496
after model.ckpt-2001 training accuracy is 0.9666
after model.ckpt-2001 training accuracy is 0.9666
after model.ckpt-3001 training accuracy is 0.9718
after model.ckpt-3001 training accuracy is 0.9718after model.ckpt-4001 training accuracy is 0.9756
下载地址:
http://download.csdn.net/download/yunge812/10254907
=======================================================================
最近新开的公众号,文章正在一篇篇的更新,
公众号名称:玩转电子世界
各位朋友有什么问题了可以直接在上面提问,我会一一进行解答的。
跟着阳光非宅男,一步步走进电子的世界。
关注之后回复 资料下载 关键词可以获得免费海量的视频学习资料下载~~!
已共享的学习视频资料,共享资料正在不断更新中。
共享机器学习/tensorflow视频学习资料:
=======================================================================