2016-10-08 5 views
1

Я делаю первые шаги по изучению ТФ и испытываю трудности с RNN.Тренировка тренировки RNN Tensorflow

Моя проблема с игрушкой выглядит так: двухслойная сеть LSTM + с плотным слоем питается необработанными аудиоданными и должна проверять, присутствует ли какая-либо частота в звуке.

поэтому сеть должна 1 до 1 карта с плавающей точкой (аудио последовательность данных), чтобы плавать (предварительно подобранный объем частоты)

Я получил эту работу на Keras и видел подобное решение TFLearn, но хотелось бы реализуйте это на голом Tensorflow относительно эффективным способом.

, что я сделал:

lstm = rnn_cell.BasicLSTMCell(LSTM_SIZE,state_is_tuple=True,forget_bias=1.0) 
lstm = rnn_cell.DropoutWrapper(lstm) 
stacked_lstm = rnn_cell.MultiRNNCell([lstm] * 2,state_is_tuple=True) 
outputs, states = rnn.dynamic_rnn(stacked_lstm, in, dtype=tf.float32) 
outputs = tf.transpose(outputs, [1, 0, 2]) 
last = tf.gather(outputs, int(outputs.get_shape()[0]) - 1) 
network= tf.matmul(last, W) + b 

# cost function, optimizer etc... 

во время тренировки я кормил с (BATCH_SIZE, SEQUENCE_LEN, 1) партии и, кажется, потеря правильно сходились, но я не могу понять, как предсказать, обученной сети.

Вопросы (0): Как я могу заставить эту сеть возвращать последовательность справа от Tensorflow, не возвращаясь к python для каждого образца (кормить последовательность и прогнозировать последовательность того же размера)?

Если я хочу предсказать один образец за раз и повторить в python, что это правильный способ сделать это?

Во время тестирования требуется dynamic_rnn или он используется только для разворачивания для BPTT во время обучения? почему dynamic_rnn возвращает все обратные интервалы распространения тензоров? это выходы каждого уровня разворачиваемой сети?

ответ

0

после некоторых исследований:

как я сделать эту сеть возвращает последовательность прямо из Tensorflow , не возвращаясь к питону для каждого образца (кормить последовательность и предсказать последовательность того же размера)?

вы можете использовать state_saving_rnn

class Saver(): 
def __init__(self): 
    self.d = {} 
def state(self, name): 
    if not name in self.d: 
     return tf.zeros([1,LSTM_SIZE],tf.float32) 
    return self.d[name] 
def save_state(self, name, val): 
    self.d[name] = val 
    return tf.identity('save_state_name') #<-important for control_dependencies 

outputs, states = rnn.state_saving_rnn(stacked_lstm, inx, Saver(), 
             ('lstmstate', 'lstmstate2', 'lstmstate3', 'lstmstate4'),sequence_length=[EVAL_SEQ_LEN]) 
#4 states are for two layers of lstm each has hidden and CEC variables to restore 
network = [tf.matmul(outputs[-1], W) for i in xrange(EVAL_SEQ_LEN)] 

одна проблема в том, что state_saving_rnn использует РНН() и не dynamic_rnn(), поэтому разворачивать во время компиляции EVAL_SEQ_LEN шаги, которые вы можете повторно реализовать state_saving_rnn с dynamic_rnn, если вы хотите ввести длинные последовательности

Если я хочу предсказать один образец за раз и повторить в python, что это правильный способ сделать это?

Вы можете использовать dynamic_rnn и указать initial_state. это, вероятно, так же эффективно, как state_saving_rnn. посмотрите на реализацию state_saving_rnn для справки

Во время тестирования требуется dynamic_rnn или он используется только для разворачивания для BPTT во время обучения? почему dynamic_rnn возвращает все обратные интервалы распространения тензоров? это выходы каждого уровня разворачиваемой сети?

dynamic_rnn выполняет разворачивание во время выполнения аналогично времени компиляции rnn().Я думаю, он возвращает все шаги для того, чтобы вы могли развернуть граф в некоторых других местах - после меньших временных шагов. в сети, которые используют [одноразовый входной сигнал * текущее состояние -> один выход, новое состояние], как описано выше, он не требуется при тестировании, но может использоваться для обучения усеченного времени обратного распространения

Смежные вопросы