2017-07-10 1 views
0

Ich versuche ein CNN+LSTM+CTC Modell für die Worterkennung zu erstellen.
Zunächst habe ich ein Bild, ich konvertiere die Features extrahiert mit CNN auf Word-Bild und Erstellen einer Sequenz von Features, die ich als sequentielle Daten an RNN übergeben.

Follwing ist, wie ich die Funktionen sequentieller Daten am Umwandlung:
[[a1,b1,c1],[a2,b2,c2],[a3,b3,c3]] -> [[a1,a2,a3],[b1,b2,b3],[c1,c2,c3]]
Wo a,b,c sind 3 extrahierten Merkmale mit CNN.
Derzeit kann ich eine Konstante batch_size an das Modell common.BATCH_SIZE übergeben, aber was ich will, ist die Variable batch_size an das Modell übergeben können.
Wie kann das gemacht werden?Wie `None` Batch-Größe zu Tensorflow dynamische Rnn übergeben?

inputs = tf.placeholder(tf.float32, [common.BATCH_SIZE, common.OUTPUT_SHAPE[1], common.OUTPUT_SHAPE[0], 1]) 
# Here we use sparse_placeholder that will generate a 
# SparseTensor required by ctc_loss op. 
targets = tf.sparse_placeholder(tf.int32) 

# 1d array of size [batch_size] 
seq_len = tf.placeholder(tf.int32, [common.BATCH_SIZE]) 

model = tf.layers.conv2d(inputs, 64, (3,3),strides=(1, 1), padding='same', name='c1') 
model = tf.layers.max_pooling2d(model, (3,3), strides=(2,2), padding='same', name='m1') 
model = tf.layers.conv2d(model, 128,(3,3), strides=(1, 1), padding='same', name='c2') 
model = tf.layers.max_pooling2d(model, (3,3),strides=(2,2), padding='same', name='m2') 
model = tf.transpose(model, [3,0,1,2]) 
shape = model.get_shape().as_list() 
model = tf.reshape(model, [shape[0],-1,shape[2]*shape[3]]) 

cell = tf.nn.rnn_cell.LSTMCell(common.num_hidden, state_is_tuple=True) 
cell = tf.nn.rnn_cell.DropoutWrapper(cell, input_keep_prob=0.5, output_keep_prob=0.5) 
stack = tf.nn.rnn_cell.MultiRNNCell([cell]*common.num_layers, state_is_tuple=True) 

outputs, _ = tf.nn.dynamic_rnn(cell, model, seq_len, dtype=tf.float32,time_major=True) 



UPDATE:

batch_size = tf.placeholder(tf.int32, None, name='batch_size') 

inputs = tf.placeholder(tf.float32, [batch_size, common.OUTPUT_SHAPE[1], common.OUTPUT_SHAPE[0], 1]) 
# Here we use sparse_placeholder that will generate a 
# SparseTensor required by ctc_loss op. 
targets = tf.sparse_placeholder(tf.int32) 

# 1d array of size [batch_size] 
seq_len = tf.placeholder(tf.int32, [batch_size]) 

model = tf.layers.conv2d(inputs, 64, (3,3),strides=(1, 1), padding='same', name='c1') 
model = tf.layers.max_pooling2d(model, (3,3), strides=(2,2), padding='same', name='m1') 
model = tf.layers.conv2d(model, 128,(3,3), strides=(1, 1), padding='same', name='c2') 
model = tf.layers.max_pooling2d(model, (3,3),strides=(2,2), padding='same', name='m2') 
model = tf.transpose(model, [3,0,1,2]) 
shape = model.get_shape().as_list() 
model = tf.reshape(model, [shape[0],-1,shape[2]*shape[3]]) 

cell = tf.nn.rnn_cell.LSTMCell(common.num_hidden, state_is_tuple=True) 
cell = tf.nn.rnn_cell.DropoutWrapper(cell, input_keep_prob=0.5, output_keep_prob=0.5) 
stack = tf.nn.rnn_cell.MultiRNNCell([cell]*common.num_layers, state_is_tuple=True) 

outputs, _ = tf.nn.dynamic_rnn(cell, model, seq_len, dtype=tf.float32,time_major=True) 


Ich erhalte Fehler wie folgt:

Traceback (most recent call last): 
    File "lstm_and_ctc_ocr_train.py", line 203, in <module> 
    train() 
    File "lstm_and_ctc_ocr_train.py", line 77, in train 
    logits, inputs, targets, seq_len, batch_size = model.get_train_model() 
    File "/home/himanshu/learning-tf/tf/code/tensorflow_lstm_ctc_ocr/model.py", line 20, in get_train_model 
inputs = tf.placeholder(tf.float32, [batch_size, common.OUTPUT_SHAPE[1], common.OUTPUT_SHAPE[0], 1]) 
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/array_ops.py", line 1530, in placeholder 
    return gen_array_ops._placeholder(dtype=dtype, shape=shape, name=name) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_array_ops.py", line 1954, in _placeholder 
    name=name) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/op_def_library.py", line 705, in apply_op 
    attr_value.shape.CopyFrom(_MakeShape(value, key)) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/op_def_library.py", line 198, in _MakeShape 
    return tensor_shape.as_shape(v).as_proto() 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/tensor_shape.py", line 798, in as_shape 
    return TensorShape(shape) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/tensor_shape.py", line 434, in __init__ 
    self._dims = [as_dimension(d) for d in dims_iter] 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/tensor_shape.py", line 376, in as_dimension 
    return Dimension(value) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/tensor_shape.py", line 32, in __init__ 
    self._value = int(value) 
TypeError: int() argument must be a string or a number, not 'Tensor' 

Antwort

0

Sie sollten in der Lage sein, 01 passierenzu dynamischem RNN als Platzhalter. Meiner Erfahrung nach sind die einzigen Kopfschmerzen, die Sie möglicherweise haben, wenn Sie seine Form nicht im Voraus angeben, so sollten Sie [] übergeben, um die Dinge funktionieren zu lassen, etwa so:

batchsize = tf.placeholder (tf.int32 , [], name = 'batchsize')

und füttern Sie dann ihren Wert während sess.run() in der üblichen Weise. Dies funktioniert gut für mich beim Training auf einer großen Batch-Größe, aber dann mit der Charge von 1.

generieren Aber genau genommen müssen Sie nicht einmal Batch-Größe für dynamic_rnn speziell angeben, oder? Sie benötigen es, wenn Sie MultiRNNCell verwenden Null-Zustand zu erhalten, aber ich sehe nicht, dass in Ihrem Code zu tun ...

*** UPDATE:

Wie im Kommentar erläutert, Ihr Problem scheint haben nichts mit dynamic_rnn zu tun und mehr mit der Tatsache zu tun, dass Sie einen Platzhalter inputs verwenden, um die Form eines anderen Platzhalters seq_len anzugeben. Hier ist der Code, den gleichen Fehler reproduziert:

import tensorflow as tf 

a = tf.placeholder(tf.int32, None, name='a') 
b = tf.placeholder(tf.int32, [a, 5], name='b') 
c = b * 5 

with tf.Session() as sess: 
    C = sess.run(c, feed_dict={a:1, b:[[1,2,3,4,5]]}) 

Und hier ist der Fehler:

TypeError: int() argument must be a string, a bytes-like object or a number, not 'Tensor' 

Bevor ich auf die Kopfschmerzen von dynamic_rnn bekommen, würde ich empfehlen, einen Weg, um diese zu finden, entweder durch Ihren Code zu ändern oder indem Sie eine separate Frage stellen, wie Sie es mit Platzhaltern täuschen können.

+0

Ich habe versucht, was Sie vorgeschlagen, ich bekomme immer noch den Fehler, wie in der aktualisierten Frage – lordzuko

+0

erwähnt Der Grund, warum ich eine feste 'Batch_size' setzen musste, ist, weil ich Bilddaten in sequenzielle Daten umwandeln, so dass ich 't tun Modell = tf.Umformen (Modell, [shape [0], - 1, shape [2] * shape [3]]) ', also wenn ich' None' in 'batch_size' setze, bekomme ich etwas, da man ganzzahl nicht mit multiplizieren kann Keine – lordzuko

+0

Wenn Sie Ihren aktualisierten Beitrag und den Fehler-Stack betrachten, denke ich, dass das Problem nichts mit dynamic_rnn zu tun hat. Ich denke, das Problem ist, dass Sie einen Platzhalter (Eingaben) in der Spezifikation der Form eines anderen Platzhalters (seq_len) bereitstellen. Ich werde meine Antwort aktualisieren, um Ihnen den minimalen Code zu zeigen, der diesen Fehler reproduzieren kann. Ich bin mir nicht sicher, wie ich das umgehen soll, vielleicht können Sie die Logik Ihres Codes irgendwie ändern, um diesen Wert anderweitig zu nutzen. Es wäre wahrscheinlich am besten, eine separate Frage speziell dafür zu stellen - Sie werden eher eine Antwort bekommen. Überprüfen Sie meine aktualisierte Antwort für den Code –

Verwandte Themen