-
Notifications
You must be signed in to change notification settings - Fork 2
/
s4-1-2_PoissonEncoder.py
51 lines (41 loc) · 1.62 KB
/
s4-1-2_PoissonEncoder.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
"""
ゼロから学ぶスパイキングニューラルネットワーク
- Spiking Neural Networks from Scratch
Copyright (c) 2020 HiroshiARAKI. All Rights Reserved.
"""
import numpy as np
import matplotlib.pyplot as plt
if __name__ == '__main__':
max_freq = 128 # 最大スパイク周波数 [Hz] = 1秒間 (1000 ms) に何本のスパイクを最大生成するか
time = 300 # 観測時間 [ms]
dt = 0.5 # 時間分解能 [ms]
image = np.random.random((3, 3)) # 適当な画像
freq_img = image * max_freq # pixels to Hz
norm_img = 1000. / freq_img # Hz to ms
norm_img = norm_img.reshape(-1) # 2次元だと扱いが面倒なので1次元に
spikes = [
# 周期が抽出されるのでスパイク発生時間としては累積させなければならない
# とりあえず,今回は約300msに収まる分だけ抽出
np.cumsum(np.random.poisson(cell / dt, (int(time / cell + 1)))) * dt
for cell in norm_img
]
# Plotting
plt.figure(figsize=(10, 4))
# Original Image
plt.subplot(1, 2, 1)
plt.title('original')
plt.imshow(image, cmap='gray')
plt.xticks([])
plt.yticks([])
plt.colorbar()
for num in range(9):
plt.text(int(num % 3), int(num / 3), str(num), color='tab:blue', fontsize=14)
# Spike trains generated by Poisson Encoder
plt.subplot(1, 2, 2)
plt.title('Spike firing timing')
for i, s in enumerate(spikes):
plt.scatter(s, [i for _ in range(len(s))], s=1.0, c='tab:blue')
plt.xlim(0, time)
plt.ylabel('pixel index')
plt.xlabel('time [ms]')
plt.show()