본문 바로가기

Deep Learning Tools/Nengo

Nengo로 one-hot-vector에 반응하는 one-hot-neuron 만들기

Deep learning에서는 대부분 one-hot-vector로 학습을 수행하는데, 이를 neuron으로 표현하기는 까다로울 수 있다.

그래서 one-hot-vector에 반응하는 one-hot-neuron을 만들어보쟈!


우선 간단한 one-hot-vector를 return하는 함수를 만들어보자


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
 
import nengo
from nengo.dists import Choice
from nengo.utils.ensemble import tuning_curves
from nengo.utils.matplotlib import rasterplot
 
def input_one_hot(t):
    if(t % 1 == 0):
        if(t % 2 == 0):
            return 1
        else:
            return 0
    else:
        return 0
cs


simulation이 도는 시간에 따라, 짝수 초 마다 1을 return하는 함수를 만들었다.

실제로 def input_one_hot은 나중에 one-hot-vector 정보를 return하는 함수로 작성하면 될 것이다.

중요한 것은, Nengo simulation은 시간 단위로 input을 받는다는 것이다.


1
2
3
4
5
6
7
8
9
10
11
model = nengo.Network()
with model:
    input_node = nengo.Node(output=input_one_hot)
    
    ens_neuron = nengo.Ensemble(1, dimensions=1, max_rates = [100], intercepts=[0])
    ens_neuron.encoders = Choice([[1]])
    
    nengo.Connection(input_node, ens_neuron.neurons)
    
    input_p = nengo.Probe(input_node)
    spike_p = nengo.Probe(ens_neuron.neurons)
cs


여기서 neuron의 경우에 1로 반환하는 encoder를 붙여준다.

주의할 점은 꼭 ensemble.neurons로 해야 개별 neuron에 input node가 붙는다!


1
2
3
4
5
6
7
with nengo.Simulator(model) as sim:
    eval_points, activities = tuning_curves(ens_neuron, sim)
 
plt.figure()
plt.plot(eval_points, activities)
plt.ylabel("Firing rate (Hz)")
plt.xlabel("Input scalar, x");
cs



0 이상의 값에서 firing rate가 증가하는 neuron이 만들어졌다.


10초의 simulation을 돌려보자


1
2
3
4
5
6
7
8
with nengo.Simulator(model) as sim:
    sim.run(10.0)
 
plt.figure(figsize=(128))
plt.subplot(211)
plt.plot(sim.trange(), sim.data[input_p])
plt.subplot(212)
rasterplot(sim.trange(), sim.data[spike_p])
cs



input은 짝수 초마다 1의 값을 반환하고, neuron은 1의 값을 받아 발화가 잘 일어난다~





참고: https://www.nengo.ai/nengo/examples/advanced/functions_and_tuning_curves.html