머신러닝 보험 업계 문답 개방 데이터 세트 DeepQA-1에 대한 상세한 설명(二)

6329 단어 PythonAI
책을 받다.
지난번에class Neural Network () 의 구조 함수를 설명했습니다init__(), 다음은class Neural Network ()의run 함수입니다.왜 런() 함수입니까?다음 코드를 보십시오.
def test_train():
    visual_loss.init()
    visual_acc.init()
    nn = NeuralNetwork(epoch = 50, lr = 0.0001, eval_every_N_steps = 200)
    nn.run(test = True)

if __name__ == '__main__':
    test_train()

확 트이지?network.py의 주 함수가test 호출됨train(), testtrain()에서 가장 중요한 것은 NeuralNetwork()와run()이다.앞의 함수는 실제적으로 데이터의 준비와 예처리를 완성했는데, 그것은 이미 지난 글에서 설명하였다.이 글은run() 함수를 상세하게 설명하고 가장 핵심적인 훈련과 예측 기능을 완성했다.코드는 다음과 같습니다.
def run(self, test = False):
        '''
        Train model with mini-batch stochastic gradient descent.
        '''
        total_step = 0
        for n in range(self.epoch):
            for mini_batch in corpus.load_train():
                nabla_b = [np.zeros(b.shape) for b in self.biases]
                nabla_w = [np.zeros(w.shape) for w in self.weights]
                total_cost = 0.0
                for x, y_ in mini_batch:
                    # here scale the input's word ids with 0.001 for x to make sure the Z-vector can pass sigmoid fn
                    delta_nabla_b, delta_nabla_w, cost = self.back_propagation( \
                                np.reshape(x, (self.input_layer_size, 1)) * 0.001, \
                                np.reshape(y_, (self.output_layer_size, 1)))
                    nabla_b = [ nb+mnb for nb, mnb in zip(nabla_b, delta_nabla_b)]
                    nabla_w = [ nw+mnw for nw, mnw in zip(nabla_w, delta_nabla_w)]
                    total_cost += cost
                self.weights = [ w - (self.lr * w_)/len(mini_batch) for w, w_ in zip(self.weights, nabla_w)]
                self.biases = [ b - (self.lr * b_)/len(mini_batch) for b, b_ in zip(self.biases, nabla_b)]
                total_step += 1
                print("Epoch %s, total step %d, cost %f" % (n, total_step, total_cost/len(mini_batch)))
                visual_loss.plot(total_step, total_cost/len(mini_batch))
                if (total_step % self.eval_every_N_steps ) == 0 and test:
                    accuracy = self.evaluate()
                    print("Epoch %s, total step %d, accuracy %s" % (n, total_step, accuracy))
                    visual_acc.plot(total_step, accuracy)

절대로 이 십여 줄의 코드를 얕잡아 보지 마라. 실제로 전개된 내용은 상당히 많다.앞의 몇 줄은 더 말할 필요가 없어 이해하기 쉽다.for n in range(self.epoch): 이 줄부터 시작합니다.
사실 이 줄도 이해하기 어렵지 않다. for순환은 모두 epoch라운드 훈련을 진행하는 라운드마다 처리하는 것을 의미한다.
다음은 포미니batch in corpus.load_train():.코퍼스 먼저.load_train().이전 글의 corpus를 참조할 수 있습니다.load_테스트 ()의 분석.실제로 최종적으로 데이터를 호출했습니다.py의 loadtrain().코드는 다음과 같습니다.
def load_train(batch_size = 100, question_max_length = 20, utterance_max_length = 99):
    '''
    load train data
    '''
    return __resolve_input_data(_train_data, batch_size, question_max_length, utterance_max_length)

먼저resolve_input_데이터 () 의train_data.이전 문장의test_데이터와 유사합니다. 데이터에도 있습니다.py 중:train_data = insuranceqa.load_pairs_train()._train_데이터가 insuranceqa에 저장되어 있습니다.load_pairs_train()의 반환 값입니다.이전 글, insuranceqa. 참조load_pairs_train () 은 XXX\Anaconda3\Lib\site-packages\pairs\insuranceqadata\iqa.train.json.gz 파일의 내용입니다.
다시 보자resolve_input_데이터 () 소스는 다음과 같습니다.
def __resolve_input_data(data, batch_size, question_max_length = 20, utterance_max_length = 99):
    '''
    resolve input data
    '''
    batch_iter = BatchIter(data = data, batch_size = batch_size)
    
    for mini_batch in batch_iter.next():
        result = []
        for o in mini_batch:
            x = pack_question_n_utterance(o['question'], o['utterance'], question_max_length, utterance_max_length)
            y_ = o['label']
            assert len(x) == utterance_max_length + question_max_length + 1, "Wrong length afer padding"
            assert VOCAB_GO_ID in x, " must be in input x"
            assert len(y_) == 2, "desired output."
            result.append([x, y_])
        if len(result) > 0:
            # print('data in batch:%d' % len(mini_batch))
            yield result
        else:
            raise StopIteration

이 함수에서 올라오자 또 하나의 종류가 나왔다:BatchIter.BatchIter 클래스는 데이터에 있습니다.py에서 정의 및
구현 코드는 다음과 같습니다.
class BatchIter():
    '''
    Load data with mini-batch
    '''
    def __init__(self, data = None, batch_size = 100):
        assert data is not None, "data should not be None."
        self.batch_size = batch_size
        self.data = data

    def next(self):
        random.shuffle(self.data)
        index = 0
        total_num = len(self.data)
        while index <= total_num:
            yield self.data[index:index + self.batch_size]
            index += self.batch_size

        __resolve_input_데이터()에서 BatchIter의 구조 함수를 먼저 호출하였는데, 사실은 두 개의 값을 전송하였다.batch크기 및 데이터.batch_크기는 호출할 때 표시되지 않기 때문에 기본 100입니다.데이터는 바로train_데이터, 즉 XXX\Anaconda3\Lib\site-packages\pairs\insuranceqadata\iqa.train.json.gz 파일의 원본 내용입니다.
        __resolve_input_데이터 () 다음에 BatchIter의next () 함수를 호출했습니다. 이 함수는 우선random을 호출합니다.shuffle ()는self.데이터 즉train_데이터의 원소가 흐트러집니다.이후 번갈아batch모든 데이터를 되돌릴 때까지 크기 데이터입니다.그러나 이 코드에 대해 개인적으로 버그가 있다고 생각합니다. 만약에 index가total 을 초과하지 않았다면num, 하지만 index에batch사이즈가 토탈을 넘어섰어요num, 그룹이 넘칠 수 있습니다.
다음resolve_input_데이터 ()에서 pack 호출됨question_n_utterance(o['question'], o['utterance'], question max length, utterance max length) 및 반환 값을 x에 부여합니다.pack_question_n_utterance () 이 함수는 이전 글에서 상세하게 분석되었는데, 여기서 호출하는 역할은 훈련집을train_데이터의 미니batch 견본에 있는 모든 견본의 문제, 구분자, 답변을 조합하여result 목록에 순서대로 추가합니다.동시에 미니batch 견본에 있는 모든 견본의 라벨 (정례 또는 마이너스) 은 y 에 부여됩니다.그리고 x의 모든 값과 목록을 구성하여result 목록에 차례대로 추가합니다.최종적으로result 목록을 되돌려줍니다.
        __resolve_input_데이터 ()가 되돌아왔습니다. corpus를 의미합니다.load_train()도 반환되었습니다.run 함수의 for mini 로 돌아가기batch in corpus.load_train(): 전에 우리는 여기에서 왔는데, 지금 한 바퀴 돌았으니 처음의 곳으로 돌아가야 하는데, 이번에는 모든 미지의 것을 알아내고 돌아온 거야.corpus.load_train()이 반환하는 것은train_데이터(즉 XXX\Anaconda3\Lib\site-packages\pairs\insuranceqa data\iqa.train.json.gz 파일의 원시 내용)의 혼란 순서 뒤의batch(batch size,mini batch)batch가 바로 이batch의 모든 항목이다.
다음 글은 for minibatch in corpus.load_train(): 순환체의 내용입니다.

좋은 웹페이지 즐겨찾기