Python20行代码实现多层神经网络的学习

转载自:python小练习(062):python20行代码实现多层神经网络的机器学习(一)http://bbs.fishc.com/thread-81849-1-1.html(出处: 鱼C论坛)

今天在鱼C论坛看到一个很好的入门机器学习的小例子,分享给大家。

现在神经网络、机器学习、深度学习逐渐成为未来计算机发展的大趋势。今天就通过一个很简单的小例子,浅谈一下如何用python实现多层神经网络的机器学习。神经网络(Neural Networks)属于 机器学习(Machine Learning)的一种。深层神经网络(Deep Neural Networks)也只是 深层学习(Deep Learning) 的一种。"深度学习"是为了让层数较多的多层神经网络可以训练,能够work而演化出来的一系列的 新的结构和新的方法。好吧,太复杂的概念大家可以google,这里举个简单的例子说明:例如,有一组输入:X = 1,2,3,4,5,6,7,8,9,10有一组输出:Y = 10,20,30,40,50,60,70,80,90,100求解:Y = k*X + b 中的 k 和 b 为何值时,函数拟合最好。当然,这是非常简单的题目,用脚趾头想都能知道这个函数当然应该是 Y = 10 * X + 0,即 k = 10, b = 0.那么用神经网络学习应该如何实现呢?卖个关子。我们先看结果吧:当学习次数为100时,程序输出:k=9.999852648623337 b=0.0007369339496443169当学习次数为10000时,程序输出:k=9.999866463857986 b=0.0007360277038955244当学习次数为1000000时,程序输出:k=9.999935468934599 b=0.0003552889884596963可以看到随着学习次数的增加,输出值会无限接近标准值(但是永远也打不到标准值,因为机器学习的特点就是根据偏差值不断调整自身参数,以不断减小误差,但是误差是永远存在的。)下面详细解释程序代码:首先,我们要定义一个函数,这个函数的作用是能够把输入值转化为一个0~1之间的数,并且当输入值与0的差值越大,输出越接近1,输入值越接近0时,输入值也越接近于0. 这个函数的作用就是用来调整机器本身参数,使结果更加接近于标准值。那么,我们这个函数F(x)= (e^x -1) / (e^x + 1) 就符合这样的要求,其中x>=0(取绝对值)。def F(x):    return (math.exp(abs(x))-1)/(math.exp(abs(x))+1)然后当然要把X和Y以列表的形式放入以便机器学习使用。X = list(range(1,11))Y = list(range(10,110,10))由于有k和b 2个未知数,我们设定一个二层的神经网络。把X作为第一层输入,k*X作为第一层的输出把k*X作为第二层输入,k*X+b作为第二层的输出利用k*X与Y-b计算第一层的偏差值error1,代入F(error1)计算权重,然后把这个权重值*error1作为k值的调整值同样,利用k*X+b与Y计算第二层的偏差值error2,代入F(error2)计算权重,再把这个权重值*error2作为b值的调整值然后,不断反复迭代这个过程,使得k和b不断接近标准值。这个过程就是这样。20行源代码如下:

import math
def F(x):
    return (math.exp(abs(x))-1)/(math.exp(abs(x))+1)

X = list(range(1,11))
Y = list(range(10,110,10))

k,b = 0,0
for repeat in range(1000000):
    for i in range(10):
        c1 = k*X[i]
        e1 = Y[i]-b-c1
        d1 = e1*F(e1)
        k += d1
        c2 = k*X[i]+b
        e2 = Y[i]-c2
        d2 = e2*F(e2)
        b += d2

print (k,b)

既然说到了,神经网络那不提google的开源大作tensorflow就实在说不过去了,所以我决定还是要把这段加上。
同样20行左右的代码(去掉注释),完成同样的工作,而且tensorflow是一个非常完善的库,可以用来做非常多的机器学习的项目。
直接上代码,注释都写好了:

import tensorflow as tf
import numpy as np

# 使用 NumPy 生成假数据(phony data), 总共 100 个点.
x_data = np.float32(np.random.rand(1, 100))  # 随机输入
y_data = np.dot([10], x_data) + 0

# 构造一个线性模型
b = tf.Variable(tf.zeros([1])) + 0.1
W = tf.Variable(tf.random_uniform([1, 1], -1.0, 1.0))
y = tf.matmul(W, x_data) + b

# 最小化方差
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)

# 初始化变量
init = tf.initialize_all_variables()

# 启动图 (graph)
sess = tf.Session()
sess.run(init)

# 拟合平面
for step in range(0, 301):
    sess.run(train)
    if step % 30 == 0:
        print (step, sess.run(W), sess.run(b), sess.run(loss))

输出:
Step     k                         b                         error
0 [[ 4.0464325]] [ 4.64299202] 5.73681
30 [[ 9.25678635]] [ 0.40823561] 0.0502534
60 [[ 9.91544819]] [ 0.04644302] 0.000650405
90 [[ 9.99038124]] [ 0.00528351] 8.41773e-06
120 [[ 9.99890614]] [ 0.00060082] 1.08852e-07
150 [[ 9.99987507]] [  6.87018037e-05] 1.41737e-09
180 [[ 9.99998474]] [  8.32974911e-06] 2.0752e-11
210 [[ 9.99999619]] [  2.02655792e-06] 1.39467e-12
240 [[ 9.99999619]] [  2.02655792e-06] 1.39467e-12
270 [[ 9.99999619]] [  2.02655792e-06] 1.39467e-12
300 [[ 9.99999619]] [  2.02655792e-06] 1.39467e-12

你可能感兴趣的:(深度学习)