2016-10-22 5 views
0

Ich versuche gerade, dieses RNN-Netzwerk zu trainieren, aber es scheint in seltsame Fehler zu kommen, die ich nicht entschlüsseln kann.Tensorflow RNN Training wird nicht ausgeführt?

Der Eingang zu meinem RNN-Netzwerk ist digital gesampelte Audiodateien. Da die Audiodatei eine unterschiedliche Länge haben kann, wird der Vektor des abgetasteten Audios auch unterschiedliche Längen haben.

Die Ausgabe oder das Ziel des neuronalen Netzwerks besteht darin, einen 14-dimensionalen Vektor mit bestimmten Informationen der Audiodateien neu zu erstellen. Ich kenne das Ziel bereits, indem ich es manuell berechne, aber ich muss es mit einem neuronalen Netzwerk arbeiten lassen.

Ich verwende derzeit Tensorflow als Framework.

Mein Netzwerk-Setup sieht wie folgt aus:

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() 

Der Fehler scheint die Verwendung der Funktion last_relevant zu sein, der den Ausgang nehmen sollte, und führen Sie es zurück.

Dies ist die Fehlermeldung:

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

Wie auch immer zu sagen, was hier falsch sein könnte?

+0

Sie definierte Länge als Funktion festgelegt werden. Dann übergeben Sie es an tf.one_hot. Machst du das bewusst? –

+0

ja ... Um den relevanten Teil von dem nicht relevanten zu maskieren. Länge gib mir die Länge, und max_length hat die volle Länge –

Antwort

1

Ich habe versucht, Ihren Code in meinem lokalen zu bauen. Es gibt einen fundamentalen Fehler im Code, dass Sie tf.one_hot nennen, ist aber, was Sie passieren wirklich nicht passen mit dem, was erwartet wird:

lesen Dokumentation hier: 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) 

jedoch Sie übergeben einen Funktionszeiger ("length" ist eine Funktion in Ihrem Code, ich empfehle Ihnen, Ihre Funktion sinnvoll zu benennen, indem Sie sich von der Verwendung allgemeiner Schlüsselwörter abwenden) anstelle des ersten Parameters.

Für einen wilden Führer, können Sie Ihren Indizes als erster param (statt meiner Platzhalter leere Liste) gesetzt und es wird

relevant = tf.reduce_sum(
     tf.mul(output, tf.expand_dims(tf.one_hot([], max_length), -1)), 1)