RNN в генеративном режиме с Theano (операция сканирования)

У меня есть вопрос относительно моей реализации RNN.

У меня есть следующий код

def one_step(x_t, h_tm1, W_ih, W_hh, b_h, W_ho, b_o):  

    h_t = T.tanh(

                theano.dot(x_t, W_ih) +

                theano.dot(h_tm1, W_hh) +

                b_h

            )

    y_t = theano.dot(h_t, W_ho) + b_o

    return [h_t, y_t]


n_hid = 3
n_in  = 1
n_out = 1


W_hh_values = np.array(np.random.uniform(size=(n_hid, n_hid), low=-.01, high=.01), dtype=dtype)
W_hh2_values = np.array(np.random.uniform(size=(n_hid, n_hid), low=-.01, high=.01), dtype=dtype)
h0_value = np.array(np.random.uniform(size=(n_hid), low=-.01, high=.01), dtype=dtype)
b_h_value = np.array(np.random.uniform(size=(n_hid), low=-.01, high=.01), dtype=dtype)
b_h2_value = np.array(np.random.uniform(size=(n_hid), low=-.01, high=.01), dtype=dtype)
W_ih_values = np.array(np.random.uniform(size=(n_in, n_hid), low=-.01, high=.01), dtype=dtype)
W_ho_values = np.array(np.random.uniform(size=(n_hid, n_out), low=-.01, high=.01), dtype=dtype)
b_o_value = np.array(np.random.uniform(size=(n_out), low=-.01, high=.01), dtype=dtype)


# parameters of the rnn
b_h = theano.shared(b_h_value)
b_h2 = theano.shared(b_h_value)
h0 = theano.shared(h0_value)
W_ih = theano.shared(W_ih_values)
W_hh = theano.shared(W_hh_values)
W_hh2 = theano.shared(W_hh_values)
W_ho = theano.shared(W_ho_values)
b_o = theano.shared(b_o_value)

params = [W_ih, W_hh, b_h, W_ho, b_o, h0]

# target values
t = T.matrix(dtype=dtype)


# hidden and outputs of the entire sequence
[h_vals, y_vals], _ = theano.scan(fn=one_step,
                           sequences = dict(input = x, taps=10),
                           outputs_info = [h0, None], # corresponds to the return type of one_step
                           non_sequences = [W_ih, W_hh, b_h, W_ho, b_o]
                        )

learn_rnn_fn = theano.function([],
                        outputs = cost,
                        updates = updates,
                        givens = {
                           x: s_,
                           t: t_
                        }
              )

Теперь после обучения я мог предсказать вывод курса как таковой:

test_rnn_fn = theano.function([],
               outputs = y_vals,
                       givens = {x: s_2}
              )

Однако это запускает сеть в прогнозирующем режиме (т. е. делает X шагов ввода и прогнозирует вывод). Я хотел бы запустить это в генеративном режиме, что означает, что я хочу начать с начального состояния и запустить RNN для любого произвольного количества шагов и вернуть его вывод в качестве ввода.

Как я мог это сделать?

Спасибо!


person KennyV    schedule 07.12.2014    source источник


Ответы (1)


Вы можете запустить сканирование с произвольным количеством шагов, используя параметр n_steps. Чтобы передать y_t следующему вычислению - и предполагая x_t.shape == y_t.shape - вы можете использовать outputs_info=[h0, x_t] в качестве аргумента для сканирования и изменения ступенчатой ​​функции на one_step(h_tm1, y_tm1, W_ih, W_hh, b_h, W_ho, b_o)

С помощью theano.scan_module.until() можно было бы создать более сложные критерии завершения, но это вопрос дизайна, а не реализации. Примеры см. здесь.

person user2805751    schedule 09.12.2014