Дерево сегмента [закрытая] реализация Java

Я не знаком с STDP, поэтому надеюсь, что правильно понял, что вы имели в виду. Я думаю, что это делает то, что вы описываете:

import tensorflow as tf

def f(x):
    # STDP function
    return x * 1

def stdp(input_spikes, output_spikes):
    input_shape = tf.shape(input_spikes)
    t = input_shape[-1]
    # Compute STDP function for all possible time difference values
    stdp_values = f(tf.cast(tf.range(-t + 1, t), dtype=input_spikes.dtype))
    # Arrange in matrix such that position [i, j] contains f(i - j)
    matrix_idx = tf.expand_dims(tf.range(t - 1, 2 * t - 1), 1) + tf.range(0, -t, -1)
    stdp_matrix = tf.gather(stdp_values, matrix_idx)
    # Find spike matches
    spike_match = (input_spikes[:, tf.newaxis, :, tf.newaxis] *
                   output_spikes[tf.newaxis, :, tf.newaxis, :])
    # Sum values where there are spike matches
    return tf.reduce_sum(spike_match * stdp_matrix, axis=(2, 3))

# Test
input_spikes = [[0, 0, 1, 1, 0, 1, 0],
                [1, 1, 0, 0, 0, 0, 1]]
output_spikes = [[0, 0, 0, 1, 0, 0, 1],
                 [1, 0, 0, 0, 0, 0, 0],
                 [0, 0, 0, 0, 1, 1, 1]]
with tf.Graph().as_default(), tf.Session() as sess:
    ins = tf.placeholder(tf.float32, [None, None])
    outs = tf.placeholder(tf.float32, [None, None])
    res = stdp(ins, outs)
    res_val = sess.run(res, feed_dict={ins: input_spikes, outs: output_spikes})
    print(res_val)
    # [[ -7.  10. -15.]
    #  [-13.   7. -24.]]

Здесь я предполагаю, что f, вероятно, дорого (и что его значение одинаково для каждой пары нейронов), поэтому я вычисляю его только один раз для каждого возможная дельта времени, а затем перераспределить вычисленные значения в матрице, так что я могу умножить на пары координат, где происходят пики ввода и вывода.

Я использовал функцию тождества для f в качестве заполнителя, поэтому полученные значения на самом деле являются просто суммой временных различий в этом случае.

РЕДАКТИРОВАТЬ: просто для справки, заменив f на функцию STDP, которую вы включили:

def f(x):
    return tf.where(x == 0,
                    tf.zeros_like(x),
                    tf.where(x > 0,
                             1.0 * tf.exp(-1.0 * x / 10.0),
                             -1.0 * 1.0 * tf.exp(x / 10.0)))

Результат:

[[-3.4020822   2.1660795  -5.694256  ]
 [-2.974073    0.45364904 -3.1197631 ]]
13
задан avim 29 March 2015 в 21:59
поделиться

1 ответ

This has been implemented within the open source Layout Management SW Package project

Here is a link to the sub package

You might find the code useful. I have neither verified it nor run it and I cannot find the license the code is provided under from a quick search of the code and website so Caveat Emptor.

You may be able to contact the authors but the last activity appears to have been August 2008.

3
ответ дан 2 December 2019 в 00:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: