양 방향 rnn 의 정확 한 사용 자세 교육

양 방향 RNN 을 어떻게 사용 합 니까?
'딥 러 닝 의 텐서 플 로 우 입문,원리 와 진급 실전'이라는 책의 9.4.2 중 4 절 에 서 는 길 어 지 는 동적 RNN 의 실현 을 소개 한 바 있다.
여기 서 양 방향 동적 rnn 이 길 어 지 는 서열 을 처리 할 때 사용 하 는 응용 에 대해 설명 합 니 다.사실 양 방향 RNN 사용 에는 실수 하기 쉬 운 은밀 한 주의사항 이 있다.
본 고 는 양 방향 RNN 의 상용 함수,용법 및 주의사항 을 소개 한다.
동적 양 방향 rnn 에는 두 가지 함수 가 있 습 니 다.

stack_bidirectional_dynamic_rnn
bidirectional_dynamic_rnn
이들 의 실현 은 대동소이 하고 놓 인 위치 도 다르다.전 자 는 contrib 아래 에 놓 고 후 자 는 더욱 붉 은 싹 이 바로 tf 의 핵심 창고 아래 에 놓 여 있다.사용 시 양자 의 반환 값 도 차이 가 있다.다음은 일일이 소개 하 겠 습 니 다.
예제 코드
먼저 GRU 의 cell 코드 를 예 로 들 면:

import tensorflow as tf
import numpy as np
tf.reset_default_graph()
#       
X = np.random.randn(2, 4, 5)#    、    、    
#         3
X[1,2:] = 0
seq_lengths = [4, 2]
Gstacked_rnn = []
Gstacked_bw_rnn = []
for i in range(3):
    Gstacked_rnn.append(tf.contrib.rnn.GRUCell(3))
    Gstacked_bw_rnn.append(tf.contrib.rnn.GRUCell(3))
#          RNN
Gmcell = tf.contrib.rnn.MultiRNNCell(Gstacked_rnn)
Gmcell_bw = tf.contrib.rnn.MultiRNNCell(Gstacked_bw_rnn)
sGbioutputs, sGoutput_state_fw, sGoutput_state_bw = tf.contrib.rnn.stack_bidirectional_dynamic_rnn([Gmcell],[Gmcell_bw], X,sequence_length=seq_lengths,                                           dtype=tf.float64)
Gbioutputs, Goutput_state_fw = tf.nn.bidirectional_dynamic_rnn(Gmcell,Gmcell_bw, X,sequence_length=seq_lengths,dtype=tf.float64)
위의 예 는 양 방향 RNN 을 만 드 는 방법 예제 입 니 다.stack 이 있 는 양 방향 RNN 은 3 개의 반환 값 을 출력 하고 stack 이 없 는 양 방향 RNN 은 2 개의 반환 값 을 출력 하 는 것 을 볼 수 있다.
이 안에서 주의해 야 할 것 은 cell 초기 화 되 지 않 았 을 때 dtype 매개 변 수 를 할당 해 야 한 다 는 것 입 니 다.안 그러면 잘못 보고 할 거 야.
코드:BiRNN 출력
다음은 코드 를 추가 하여 출력 값 을 인쇄 합 니 다.이 두 함수 가 도대체 출력 한 것 이 무엇 입 니까?

#      
sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())
sgbresult,sgstate_fw,sgstate_bw=sess.run([sGbioutputs,sGoutput_state_fw,sGoutput_state_bw])
print("   :
", sgbresult[0]) print(" :
", sgbresult[1]) print('Gru :',len(sgstate_fw[0]),'
',sgstate_fw[0][0],'
',sgstate_fw[0][1],'
',sgstate_fw[0][2]) print('Gru :',len(sgstate_bw[0]),'
',sgstate_bw[0][0],'
',sgstate_bw[0][1],'
',sgstate_bw[0][2])
stack 이 있 는 양 방향 RNN 출력 내용 을 살 펴 보 겠 습 니 다.
这里写图片描述
우리 가 입력 한 데이터 의 차례 는 2 이 고,첫 번 째 서열 의 길 이 는 4 이 며,두 번 째 서열 의 길 이 는 2 이다.
그림 에서 모두 4 부분의 출력 이 있 는데 첫 번 째 부분(전체 서열)은 서열 길이 가 4 인 결과 이 고 두 번 째 부분(짧 은 서열)은 서열 길이 가 2 인 결과 이다.RNN 3 개의 GRU cell 로 구 성 된 층 이 없 기 때문에 각 시퀀스 의 출력 은 3 이다.이러한 결과 출력 에 대해 서 는 짧 은 시퀀스 뒤의 0 을 제거 해 야 사용 할 수 있 음 이 분명 하 다.
다행히 이 함수 에는 두 번 째 출력 값,GRU 상태 가 있 습 니 다.상태 에 있 는 값 을 직접 사용 할 수 있 으 며,원시 결 과 를 0 으로 변화 시 킬 필요 가 없다.
단일 GRU 는 원래 상태 가 없 기 때문이다.그래서 이 함 수 는 마지막 출력 을 상태 로 되 돌려 줍 니 다.이 함 수 는 두 개의 상태 로 되 돌아 가 며 각각 앞 방향 과 뒤 방향 을 대표 합 니 다.모든 방향의 상 태 는 세 개의 요 소 를 되 돌려 줍 니 다.각 방향의 네트워크 가 3 층 GRU 로 구 성 돼 있 기 때문이다.사용 할 때 보통 마지막 상 태 를 취한 다.그림 에서 빨간색 부분 은 전방 향 중 이 고 두 견본 이 대응 하 는 출력 인 데 이것 은 이해 하기 쉽다.
중요 한 것 은 파란색 부분,즉 역방향 상태 값 이 원시 데이터 에서 가장 실제 적 인 서열 입력 에 대응 하 는 것 이다.역방향 RNN 이기 때문에 역방향 으로 순환 할 때 서열 중 마지막 을 맨 앞 에 놓 기 때문에 역방향 네트워크 생 성 결 과 는 처음 서열 과 대응한다.
특징 추출 작업 처리 시 정방 향 과 역방향 의 마지막 값 은 모두 이 서열 의 특징 이 므 로 합 쳐 통일 적 으로 처리 해 야 한다.다만 다음 시퀀스 예측 작업 에 대해 서 는 정방 향 RNN 네트워크 를 직접 사용 하 는 것 을 권장 하면 된다.
양 방향 RNN 의 결 과 를 얻 으 려 면,특히 길 어 진 경우 상 태 를 통 해 값 을 받 아 직접 맞 추 는 것 이 옳다.길 어 지지 않 아 도출력 값 을 직접 사용 하여 연결 하면 역방향 의 일부 특징 결 과 를 손실 할 수 있 습 니 다.이것 은 주의해 야 할 곳 이다.
코드:BiRNN 출력
됐어.이어서 stack 이 없 는 함수 출력 이 어떤 지 보 겠 습 니 다.

gbresult,state_fw=sess.run([Gbioutputs,Goutput_state_fw])
print("  :
", gbresult[0]) print(" :
", gbresult[1]) print(' :',len(state_fw),'
',state_fw[0],'
',state_fw[1]) #state_fw[0]:【 , ,cell 】 print(state_fw[0][-1],state_fw[1][-1]) out = np.concatenate((state_fw[0][-1],state_fw[1][-1]),axis = 1) print(" ",out)
이번 에는 출력 기본 내용 을 바탕 으로 결 과 를 직접 연결 했다.위의 코드 가 실행 되면 다음 과 같은 내용 을 출력 합 니 다.
这里写图片描述
똑 같이 빨간색 을 사용 하고 파란색 을 반대 방향 으로 사용 합 니 다.함수 가 되 돌아 오 는 출력 값 을 바 꾸 었 습 니 다.정반 방향 으로 연결 하지 않 았 습 니 다.출력 상 태 는 하나의 값 이지 만 그 안에 두 개의 요소 가 있 습 니 다.하 나 는 정방 향 상 태 를 대표 하고 하 나 는 역방향 상 태 를 대표 합 니 다.
출력 에서 볼 수 있 듯 이 마지막 줄 은 최종 결과 의 진정한 연결 을 실현 했다.양 방향 rnn 을 사용 할 때 위의 예 코드 에 따라 그 상 태 를 전체 출력 으로 연결 한 다음 에 처리 할 수 있 습 니 다.
코드:LSTM 의 양 방향 RNN
비슷 한 게 LSTM cell 을 사용 하려 면앞의 GRU 부분 을 바 꾸 면 됩 니 다.코드 는 다음 과 같 습 니 다.

stacked_rnn = []
stacked_bw_rnn = []
for i in range(3):
    stacked_rnn.append(tf.contrib.rnn.LSTMCell(3))
    stacked_bw_rnn.append(tf.contrib.rnn.LSTMCell(3))
mcell = tf.contrib.rnn.MultiRNNCell(stacked_rnn)
mcell_bw = tf.contrib.rnn.MultiRNNCell(stacked_bw_rnn)    
bioutputs, output_state_fw, output_state_bw = tf.contrib.rnn.stack_bidirectional_dynamic_rnn([mcell],[mcell_bw], X,sequence_length=seq_lengths,
                                              dtype=tf.float64)
bioutputs, output_state_fw = tf.nn.bidirectional_dynamic_rnn(mcell,mcell_bw, X,sequence_length=seq_lengths,
                                              dtype=tf.float64)
출력 내용 이 무엇 인지 에 대해 서 는 앞의 GRU 출력 부분 에 따라 스스로 관찰 할 수 있 습 니 다.어떻게 맞 추 는 지도 GRU 의 예 를 참조 하여 할 수 있다.
정반 방향의 상 태 를 맞 춰 야 양 방향 RNN 의 최종 출력 특징 을 얻 을 수 있다.절대 출력 이 처리 되 지 않 은 것 을 가지 고 후속 연산 을 하지 마 세 요.이것 은 대부분의 연산 특징 을 손실 시 킬 수 있 습 니 다.
이 부분 은'딥 러 닝 의 텐서 플 로 우 입문,원리 와 진급 실전'이라는 책의 내용 보충 에 해당 한다.RNN 에 대한 더 많은 소 개 는 책 속 9 장의 상세 한 내용 을 참고 할 수 있다.
양 방향 RNN 에 대한 저의 이해.
1.쌍방 향 RNN 이 사용 하 는 장면:일부 상황 에서 현재 의 출력 은 이전의 시퀀스 요소 에 만 의존 하 는 것 이 아니 라 그 후의 시퀀스 요소 에 도 의존 할 수 있다.예 를 들 어 빈 칸 완성,기계 번역 등 응용 을 한다.

2.Tensorflow 에서 쌍방 향 RNN 을 실현 하 는 API 는:bidirectionaldynamic_rnn; 그 본질은 주로 두 번 reverse 를 한 것 이다.
첫 번 째 reverse:입력 시퀀스 를 reverse 한 다음 dynamicrnn 연산 한번 해 봐.
두 번 째 reverse:위 에 dynamicrnn 이 되 돌아 오 는 outputs 는 reverse 를 진행 하여 정방 향 과 역방향 으로 출력 하 는 time 이 맞 도록 합 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기