코드는 스와 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 (마스크)