自己的第一个神经网络

最近一直在研究神经网络,于是周末空闲之余通过一篇文章的启发制作了一个3层神经网络,用来计算加法(两个输入,3个隐含,1个输出)。训练5000000次后效果还是不错的,几乎可以计算所有和小于10的加法了。

(代码)

import numpy as np
import random
def sigmoid(x):
    return 1/(1+(np.exp(-x)))
w = []
h = []
o = 0
s = 0.6
for i in range(9):
    w.append(random.random())
for i in range(3):
    h.append(0)
def train():
    for i in range(5000000):
        if i%2 == 0:
            x1 = random.randint(0,5)/10
            x2 = random.randint(0,5)/10
            y = x1 + x2
        else:
            x1 = random.uniform(0, 5) / 10
            x2 = random.uniform(0, 5) / 10
            y = x1 + x2
        h[0] = sigmoid(x1*w[0]+x2*w[3])
        h[1] = sigmoid(x1*w[1]+x2*w[4])
        h[2] = sigmoid(x1*w[2]+x2*w[5])
        o = sigmoid(h[0]*w[6]+h[1]*w[7]+h[2]*w[8])
        err = pow((o-y),2)
        c1 = -(o-y)*o*(1-o)
        c2 = (c1*w[6])*(h[0])*(1-h[0])
        c3 = (c1*w[7])*(h[1])*(1-h[1])
        c4 = (c1*w[8])*(h[2])*(1-h[2])
        w[0] = w[0]+(x1*(c2)*s)
        w[1] = w[1]+(x1*(c3)*s)
        w[2] = w[2]+(x1*(c4)*s)
        w[3] = w[3]+(x2*(c2)*s)
        w[4] = w[4]+(x2*(c3)*s)
        w[5] = w[5]+(x2*(c4)*s)
        w[6] = w[6]+(h[0]*(c1)*s)
        w[7] = w[7]+(h[1]*(c1)*s)
        w[8] = w[8]+(h[2]*(c1)*s)
        print('Epoch:'+str(i)+' x1:'+str(x1*10)+' x2:'+str(x2*10)+' y:'+str(y*10)+' Output:'+str(o*10)+' Error:'+str(err)+' 差:'+str(abs(o-y)))
    while True:
        x1 = float(input('x1: '))/10
        x2 = float(input('x2: '))/10
        y = x1 + x2
        h[0] = sigmoid(x1 * w[0] + x2 * w[3])
        h[1] = sigmoid(x1 * w[1] + x2 * w[4])
        h[2] = sigmoid(x1 * w[2] + x2 * w[5])
        o = sigmoid(h[0] * w[6] + h[1] * w[7] + h[2] * w[8])
        print('Output: '+str(o*10)+' y: '+str(y*10)+'\n')

train()

不过这个模型有2个缺陷:无法保存训练结果,以及纯手工进行计算操作(没办法,我能力有限呀...)。下个周末我会来改进的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值