神经网络网课学习笔记(1)

神经网络网课学习笔记1

TensorFlow基本用法

参数(weight)

例: w=tf.Variable(tf.random_normal([2,3],stddev=2,mean=0,seed=1)

  • tf.random_normal() 正态分布
  • [2,3] 产生2*3的矩阵
  • stddev = 2 标准差为2
  • mean = 0 均值为0
  • seed = 1 随机种子,如果设为0,则每次的随机数不同

tf.truncated_normal() 去掉偏差过大的点,偏离平均值超过两个标准差的点将会重新生成
tf.random_uniform() 平均分布
tf.ones() 全1数组
tf.zeros)) 全0数组 tf.fill() 全定值数组,如tf.fill([2,3],6),生成一个2*3的全为6的数组
tf.constant() 直接给值 tf.constant([1,2,3]),生成[1,2,3]


神经网络的基本实现过程

  1. 准备数据集,提取特征做为输入,传给神经网络
  2. 搭建NN结构,从输入到输出(前向传播->计算输出,搭建计算图,然后用sess执行)
  3. 大量特征数据喂给NN,迭代优化NN参数(后向传播->优化参数训练模型)
  4. 使用训练好的模型预测和分类(有时会使用已经搭好的网络,喂入新的数据,再对其参数进行一个优化)
    两个过程:训练过程和使用过程

前向传播(全连接神经网络)

搭建模型->实现推理

假设x为输入,是一个1*2的矩阵(两个特征) 一般指几层指的是计算层,输入层不是计算层。

变量(Variable)的初始化
在sess里面键入tf.global_variables_initializer()
用tf.placeholder()进行占位,暂时不给值,在sess里面用feed_dict=(x:...)
可以一次喂入多个数据,shape的第一维写none即可

x=tf.placeholder(tf.float32,shape=f(None,2))

init_op=tf.global_variables_initializer()
sess.run(init_op)

反向传播

目的:训练模型参数,在所有参数上用梯度下降,使NN模型在训练数据上的损失函数最小

损失函数(loss)= 预测值(y)与已知答案(y_(预先提供的标签))的差距

均方误差MSE image 用TensorFlow的函数可以表示为:

loss=tf.reduce_mean(tf.square(y_-y) 

反向传播训练方法:以减小loss值为优化目标

优化器: image 使用时选择其中之一即可
其中可以看到,他们都有一个参数,learning_rate学习率

学习率决定每次参数更新的幅度,一开始可以先填一个很小的值上去,如0.001

回退到上面神经网络的基本实现过程
特征->标签,训练集中不只要提取出的特征,还要其所对应的标签
先前向传播,计算出y;再反向传播,计算loss值


神经网络训练的标准是基于数据和概率的,并不知道人为标记的方法
Examples:

#coding:utf - 8
import tensorflow as tf
import numpy as np  #python的科学计数模块

BATCH_SIZE=5 #表示一次喂入多少组数据,每次不可过大 seed=23455 #基于seed产生随机数 rng=np.random.RandomState(seed) X=rng.rand(32,2)#随机数返回32*2的矩阵,表示32体积、重量 做为输入数据集 Y=[[int(x0+x1<1)] for (x0,x1) in X]#生成训练集对应的标签,此处人为给出是否合格的标准(虚拟的样本和标签) print("X:\n",X)#构建出数据集x print("Y:\n",Y)#构建出数据集对应的标签y #定义神经网络的输入、输出和参数 x=tf.placeholder(tf.float32,shape=(None,2)) #输入的特征,不知道多少组,但是知道有两个特征(第一维表示多少组,第二维表示特征个数) y_=tf.placeholder(tf.float32,shape=(None,1)) #标准答案(合格或不合格) #使用正态分布生成随机数 w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1)) #输入是两个特征,隐藏层用三个神经元,对应x w2=tf.Variable(tf.random_normal([3,2],stddev=1,seed=1)) #输出是一个数,对应y #前向传播,用矩阵乘法实现 a=tf.matmul(x,w1) y=tf.matmul(a,w2) #反向传播 learning_rate=0.001 loss=tf.reduce_mean(tf.square(y-y_)) train_step=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)#梯度下降 #生成会话,训练steps轮 with tf.Session() as sess: init_op=tf.global_variables_initializer() sess.run(init_op) #输出训练之前: print("w1:\n",sess.run(w1)) print("w2:\n",sess.run(w2)) steps=3000 for i in range(steps): start=(i*BATCH_SIZE)%32 end=start+BATCH_SIZE sess.run(train_step,feed_dict={x:X[start:end],y_:Y[start:end]})#每轮从X和Y中抽取Start-End个特征和标签 if i%500 == 0:#每500轮打印一次losstotal_loss=sess.run(loss,feed_dict={x: X,y_:Y}) print("After training %d steps,loss on all data is %g" %(i,total_loss)) print("\nw1:",sess.run(w1)) print("\nw2:",sess.run(w2)) 

运行结果:

X: [[0.83494319 0.11482951]
[0.66899751 0.46594987]
[0.60181666 0.58838408]
[0.31836656 0.20502072]
[0.87043944 0.02679395]
[0.41539811 0.43938369]
[0.68635684 0.24833404]
[0.97315228 0.68541849]
[0.03081617 0.89479913]
[0.24665715 0.28584862]
[0.31375667 0.47718349]
[0.56689254 0.77079148]
[0.7321604 0.35828963]
[0.15724842 0.94294584]
[0.34933722 0.84634483]
[0.50304053 0.81299619]
[0.23869886 0.9895604 ]
[0.4636501 0.32531094]
[0.36510487 0.97365522]
[0.73350238 0.83833013]
[0.61810158 0.12580353]
[0.59274817 0.18779828]
[0.87150299 0.34679501]
[0.25883219 0.50002932]
[0.75690948 0.83429824]
[0.29316649 0.05646578]
[0.10409134 0.88235166]
[0.06727785 0.57784761]
[0.38492705 0.48384792]
[0.69234428 0.19687348]
[0.42783492 0.73416985]
[0.09696069 0.04883936]]
Y: [[1], [0], [0], [1], [1], [1], [1], [0], [1], [1], [1], [0], [0], [0], [0], [0], [0], [1], [0], [0], [1], [1], [0], [1], [0], [1], [1], [1], [1], [1], [0], [1]]
w1: [[-0.8113182 1.4845988 0.06532937]
[-2.4427042 0.0992484 0.5912243 ]]
w2:
[[-0.8113182 1.4845988 ]
[ 0.06532937 -2.4427042 ]
[ 0.0992484 0.5912243 ]]
After training 0 steps,loss on all data is 12.0156
After training 500 steps,loss on all data is 0.696271
After training 1000 steps,loss on all data is 0.53858
After training 1500 steps,loss on all data is 0.483959
After training 2000 steps,loss on all data is 0.454848
After training 2500 steps,loss on all data is 0.438255
w1: [[-0.30248263 0.06204198 0.6001488 ] [-2.0333931 -0.48535204 0.7457628 ]] w2: [[-0.30288324 0.6126571 ] [ 0.13707067 -1.9931065 ] [-0.01895767 0.9599734 ]]
[Finished in 3.0s]

后续可以更改batch_size和优化器,试一试哪个效果更好

Summary:

神经网络搭建:准备、前传、反传、迭代

  1. 准备:import模块、定义常量、更改优化生成数据集
  2. 前向传播:定义输入、参数、输出
  • 输入:x= y_=
  • 参数:w1= w2=
  • 输出:a= y=

3.反向传播:定义损失函数、反向传播方法

  • loss=
  • train_step=

4.输出:训练steps轮

for i in range():
    start=
    end=
    sess.run(train_step,feed_dict)
常用输出,每隔一定轮数输出一次loss

猜你喜欢

转载自www.cnblogs.com/TheSilverMoon/p/10962357.html
今日推荐