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()