2016-10-22 6 views
0

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

Вход в мою сеть rnn - это цифровые аудиофайлы. Поскольку аудиофайл может иметь разную длину, будет ли вектор сэмплированного аудио также иметь разную длину.

Выход или цель нейронной сети заключается в воссоздании 14-мерного вектора, содержащего определенную информацию аудиофайлов. Я уже знаю цель, вручную вычислив ее, но нужно заставить ее работать с нейронной сетью.

В настоящее время я использую shadoworflow в качестве рамки.

Моя установка сети выглядит следующим образом:

def last_relevant(output): 
    max_length = int(output.get_shape()[1]) 
    relevant = tf.reduce_sum(tf.mul(output, tf.expand_dims(tf.one_hot(length, max_length), -1)), 1) 
    return relevant 

def length(sequence): ##Zero padding to fit the max lenght... Question whether that is a good idea. 
    used = tf.sign(tf.reduce_max(tf.abs(sequence), reduction_indices=2)) 
    length = tf.reduce_sum(used, reduction_indices=1) 
    length = tf.cast(length, tf.int32) 
    return length 

def cost(output, target): 
    # Compute cross entropy for each frame. 
    cross_entropy = target * tf.log(output) 
    cross_entropy = -tf.reduce_sum(cross_entropy, reduction_indices=2) 
    mask = tf.sign(tf.reduce_max(tf.abs(target), reduction_indices=2)) 
    cross_entropy *= mask 
    # Average over actual sequence lengths. 
    cross_entropy = tf.reduce_sum(cross_entropy, reduction_indices=1) 
    cross_entropy /= tf.reduce_sum(mask, reduction_indices=1) 
    return tf.reduce_mean(cross_entropy) 
#----------------------------------------------------------------------# 
#----------------------------Main--------------------------------------# 
### Tensorflow neural network setup 

batch_size = None 
sequence_length_max = max_length 
input_dimension=1 

data = tf.placeholder(tf.float32,[batch_size,sequence_length_max,input_dimension]) 
target = tf.placeholder(tf.float32,[None,14]) 

num_hidden = 24 ## Hidden layer 
cell = tf.nn.rnn_cell.LSTMCell(num_hidden,state_is_tuple=True) ## Long short term memory 

output, state = tf.nn.dynamic_rnn(cell, data, dtype=tf.float32,sequence_length = length(data)) ## Creates the Rnn skeleton 

last = last_relevant(output)#tf.gather(val, int(val.get_shape()[0]) - 1) ## Appedning as last 

weight = tf.Variable(tf.truncated_normal([num_hidden, int(target.get_shape()[1])])) 
bias = tf.Variable(tf.constant(0.1, shape=[target.get_shape()[1]])) 

prediction = tf.nn.softmax(tf.matmul(last, weight) + bias) 

cross_entropy = cost(output,target)# How far am I from correct value? 

optimizer = tf.train.AdamOptimizer() ## TensorflowOptimizer 
minimize = optimizer.minimize(cross_entropy) 

mistakes = tf.not_equal(tf.argmax(target, 1), tf.argmax(prediction, 1)) 
error = tf.reduce_mean(tf.cast(mistakes, tf.float32)) 

## Training ## 

init_op = tf.initialize_all_variables() 
sess = tf.Session() 
sess.run(init_op) 

    batch_size = 1000 
    no_of_batches = int(len(train_data)/batch_size) 
    epoch = 5000 
    for i in range(epoch): 
     ptr = 0 
     for j in range(no_of_batches): 
      inp, out = train_data[ptr:ptr+batch_size], train_output[ptr:ptr+batch_size] 
      ptr+=batch_size 
      sess.run(minimize,{data: inp, target: out}) 
     print "Epoch - ",str(i) 
    incorrect = sess.run(error,{data: test_data, target: test_output}) 
    print('Epoch {:2d} error {:3.1f}%'.format(i + 1, 100 * incorrect)) 
    sess.close() 

ошибка, как представляется, использование функции last_relevant, который должен взять на себя выход, и кормить его обратно.

Это сообщение об ошибке:

TypeError: Expected binary or unicode string, got <function length at 0x7f846594dde8> 

Во всяком случае, чтобы сказать, что может быть не так?

+0

Вы определили длину как функция. Затем вы передаете его tf.one_hot. Вы делаете это намеренно? –

+0

yes ... Чтобы замаскировать соответствующую часть из неуправляемой. Длина дает мне длину, а max_length имеет длину –

ответ

1

Я попытался создать свой код в своем локальном. Существует фундаментальная ошибка в коде, который является то, что вы называете tf.one_hot но то, что вы передаете на самом деле не соответствует тому, что, как ожидается:

Читайте документацию здесь: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/g3doc/api_docs/python/functions_and_classes/shard6/tf.one_hot.md

tf.one_hot(indices, depth, on_value=None, off_value=None, axis=None, dtype=None, name=None) 

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

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

relevant = tf.reduce_sum(
     tf.mul(output, tf.expand_dims(tf.one_hot([], max_length), -1)), 1) 
Смежные вопросы