AttributeError: 'numpy.ndarray' object has no attribute 'self'

AttributeError: 'numpy.ndarray' object has no attribute 'self'

我开始实现神经网络的后端,但卡在了 python 的代码中。 下面是神经网络的代码。当我在要创建的一个应用程序中使用用户定义的 class 时,我收到了一个名为 attributeError 的错误。请帮我解决它。 我尝试了所有缩进语法,但没有任何效果。

class NeuralNetwork:
    def __init__(self,layers,alpha=0.1):
        
        self.W=[]
        self.layers=layers
        self.alpha=alpha
        
        
        for i in np.arange(0,len(layers)-2):
            w=np.random.randn(layers[i]+1,layers[i+1]+1)
            self.W.append(w/np.sqrt(layers[i]))
        
        w=np.random.randn(layers[-2]+1,layers[-1])
        self.W.append(w/np.sqrt(layers[-2]))
    
    
    def __repr__(self):
        
        return "NeuralNetwork: {}".format("-".join(str(l) for l in self.layers ))
    
    def sigmoid(self,x):
        #compute and return sigmoid activation for a given input vlaue
        return 1.0/(1+np.exp(-x))
    
    def sigmoid_deriv(self,x):
        return x*(1-x) 
    
    
    def fit(self,X,y,epochs=1000,displayUpdate=100): 
        X=np.c_[X,np.ones((X.shape[0]))]
        for epoch in np.arange(0,epochs):
            for(x,target) in zip(X,y):
                self.fit_partial(x,target)     
            if epoch==0 or (epoch+1)% displayUpdate==0:
                loss=self.calculate_loss(X,y)
                
                print("[INFO] epoch={},loss={:.7f}".format(epoch+1,loss))
                
                
    
    def fit_partial(self,x,y):
        
        A=[np.atleast_2d(x)]
        
        #FeedForward
        
        for layer in np.arange(0,len(self.W)):
            
            net=A[layer].dot(self.W[layer]) 
            
            out=self.sigmoid(net)
            
            A.append(out)
            
        #Backward
        error=A[-1]-y
        D=[error.self.sigmoid_deriv(A[-1])]
        
        for layer in np.arange(len(A)-2,0,-1):
            
            delta=D[-1].dot(self.W[layer].T)
            delta=delta*self.sigmoid_deriv(A[layer])
            D.append(delta)
            
            
        D=D[::-1]
        
        for layer in np.arange(0,len(self.W)):
            
            self.W[layer] += -self.alpha*A[layer].T.dot(D[layer])
            
            
    def predict(self,X,addBias=True): 
        p=np.atleast_2d(X)
        if addBias: 
            p=np.c_[p,np.ones((p.shape[0]))]
        for layer in np.arange(0,len(self.W)): 
            p=self.sigmoid(np.dot(p,self.W[layer]))
        return p
    
    def calculate_loss(self,X,targets):
        targets=np.atleast_2d(targets)
        predictions=self.predict(X,addBias=False)
        loss=0.5*np.sum((predictions-targets)**2)
        return loss

下面是我 运行 在 class 化问题中使用定义的 class 时弹出的错误日志。

AttributeError                            Traceback (most recent call last)
<ipython-input-7-6d9ffad8d4e7> in <module>
      1 nn=NeuralNetwork([2,2,1],alpha=0.5)
----> 2 nn.fit(X,y,epochs=20000)
      3 
      4 for (x,target) in zip(X,y):
      5     pred=nn.predict(x)[0][0]

D:\BackPropagation\neuralnetwork.ipynb in fit(self, X, y, epochs, displayUpdate)
     42     "    def sigmoid_deriv(self,x):\n",
     43     "        return x*(1-x) \n",
---> 44     "    \n",
     45     "    \n",
     46     "    def fit(self,X,y,epochs=1000,displayUpdate=100):\n",

D:\BackPropagation\neuralnetwork.ipynb in fit_partial(self, x, y)
     69     "            \n",
     70     "            \n",
---> 71     "            out=self.sigmoid(net)\n",
     72     "            \n",
     73     "            A.append(out)\n",

**AttributeError: 'numpy.ndarray' object has no attribute 'self'**

根据神经网络Back-end理论,误差必须乘以前一层激活的sigmoid才能得到delta的值,而不是它的点积。所以错误。 self 将不会被识别。

更改以下代码

error.self.sigmoid_deriv(A[-1])

error*self.sigmoid_deriv(A[-1])