我正在尝试在tensorflow中实现STDP(峰值时间相关塑性)。有点复杂。有什么想法(完全在张量流图中运行)?在
它是这样工作的:假设我有2个输入神经元,它们通过这个矩阵连接到3个输出神经元:[[1.0, 1.0, 0.0], [0.0, 0.0, 1.0]]
(输入神经元0连接到输出神经元0和1…)。在
假设输入神经元有这些峰值(2个神经元,7个时间步):
Input Spikes:
[[0, 0, 1, 1, 0, 1, 0],
[1, 1, 0, 0, 0, 0, 1]]
输出神经元的这些峰值(3个神经元,7个时间步):
^{pr2}$现在,对于每个非零权重,我要计算一个dw。例如,对于连接到输出神经元0的输入神经元0:
输入神经元0的峰值时间戳是[2, 3, 5]
,输出神经元0的时间戳是[3, 6]
。现在,我计算所有的增量时间:
Delta Times = [ 2-3, 2-6, 3-3, 3-6, 5-3, 5-6 ] = [ -1, -4, 0, -3, 2, -1 ]
然后,我计算了一些函数(实际的STDP函数,对于这个问题来说并不重要——一些指数函数)
dw = SUM [ F(-1), F(-4), F(0), F(-3), F(2), F(-1) ]
这是连接输入神经元0和输出神经元0的权重的dw。对所有非零权重重复此操作。在
所以我可以在numpy中完成所有这些,但是我希望能够完全在一个张量流图中完成。尤其是,我一直在计算delta时间。以及如何对所有非零权重并行地执行这些操作。在
这是实际的stdp函数btw(常数可以是参数):
def stdp_f(x):
return tf.where(
x == 0, np.zeros(x.shape), tf.where(
x > 0, 1.0 * tf.exp(-1.0 * x / 10.0), -1.0 * 1.0 * tf.exp(x / 10.0)))
关于性能的一点说明:下面@jdehesa给出的方法既正确又聪明。但结果也很慢。特别是,对于一个由784个输入神经元组成的神经网络,在500多个时间步中,spike_match =
步执行(784,1500,1)和(1400,1500)张量的乘法。在
我不熟悉STDP,所以我希望我能正确理解你的意思。我想这就是你所描述的:
这里我假设
f
可能很昂贵(而且它的值对于每对神经元都是相同的),所以我只为每个可能的时间增量计算一次,然后在矩阵中重新分配计算的值,这样我就可以在发生输入和输出峰值的坐标对上进行乘法。在我使用
f
的identity函数作为占位符,因此结果值实际上只是本例中时间差的总和。在编辑:仅供参考,将
^{pr2}$f
替换为包含的STDP函数:结果是:
相关问题 更多 >
编程相关推荐