Я пытаюсь создать простую нейросетевую программу / модуль. Поскольку я использую Pythonista на iPad Pro, скорость может немного улучшиться. Насколько я понимаю, для циклов for много накладных расходов, поэтому мне было интересно, можно ли обучить 50000 входных данных: наборы целей с использованием некоторой формы векторизации.
Я пытался найти ресурсы о том, как массивы проходят через функции, но мне очень трудно обернуть голову. Я пытался создать один большой массив, который будет содержать входные данные функции train в виде небольших списков, но эта функция работает со всем массивом, а не с меньшими по отдельности.
# train function that accepts inputs and targets
# currently called inside a for loop
# input: [[a], [b]], target: [[c]]
def train(self, input_mat, target_mat):
# generate hidden layer neuron values
hidden = self.weights_in_hid.dot(input_mat)
hidden += self.bias_hid
hidden = sigmoid(hidden)
# generate output neuron values
output_mat = self.weights_hid_out.dot(hidden)
output_mat += self.bias_out
# activation function
output_mat = sigmoid(output_mat)
# more of the function continues
# ...
# Datum converts simple lists into numpy matrices, so they don’t have to be reinstantiated 50000 times
training_data = [
Datum([0, 0], [0]),
Datum([0, 1], [1]),
Datum([1, 0], [1]),
Datum([1, 1], [0]),
]
# ...
# XXX Does this for loop cause a lot of the slowdown?
for _ in range(50000):
datum = rd.choice(training_data)
brain.train(datum.inputs, datum.targets)
В показанном состоянии все работает, но несколько медленно. Всякий раз, когда я пытаюсь передать все данные в одну матрицу, функция не может их векторизовать. Вместо этого он пытается работать с матрицей в целом, что, очевидно, вызывает ошибку на первом шаге, поскольку массив слишком велик.