学习了:
在mnist数据集上训练模型,输出手写数字识别准确lv,具体就是
前向(权重函数、偏置函数、前向传播函数,构建网络结构)
后向(读入数据、backward(mnist),交叉熵损失函数、正则化、滑动平均、指数下降、实例化saver对象、保存模型)
test(加载数据,不加载图结构、定义网络结构、实例化带滑动平均的saver对象、 计算准确率)
结论:
1、w
将 # truncated_normal初始化权重,去掉过大偏离点的正态分布
w = tf.Variable(tf.truncated_normal(shape, stddev=0.1))
改成:w = tf.Variable(tf.random_normal(shape, mean=0, stddev=0.1))
借鉴的是vgg的初始化方法。明显提高了准确lv!
2、b
给成0.1还是有提升的,这个0.01是借鉴cs231n的课程中的偏置来说的,所以说哈,可能这个是神经网络,还是简单点,哦初始化好了!(不知道正确么,我的猜测)
3、在backward中加入下面代码即可实现断点续训
上面就显示从第6002次迭代接着训练.....
正 文
minist-forward.py
import tensorflow as tf
INPUT_NODE = 784 #输入神经元个数(28*28)
OUTPUT_NODE = 10 #输出神经元个数(10类,0-9)
LAYER1_NODE = 500 #隐藏层的node
# 权重函数
def get_weight(shape, regularizer):
# truncated_normal初始化权重,去掉过大偏离点的正态分布
w = tf.Variable(tf.truncated_normal(shape, stddev=0.1))
# 判断是否正则化,regularizer为空则不正则化
if regularizer != None: tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(regularizer)(w))
# 返回w
return w
# 偏置函数
def get_bias(shape):
# 使用tf.zeros初始化权重,全0
b = tf.Variable(tf.zeros(shape))
# 返回b
return b
# 前向传播函数,构建网络结构
def forward(x, regularizer):
#第一层
# 调用权重函数
w1 = get_weight([INPUT_NODE, LAYER1_NODE], regularizer)
# 调用偏置函数
b1 = get_bias([LAYER1_NODE])
# relu函数非线性化
y1 = tf.nn.relu(tf.matmul(x, w1) + b1)
#第二层
w2 = get_weight([LAYER1_NODE, OUTPUT_NODE], regularizer)
b2 = get_bias([OUTPUT_NODE])
# 因为后面用到softmax函数,为了使得满足概率分布,从而不用relu函数
y = tf.matmul(y1, w2) + b2
# 返回预测的y
return y
mnist_backwa