说明:其中代码主要来源莫烦Python,大家可以去看看,但是因为版本问题(我是python3.6)现在有些函数的调用方法有细微改变,所以我下面的代码做了一些修改,目前其可以在win10上面运行。
本文主要目的是简单快速介绍神经网络,然后通过代码运行的结果直观的让大家对神经网络有一个大概的宏观认识,从而有助于大家开展后续深入的研究,总之一句话就是小白入门。
神经网络最基本的模型如下:
输入层、隐藏层、输出层。其实可以简单地这样的理解:输入层就是我们要在这里输入我们即将处理的数据,同理输出层就是输出结果即数据被处理的结果从这里输出,顾名思义隐藏层里面就是包括怎么处理数据。
它的原理就是假设根据一次输入我们看输出,根据结果的对错,返回去改变隐藏层的一些权重和偏置,使错误率减低,然后下一次又有输入,再根据这次输出结果进行逆向修改相关的参数,通过这样反复学习,错误率不断下降,不断逼近精确值。
哈哈,说起来容易,那么到底具体怎么做呢?这里我们做最简单直观的类子,比如第i次的真实输出值为yi,预测值为yi_prediction那么误差就是yi-yi_prediction,为了避免负数的影响我们一般将其平方定义为loss,那么我们的目标相当明确了,就是尽可能的使loss最小对吧,那么好我们每次就以此为优化目标,那么具体优化什么呢?我们比如预测一条直线即y=Wx+b
x为输入,y为输出,那么loss函数就有W和b对吧,那么一个二元函数怎么求最小值呢?偏导呗!!就是所谓的梯度,当然这里有很多方法SGD,Momentum,adagrad等等,他们目的就是一个:尽快的优化,尽快的找到最优解。其中的原理必须涉及到具体的数学工具来量化说明,大家可以参考各种优化方法总结比较
关于神经网络的优化方法有很多,等大家入门后可以深入研究,现在只需要知道它们大部分的目的就是求“快”就可以了
下面就通过代码来感受一下吧
学习这一块要用到tensorflow,大家要下载才可以用,注意运行之前大家要在根目录下建一个logs的目录用来保存运行过程参数变化的过程数值,以便后续我们通过浏览器来观察,代码每一步都有详细的注释请大家自行阅读,或去看莫烦Python
代码如下:
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
#定义神经层
def add_layer(inputs,in_size,out_size,n_layer,activation_function=None):
layer_name='layer%s'%n_layer
with tf.name_scope('ayer_name'): #可视化
with tf.name_scope('weignts'):
Weignts=tf.Variable(tf.random_normal([in_size,out_size]),name='W') #权重
tf.summary.histogram(layer_name+'/weights',Weignts) #为了通过浏览器观察每一神经层的权重
with tf.name_scope('weignts'): #可视化
biases=tf.Variable(tf.zeros([1,out_size])+0.1,name='b') #偏移量
tf.summary.histogram(layer_name+'/biases',biases)
with tf.name_scope('Input_mut_W_Plus_bia'): #可视化
Input_mut_W_Plus_bia=tf.matmul(inputs,Weignts)+biases
tf.summary.histogram(layer_name+'/Input_mut_W_Plus_bias',Input_mut_W_Plus_bia) #为了通过浏览器观察每一神经层的权重
if activation_function is None:
outputs=Input_mut_W_Plus_bia
else:
outputs=activation_function(Input_mut_W_Plus_bia) #激励函数
tf.summary.histogram(layer_name+'/outputs',outputs) #为了通过浏览器观察每一神经层的输出值
return outputs
#产生数据
x_data = np.linspace(-1,1,300)[: ,np.newaxis]
noise=np.random.normal(0,0.05,x_data.shape)
y_data =np.square(x_data)-0.5+noise
#None就是代表不管多少例子都可以,1可以理解为样本中只有一个特征
with tf.name_scope('inputs'): #可视化
xs=tf.placeholder(tf.float32,[None,1],name='x_input')
ys=tf.placeholder(tf.float32,[None,1],name='y_input')
#添加神经层
layer1=add_layer(xs ,1,10,1,activation_function=tf.nn.relu)
#添加神经层
prediction=add_layer(layer1,10,1,2,activation_function=None)
with tf.name_scope('loss'): #可视化
loss=tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction),reduction_indices=[1]),name='myloss') #代价函数
tf.summary.scalar('loss',loss) #为了通过浏览器观察每一神经层的误差(代价函数)
with tf.name_scope('train_ste'):
train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss) #优化函数
init=tf.global_variables_initializer() #初始化所有变量
sess=tf.Session()
merged=tf.summary.merge_all() #将所有需要在浏览器中展现的参数合并在一起
writer=tf.summary.FileWriter("logs/",sess.graph) #将需要可视化的东西写到logs文件下
sess.run(init)
#绘图
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
ax.scatter(x_data ,y_data)
plt.ion()
plt.show()
#训练多次
for i in range(1000):
sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
if i%50==0:
try:
ax.lines.remove(lines[0])
except Exception:
pass
result=sess.run(merged,feed_dict={xs:x_data,ys:y_data})
#将需要统计的结果加到writer
writer.add_summary(result,i)
prediction_value=sess.run(prediction,feed_dict={xs:x_data,ys:y_data})
lines=ax.plot(x_data,prediction_value,'r-',lw=5)
plt.pause(0.3)
运行结果:(运行的时候其是动态的,会直观地看到红色线的学习过程,它是逐渐拟合样本点,我这里放的是最后的结果)
稍后就会出现一个URL,具体到我的就是上图红色的部分,复制用浏览器打开就可以在GRAPHS中看到我们神经网络图:
双击还可以看进一步细节类如我这里双击中间的一个神经层:
所以从这里我们就可以清楚的看到数据流向
下面我们再打开SCALARS就可以我们的误差函数(误差是越来越小)
最后我们打开HISTOGRAMS,就可以看到每一个神经层内部权重,偏置等参数的学习过程的变化:
神经层一:
神经层二:
好了,大家快快实践吧!