用tensorflow10分钟搭建你的第一个神经网络

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CSDN_fzs/article/details/82670370

一、概念

1.1神经网络:人工神经网络(Artificial Neural Network,即ANN )简称神经网络,是一种运算模型,由大量的节点(或称神经元)之间相互联接构成。每个节点代表一种特定的输出函数,称为激励函数(activation function)。每两个节点间的连接都代表一个对于通过该连接信号的加权值,称之为权重,这相当于人工神经网络的记忆。网络的输出则依网络的连接方式,权重值和激励函数的不同而不同。而网络自身通常都是对自然界某种算法或者函数的逼近,也可能是对一种逻辑策略的表达。

1.2前向传播:搭建模型,根据一组输入给定相应的输出,使模型具有推理的能力。

举例:生产一批零件将提交x1和重量x2作为特征输入神经网络,在隐藏层中经过加权w计算,得到输出结果y.

1.3反向传播:训练模型参数,在所有参数上使用梯度下降,使神经网络在训练数据上的损失函数最小。

1.4损失函数(loss):预测值(y)与已知答案(y_)标签的差距。

1.5学习率:决定参数每次更新的幅度

二、步骤

2.1.准备数据集,提取特征,作为输入喂给神经网络(Neural Network,NN)
2.2.搭建NN结构,从输入到输出,(先搭建计算图,在用会话执行)    NN前向传播算法 -----> 计算输出
2.3.大量特征数据喂给NN,迭代优化NN参数        NN反向传播算法 -----> 优化参数训练模型
2.4.使用训练好的模型预测和训练

三、代码实现

#完整神经网络
import tensorflow as tf  #导入tensorflow模块
import numpy as np       #导入numpy模块
BATCH_SIZE = 8 #表示一次喂入神经网络多少组数据
seed = 23455  #每次都输出一样的随机数

#基于seed产生随机数
rng = np.random.RandomState(seed)
#随机数返回32行2列的矩阵,表示32组 数据作为输入
X = rng.rand(32,2)
#从X这个32行2列的矩阵中取出一行 判断如果小于1 给Y赋值1,如果不小于1 给Y赋值0
#作为数据数据集的标签(正确答案),数据标注
Y = [[int(x0 + x1 < 1)] for (x0,x1) in X]
print('X:\n',X)
print('Y:\n',Y)

#1.定义神经网络的输入、参数和输出,这里输入两个特征x,输出一个标签y_
x = tf.placeholder(tf.float32,shape=(None,2))    #利用占位符placeholder,输入float32的 一行两列的张量表示 输入n组特征
y_ = tf.placeholder(tf.float32,shape=(None,1))    #利用占位符placeholder,输入float32的 一行两列的张量表示 输入n组标签

w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))    #第一层网络,两行三列的正态分布随机数组成的矩阵,标准差为1,随机种子为1
w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))    #第一层网络,三行一列的正态分布随机数组成的矩阵,标准差为1,随机种子为1

#2.定义前向传播过程
a = tf.matmul(x,w1)       #x经过第一层网络,矩阵加权乘法
y = tf.matmul(a,w2)       #经过第二层网络,矩阵加权乘法,也就是最后一层的输出结果

#3.定义损失函数及反向出传播方法
loss = tf.reduce_mean(tf.square(y-y_))
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss)  #梯度下降优化器  

#4.生成会话,训练STEPS轮
sess = tf.Session()
init_op = tf.global_variables_initializer()
sess.run(init_op)
#输出目前未经训练的参数取值
#print('w1:',sess.run(w1))
#print('w2:',sess.run(w2))

#训练模型
STEPS = 5000   #训练5000轮
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]})       #从初始数据集和标签中取出对应的数据,喂入神经网路
    if i % 500 == 0:            #每500轮打印一次loss值
        total_loss = sess.run(loss,feed_dict={x:X,y_:Y})
        print('经过%d轮训练,loss所有取值为:%g'%(i,total_loss))

#输出训练后的参数取值
print('输出训练后的参数取值:')
print('w1:\n',sess.run(w1))
print('w2:\n',sess.run(w2))

输出:

经过0轮训练,loss所有取值为:5.13118
经过500轮训练,loss所有取值为:0.429111
经过1000轮训练,loss所有取值为:0.409789
经过1500轮训练,loss所有取值为:0.399923
经过2000轮训练,loss所有取值为:0.394146
经过2500轮训练,loss所有取值为:0.390597
经过3000轮训练,loss所有取值为:0.388336
经过3500轮训练,loss所有取值为:0.386855
经过4000轮训练,loss所有取值为:0.385863
经过4500轮训练,loss所有取值为:0.385187

输出训练后的参数取值:
w1:
 [[-0.69597054  0.85992473  0.09337731]
 [-2.3418374  -0.12466972  0.5866561 ]]
w2:
 [[-0.07531643]
 [ 0.8627887 ]
 [-0.05937824]]

本次神经网络一共训练5000轮,每一次训练都进行优化,最后输出训练后的参数w1和w2的值。

四、总结

神经网络的实现过程(八股):准备、前传、反传、迭代

准备:
        import 相关模块
        定义常量
        
        生成数据集

前向传播
        定义输入
        x = 
        y_ =
        
        定义(网络层)参数:
        w1 = 
        w2 = 
        
        定义网络推理计算过程
        a = 
        y = 
        
反向传播
        定义损失函数
        loss = 
        
        反向传播方法
        train_step = 

生成会话,训练STEPS轮,迭代
        sess = tf.Session()
        init_op = tf.global_variables_initializer()
        sess.run(init_op)
       

        #训练模型
        STEPS = 5000   #训练5000轮
        for i in range(STEPS):
            start = 
            end = 
            sess.run(train_step,feed_dict)

猜你喜欢

转载自blog.csdn.net/CSDN_fzs/article/details/82670370