今儿上午讲座下午和我宝畅聊哈哈哈 所以以下是晚上吃完饭的学习成果~
TensorFlow完整测试
还是开头进行固定参数的设置,输入输出结点和隐藏层结点,和之前的一样,然后通过tf.get_variable()来获取变量,在测试时会通过保存的模型加载这些变量的取值。所以这里学习一下tf.get_variable的用法:
get_variable(
name,
shape=None,
dtype=None,
initializer=None,
regularizer=None,
trainable=True,
collections=None,
caching_device=None,
partitioner=None,
validate_shape=True,
use_resource=None,
custom_getter=None,
constraint=None
)
主要的参数就是name、shape以及initializer,名字的话就是我们给变量的名称,shape是变量的形状,initializer则是变量的初始化
当给出了正则化生成函数时,将当前变量的正则化损失加入名字为losses的集合,这里使用add_to_collection函数将一个张量加入到一个集合中。
if regularizer != None: tf.add_to_collection('losses', regularizer(weights))
return weights
下面在inference函数中定义前向传播过程,第一层神经网络的变量声明如下:
with tf.variable_scope('layer1'):
weights = get_weight_variable([INPUT_NODE, LAYER1_NODE], regularizer)
biases = tf.get_variable("biases", [LAYER1_NODE],
initializer=tf.constant_initializer(0.0))
layer1 = tf.nn.relu(tf.matmul(input_tensor, weights) + biases)
第二层神经网络变量声明如下:
with tf.variable_scope('layer2'):
weights = get_weight_variable([LAYER1_NODE, OUTPUT_NODE], regularizer)
biases = tf.get_variable("biases", [OUTPUT_NODE],
initializer=tf.constant_initializer(0.0))
layer2 = tf.matmul(layer1, weights) + biases
这两层神经网络定义,主要参数weights和biases以及初始化layer,都是固定用法,没啥原理性的,主要是便于理解前向传播算法的整个过程!以上代码是神经网络前向传播算法的源代码,在使用是直接调用inference.py就可以使用前向传播函数。
————————————————————————————————————————————————————————
下面是train程序
程序开头就是配置神经网络的各种参数,并设置训练好模型保存的路径和文件名
定义输入输出:
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')
这里有个陌生的地方就是placeholder,这个函数主要是设置占位符的,tensorflow如果要从外部传入data,就必须使用这个函数来定义输入值的格式方便后续训练
训练过程的前向传播就简单了,直接调用inference.py
后续继续定义损失函数(交叉熵)、学习率、滑动平均操作
variable_averages = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step)
variables_averages_op = variable_averages.apply(tf.trainable_variables())
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)
loss = cross_entropy_mean + tf.add_n(tf.get_collection('losses'))
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')
然后初始tensorflow持久化类,那么什么是持久化类呢?
tensorflow将模型保持到本地会生成4个文件:
meta文件:保存了网络的图结构,包含变量、op、集合等信息
ckpt文件: 二进制文件,保存了网络中所有权重、偏置等变量数值,分为两个文件,一个是.data-00000-of-00001 文件,一个是 .index 文件
checkpoint文件:文本文件,记录了最新保持的5个模型文件列表
使用了持久化操作,就可以在下一次使用时直接读取文件而不需要重新训练,这个操作大大缩短了训练总时间,也就是可以一个模型走到底,很舒服
————————————————————————————————————————————————————————
下面是eval程序:
在train函数中 每迭代1000轮就可以保存一个当前训练精度的模型,在验证的时候可以直接调用每1000轮迭代的模型
下面在测试集上进行测试,每10s加载一次最新的模型
首先还是要定义输入输出的格式,上面说过,然后每10s调用一次模型来检测训练过程中准确率的变化
while True:
with tf.Session() as sess:
ckpt = tf.train.get_checkpoint_state(mnist_train.MODEL_SAVE_PATH)
if ckpt and ckpt.model_checkpoint_path:
saver.restore(sess, ckpt.model_checkpoint_path)
global_step = ckpt.model_checkpoint_path.split('/')[-1].split('-')[-1]
accuracy_score = sess.run(accuracy, feed_dict=validate_feed)
print("After %s training step(s), validation accuracy = %g" % (global_step, accuracy_score))
else:
print('No checkpoint file found')
return
time.sleep(EVAL_INTERVAL_SECS)
测试过程中,路径问题是个很容易被忽略的问题,如果不加修改,测试返回还是到了模型路径,所以需要重新定义,电脑CPU跑tensorflow是真滴慢,一直在等结果,出问题了再改,改完再错。。。不过总算缕清楚了神经网络的整个运作过程以及内部黑箱的执行原理,感觉对以后使用VGG resnet等网络会有一个更深的理解,只能说迭代修正大法真的像回溯一样牛批。。。
但是这只是经典神经网络的过程,随着技术的进步,卷积神经网络的优势大大明显滴,所以。。。。
明儿把CNN撸完~~~!!