'IndexError: list assignment index out of range for CNN program from scratch

I've been getting this error while the dimension of my array match the limits of my loop, what should I change.

this program is aimed to classify 32*32p black and white images using Neural Networks from scratch.

import numpy as np
import matplotlib.pyplot as plt
import pickle
from math import exp
from random import seed
from random import random

def unpickle(file):
    with open(file, 'rb') as fo:
        data = pickle.load(fo, encoding='bytes')
    return data

def load_data(data_dir, negatives=False):

    meta_data_dict = unpickle("batches.meta")
    data_label_names = meta_data_dict[b'label_names']
    data_label_names = np.array(data_label_names)

    # training data
    train_data = None
    train_filenames = []
    train_labels = []
    
    train_data_dict = unpickle("data_batch_1")
    train_data = train_data_dict[b'data']
    train_filenames += train_data_dict[b'filenames']
    train_labels += train_data_dict[b'labels']

    train_data = train_data.reshape((len(train_data), 1, 32, 32))
    if negatives:
        train_data = train_data.transpose(0, 2, 3, 1).astype(np.float32)
    else:
        train_data = np.rollaxis(train_data, 1, 4)
    train_filenames = np.array(train_filenames)
    train_labels = np.array(train_labels)

    return train_data, train_filenames, train_labels, data_label_names

data_dir = 'data-batches-py'
x_train, x_train_filenames, y_train_labels, y_label_names =load_cifar_10_data(data_dir)
print (x_train.shape)
print (len(x_train))

# Initialize a network
def initialize_network(n_hidden):
    network = list()
    hidden_layer = [{'weights':[random() for i in range(len(x_train) + 1)]} for i in range(n_hidden)]
    network.append(hidden_layer)
    output_layer = [{'weights':[random() for i in range(n_hidden +1)]} for i in range(10)]
    network.append(output_layer)
    return network


def sum(inputs):
    sum_row=[]
    for i in range(len(x_train)):
        for a in range(32):
            for b in range(32):
                sum_row[i]=0
                sum_row[i]+= inputs[i][a][b][1]
    return sum_row
# Calculate neuron activation for an input
def activate(weights, inputs):
    flattened= sum(inputs)
    activation = weights[-1]
    for i in range(len(weights)-1):
        activation += weights[i] * flattened[i]
    return activation

# Transfer neuron activation
def transfer(activation):
    return 1.0 / (1.0 + exp(-activation))

# Forward propagate input to a network output
def forward_propagate(network, row):
    inputs = row
    for layer in network:
        new_inputs = []
        for neuron in layer:
            activation = activate(neuron['weights'], inputs)
            neuron['output'] = transfer(activation)
            new_inputs.append(neuron['output'])
        inputs = new_inputs
    return inputs

network = initialize_network(1)
row = x_train
output = forward_propagate(network, row)
print(output)

After running this code I get the following output

(10000, 32, 32, 1)
10000
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
/var/folders/gm/z9_jyr1s5k1232zgf4xf7cxc0000gn/T/ipykernel_15670/2752672525.py in <module>
    153 network = initialize_network(1)
    154 row = x_train
--> 155 output = forward_propagate(network, row)
    156 print(output)

/var/folders/gm/z9_jyr1s5k1232zgf4xf7cxc0000gn/T/ipykernel_15670/2752672525.py in forward_propagate(network, row)
     78                 new_inputs = []
     79                 for neuron in layer:
---> 80                         activation = activate(neuron['weights'], inputs)
     81                         neuron['output'] = transfer(activation)
     82                         new_inputs.append(neuron['output'])

/var/folders/gm/z9_jyr1s5k1232zgf4xf7cxc0000gn/T/ipykernel_15670/2752672525.py in activate(weights, inputs)
     62 # Calculate neuron activation for an input
     63 def activate(weights, inputs):
---> 64     flattened= sum(inputs)
     65     activation = weights[-1]
     66     for i in range(len(weights)-1):

/var/folders/gm/z9_jyr1s5k1232zgf4xf7cxc0000gn/T/ipykernel_15670/2752672525.py in sum(inputs)
     57         for a in range(32):
     58             for b in range(32):
---> 59                 sum_row[i]=0
     60                 sum_row[i]+= inputs[i][a][b][1]
     61     return sum_row

IndexError: list assignment index out of range

as you can see the dimension of the input is 100003232*1, then why am I getting an error?



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source