簡體   English   中英

'list' object 不能從頭開始在 ANN 中解釋為 integer

[英]'list' object cannot be interpreted as an integer in ANN from scratch

我一直在練習從頭開始構建一個簡單的 NN,並且下面的代碼經常出現以下問題。

  1. 代碼的第一部分初始化我的網絡,“網絡”有兩個隱藏層,每層有兩個節點,一個 output。
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')

  1. 然后,我定義網絡的參數。

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  

  1. 然后我設置輸入並啟動前向傳播,以便第一層的 output 成為第二層的輸入。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM