AttributeError: 'list' object has no attri

2019-09-26 05:44发布

问题:

I have been trying to implement a neural network in python that uses back propagation and keep getting the above error. How can I go about eliminating it. The code runs for one epoch without calculating the error in the system hence it is not able to back propagate the error across the network

import numpy as np 

 X = [0.4, 0.7]
    y = [0.1]
    class Neural_Network(object):
      def __init__(self):
        #parameters
        self.inputSize = 2
        self.outputSize = 1
        self.hiddenSize = 2

        #weights
        self.W1 = [[0.1, 0.4],
                   [0.2, -0.2]]  # (2x2) weight matrix from input to hidden layer
        self.W2 = np.array([0.2, -0.5])[np.newaxis]  # (2x1) weight matrix from hidden to output layer


      def forward(self, X):
        #forward propagation through our network
        self.z = np.dot(X, self.W1) # dot product of X (input) and first set of 3x2 weights
        self.z2 = self.sigmoid(self.z) # activation function
        self.z3 = np.dot(self.z2, self.W2.T) # dot product of hidden layer (z2) and second set of 3x1 weights
        o = self.sigmoid(self.z3) # final activation function
        return o

      def sigmoid(self, s):
        # activation function
        return 1/(1+np.exp(-s))

      def sigmoidPrime(self, s):
        #derivative of sigmoid
        return s * (1 - s)

      def backward(self, X, y, o):
        # backward propgate through the network
        self.o_error = y - o # error in output
        self.o_delta = self.o_error*self.sigmoidPrime(o) # applying derivative of sigmoid to error

        self.z2_error = self.o_delta.dot(self.W2) # z2 error: how much our hidden layer weights contributed to output error
        self.z2_delta = self.z2_error*self.sigmoidPrime(self.z2) # applying derivative of sigmoid to z2 error

        self.W1 += X.T.dot(self.z2_delta) # adjusting first set (input --> hidden) weights
        self.W2 += self.z2.T.dot(self.o_delta) # adjusting second set (hidden --> output) weights

      def train (self, X, y):
        o = self.forward(X)
        self.backward(X, y, o)

    NN = Neural_Network()
    for i in xrange(1000): # trains the NN 1,000 times
      print "Input: \n" + str(X)
      print "Actual Output: \n" + str(y)
      print "Predicted Output: \n" + str(NN.forward(X))
      print "Loss: \n" + str(np.mean(np.square(y - NN.forward(X)))) # mean sum squared loss
      print "\n"
      NN.train(X, y)

The error I am getting is

File "C:/Users/Aaa/AppData/Local/Temp/abc.py", line 43, in backward
    self.W1 += X.T.dot(self.z2_delta) # adjusting first set (input --> hidden) weights
AttributeError: 'list' object has no attribute 'T'

回答1:

The X you are using is a list. You should use a numpy.array:

X = np.array([0.4, 0.7])


回答2:

X is a list. You can see that by typing type(X). And lists do not have a transpose method. You want an array, so replace X = [0.4, 0.7] with:

X = np.array([0.4, 0.7])

Oh and btw.: A transpose of X = np.array([0.4, 0.7]) will be the same as X:

print(np.all(X.T == X))
# Out: True

This is true for all X with one dimension.