用numpy纯手工搭建神经网络,

import numpy as np

import matplotlib.pyplot as plt

shape=[3,15,15,2]

Bath=6

inputs =np.random.randn(Bath,3)

def creat(inputs1 ):

    for i in range(len(inputs1)):

        if inputs1[i,0]**2+inputs1[i,1]**2<=1:

            inputs1[i,2]=1

        else:

            inputs1[i,2]=0

        pass

    tput=inputs1[:,0:2]

    target=inputs1[:,2]

    mm=np.zeros((len(target),2))

    mm[:,0]=target

    mm[:,1]=1-target

    target=mm

    return tput,target 

tput,target =creat(inputs)    

 

  

def weights(ss):

        list1=[]

        a=2

        for i in range(len(ss)):

            if i==0:

                list1.append(np.random.randn(a,ss[i]))

            else:

                list1.append(np.random.randn(ss[i-1],ss[i]))

        return list1

def bises(ss):

        ll=[]

        for i in ss:

            ll.append(np.random.randn(i))       

        return ll

        

weight=weights(shape)

bise=bises(shape)

  

class Layer:#定义层的大类

    def __init__(self,inputs,shape,weight,bise,target):

        self.inputs= inputs

        self.shape=shape

        self.weight=weight

        self.bise=bise

        self.target=target

        self.rate=0.002

      

    

    def network_qian(self): 

        outputs=[]

       

        for i in range(len(self.shape)):

            if i==0:

                aa=np.dot(self.inputs,self.weight[i])+self.bise[i]

                aa=self.jihuo1(aa)

                aa=self.norm(aa)

                outputs.append(aa)

            elif i==len(self.shape)-1:

                aa=np.dot(outputs[-1],self.weight[i])+self.bise[i]

                aa=self.jihuo2(aa)

                aa=self.norm(aa)

                outputs.append(aa)

            else:

                aa=np.dot(outputs[-1],self.weight[i])+self.bise[i]

                aa=self.jihuo1(aa)

                aa=self.norm(aa)

                outputs.append(aa)

                

        return outputs    

    

    def jihuo1(self,aa):

        bb=np.where(aa>0,aa,0)

        return bb   

        

    def jihuo2(self,aa):

        bb=aa/np.max(np.abs(aa),axis=1,keepdims=1)

        bb=np.exp(bb)

        return bb

    def norm(self,aa):

        kk=np.abs(aa)

        mm=np.where(kk==0,1,kk)

        ax=np.max(mm)

        ab=np.max(mm,axis=1,keepdims=1)

        

        aa=aa/ab

        return aa 

    

    def xuqiu(self):

        ops=self.network_qian()

        aa=ops[-1]

        mad=np.sum(aa,axis=1,keepdims=1)

        bb=aa/mad

        tar=np.where(bb>0.5,1,0)

        ma1=self.target-bb

        ma2=self.target-tar   

        return tar,ma2

     

     

    def network_hou(self):

        aa=self.xuqiu()

        bb=self.network_qian()

        ww=[]  

        q=aa[1]

        we=[]

        

        qq=q/np.exp(bb[-1])

        

            

        qq=self.norm(qq)

        we.append(np.zeros(qq.shape))

        w=self.quandao(bb[-2],qq)

        ww.append(w)

        

        for i in range(len(self.shape)-1):

            if i==len(self.shape)-2:

                qq=qq@(self.weight[-1-i].T)

                qq=self.norm(qq)

                we.append(qq)

                w=self.quandao(self.inputs,np.maximum(qq,0))

                w=self.norm(w)

                ww.append(w)   

            else:

                qq=qq@(self.weight[-1-i].T)

                qq=self.norm(qq)

                we.append(qq)

                w=self.quandao(bb[-3-i],np.maximum(qq,0))   

                w=self.norm(w)

                ww.append(w)

            

               

        return ww,we

 

    def quandao(self,qian,hou):

        a=len(qian)

        m=qian.shape[-1]

        n=hou.shape[-1]

        moxing=np.full((m,n),1.0)

        mx=np.zeros((m,n))

        for i in range(a):

            mx+=(moxing.T*qian[i]).T*hou[i]

        rt=mx/a

        return rt

        

    def getnew(self):

        net=self.network_hou()

        w=self.weight

        b=self.bise

        nw=[]

        nb=[]

        for i in range(len(self.shape)):

            ww=w[i]+net[0][-i-1]*self.rate

            nw.append(ww)

            if i!=len(self.shape):

                bb=b[i]+self.rate*np.mean(net[1][-1-i],axis=0)

                nb.append(bb)

            else:

                bb=b[i]

            

        return nw,nb

def tu(ls,title,targ):
    color=[(1,0,0),(0,1,0)]
    t=targ[:,0]
    a=ls[:,0]
    b=ls[:,1]
    k=0
    for i in range(len(a)):
      if t[i]==1:
         plt.scatter(a[i],b[i],marker='o',s=10,color=color[0])
      else:
         plt.scatter(a[i],b[i],marker='o',s=10,color=color[1])
      
      if i/len(a)*100//10!=k:
          for p in range(1,int(k+1)):
              print("f",end="")
          print("完成{}".format(i/len(a)))
          
      k=i/len(a)*100//10
      
    print("完成循环")
    plt.title({title})  
    #plt.savefig('{0}.png'.format(title),dpi=300)
#if __name__=="__name__":
def creat(inputs1 ):
    for i in range(len(inputs1)):
        if inputs1[i,0]**2+inputs1[i,1]**2<=1:
            inputs1[i,2]=1
        else:
            inputs1[i,2]=0
        pass
    tput=inputs1[:,0:2]
    target=inputs1[:,2]
    mm=np.zeros((len(target),2))
    mm[:,0]=target
    mm[:,1]=1-target
    target=mm
    return tput,target

l=np.random.randn(200,3)
ll=creat(l)
tput,target=ll

shape=[11,44,65,34,2]
weight=weights(shape)
bise=bises(shape)
#print(tput,target)

tu(tput,"before",target)


app=Layer(inputs=tput,shape=shape,weight=weight,bise=bise,target=target)
app.rate=0.0005
newnet=app.getnew()


def panduan(t1,t2):
    k=0
    f=len(t1)
    for i in range(f):
        if t1[i,0]==t2[i,0]:
            k+=1
    return k/f

n="y"
z=0
while z<0.99:
    for i in range(50):
        app1=Layer(inputs=tput,shape=shape,weight=newnet[0],bise=newnet[1],target=target)
        app1.rate=0.0001
        newnet=app1.getnew() 
        tar1=app1.xuqiu() 
        print(i)
      
        z=panduan(target,tar1[0])
        print("训练后的正确率",z)
    #n=input("继续测试?y/n")
tu(tput,"after",tar1[0])


def cs():
    qq=creat(np.random.randn(800,3))
    
    app1=Layer(inputs=qq[0],shape=shape,weight=newnet[0],bise=newnet[1],target=qq[1])
    app1.rate=0.0002
    tar1=app1.xuqiu()
    z=panduan(qq[1],tar1[0])
    print("随机训练后的正确率",z)
for i in range(33):
    cs()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值