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?
Sie definierte Länge als Funktion festgelegt werden. Dann übergeben Sie es an tf.one_hot. Machst du das bewusst? –
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 –