Esempio n. 1
0
    def train(self, session):
        """
        模型训练函数
        :param session: 
        :return: 
        """

        training_set = SequenceData(filename=self.conf.training_data, max_seq_len=self.seq_max_len)
        for step in range(1, self.conf.training_steps + 1):
            batch_x, batch_y, batch_seqlen = training_set.next(self.conf.batch_size)
            # Run optimization op (backprop)
            session.run(self.optimizer_op,
                        feed_dict={self.X: batch_x, self.Y: batch_y,
                                   self.seqlen: batch_seqlen,
                                   self.dropout_keep_prob: self.conf.dropout_keep_prob})
            if step % self.conf.display_steps == 0 or step == 1:
                # Calculate batch accuracy & loss
                acc, loss = session.run([self.accuracy_op, self.loss_op],
                                        feed_dict={self.X: batch_x, self.Y: batch_y,
                                                   self.seqlen: batch_seqlen,
                                                   self.dropout_keep_prob: self.conf.dropout_keep_prob})
                print("Step " + str(step) + ", Minibatch Loss= " + \
                      "{:.6f}".format(loss) + ", Training Accuracy= " + \
                      "{:.5f}".format(acc))
        print("Optimization Finished!")
        print('Start to save model.')
        saver = tf.train.Saver()
        saver.save(session, self.conf.save_model_path)
Esempio n. 2
0
    def test(self, load_model=False):
        """
        test
        :param load_model: 
        :return: 
        """
        if load_model:
            print 'Start loading model from "%s"' % self.config.load_model_path
            self.model.load_state_dict(torch.load(self.config.load_model_path))

        test_set = SequenceData(filename=self.config.test_file, max_seq_len=self.max_seq_len)

        with torch.no_grad():
            correct = 0
            total = 0
            features, labels, seqlen, words = test_set.get_all_data()

            features = features.to(device)
            _, labels = torch.max(labels, 1)
            labels = labels.to(device)
            seqlen = seqlen.to(device)

            outputs, all_outputs = self.model(features, seqlen)
            _, predicted = torch.max(outputs.data, 1)

            total += labels.size(0)
            correct += (predicted == labels).sum().item()

            print 'Test Accuracy of the model: {} %'.format(100 * correct / total)
Esempio n. 3
0
    def train(self):
        """
        train
        :return: 
        """
        print 'Start training model.'
        training_set = SequenceData(filename=self.config.training_file, max_seq_len=self.max_seq_len)
        for i in range(self.config.training_steps):
            batch_x, batch_y, batch_seqlen, batch_words = training_set.next(self.config.batch_size)

            batch_x = batch_x.to(device)
            _, batch_y = torch.max(batch_y, 1) # 元组第一个维度为最大值,第二个维度为最大值的索引
            batch_y = batch_y.to(device)
            batch_seqlen = batch_seqlen.to(device)

            # Forward pass
            outputs, all_outputs = self.model(batch_x, batch_seqlen)
            # loss = self.cross_entropy_loss(outputs, batch_y)
            loss = self.cross_entropy_loss(outputs, batch_y) + \
                   self.regularized_loss(all_outputs, batch_seqlen, batch_words)
            # loss = self.criterion(outputs, batch_y)

            # Backward and optimize
            self.optimizer.zero_grad()  # 清空梯度缓存
            loss.backward()  # 反向传播,计算梯度
            self.optimizer.step()  # 利用梯度更新模型参数

            if (i + 1) % 100 == 0:
                print 'Step [{}/{}], Loss: {:.4f}'\
                    .format(i + 1, self.config.training_steps, loss.item())

        # Save the model checkpoint
        print 'Start saving model to "%s".' % self.config.save_model_path
        torch.save(self.model.state_dict(), self.config.save_model_path)
Esempio n. 4
0
    def test(self, session, load_model=False):
        """
        测试函数
        :param session: 
        :param load_model: 是否加载模型
        :return: 
        """
        if load_model:
            print('Start to load model.')
            saver = tf.train.Saver()
            saver.restore(session, self.conf.load_model_path)
        test_set = SequenceData(filename=self.conf.test_data, max_seq_len=self.seq_max_len)
        test_data = test_set.data
        test_label = test_set.labels
        test_seqlen = test_set.seqlen

        print("Testing Accuracy:", \
              session.run(self.accuracy_op, feed_dict={self.X: test_data, self.Y: test_label,
                                                       self.seqlen: test_seqlen,
                                                       self.dropout_keep_prob: 1.0}))
        print("Testing PR:")
        # 准召结果
        y_list = [label.index(1) for label in test_label]
        predict_pro = session.run(self.predict_pro_op, feed_dict={self.X: test_data,
                                                                  self.seqlen: test_seqlen,
                                                                  self.dropout_keep_prob: 1.0})

        y_pre_list = indicator.threshold_judge_by_y_index(pro_list=predict_pro, axis=1, threshold=0.5)
        indicator.cal_precision_recall_F1(y_list, y_pre_list)
Esempio n. 5
0
    def predict(self, session, load_model=False):
        """
        预测函数
        :param session: 
        :param load_model: 是否加载模型
        :return: 
        """
        if load_model:
            print('Start to load model.')
            saver = tf.train.Saver()
            saver.restore(session, self.conf.load_model_path)

        predict_set = SequenceData(filename=self.conf.predict_data,
                                   max_seq_len=self.seq_max_len)
        predict_result = session.run(self.predict_op,
                                     feed_dict={
                                         self.X: predict_set.data,
                                         self.seqlen: predict_set.seqlen,
                                         self.dropout_keep_prob: 1.0
                                     })
        predict_result_list = []
        for predict_index in predict_result:
            result = [0] * self.num_class
            result[predict_index] = 1
            predict_result_list.append(result)

        # print("Predict Result:", predict_result)
        print("Predict Result:", predict_result_list)
Esempio n. 6
0
 def test(self, session, load_model=False):
     """
     @brief: test func
     @Args:
         session
         load_model: whether load model or not
     """
     if load_model:
         print('Start to load model.')
         saver = tf.train.Saver()
         saver.restore(session, self.conf.load_model_path)
     test_set = SequenceData(filename=self.conf.test_data,
                             max_seq_len=self.seq_max_len)
     test_data = test_set.data
     test_label = test_set.labels
     test_seqlen = test_set.seqlen
     print("Testing Accuracy:", \
           session.run(self.accuracy_op, feed_dict={self.X: test_data, self.Y: test_label,
                                                    self.seqlen: test_seqlen,
                                                    self.dropout_keep_prob: 1.0}))
Esempio n. 7
0
 def test(self, session, load_model=False):
     """
     测试函数
     :param session: 
     :param load_model: 是否加载模型
     :return: 
     """
     if load_model:
         print('Start to load model.')
         saver = tf.train.Saver()
         saver.restore(session, self.conf.load_model_path)
     test_set = SequenceData(filename=self.conf.test_data,
                             max_seq_len=self.seq_max_len)
     test_data = test_set.data
     test_label = test_set.labels
     test_seqlen = test_set.seqlen
     print("Testing Accuracy:", \
           session.run(self.accuracy_op, feed_dict={self.X: test_data, self.Y: test_label,
                                                    self.seqlen: test_seqlen,
                                                    self.dropout_keep_prob: 1.0}))