import numpy as np
def tanh(x):
return np.tanh(x)
def tanh_dao(x):
return 1.0-np.tanh(x)*np.tanh(x)
def luoji(x):
return 1/(1+np.exp(-x))
def luojidao(x):
return luoji(x)*(1-luoji(x))
class NN:
def __int__ (self,layers,hanshu='tanh'):
if hanshu=='luoji':
self.hanshu=luoji
self.hanshudao=luojidao
elif hanshu=='tanh':
self.hanshu='tanh'
self.hanshudao=tanh_dao
self.quanzhong=[]
for i in range(1,len(layers)-1):
self.quanzhong.append((2*np.random.random((layers[i-1]+1,layers[i]+1))-1)*0.25)
self.quanzhong.append((2*np.random.random((layers[i] + 1,layers[i+1]))-1)*0.25)
def xunlian (self,X,y,xuexisudu=0.2,xunliancishu=10000):
X=np.atleast_2d(X)
kongjuzheng=np.ones([X.shape[0],X.shape[1]+1])
kongjuzheng[:,0:-1]=X
X=kongjuzheng
y=np.array(y)
for k in range(xunliancishu):
i=np.random.randint(X.shape[0])
a=[X[i]]
for l in range(len(self.quanzhong)):
a.append(self.hanshu(np.dot(a[l],self.quanzhong[l])))
error=y[i]-a[-1]
dertas=[error*self.hanshudao(a[-1])]
for l in range(len(a)-2,0,-1):
dertas.append(dertas[-1].dot(self.quanzhong[l].T)*self.hanshudao(a[l]))
dertas.reverse()
for i in range(len(self.quanzhong)):
layer=np.atleast_2d(a[i])
derta=np.atleast_2d(dertas[i])
self.quanzhong[i]+=xuexisudu*layer.T.dot(derta)
def ceshi(self,x):
x=np.array(x)
kongjuzheng=np.ones(x.shape[0]+1)
kongjuzheng[0:-1]=x
a=kongjuzheng
for l in range(0,len(self.quanzhong)):
a=self.hanshu(np.dot(a,self.quanzhong[l]))
return a
这是文件NN.py代码
from NN import NN
import numpy as np
nn=NN([2,2,1],'tanh')
x=np.array([[0,0],[0,1],[1,0],[1,1]])
y=np.array([0,1,1,0])
nn.xunlian(x,y)
for i in [[0,0],[0,1],[1,0],[1,1]]:
print(i,nn.ceshi(i))
通过调用NN实现异或
出现这
Traceback (most recent call last):
File "C:/Users/Administrator/PycharmProjects/xuexi/yihuo.py", line 4, in <module>
nn=NN([2,2,1],'tanh')
TypeError: this constructor takes no arguments
def tanh(x):
return np.tanh(x)
def tanh_dao(x):
return 1.0-np.tanh(x)*np.tanh(x)
def luoji(x):
return 1/(1+np.exp(-x))
def luojidao(x):
return luoji(x)*(1-luoji(x))
class NN:
def __int__ (self,layers,hanshu='tanh'):
if hanshu=='luoji':
self.hanshu=luoji
self.hanshudao=luojidao
elif hanshu=='tanh':
self.hanshu='tanh'
self.hanshudao=tanh_dao
self.quanzhong=[]
for i in range(1,len(layers)-1):
self.quanzhong.append((2*np.random.random((layers[i-1]+1,layers[i]+1))-1)*0.25)
self.quanzhong.append((2*np.random.random((layers[i] + 1,layers[i+1]))-1)*0.25)
def xunlian (self,X,y,xuexisudu=0.2,xunliancishu=10000):
X=np.atleast_2d(X)
kongjuzheng=np.ones([X.shape[0],X.shape[1]+1])
kongjuzheng[:,0:-1]=X
X=kongjuzheng
y=np.array(y)
for k in range(xunliancishu):
i=np.random.randint(X.shape[0])
a=[X[i]]
for l in range(len(self.quanzhong)):
a.append(self.hanshu(np.dot(a[l],self.quanzhong[l])))
error=y[i]-a[-1]
dertas=[error*self.hanshudao(a[-1])]
for l in range(len(a)-2,0,-1):
dertas.append(dertas[-1].dot(self.quanzhong[l].T)*self.hanshudao(a[l]))
dertas.reverse()
for i in range(len(self.quanzhong)):
layer=np.atleast_2d(a[i])
derta=np.atleast_2d(dertas[i])
self.quanzhong[i]+=xuexisudu*layer.T.dot(derta)
def ceshi(self,x):
x=np.array(x)
kongjuzheng=np.ones(x.shape[0]+1)
kongjuzheng[0:-1]=x
a=kongjuzheng
for l in range(0,len(self.quanzhong)):
a=self.hanshu(np.dot(a,self.quanzhong[l]))
return a
这是文件NN.py代码
from NN import NN
import numpy as np
nn=NN([2,2,1],'tanh')
x=np.array([[0,0],[0,1],[1,0],[1,1]])
y=np.array([0,1,1,0])
nn.xunlian(x,y)
for i in [[0,0],[0,1],[1,0],[1,1]]:
print(i,nn.ceshi(i))
通过调用NN实现异或
出现这
Traceback (most recent call last):
File "C:/Users/Administrator/PycharmProjects/xuexi/yihuo.py", line 4, in <module>
nn=NN([2,2,1],'tanh')
TypeError: this constructor takes no arguments