2017-07-14 1 views
0

Ich versuche derzeit, meinen Tensorflow-Klassifikator anzupassen, der in der Lage ist, eine Folge von Wörtern positiv oder negativ zu markieren, um viel längere Sequenzen ohne Umschulung zu verarbeiten. Mein Modell ist ein RNN mit einer maximalen Sequenzlänge von 210. Eine Eingabe ist ein Wort (300 dim), ich habe die Wörter mit Googles word2vec vektorisiert, so dass ich eine Sequenz mit maximal 210 Wörtern füttern kann. Jetzt ist meine Frage, wie kann ich die maximale Sequenzlänge auf beispielsweise 3000 ändern, um Filmkritiken zu klassifizieren.Wie kann ich die maximale Sequenzlänge in einem Tensorflow RNN Modell ändern?

Mein Arbeitsmodell mit fester max Sequenzlänge von 210 (tf_version: 1.1.0):

n_chunks = 210 
chunk_size = 300 

x = tf.placeholder("float",[None,n_chunks,chunk_size]) 
y = tf.placeholder("float",None) 
seq_length = tf.placeholder("int64",None) 


with tf.variable_scope("rnn1"): 
     lstm_cell = tf.contrib.rnn.LSTMCell(rnn_size, 
              state_is_tuple=True) 

     lstm_cell = tf.contrib.rnn.DropoutWrapper (lstm_cell, 
                input_keep_prob=0.8) 

     outputs, _ = tf.nn.dynamic_rnn(lstm_cell,x,dtype=tf.float32, 
             sequence_length = self.seq_length) 

fc = tf.contrib.layers.fully_connected(outputs, 1000, 
             activation_fn=tf.nn.relu) 

output = tf.contrib.layers.flatten(fc) 

#*1 
logits = tf.contrib.layers.fully_connected(output, self.n_classes, 
              activation_fn=None) 

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits 
             (logits=logits, labels=y)) 
optimizer = tf.train.AdamOptimizer(learning_rate=0.01).minimize(cost) 

... 
#train 
#train_x padded to fit(batch_size*n_chunks*chunk_size) 
sess.run([optimizer, cost], feed_dict={x:train_x, y:train_y, 
                seq_length:seq_length}) 
#predict: 
... 

pred = tf.nn.softmax(logits) 
pred = sess.run(pred,feed_dict={x:word_vecs, seq_length:sq_l}) 

Welche Änderungen habe ich schon versucht:

1 Auswechseln n_chunks mit None und einfach Daten-Feed in

x = tf.placeholder(tf.float32, [None,None,300]) 
#model fails to build 
#ValueError: The last dimension of the inputs to `Dense` should be defined. 
#Found `None`. 
# at *1 

... 
#all entrys in word_vecs still have got the same length for example 
#3000(batch_size*3000(!= n_chunks)*300) 
pred = tf.nn.softmax(logits) 
pred = sess.run(pred,feed_dict={x:word_vecs, seq_length:sq_l}) 

2 Ändern x und dann das alte Modell wiederherzustellen:

x = tf.placeholder(tf.float32, [None,n_chunks*10,chunk_size] 
... 
saver = tf.train.Saver(tf.all_variables(), reshape=True) 
saver.restore(sess,"...") 
#fails as well: 
#InvalidArgumentError (see above for traceback): Input to reshape is a 
#tensor with 420000 values, but the requested shape has 840000 
#[[Node: save/Reshape_5 = Reshape[T=DT_FLOAT, Tshape=DT_INT32, 
#_device="/job:localhost/replica:0/task:0/cpu:0"](save/RestoreV2_5, 
#save/Reshape_5/shape)]] 

# run prediction 

Wenn es möglich ist, können Sie mir bitte irgendein Arbeitsbeispiel geben oder mir erklären, warum es nicht ist?

Antwort

0

Ich frage mich nur, warum Sie nicht nur den n_chunk einen Wert von 3000 zuweisen?

In Ihrem ersten Versuch können Sie zwei None nicht verwenden, da tf nicht wie viele Dimensionen für jeden einzelnen eingeben können. Die erste Dimension wird als Keine festgelegt, da sie von der Stapelgröße abhängig ist. In Ihrem zweiten Versuch ändern Sie nur einen Ort, und die anderen Orte, an denen n_chunks verwendet wird, können mit dem Platzhalter x kollidieren.

+0

Danke für Ihre Antwort, ich habe n_chunks nicht auf 3000 gesetzt, weil es nicht für das Training notwendig ist, da die maximale Seq-Länge 210 ist. Wenn ich n_chunks auf 3000 setze, muss ich alle meine Eingaben mit 0 vecs füllen, damit sie passen , so würde der Trainingsprozess extrem rechenintensiv werden und ich müsste wieder von vorne anfangen, wenn ich eine Sequenz hätte, die n_chunks übersteigt. Bei meinem zweiten Versuch habe ich die anderen Plätze gewechselt, wo auch n_chunks reinkommt, habe ich vergessen es zu erwähnen. – Tobi

Verwandte Themen