У меня есть проблема, для которой я не могу найти решение относительно некоторого кода Numpy, который я пишу.Чтобы дать некоторое представление, я хочу реализовать задержки в нейронной сети.Нейронная сеть имеет входной массив x
, который имеет размер [time, trials, neurons]
, и я хотел бы назначить определенную временную задержку для каждого нейрона.
Самый простой случай, когда нет задержки, иЯ могу передать свою входную сетевую информацию следующим образом:
import numpy as np
def f(x):
""" Dummy function so that the code runs """
return np.mean(x)
# Set up initial state
time, trials, neurons = (100, 256, 16)
x = np.random.rand(time, trials, neurons)
# Iterate through time
for t in range(time):
# Index into the state in time
x_ = x[t,:,:]
y = f(x_)
# Assert shape of indexed array
assert x_.shape == (trials, neurons)
В этом случае, когда я индексирую в определенное время, форма массива x
становится [trials, neurons]
, так как я проиндексировал дляконкретный момент времени.
Теперь я знаю, что могу добавить фиксированную задержку L
, целое число, индексируя с помощью x[t-L,:,:]
, и полученная фигура снова будет [trials, neurons]
.Результат в основном идентичен приведенному выше коду.
Чтобы усложнить задачу, к сожалению, мой проект требует разной задержки для каждого нейрона.Таким образом, вместо того, чтобы L
было некоторым целым числом, я бы хотел, чтобы это был массив значений задержки.В частности, я хотел бы сделать L = np.random.randint(a, b, size=neurons)
, поэтому каждый элемент L представляет собой некое целое число от a
до b
, исключительное.
Моя цель - создать идиоматическую кодовую фразу, которая выполняет то же самоепуть как целое число L
.Я знаю, что могу легко сделать for
цикл по нейронам, чтобы получить неэффективную версию этого, как показано:
import numpy as np
def f(x):
""" Dummy function so that the code runs """
return np.mean(x)
# Set up initial state
time, trials, neurons = (100, 256, 16)
a, b = (8, 12)
x = np.random.rand(time, trials, neurons)
L = np.random.randint(a, b, size=neurons)
# Iterate through time
for t in range(time):
### This is what I want to optimize ###
#######################################
# Index into the state in time, with
# a different latency for each neuron
x_ = []
for n in range(neurons):
x_.append(x[t-L[n],:,n])
x_ = np.stack(x_, axis=1)
#######################################
# Use the latency-indexed array
y = f(x_)
# Assert shape of indexed array
assert x_.shape == (trials, neurons)
Таким образом, мой вопрос состоит в том, как добиться всего этого индексации с надеждой простонесколько строк решения Numpy-native.Я пытался злоупотреблять расширенной индексацией в этом отношении, но безрезультатно, и я надеюсь на некоторую помощь в этом вопросе.Ура!