CRF 코드 구현을 keras

코드는 스와 Jianlin에서입니다

 

# - * - 코딩 :. UTF-8 - * - 

 keras.layers 오기 계층
 오기 AS keras.backend K 

클래스 CRF (레이어)
     "" " CRF를 달성하기 위해 순수 Keras 층 
    손실 계산 CRF 트레이닝 파라미터를 가지는 층이 본질적 층은 층 CRF는 단지 모델을 학습하는 데 사용, 
    전송 매트릭스를 사용하는 것은 여전히 훈련하고 예측 모델을 만들 필요하지만, 
    "" " 
    DEF  __init__ (자체, ignore_last_label = 거짓, ** : kwargs로)
         " "" ignore_last_label을 : 마스크 효과, 마지막 라벨을 무시 재생 여부의 정의
         "" " 
        self.ignore_last_label = 1 IF ignore_last_label 다른 
        슈퍼 (CRF, 자기를).__init__ (** kwargs로)
     DEF(자체, input_shape) 구축 : 
        self.num_labels = input_shape [-1] - self.ignore_last_label 
        self.trans = self.add_weight (이름 = ' crf_trans ' , 
                                     모양 = (self.num_labels, self.num_labels) 
                                     의 초기화 = ' glorot_uniform ' , 
                                     학습 가능한 = 참)
     DEF의 log_norm_step (자기, 입력, 미국) :
         "" " 재귀 계산 정규화 인자 
        포인트 1, 재귀 적 연산 2, logsumexp 않도록 오버플로. 
        팁 : expand_dims 의해이 텐서를 정렬한다. 
        " ""
        미국은 = K.expand_dims (미국 [0], 2) # 이전 
        입력 K.expand_dims = (입력, 2) #는 이 태그 타이밍 점수이며, 방출 점수 
        트랜스 = K.expand_dims을 (self.trans 0) # 전송 행렬 

        출력 = K.logsumexp (입력 미국 + + 트랜스 ,. 1) #의 E 합산 인덱스 넘침 방지 로그 
        리턴 출력을 [출력] 

    DEF의 path_score을 (자기, 입력 라벨)
         "" " 상대 경로 계산 대상 확률 (정규화되지 않음) 
        하이라이트 : 점수별로 라벨 함께 전이 확률 점수. 
        팁 : 추출 골 득점 경로의 "예측"도트 "표적"을 사용한다. 
        "" " 
        #는 만성 신부전의 라벨에 관한 형상의 라벨로서 (실제로 실제 태그 위치 총 점수에 대한 예측을 볼 라벨 경우) 플러스 전이 확률 점수 및이 점 점수 해당 태그 스코어 것은 N에서 [B, T, N], 및 이 차원은 한 뜨겁다
        # 여기서 Pred와의 승산, 그 득점의 존재로, 나머지 대응 라벨 모두 0 인 경우, 다음 두 번째 측정을 추가하는 0의 값을 제거 나타낸다 후 라벨을 추가하는 총 점수 찾는 나타내고있다 
        = point_score을 K.sum (K.sum (*이 입력 레이블 2) ,. 1 keepdims가 = TRUE) # 탭 평가 점수는, [B ,. 1] 모양 
        labels1 K.expand_dims = ([: -1] ,. 라벨 3) 중 # 형상 [B ,. 1-T, N ,. 1] 
        라벨 2 = K.expand_dims (라벨 [: 1.], 2) #의 형상 [. B, T- 1은 N ,.] 
        #는 여기 오브젝트에 대응 곱할 레이블 한 고온의 형태이기 때문에, 시간이 지남에 따라 라벨 양도 금회 판정 된 전송 시간, 현재 시간, 최종 요소에 있으므로 두 치수는 모든 다른 0, 1 인 플래그가 나타내는 전환 
        라벨 = labels1 라벨 2 * # 두 전사 대상 점 형상 [B, T-1, 취할 책임 라벨 오프셋 N, N]을 전달 매트릭스로부터 
        트랜스 = K.expand_dims (K.expand_dims (self.trans, 0 ), 0)
         #K.sum (트랜스 * 라벨 [2 , 3]) 결과이기 때문에, 트랜스 * 라벨 [B, T-1, N , N, 그러나 단지 이후의 1의 값을 가진 2 차원의 점수 전사 나타내는 
        trans_score을 K.sum = (K.sum (트랜스 *이 라벨 [2 ,. 3) ,. 1 keepdims = TRUE) #가 모든 전송 시간의 확률을 얻는다 T-1의 총 점수 K.sum (트랜스 * 라벨 [ 2 3)마다 점수 전사 나타내는 
        반환 point_score + trans_score # 점수 및 두 부분 

    DEF 전화 (자체, 입력) : # CRF 자체가 단지 손실되면, 출력을 변경하지 않고 
        입력 

    DEF의 손실 (자기, y_true, y_pred) : #의 목적은 핫 y_pred 형성 할 필요 
        마스크 1 = y_true. -1 :., 1 :] IF self.ignore_last_label 다른 없음 
        y_true, y_pred =y_true [: : : self.num_labels] y_pred [: : : self.num_labels] 
        init_states의 =는 [y_pred :] 0] # 초기 상태 
        log_norm, _, _ = K.rnn ( self.log_norm_step, y_pred [: 1.] init_states는 마스크 = 마스크) #가 산출 벡터 Z (대수) 모양 [BATCH_SIZE, output_dim] 
        log_norm = K.logsumexp (log_norm ,. 1 keepdims는 = TRUE) #는 Z를 계산한다 (대수) 형상 [BATCH_SIZE, 1] 총 산출 
        path_score = self.path_score을 (y_pred, y_true) # 1 분자 (대수)을 산출 
        복귀 log_norm을 - path_score # 즉 로그 (분자 / 분모) 

    DEF의 정확도 (자기, y_true, y_pred) : #의 훈련 마스크의 영향을 제외한 프레임 정확도하여 기능 표시 처리 프레임 
        마스크 = 1 y_true. : : - 1이다.] IFself.ignore_last_label 다른 없음 
        y_true, y_pred = y_true [: : : self.num_labels] y_pred [: : : self.num_labels] 
        ISEQUAL = K.equal (K.argmax (y_true 2) K.argmax (y_pred 2 )) 
        ISEQUAL = K.cast (ISEQUAL, ' float32 ' )
         의 경우 , 마스크 == 없음 :
             리턴 ) K.mean (ISEQUAL를
         다른 :
             리턴 K.sum (ISEQUAL * 마스크) / K.sum (마스크)

 

추천

출처www.cnblogs.com/callyblog/p/11289566.html