使用python中的numpy 搭建神经网络

 
 
 
 

python版本2.7

暂时没写太全,做个备份,复制黏贴到py文件中即可运行

使用python语言(不使用机器学习库)搭建神经网络

# coding:utf-8
import numpy as np
from matplotlib import pyplot as plt
def divDebugWindow():
    print('====================================神秘的分割线================================\n')
def deBugout(nameofVAR,VAR):
    print (nameofVAR,VAR,'Shape',nameofVAR,'is',np.shape(VAR))
def datafile():
    x1=np.array([29,43,50,36,2,29,94,45,83,93,41,76,39,91,45,28,28,39,57,72,12,38,52,83,32,15,100,49,83,93,50,45,72,56,36,43,11,23,67,67,2,86,14,92,51,52,94,55,87,40,14,30,24,22,17,22,7,43,71,23,32,33,53,32,27,94,19,54,76,50,67,53,2,45,73,98,19,15,9,24,64,51,62,86,58,32,53,45,52,85,84,29,83,67,91,45,71,8,76,99]);
    x2=np.array([54,47,65,79,56,80,55,65,85,67,67,42,45,56,21,67,72,50,33,2,\
                 81,55,66,13,30,63,55,7,39,19,61,43,35,69,45,69,39,83,50,60,\
                 44,10,56,99,59,17,66,68,41,83,26,42,79,0,14,48,44,96,65,37,\
                 61,85,72,40,24,82,0,44,58,35,43,28,67,58,37,28,34,40,61,45,\
                 22,28,60,91,81,51,83,75,97,91,58,83,68,57,55,38,87,59,100,80]);
    x3=np.array([98,56,31,78,30,90,73,52,37,21,93,97,25,60,90,66,28,69,46,67,\
                 32,56,95,6,1,86,52,89,61,26,82,97,52,43,39,95,59,2,22,6,83,\
                 91,0,51,76,94,45,37,11,40,9,12,7,19,60,38,17,76,55,89,91,44,\
                 18,55,24,73,32,29,75,9,69,95,84,69,58,59,93,37,1,57,84,75,17,\
                 70,40,6,86,11,71,64,95,19,21,17,3,79,33,41,19,42]);
    y1=np.array([973,202,77,541,59,796,429,187,131,63,853,938,40,256,738,335,77,357,\
                 114,308,100,210,906,10,12,677,181,710,250,30,594,936,160,133,83,909,\
                 222,71,42,43,591,763,33,240,479,839,144,102,27,137,9,22,65,9,220,80,\
                 25,535,216,721,794,161,63,186,22,466,35,49,463,18,354,871,638,367,216,\
                 223,818,68,38,208,604,435,47,434,135,29,710,62,457,353,899,79,64,44,\
                 39,512,119,105,114,148]);
    y2=np.array([63,107,170,117,34,97,868,139,648,851,123,466,82,791,105,73,77,91,201,\
                 380,71,91,194,574,42,52,1035,127,593,811,170,119,391,228,71,137,22,81,\
                 328,337,28,646,34,882,175,153,879,216,676,137,10,46,77,13,13,37,21,179,\
                 406,35,79,113,203,54,28,905,10,180,480,138,326,166,53,132,409,955,28,23,\
                 38,40,275,148,276,726,265,59,226,148,242,703,636,95,620,335,784,113,\
                 437,39,541,1038]);
    print('shape x1:')
    print np.shape(x1)
    print('shape x2:')
    print np.shape(x2)
    print('shape x3:')
    print np.shape(x3)
    print('shape y1:')
    print np.shape(y1)
    print('shape y2:')
    print np.shape(y2)
    s1=np.zeros((1,np.size(y1)))
    s2=np.zeros((1,np.size(y1)))
    # for i in range(100):
    #     s1[i]=(1.0/(1.0+np.exp(-y1[i])));#对输出进行尺度调整至(0,1)范围
    #     s2[i]=(1.0/(1.0+np.exp(-y2[i])));
    s1 = (1.0/(1.0+np.exp(-y1)));
    s2 = (1.0 / (1.0 + np.exp(-y2)));
    # data=np.array([[x1],[x2],[x3],[s1],[s2]]);
    # x = np.sta
    print '建立数据集----》data成功\n'
    return np.array([[x1],[x2],[x3],[s1],[s2]]);
#=====================================#=====================================#=====================================#==============================
# a=datafile();
# print a;
# function [sigma]=BP_BACK(training_example,eta)

def BP_BACK(training_example,eta):
    # np.random.seed(1)

    ssize=np.array(np.shape(training_example)) ;
    print ssize
    m=ssize[0]; n=ssize[2];
    print m
    print n
    # sigma=np.zeros(1,n);

    sigma=np.array(range(n),np.float64);
          # %m--行,n--列
        # %初始化权值矩阵-0.5~0.5之间
    w = np.random.rand(2,3) - 0.5;
    v = np.random.rand(3,2) - 0.5;
    u = np.random.rand(2,3) - 0.5;
    # %------------------------
    divDebugWindow()
    print('初始化权重wvu结束\n')
        # for num = 1:n  %对每组输入量与输出量
    for num in range(n):
        # 前向传播
        print num
        one_sample = training_example[:,0,num];

        print ('onesample_shape:')
        print (np.shape(one_sample))
        print one_sample
        x = one_sample[0:3]
        print('shape  x: ')
        print (np.shape(x))
        y = one_sample[3:5]
        print('shape  y: ')
        print np.shape(y)
        print('shape  w: ')
        print np.shape(w)

        print ('begin w*x')
        # print ('x',x,'w',w)
        deBugout('x',x)
        deBugout('w',w)
        net2 = np.dot(x,w.T)
        deBugout('net2 :',net2)
        # net2 = np.dot(w,np.tile(np.transpose(np.transpose([x])),(3,2)));


        # print('Finish-----np.dot(w,np.transpose(x))')
        # print ('net2')
        # print net2
        # for i in range(2):
        #     hidden1(i)=1/(1+np.exp(-net2[i]));
        hidden1 = 1 / (1 + np.exp(-net2));
        divDebugWindow()
        # print hidden1
        # print ('size v ',np.shape(v))
        # w = np.random.rand(2, 3) - 0.5;
        # v = np.random.rand(3, 2) - 0.5;
        # u = np.random.rand(2, 3) - 0.5;

        deBugout('hidden1',hidden1)
        deBugout('v',v)
        net3 = np.dot(hidden1,v.T)
        # net3 = np.dot(v,np.transpose(hidden1));
        deBugout ('net3',net3)
        divDebugWindow() # =================================================
        deBugout('u',u)
        hidden2 = 1 / (1 + np.exp(-net3));

        # print ('hidden2',hidden2)
        deBugout('hidden2',hidden2)
        net4 = np.dot(hidden2, u.T);
        deBugout ('net4', net4)
        divDebugWindow() # =================================================
        o = 1 / (1 + np.exp(-net4))
        deBugout('o',o)
        # % % -------------反向传播算法,计算各层delta值(误差E对各层权值的导数)-----------------
        delta3 = (y - o) * o * (1 - o); #% 计算公式
        deBugout('delta3', delta3)
        divDebugWindow() # =================================================

        # delta2(j) = hidden2(j) * (1 - hidden2(j)) * delta3 * u(:, j);
        # print ('u', u)

        deBugout('u',u)
        # delta2=1
        deBugout('delta3afterCut', delta3[0:np.size(hidden2)])
        deBugout('hidden2',hidden2)
        deBugout('u',u)
        # deBugout('hidden2 * (1 - hidden2 )* delta3[0:np.size(hidden2)]',hidden2 * (1 - hidden2 )* delta3[0:np.size(hidden2)])
        divDebugWindow() # =================================================
        # delta2 = np.dot(hidden2 * (1 - hidden2 )* delta3[0:np.size(hidden2)],u);
        # deBugout('delta3[0:np.size(hidden2)]',delta3[0:np.size(hidden2)])
        deBugout('delta3',delta3)
        deBugout('hidden2',hidden2)
        delta2 = hidden2[0:2] * (1 - hidden2[0:2])*delta3;
        # for j = 1:3 % 计算公式,与其后一层的delta值相关
        # delta2(j) = hidden2(j) * (1 - hidden2(j)) * delta3 * u(:, j);
        # end
        deBugout('delta2',delta2);
        # for j in range(3):
        print ('Finished computing delta2.......')
        divDebugWindow()# =================================================
        print ('beginning computing delta1.......')
        #     delta2[j] = hidden2[j] * (1 - np.dot(hidden2[j]) * delta3,u[:, j]);
        #
        deBugout('hidden1',hidden1)
        deBugout('delta2',delta2)
        deBugout('v',v)
        deBugout('v[0:2,:]',v[0:2,:])
        deBugout('hidden1[0:2]*(1-hidden1[0:2])*delta2[0:2]',hidden1[0:2]*(1-hidden1[0:2])*delta2[0:2])
        print (np.shape([hidden1[0:2]*(1-hidden1[0:2])*delta2[0:2]]))
        delta1 = np.dot(hidden1[0:2]*(1-hidden1[0:2])*delta2[0:2],v[0:2,:])
        print ('Finished computing delta1.......')
        deBugout('delta1',delta1)
        divDebugWindow()  # =================================================

        # delta1(k) = hidden1(k) * (1 - hidden1(k)) * delta2 * v(:, k);
        # delta1 =1
        # for k in range(2):
        #     delta1[k] = hidden1[k] * np.dot((1 - hidden1[k]) * delta2 ,v[:, k]);
        print ('Begining updating weight.......')
        # %--------各层delta计算完后开始更新权值---------------------
        # %---更新u权值-----
        deBugout('u',u)
        deBugout('delta3',delta3)
        deBugout('hidden2',hidden2)
        # u=u+eta*delta3*hidden2;

        for i in range(2):
            for j in range(3):
                u[i,j] = u[i,j] + eta*delta3[i]*hidden2[j];
        deBugout('u_after', u)
         # %---更新v权
        print ('Finished updating u.........')
        divDebugWindow()  # =================================================

        deBugout('delta2',delta2)
        deBugout('hidden1',hidden1)
        for i in range(2):
            for j in range(2):
                v[i,j] = v[i,j] + eta*delta2[i]*hidden1[j];
        deBugout('v_after', v)
        print ('finished updating v.........')
        divDebugWindow()  # =================================================
        # %---更新w权值-----
        print ('Begining updating w..........')
        deBugout('w', w)
        deBugout('delta1', delta1)
        deBugout('x', x)
        for i in range(2):
            for j in range(2):
                w[i, j] = w[i, j] + eta * delta1[i] * x[j];
        deBugout('w_after', w)
        print ('Finished updating w.........')
        divDebugWindow()  # =================================================
         # %--------------记录一下这个过程后的误差值
        deBugout('o', o)
        deBugout('y', y)
        e=o-y;#%计算误差向量  (计算输出-目标输出)
        deBugout('e',e)
        ee=np.sum(np.dot(np.transpose(e),e))
        deBugout('ee',ee)
        print (ee)
        # deBugout('y', y)
        # deBugout('err', e)
        # e=;
        print('updating sigma',num,'th')
        # sigma[num] = np.dot(np.transpose(e),e);#%计算误差平方和
        # sigma[num]=ee;
        deBugout('sigma',sigma)
        # plt.plot(sigma);
        # sigma = 0
        # print sigma
        # np.append(sigma,ee);
        sigma[num]= ee;
        print ('Finished updating Sigma')
        divDebugWindow()
    return sigma
        #

print('主程序开始。。。。。。。。。。。');
training_example=datafile();

print(training_example)
# pic=plt.plot(training_example)
# pic.s
print ('训练样本的shape:');
print np.shape(training_example)

print('开始使用反向传播算法 ')
#===============================
plotSigma=BP_BACK(training_example,0.9)
#===============================
print ('BPFINISHED')
plt.plot(plotSigma)

plt.xlabel('ITERATION')
plt.ylabel('LOSS')
plt.title('LOSS GRAPH')
plt.grid()
plt.show()


猜你喜欢

转载自blog.csdn.net/weixin_39257042/article/details/80068002