Python dict без ошибки атрибута в массиве

#python #neural-network

#python #нейронная сеть

Вопрос:

Я использую следующий код для отображения массива

 net = NeuralNetwork(4, 28 * 28, [128, 64, 10])
print(net(1).w)
  

В файле NeuralNetwork

   def __call__(self, counter):           
        return self.params[counter]
  

при инициализации я использую

 self.params     = [] 
np.random.seed(1)
        for i in range(len(neurons_per_layer)):
            w = np.random.randn(2,2)
            b = np.zeros([2, 1])
            self.params.append({"w" : w, "b" : b})

        return
  

Однако я получаю ошибку

 'dict' object has no attribute 'w'
  

Ответ №1:

В print(net(1).w) вы пытаетесь получить доступ к атрибуту w dict , которого dict нет.

Я думаю, что вы действительно хотите print(net(1)['w'])

В итоге вы получаете, 'dict' object has no attribute 'w' поскольку вы пытаетесь вызвать атрибут из dict , в данном случае w , и dicts у вас нет вызванного атрибута w , вы хотите получить значение для dict для ключа w .

Комментарии:

1. Я хочу выполнить print(net(1).w) , как я могу изменить свой код, чтобы продемонстрировать это поведение.

2. @MuhammadUmar: print(net(1)['w'])

3. @El Я не хочу выполнять print(net(1)[‘w’]), да, я понимаю, что мой код делает это, но я хочу продемонстрировать поведение, упомянутое мной, как я могу изменить свой код.

4. Вы имеете в виду, вы хотите, чтобы вещь, которую вы помещаете в self.params в первую очередь, действительно имела этот .w атрибут? Тогда вам нужно сделать так, чтобы это было что-то, у чего есть этот атрибут, вместо использования dict . Например, написав другой класс для его представления.

5. Примечание. Существуют другие способы (помимо использования класса) реализовать такой взлом, например, перегрузка __getattr__ . (Я думаю, что Collections.namedtuples or recordtype также может работать здесь?)

Ответ №2:

Словарь имеет набор ключей и набор значений.

Доступ к значению через ключ — это dict[key] использование dict.key того, что вы пытаетесь получить доступ к атрибуту из класса dict.

Если вы хотите продемонстрировать такое же поведение с помощью instance.key метода, вам нужно будет обернуть словарь или создать новый класс.

В противном случае просто используйте формулу python dict[key] .