VNet 네트워크의 concatenation 구현

3113 단어 딥 러닝
VNet 네트워크에서skipconnection의 조작이 있는데 바로 encoding과 decoding의 특징을 등급으로 연결하는 것이다. 그러나 등급의 조건은 feature map의 크기가 일치해야 하기 때문에 자주 하는 조치는 encoding의 feature map을 decoding의 feature map과 같은 크기로 재단하는 것이다. 여기에는 tf를 사용한다.slice(input_tensor,begin,size)
매개변수 해석:
input_tensor는 입력한tensor입니다. 바로 재단된feature 맵입니다.
begin은 모든 차원의 시작 위치입니다.
크기는 각 차원에서 몇 개의 원소를 꺼내는 것과 같다
다음 예를 들어 설명합니다.
참고 문헌:https://www.jianshu.com/p/71e6ef6c121b
t = tf.constant([[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]], [[5, 5, 5], [6, 6, 6]]])
tf.slice(t, [1, 0, 0], [1, 1, 3])
출력: [[[3,3,3]]], 마지막 shape는 size와 같고, size는 (1,1,3)
먼저 shape의 개념을 이해하고 t를 분해한다.
t = [A, B, C] # 1차원
A=[i,j], B=[k,l], C=[m,n]#2차원
i=[1,1,1], j=[2,2,2], k=[3,3], l=[4,4,4], m=[5,5,5], n=[6,6,6] #이것은 3차원
t에 대해 말하자면, 가장 바깥쪽 괄호 안에는 3개의 물건이 있는데, 각각 A, B, C이다.이 세 가지 물건은 각각 i와 j, k와 l, m와 n 두 개가 있다.
그것들 중에는 하나하나에 또 3개의 숫자가 있기 때문에 t의 shape는 [3, 2, 3]
자르기 시작:
tf.slice(t, [1, 0, 0], [1, 1, 3])  # begin = [1, 0, 0],size=[1,1,3]
매개변수 해석:
begin과size의 의미는 왼쪽에서 오른쪽으로, begin의 의미는 시작 위치이다. 그 중의 모든 숫자는 하나의 차원을 대표한다. 그러면 [1,0,0의 의미는 3개의 차원 중에서 각 차원은 어디에서 계산하는가를 의미한다.
1차원은 [A, B, C]이고 begin리[1, 0, 0]는 1이다. 즉, B부터 계산한다.그 다음에 2차원에서 B=[k,l](주의하세요, 저는 여기에 B=[k,l]만 썼는데 B만 쓸모가 있는 것은 아닙니다. 만약size에서 첫 번째 숫자가 2이면 B와 C가 모두 뽑힐 수 있습니다), begin에서 두 번째 숫자는 0입니다. 즉, k에서 계산하고, 3차원 k=[3,3], begin에서 세 번째 숫자는 0입니다. 첫 번째 3에서 계산합니다. 그리고size는 각 차원의 크기, 즉 각 차원에서 몇 개의 원소를 취하는 것을 의미합니다.사이즈의 크기는 마지막으로 출력된tensor의shape입니다.
size에서 첫 번째는 1입니다. 첫 번째 차원에서 하나의 원소를 취하는 것을 의미합니다.t=[A, B, C]begin은 B부터 계산하고 하나를 취하면 B다. 그러면 1차원 결과는 [B]
size 두 번째도 1, 2차원 B=[k,l],begin은 k에서 계산하고 하나는 k를 취하면 2차원 결과는 [[k]]이다.
size 세 번째는 3, 3차원 k=[3, 3, 3],begin에서 첫 번째, 세 번째, 세 번째, 세 번째, 세 번째, 세 번째를 모두 뽑아야 하기 때문에 출력: [[[3, 3, 3]]]
다시 한 번 예를 들자.
t = tf.constant([[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]], [[5, 5, 5], [6, 6, 6]]])
tf.slice(t, [1, 0, 0], [1, 2, 3])
begin이냐[1,0,0]이냐,size의 첫 번째 차원에서 하나를 취하느냐,[B]를 취하느냐,그리고 size의 두 번째 차원에서 1이 아니라 2를 취하느냐는 뜻이다.B=[k,l] 기억나세요?지금은 k만 있는 것이 아니라 k와 l 모두 사이즈 3차원에서 3개를 뽑아야 한다. 즉, k=[3, 3, 3]와 l=[4, 4, 4]를 대상으로 각각 3개의 원소를 뽑아야 한다. 마지막 출력: [[[3, 3, 3], [4, 4, 4]]]
세 번째 예:
t = tf.constant([[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]], [[5, 5, 5], [6, 6, 6]]])
tf.slice(t, [1, 0, 0], [-1, -1, -1])
만약 사이즈 입력 값이 -1이라면 그 차원에서 모든 수가 출력됩니다.위의 예에서 begin은 [1,0,0]이다.세 차원이 모두 -1이면 출력 결과: 첫 번째 차원은 [B,C], 두 번째 차원은 [k,l], [m, n], 세 번째 차원은 [[[3,3,3], [4,4], [5,5,5], [6,6]]]
 
마지막 자르기 및 concatenate 함수:
def crop_and_concat(x1, x2): #x1 encoding feature map,x2 decoding feature map
    x1_shape = tf.shape(x1)
    x2_shape = tf.shape(x2)
    # offsets for the top left corner of the crop
    offsets = [0, (x1_shape[1] - x2_shape[1]) // 2, # 
               (x1_shape[2] - x2_shape[2]) // 2, (x1_shape[3] - x2_shape[3]) // 2, 0]
    size = [-1, x2_shape[1], x2_shape[2], x2_shape[3], -1] # 
    x1_crop = tf.slice(x1, offsets, size)
    return tf.concat([x1_crop, x2], 4)

이렇게 자르는 것과 등급을 연결하는 것은 하나의 폐단이 있다.
네트워크 입력은 16배 크기여야 합니다.

좋은 웹페이지 즐겨찾기