[英]'list' object cannot be interpreted as an integer in ANN from scratch
我一直在練習從頭開始構建一個簡單的 NN,並且下面的代碼經常出現以下問題。
import numpy as np
n = 2
num_hidden_layers = 2
m = [2, 2]
num_nodes_output = 1
num_nodes_previous = n
network = {}
for layer in range(num_hidden_layers + 1):
if layer == num_hidden_layers:
layer_name = 'output'
num_nodes = num_nodes_output
else:
layer_name = 'layer_{}'.format(layer + 1)
num_nodes = m[layer]
network[layer_name] = {}
for node in range(num_nodes):
node_name = 'node_{}'.format(node + 1)
network[layer_name][node_name] = {
'weights':np.around(np.random.uniform(size = num_nodes_previous), decimals = 2),
'bias':np.around(np.random.uniform(size = 1), decimals = 2)
}
num_nodes_previous = num_nodes
print(network)
print('\n')
def initialize_network(num_inputs, num_hidden_layers, num_nodes_hidden, num_output):
num_nodes_previous = num_inputs
network = {}
for layer in range(num_hidden_layers + 1):
if layer == num_hidden_layers:
layer_name = 'output'
num_nodes = num_nodes_output
else:
layer_name = 'layer_{}'.format(layer + 1)
num_nodes = num_nodes_hidden
network[layer_name] = {}
for node in range(num_nodes):
node_name = 'node_{}'.format(node + 1)
network[layer_name][node_name] = {
'weights':np.around(np.random.uniform(size = num_nodes_previous), decimals = 2),
'bias':np.around(np.random.uniform(size = 1), decimals = 2)
}
num_nodes_previous = num_nodes
return network
from random import seed
np.random.seed(12)
inputs = np.around(np.random.uniform(size=5), decimals=2)
print('The inputs to the network are {}'.format(inputs))
print('\n')
def compute_weighted_sum(inputs, weights, bias):
return np.sum(inputs * weights) + bias
def node_activation():
1.0 / (1.0 + np.exp(-1 * compute_weighted_sum))
return
def forward_propagation(network, inputs):
layer_inputs = list(inputs)
for layer in network:
layer_data = network[layer]
layer_outputs = []
for layer_node in layer_data:
node_data = layer_data[layer_node]
node_output = node_activation(computed_weighted_sum(layer_inputs, node_data['weights'], node_data['bias']))
layer_outputs.append(np.around(node_output[0], decimals = 4))
if layer != 'output':
print('The output of the nodes in the hidden layer number {} is {}'.format(layer.split('_')[1], layer_outputs))
layer_inputs = layer_outputs
network_predictions = layer_outputs
return network_predictions
my_net = initialize_network(5, 2, [3, 2], 1)
prediction = forward_propagation(my_net, inputs)
我在前向傳播代碼的第二部分中將此作為錯誤:
{'layer_1': {'node_1': {'weights': array([0.22, 0.26]), 'bias': array([0.17])}, 'node_2': {'weights': array([0.11, 0.65]), 'bias': array([0.18])}}, 'layer_2': {'node_1': {'weights': array([0.33, 0.66]), 'bias': array([0.01])}, 'node_2': {'weights': array([0.04, 0.74]), 'bias': array([0.45])}}, 'output': {'node_1': {'weights': array([0.64, 0.9 ]), 'bias': array([0.25])}}}
The inputs to the network are [0.15 0.74 0.26 0.53 0.01]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-1-5ae0b4d7d449> in <module>
89 return network_predictions
90
---> 91 my_net = initialize_network(5, 2, [3, 2], 1)
92 prediction = forward_propagation(my_net, inputs)
<ipython-input-1-5ae0b4d7d449> in initialize_network(num_inputs, num_hidden_layers, num_nodes_hidden, num_output)
46
47 network[layer_name] = {}
---> 48 for node in range(num_nodes):
49 node_name = 'node_{}'.format(node + 1)
50 network[layer_name][node_name] = {
TypeError: 'list' object cannot be interpreted as an integer
非常感謝您的任何解決方案!
根據您的第一段代碼,我認為您遺漏了一點:
def initialize_network(num_inputs, num_hidden_layers, num_nodes_hidden, num_output):
num_nodes_previous = num_inputs
network = {}
for layer in range(num_hidden_layers + 1):
if layer == num_hidden_layers:
layer_name = 'output'
num_nodes = num_nodes_output
else:
layer_name = 'layer_{}'.format(layer + 1)
num_nodes = num_nodes_hidden[layer] # <----|| HERE!!! ||------
network[layer_name] = {}
for node in range(num_nodes):
node_name = 'node_{}'.format(node + 1)
network[layer_name][node_name] = {
'weights':np.around(np.random.uniform(size = num_nodes_previous), decimals = 2),
'bias':np.around(np.random.uniform(size = 1), decimals = 2)
}
num_nodes_previous = num_nodes
return network
同樣在forward_propagation
我會小心,因為您正在將network
(這是一個dict
)轉換為一個list
,並且順序基於鍵,這可能與網絡中層的順序不同......(在這種情況下,也許確實如此,但這只是巧合)。 也許使用層的 integer id 作為鍵,以便您可以按順序遍歷層。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.