昨天是学习的第三天。晚上竟然忘记了总结emmm。一大早起来发一下,昨天学的东西很少,然后接下来要学习卷积神经网络了,也不想太着急,先把学到的这些应用一下,昨天把mnist的手写识别自己写了一下,准确率在95以上,又写了一个模拟高次函数的。几天继续加油用tensorflow写一些别的数据集,加入数据预处理
下面是昨天的笔记(很少,时间都用来实战了)
1.在一个神经网络中需要设置的参数有:
学习率:learning rate
学习衰减率:用指数衰减法生成lr时需要用到
隐藏层的节点数:这个是w1的shape的y, x是输入数据的shapq.y
迭代轮数:程序运行的次数,也就是优化器工作的次数
input_node:输入节点的大小一般为 shape(None,input_node),None表示多少个样本未知,input_node表示输入样本维度大小
output_node:输出节点的大小一般为 shape(None,output_node)None表示多少个样本未知,和输入的个数应该一样,output_node表示输出样本维度大小
2.变量管理
通过一个inference函数将神经网络中所有的参数都容纳了进去,最后返回的前向传播的结果,但是
如果变量变得更多了就不方便了。
为了实现方便 可以通过tf.get_variable 和tf.variable_scope实现
3.模型的持久化
保存模型用到tf.train.Saver
saver = tf.train.Saver()
wiht tf.Session() as sess:
sess.run(train)
#将模型保存到某一文件路径下
saver.save(sess,"路径.ckpt")
模型的后缀名是ckpt
会生成三个文件model.ckpt.meta 保存了计算图的结构
model.ckpt 保存了程序中每一个变量的取值
checkpoint文件,保存了一个目录下所有模型的文件列表
加载一个模型 saver.restore()
4.神经网络的重构
如果代码太冗长,一部分出错会严重影响下面程序的运行。所以将整个神经网络模块化,分成多个部分。
可以分成3部分,infernece.py用来计算前向传播的数值
train.py 用来作为训练过程
eval.py用来做测试过程
附上昨天手写数字识别的代码,算是大体了解了一下具体步骤(没有加入滑动平均,这个还是不熟悉,以后抽空看看)
# coding: utf-8
# In[1]:
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
# In[13]:
#大致流程
#定义各个层之间的维度
INPUT_NODE = 784
LAYER_NODE = 100
OUTPUT_NODE = 10
#学习率
# LR = 0.03
#正则项的系数
LAMBDA = 0.0001
#训练次数
#定义每次迭代输入的样本个数
batch_size = 100
#传入神经网络的权重以及偏置项
def inference(x,w1,b1,w2,b2):
# a = tf.matmul(x,w1)+b1
a = tf.nn.relu(tf.matmul(x,w1)+b1)
# y = tf.matmul(a,w2)+b2
#通过使用relu函数作为输出函数可以实现非线性
y = tf.nn.relu(tf.matmul(a,w2)+b2)
return y
#将数据集传入
def train(mnist):
#定义两个变量来存储数据集的输入以及输出
x = tf.placeholder(tf.float32,[None,INPUT_NODE],name="x_input")
y_ = tf.placeholder(tf.float32,[None,OUTPUT_NODE],name="y_input")
#开始生成隐藏层的参数
#通过truncated_normal生成一个正态分布的张量
w1 = tf.Variable(tf.truncated_normal([INPUT_NODE,LAYER_NODE],stddev=0.1))
b1 = tf.Variable(tf.constant(0.1,shape=[LAYER_NODE]))
w2 = tf.Variable(tf.truncated_normal([LAYER_NODE,OUTPUT_NODE],stddev=0.1))
b2 = tf.Variable(tf.constant(0.1,shape=[OUTPUT_NODE]))
y = inference(x,w1,b1,w2,b2)
#计算Loss函数
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=tf.argmax(y_,1),logits=y)
cross_entropy_mean = tf.reduce_mean(cross_entropy)
#定义正则项
regularizer = tf.contrib.layers.l2_regularizer(LAMBDA)
regularizion = regularizer(w1)+regularizer(w2)
#通过指数衰减生成学习率
global_step = tf.Variable(0)
LR = tf.train.exponential_decay(0.1,global_step,100,0.96,staircase=True)
#定义Loss函数在这里loss为交叉熵的损失加上正则的损失
loss = cross_entropy_mean + regularizion
#开始训练
train_step = tf.train.GradientDescentOptimizer(LR).minimize(loss,global_step=global_step)
correct_pr = tf.equal(tf.argmax(y,1),tf.argmax(y_,1))
acc = tf.reduce_mean(tf.cast(correct_pr,tf.float32))
#开始迭代
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(25):
for batch in range(mnist.train.num_examples//batch_size):
xs,ys = mnist.train.next_batch(batch_size)
sess.run(train_step,feed_dict={x:xs,y_:ys})
accu = sess.run(acc,feed_dict={x:mnist.test.images,y_:mnist.test.labels})
print("第{0}轮,准确率为{1}".format(i,accu))
def main(argv =None):
mnist = input_data.read_data_sets("MNIST_data",one_hot=True)
train(mnist)
if __name__=="__main__":
tf.app.run()
总结:今天继续实战~~~~~~~