用tensorflow搭建神经网络

``这是19年的学习笔记,使用的是基于cpu的tensorflow。

  1. 神经元模型

    神经网络中最基本的成分是神经元 (neuron)模型。在生物神经网络中,每个神经元与其他神经元相连,当它"兴奋"时,就会向相连的神经元发送化学物质,从而改变这些神经元内的电位。如果某神经元的电位超过了一个"阔值"(threshold) , 那么它就会被激活,即"兴奋 "起来,向其他神经元发送化学物质。

    现在常用的是:M-P神经元模型。在这个模型中,神经元接收到来自n个其他神经元传递过来的输入信号。这些输入信号通过带权重的连接( connection)进行传递,神经元接收到的总输入值将与神经元的阀值进行比较,然后通过"激活函数" (activation function) 处理以产生神经元的输出。

    用tensorflow搭建神经网络_第1张图片

2.激活函数

理想中的激活函数是图 (a)所示的阶跃函数,它将输入值映射为输出值0或1。显然,"1"对应于神经元兴奋,"0"对应于神经元抑制。然而,阶跃函数具有不连续、不光滑等不太好的性质,因此实际常用Sigmoid函数作为激活函数。典型的 Sigmoid 函数如图 (b) 所示,它把可能在较大范围内变化的输入值挤压到 (0,1) 输出值范围内,因此有时也称为 “挤压函数” (squashing function)。
用tensorflow搭建神经网络_第2张图片
3.多层神经网络

常见的神经网络多层级结构,每层神经元与下层神经元全互连。神经元之间不存在同层连接,也不存在跨层连接. 这样的神经网络结构通常称为"多层前馈神经网络",其中输入层神经元接收外界输入,隐层与输出层神经元对信号进行加工,最终结果由输出层神经元输出。

即:输入层神经元仅是接受输入,不进行函数处理,隐居与输出层包含功能神经元.

因此,只需包含隐层,即可称为多层网络。神经网络的学习过程,就是根据训练数据来调整神经元之间的"连接权"以及每个功能神经元的阈值。换言之,神经网络"学"到的东西,蕴涵在连接权与阈值中。
用tensorflow搭建神经网络_第3张图片
4.创建一个神经网络层
一个神经网络层需要有数据输入、数据输出、激活函数。
代码:用tensorflow搭建神经网络_第4张图片
参数如下,
input:输入个数
in_size: 当前层的输入的个数
out_size:当前层的输出的个数(即当前层神经元的个数)
activation_function:激活函数(输入层无激活函数,仅起到传递信号的作用,卷积层、池化层等含有激活函数。)

内部运算如下:
权值初始化(Weight):大小为 in_size * out_size;
偏置初始化(biases):大小为out_size(即本层神经元的个数)
卷积和运算:W_mul_x_plus_b=tf.matmul(input,Weight) + biases
输出为(output):activation_function(W_mul_x_plus_b),若无激活函数则为 output=W_mul_x_plus_b。

  1. 运用神经网络层搭建完整神经网络
    一个完整的神经网络,需要有输入层(输入数据)、隐藏层(功能层)、输出层(输出结果)、损失函数、参数求取(梯度下降法)等。

定义训练过程并进行训练:
用tensorflow搭建神经网络_第5张图片
6.完整程序

用tensorflow搭建神经网络_第6张图片
用tensorflow搭建神经网络_第7张图片
用tensorflow搭建神经网络_第8张图片
随着训练次数的增加,loss越来越小。
代码如下:`

#encoding:utf-8
#add_layer_1.py 练习增加网络层
 
#创建神经网络并训练
#功能:拟合 y=x*x+1
 
import tensorflow as tf
import numpy as np
 
#创建一个神经网络层
def add_layer(input,in_size,out_size,activation_function=None):
    """
    :param input: 数据输入
    :param in_size: 输入大小
    :param out_size: 输出大小
    :param activation_function: 激活函数(默认没有)
    :return:output:数据输出
    """
    Weight=tf.Variable(tf.random_normal([in_size,out_size]) )
    biases=tf.Variable(tf.zeros([1,out_size]) +0.1 )
    W_mul_x_plus_b=tf.matmul(input,Weight) + biases
    #根据是否有激活函数
    if activation_function == None:
        output=W_mul_x_plus_b
    else:
        output=activation_function(W_mul_x_plus_b)
    return output
 
#创建一个具有输入层,隐藏层,输出层的三层神经网络,神经元个数分别为1,10,1
x_data=np.linspace(-1,1,300)[:,np.newaxis]   # 创建输入数据  np.newaxis分别是在列(第二维)上增加维度,原先是(300,)变为(300,1)
noise=np.random.normal(0,0.05,x_data.shape)
y_data=np.square(x_data)+1+noise    # 创建输入数据对应的输出
 
# print(x_data.shape)
# x=np.linspace(-1,1,300)
# print(x.shape)
 
#定义输入数据
xs=tf.placeholder(tf.float32,[None,1])
ys=tf.placeholder(tf.float32,[None,1])
 
#定义一个隐藏层
hidden_layer1=add_layer(xs,1,10,activation_function=tf.nn.relu)
#定义一个输出层
prediction=add_layer(hidden_layer1,10,1,activation_function=None)
 
#求解神经网络参数
#1.定义损失函数
loss=tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction) ,reduction_indices=[1] ))
#2.定义训练过程
train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss)
 
init=tf.global_variables_initializer()
sess=tf.Session()
sess.run(init)
#3.进行训练
for i in range(1000):
    sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
    if i%100==0:
        print(sess.run(loss,feed_dict={xs:x_data,ys:y_data} )  )
 
#关闭sess
sess.close()

`

你可能感兴趣的:(神经网络,深度学习,tensorflow,人工智能,python)