Как реализовать stdp в тензорном потоке?

Этот код работает для меня: я устанавливаю значения с INSERT и получаю LAST_INSERT_ID () этого значения с SELECT; Я использую java NetBeans 8.1, MySql и java.JDBC.driver

                try {

        String Query = "INSERT INTO `stock`(`stock`, `min_stock`,   
                `id_stock`) VALUES ("

                + "\"" + p.get_Stock().getStock() + "\", "
                + "\"" + p.get_Stock().getStockMinimo() + "\","
                + "" + "null" + ")";

        Statement st = miConexion.createStatement();
        st.executeUpdate(Query);

        java.sql.ResultSet rs;
        rs = st.executeQuery("Select LAST_INSERT_ID() from stock limit 1");                
        rs.next(); //para posicionar el puntero en la primer fila
        ultimo_id = rs.getInt("LAST_INSERT_ID()");
        } catch (SqlException ex) { ex.printTrace;}
2
задан Scotty1- 6 March 2019 в 14:48
поделиться

1 ответ

Я не знаком с 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 ]]
0
ответ дан jdehesa 6 March 2019 в 14:48
поделиться
Другие вопросы по тегам:

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