コード例 #1
0
 def train(self, n_epochs=6):
     print("Training RNN-based generator ...")
     with tf.Session(config=tf.ConfigProto(
             log_device_placement=True)) as session:
         self._initialize_session(session)
         try:
             for epoch in range(n_epochs):
                 batch_no = 0
                 for keywords, contexts, sentences \
                         in batch_train_data(_BATCH_SIZE):
                     sys.stdout.write("[Seq2Seq Training] epoch = %d, " \
                             "line %d to %d ..." %
                             (epoch, batch_no * _BATCH_SIZE,
                             (batch_no + 1) * _BATCH_SIZE))
                     sys.stdout.flush()
                     self._train_a_batch(session, epoch, keywords, contexts,
                                         sentences)
                     batch_no += 1
                     # if 0 == batch_no % 32:
                     #     with open('save/check_epoch', 'a+') as file:
                     #         file.write('{}-{}\n'.format(epoch, batch_no))
                     #     self.saver.save(session, _model_path)
                 with open('save/check_epoch', 'a+') as file:
                     file.write('{}\n'.format(epoch))
                 self.saver.save(session, _model_path)
             print("Training is done.")
         except KeyboardInterrupt:
             print("Training is interrupted.")
コード例 #2
0
 def train(self, epoch, mode, phase, data_mode=-1, data_phase=-1, seq=-1):
     if data_mode == -1:
         data_mode = mode
         data_phase = phase
     # keyword_id, keyword_length, context_id, context_length, label_id
     with tf.Session() as sess:
         sess.run(tf.global_variables_initializer())
         model_path_l = model_load_path[mode]
         model_path_s = model_save_path[mode]
         saver = tf.train.Saver(max_to_keep=5, sharded=False)
         try:
             saver.restore(sess, tf.train.latest_checkpoint(model_path_s))
         except:
             print('mode not found')
             model_load_path[mode] = model_path_s
         for i in range(epoch):
             # time.sleep(10)
             print(f'begin epoch {i}')
             for keywords, ground_truth, contexts, sentences in batch_train_data(
                     BATCH_SIZE, data_mode, data_phase):
                 keyword_id, keyword_length = self.get_id_length(keywords)
                 ground_truth_id, _ = self.get_id_length(ground_truth)
                 context_id, context_length = self.get_id_length(contexts)
                 label_id, _ = self.get_id_length(sentences)
                 _, loss = sess.run(
                     (self.train_op, self.loss),
                     feed_dict={
                         self.keyword_id: keyword_id,
                         self.keyword_length: keyword_length,
                         self.decoder_input_id: ground_truth_id,
                         self.context_id: context_id,
                         self.label_id: label_id,
                         self.context_length: context_length,
                     })
             if (i + 1) % 5 == 0:
                 time.sleep(30)
                 with open(result_save_path[mode] + '/loss.txt', 'a') as f:
                     f.write(f'{i}\t{loss}\n')
                 print(loss)
                 saver.save(sess,
                            model_save_path[mode] + f'/{seq}_{i}',
                            global_step=i + 1)
                 poem = self.generate(['春', '秋', '冬', '夏'], i,
                                      result_save_path[mode],
                                      model_save_path[mode], f'{seq}_{i}')
                 print(poem)
                 with open(result_save_path[mode] + '/poem.txt', 'a') as f:
                     f.write(poem + '\n')
コード例 #3
0
 def train(self, n_epochs):
     print("Training RNN-based generator ...")
     try:
         for epoch in range(n_epochs):
             batch_no = 0
             for keywords, contexts, sentences in batch_train_data(
                     _BATCH_SIZE):
                 sys.stdout.write(
                     "[Seq2Seq Training] epoch = %d, line %d to %d ..." %
                     (epoch, batch_no * _BATCH_SIZE,
                      (batch_no + 1) * _BATCH_SIZE))
                 sys.stdout.flush()
                 self._train_a_batch(keywords, contexts, sentences)
                 batch_no += 1
                 if 0 == batch_no % 32:
                     self.manager.save()
             self.manager.save()
         print("Training is done.")
     except KeyboardInterrupt:
         print("Training is interrupted.")
コード例 #4
0
def train(n_epochs=6):
    funcutils = FuncUtils()
    generator = Generator()

    tf.summary.scalar('accuracy', generator.loss)  # 生成准确率标量图
    tf.summary.scalar('lr', generator.lr)  # 生成准确率标量图
    merge_summary = tf.summary.merge_all()

    batch_no = 0
    saver = tf.train.Saver()
    tf_config = tf.ConfigProto()
    tf_config.gpu_options.allow_growth = True
    loss_best = 1000
    with tf.Session(config=tf_config) as sess:

        train_writer = tf.summary.FileWriter(
            _logwriter_dir, sess.graph)  #定义一个写入summary的目标文件,dir为写入文件地址

        generator.initialize_session(sess, saver)
        for epoch_iter in range(n_epochs):
            # print('epoch_iter\t{}'.format(epoch_iter))
            for keywords, contexts, sentences in batch_train_data(_BATCH_SIZE):
                # print('-4-'*5)
                if batch_no % 32 == 0:
                    # print('len(poems_set)==>',len(poems_set))
                    print_onehot, logits, lr, loss, summary_value = _train_a_batch(
                        funcutils, generator, sess, epoch_iter, keywords,
                        contexts, sentences, merge_summary)
                    train_writer.add_summary(summary_value, batch_no)
                    print('epoch\t{}\tloss\t{}lr\t{}'.format(
                        epoch_iter, loss, lr))
                    # print('print_onehot==>',print_onehot)
                    # print('logits==>',logits)
                    if loss < loss_best:
                        saver.save(sess, _model_path)
                        loss_best = loss

                batch_no += 1
コード例 #5
0
 def train(self, n_epochs=6):
     print("Training RNN-based generator ...")
     with tf.Session() as session:
         self._initialize_session(session)
         try:
             for epoch in range(n_epochs):
                 batch_no = 0
                 for keywords, contexts, sentences \
                         in batch_train_data(_BATCH_SIZE):
                     sys.stdout.write("[Seq2Seq Training] epoch = %d, " \
                             "line %d to %d ..." %
                             (epoch, batch_no * _BATCH_SIZE,
                             (batch_no + 1) * _BATCH_SIZE))
                     sys.stdout.flush()
                     self._train_a_batch(session, epoch, keywords, contexts,
                                         sentences)
                     batch_no += 1
                     if 0 == batch_no % 32:
                         self.saver.save(session, _model_path)
                 self.saver.save(session, _model_path)
             print("Training is done.")
         except KeyboardInterrupt:
             print("Training is interrupted.")
コード例 #6
0
import argparse
from train import train
from infer import generate_control
from char2vec import Char2Vec
from char_dict import CharDict
from poems import Poems
from data_utils import batch_train_data
from rank_words import RankedWords
if __name__=='__main__':
    arguementparser=argparse.ArgumentParser(description='chinese poem generation')
    arguementparser.add_argument('-t',action='store_true',dest='train',default=False)
    arguementparser.add_argument('-p',action='store_true',dest='pretrain',default=False)
    arguementparser.add_argument('-i',action='store_true',dest='infer',default=False)
    # arguementparser.add_argument('-p', dest = 'planner', default = False,action = 'store_true',
    #                              help = 'train planning model')
    args=arguementparser.parse_args()
    # print('args==>',args)
    if args.train:
        print('进入训练阶段')
        train(n_epochs=1000)
    elif args.pretrain:
        print('进入预训练阶段')
        CharDict()
        RankedWords()
        Char2Vec()
        Poems()
        batch_train_data(32)
    elif args.infer:
        print('进入测试阶段')
        generate_control()