MNIST数据处理
from tensorflow.examples.tutorials.mnist import_data
mnist=input_data.read_data_sets("/path/",one_hot=True)
#input_data.read_data_sets()生成的类会自动将mnist数据集划分为train,validation,test三个数据集
mnist.train.next_batch()#函数,他可以从所有的训练数据中读取一小部分作为一个训练batch
tensorflow训练神经网络
这里主要是将神经网络结果按设计和训练优化的所有方法进行了实践
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
#设置输入和输出节点的个数,配置神经网络的参数
INPUT_NODE=784
OUTPUT_NODE=10
LAYER1_NODE=500 #隐藏层数
BATCH_SIZE=100 #打包的样本数量
LEARNING_RATE_BASE=0.8
LEARNING_RATE_DECAY=0.99
REGULARAZITION_RATE=0.0001
TRAINING_STEPS=5000
MOVING_AVERAGE_DECAY=0.99
#定义辅助函数来计算前向传播结果,使用ReLU作为激活函数
def inference(input_tensor,avg_class,weights1,biases1,weights2,biases2):
if avg_class==None:
layer1=tf.nn.relu(tf.matmul(input_tensor,weights1)+biases1)
return tf.matmul(layer1,weights2)+biases2
else:
# 使用滑动平均类
layer1 = tf.nn.relu(tf.matmul(input_tensor, avg_class.average(weights1)) + avg_class.average(biases1))
return tf.matmul(layer1, avg_class.average(weights2)) + avg_class.average(biases2)
#定义训练过程
def train(mnist):
x=tf.placeholder(tf.float32,[None,INPUT_NODE],name='x_input')
y_=tf.placeholder(tf.float32,[Node,OUTPUT_NODE],name='y_input')
# 生成隐藏层的参数。
weights1 = tf.Variable(tf.truncated_normal([INPUT_NODE, LAYER1_NODE], stddev=0.1))
biases1 = tf.Variable(tf.constant(0.1, shape=[LAYER1_NODE]))
# 生成输出层的参数。
weights2 = tf.Variable(tf.truncated_normal([LAYER1_NODE, OUTPUT_NODE], stddev=0.1))
biases2 = tf.Variable(tf.constant(0.1, shape=[OUTPUT_NODE]))
# 计算不含滑动平均类的前向传播结果
y = inference(x, None, weights1, biases1, weights2, biases2)
# 定义训练轮数及相关的滑动平均类
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())
average_y = inference(x, variable_averages, weights1, biases1, weights2, biases2)
# 计算交叉熵及其平均值
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)
# 损失函数的计算
regularizer = tf.contrib.layers.l2_regularizer(REGULARAZTION_RATE)
regularaztion = regularizer(weights1) + regularizer(weights2)
loss = cross_entropy_mean + regularaztion
# 设置指数衰减的学习率。
learning_rate = tf.train.exponential_decay(
LEARNING_RATE_BASE,
global_step,
mnist.train.num_examples / BATCH_SIZE,
LEARNING_RATE_DECAY,
staircase=True)
# 优化损失函数
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step=global_step)
# 反向传播更新参数和更新每一个参数的滑动平均值
with tf.control_dependencies([train_step, variables_averages_op]):
train_op = tf.no_op(name='train')
# 计算正确率
correct_prediction = tf.equal(tf.argmax(average_y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
# 初始化会话,并开始训练过程。
with tf.Session() as sess:
tf.global_variables_initializer().run()
validate_feed = {x: mnist.validation.images, y_: mnist.validation.labels}
test_feed = {x: mnist.test.images, y_: mnist.test.labels}
# 循环的训练神经网络。
for i in range(TRAINING_STEPS):
if i % 1000 == 0:
validate_acc = sess.run(accuracy, feed_dict=validate_feed)
print("After %d training step(s), validation accuracy using average model is %g " % (i, validate_acc))
xs,ys=mnist.train.next_batch(BATCH_SIZE)
sess.run(train_op,feed_dict={x:xs,y_:ys})
test_acc=sess.run(accuracy,feed_dict=test_feed)
print(("After %d training step(s), test accuracy using average model is %g" %(TRAINING_STEPS, test_acc)))
#主程序入口
def main(argv=None):
mnist = input_data.read_data_sets("../../../datasets/MNIST_data", one_hot=True)
train(mnist)
if __name__=='__main__':
main()
不同模型的比较总结
神经网络结构中没有隐藏层或激活函数对正确率影响非常大
基础学习率:学习率是参数更新的幅度
学习率的衰减率:逐步减小学习率,使得模型在训练后期更加稳定
staircase 设置为false 时 连续衰减, true阶梯衰减
REGULARIZATION_RATE描述模型复杂度的正则化(解决过拟合)项在损失函数中的系数
MOVING_AVERAGE_DECAY滑动平均衰减
激动函数可以用于去线性化
交叉熵描述的是真实的数据
softmax是预测
变量管理
variable_scope("foo",reuse=True)
#foo 是命名空间 reuse设置为true这样tf.getvariable函数将直接获取已经声名的变量
#若设置为false tf.get_variable函数则直接创建变量,重名则报错
with tf.variable_scope("foo"):
v=tf.get_variable("v",[1],initializer=tf.comstant_initializer(1,0))
#表示名字在foo的命名空间创建名字为V 的变量,若命名空间不一样责拿不到另一个命名空间的变量
tf.variable_scope函数是可以嵌套的,新建一个嵌套的上下管理器但不指定reuse,这时reuse与外面一层保持一致
TF模型持久化
让训练结果可以复用,需要将训练得到的神经网络模型持久化
tf.train.Saver() #声明
.ckpt文件保存模型训练结果
checkpoint文件保存了一个目录下所有的模型文件列表
saver.restore(sess,"/path") #加载已经保存的模型,并通过已经保存的模型中的变量的值来计算加法
saver=tf.train.import_meta_graph()#直接加载持久化的图
export_meta_graph函数支持以json文件格式导出,
最佳实践样例程序
第一定义前向传播过程以及神经网络中的参数mnist_inference.py
第二定义神经网络训练过程mnist_train.py
第三测试过程mnist_eval.py
该样例主要总结实践了前面几章的方法,从而了解了模型建立,损失函数,过拟合的正则化,前向传播,等等方面。给出的训练集是经过处理后的,测试出的是正确率。完善的地方我认为是需要将图片转化为二进制的代码或者其他形式,然后在input进去,得到的正确率改为真实结果就可以,现在训练的模型还有参数已经得到需要查的就是图片存储格式的转化,以及怎样输入制定的数据到训练好的模型,最后是怎样输出识别结果。