2017-01-18 6 views
0

J'utilise le Tensorflow seq2seq tutorial pour jouer avec la traduction automatique. Dire que j'ai formé le modèle pendant un certain temps et déterminer que je veux compléter le vocabulaire original avec de nouveaux mots pour améliorer la qualité du modèle. Y a-t-il un moyen d'interrompre la formation, d'ajouter des mots au vocabulaire, puis de reprendre l'entraînement depuis le dernier point de contrôle? J'ai essayé de le faire, mais quand j'ai commencé une formation à nouveau je suis arrivé cette erreur:Ajouter au vocab pendant Tensorflow seq2seq exécuter

Traceback (most recent call last): 
File "execute.py", line 405, in <module> 
train() 
File "execute.py", line 127, in train 
model = create_model(sess, False) 
File "execute.py", line 108, in create_model 
model.saver.restore(session, ckpt.model_checkpoint_path) 
File "/home/jrthom18/.local/lib/python2.7/site- packages/tensorflow/python/training/saver.py", line 1388, in restore 
{self.saver_def.filename_tensor_name: save_path}) 
File "/home/jrthom18/.local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 766, in run 
run_metadata_ptr) 
File "/home/jrthom18/.local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 964, in _run 
feed_dict_string, options, run_metadata) 
File "/home/jrthom18/.local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 1014, in _do_run 
target_list, options, run_metadata) 
File "/home/jrthom18/.local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 1034, in _do_call 
raise type(e)(node_def, op, message) 
tensorflow.python.framework.errors_impl.InvalidArgumentError: Assign requires shapes of both tensors to match. lhs shape= [384633] rhs shape= [384617] 
[[Node: save/Assign_82 = Assign[T=DT_FLOAT, _class=["loc:@proj_b"], use_locking=true, validate_shape=true, _device="/job:localhost/replica:0/task:0/cpu:0"](proj_b, save/RestoreV2_82)]] 

Caused by op u'save/Assign_82', defined at: 
File "execute.py", line 405, in <module> 
train() 
File "execute.py", line 127, in train 
model = create_model(sess, False) 
File "execute.py", line 99, in create_model 
model = seq2seq_model.Seq2SeqModel(gConfig['enc_vocab_size'], gConfig['dec_vocab_size'], _buckets, gConfig['layer_size'], gConfig['num_layers'], gConfig['max_gradient_norm'], gConfig['batch_size'], gConfig['learning_rate'], gConfig['learning_rate_decay_factor'], forward_only=forward_only) 
File "/home/jrthom18/data/3x256_bs32/easy_seq2seq/seq2seq_model.py", line 166, in __init__ 
self.saver = tf.train.Saver(tf.global_variables(), keep_checkpoint_every_n_hours=2.0) 
File "/home/jrthom18/.local/lib/python2.7/site-packages/tensorflow/python/training/saver.py", line 1000, in __init__ 
self.build() 
File "/home/jrthom18/.local/lib/python2.7/site-packages/tensorflow/python/training/saver.py", line 1030, in build 
restore_sequentially=self._restore_sequentially) 
File "/home/jrthom18/.local/lib/python2.7/site-packages/tensorflow/python/training/saver.py", line 624, in build 
restore_sequentially, reshape) 
File "/home/jrthom18/.local/lib/python2.7/site-packages/tensorflow/python/training/saver.py", line 373, in _AddRestoreOps 
assign_ops.append(saveable.restore(tensors, shapes)) 
File "/home/jrthom18/.local/lib/python2.7/site-packages/tensorflow/python/training/saver.py", line 130, in restore 
self.op.get_shape().is_fully_defined()) 
File "/home/jrthom18/.local/lib/python2.7/site-packages/tensorflow/python/ops/gen_state_ops.py", line 47, in assign 
use_locking=use_locking, name=name) 
File "/home/jrthom18/.local/lib/python2.7/site-packages/tensorflow/python/framework/op_def_library.py", line 759, in apply_op 
op_def=op_def) 
File "/home/jrthom18/.local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 2240, in create_op 
original_op=self._default_original_op, op_def=op_def) 
File "/home/jrthom18/.local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1128, in __init__ 
self._traceback = _extract_stack() 

InvalidArgumentError (see above for traceback): Assign requires shapes of both tensors to match. lhs shape= [384633] rhs shape= [384617] 
[[Node: save/Assign_82 = Assign[T=DT_FLOAT, _class=["loc:@proj_b"], use_locking=true, validate_shape=true, _device="/job:localhost/replica:0/task:0/cpu:0"](proj_b, save/RestoreV2_82)]] 

Il est évident que le nouveau est plus grand vocab et donc la taille des tenseurs ne correspondent pas. Y-a-t-il moyen de faire autrement?

+0

Je pense que vous devez comprendre le fonctionnement d'une séquence au modèle de séquence. Vous ne pouvez pas simplement remplacer le dictionnaire c'est pourquoi c'est toujours un problème ouvert dans le traitement du vocabulaire ouvert pour NMT, jetez un oeil à http://nlp.stanford.edu/projects/nmt/Luong-Cho-Manning-NMT-ACL2016- v4.pdf – alvas

+0

Il y a des discussions/réflexions sur la façon de changer le dictionnaire/vocabulaire à mi-chemin pendant l'entraînement mais il n'y a pas encore de méthode concrète éprouvée. Apparemment, l'état de l'art pour un vocabulaire ouvert consiste à faire un «modèle de pièce de mot» ou un «codage de paire d'octets» avant l'entraînement. Mais une fois le vocabulaire défini, vous ne pouvez pas échanger les mots ou les ajouter facilement à la liste. – alvas

Répondre

0

Vous ne pouvez pas mettre à jour votre vocab une fois qu'il est défini, mais vous pouvez toujours utiliser un modèle de pièce partagée. Il vous aidera à copier directement des mots de vocabulaire de la source de la source à la sortie cible.