ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 패스트캠퍼스 환급챌린지 12일차 미션 (2월 12일) : 딥러닝·인공지능 Signature 초격차 패키지 Online. 강의 후기
    패스트캠퍼스 챌린지 2024. 2. 12. 22:05

     

    오늘은 월요일. 연휴의 마지막날이자 낼부터 또 학교를 다니며 열심히 살아야한다.

     

    그 기념으로,

     

    Part1. 딥러닝을 시작하기전에

    CH04-03. 텐서의 형변환 및 차원조작

    &

    CH04-04. 파이토치 텐서의 연산과 함수

     

     

     

    CH04-03. 텐서의 형변환 및 차원조작

    텐서는 넘파이 배열처럼 조작할 수 있다.

    다차원에서 차원에 대한 데이터를 조작할 수도 있고, 길이 순서도 바꿔줄 수 있고, 두 텐서를 연결할 수도 있고

    조작이란 조작은 다 가능하다고 한다.(조작이라는 단어가 조금 이상하지만...ㅎㅎ)

     

    그래서 조작은 어떻게 하는데요?

    "텐서의 이용하여 간단하게 알아보자" 

     

    tensor = torch.tensor([ 

                                      [1, 2, 3, 4],

                                      [5, 6, 7, 8],

                                      [9, 10, 11, 12]])

    3X4 매트릭스가 있다고 했을 때,

     

    print(tensor[0]) # first row

    print(tensor[:, 0]) # first column

    print(tensor[...,-1]) #last column

     

    해보면 아래와 같은 답을 얻을 수 있다.

     

    두번째의 경우를 설명하자면,  :, 넣어서 행은 모든 행은 다 선택하되, 열만 두번째 열을 선택한다는 뜻이다.

    저 행열에서 두번째  줄을 가져오겠다 라고 하여 2,6,10이 나오는거다.

     

    그리고 ... 이게 참 특이한데, 앞의 축이 뭐가 어쨋든 저쩃든 모르겠고 마지막 축 컬럼을 가져온다 라고 할때

    쓴다.

     

    → 인덱싱 기법이나 슬라이싱 같은 기법들을 고대로 쓸 수 있다.

     

     

    2. 텐서 이어붙이기

     

    말 그대로 두 텐서를 길게 연결하여 새로운 텐서를 만든다는 것이다.

     

    tensor = torch.tensor([ 

                                      [1, 2, 3, 4],

                                      [5, 6, 7, 8],

                                      [9, 10, 11, 12]])

     

    # dim: 텐서를 이어 붙히기 위한 축

    #0번 축(행)을 기준으로 이어 붙이기

    result = torch.cat([tensor, tensor, tensor], dim = 0)

    print(result)

     

    #1번 축(열)을 기준으로 이어붙이기

    result= torch.cat([tensor, tensor, tensor], dim=1)

    print(result)

     

    여기서 cat은 Concatenate의 약자로 이어붙인다라고 이해하면 된다.

    위는 동일한 텐서를 리스트 형태로 묶어준다는 의민데, dim이 0이라면 행 축으로 아랫쪽으로 쪽쪽 붙혀준다는 의미고

    3X4 가 3번 반복되서 붙여지니 9X4 의 형태로 되는 것이고.

     

    dim이 1이라면 열 축으로 옆쪽으로 쭉 쭉 붙혀준다는 의미다.

    3X4 가 3번 옆쪽으로 반복되서 붙여지니 3X12가 되는 것이다. 아래에서 답 확인하자.

     

     

    3. 텐서 형변환(타입 캐스팅)

     

    당연하게도 자료형(정수, 실수 등)을 변환할 수 있다.

     

    a = torch.tensor([2], dtype=torch.int)

    b = torch.tensor([5.0])

     

    print(a.dtype)

    print(b.dtype)

     

    # 여기서 자료형이 다른 두 변수를 더해주면 어뜨케 될까나?

    # 정답은, 정수형이 실수형이 되어 더해진다.(파이썬? 파이토치는 신기한게 텐서를 그냥 만들면 다 실수의 손을 들어준다.)

    print(a+b)

     

    # 그런데 나는 정말정말정말 정수형의 합이 필요하다. 그럴땐? b를 정수로 만들어줘야한다.

    print(a + b.type(torch.int32))

     

    torch.int32

    torch.float32 tensor([7.])

    tensor([7], dtype=torch.int32) 이래 나온다.

     

     

    4. view를 통한 텐서 shape 변경

     

    자, 마지막으로 텐서의 shape를 한번 바꿔보겠습니다.

     

    #view() 텐서의 모양을 변경할 때 사용되며, 텐서의 순서는 변경되지 않는다. 아래를 보자.

    a = torch.tensor([1,2,3,4,5,6,7,8])

    b = a.view(4,2)

    print(b)

     

    # a의 값을 한번 변경해보까?

    a [0] = 7

    print(b)

     

    #a 값을 복사한 뒤에 변경

    c = a.cllone().view(4,2)

    a [0] = 9

    print(c)

     

    실행해보면 결과는 아래와 같다.

    tensor([[1, 2], [3, 4], [5, 6], [7, 8]])      ← a의 형태를 4X2 형태로 만든걸 b에 넣었으니 이렇게 나오는게 맞다.

                                                                    (포인터 주소값을 공유해줍니다)

    tensor([[7, 2], [3, 4], [5, 6], [7, 8]])      ← a인 원본에 7을 넣어버리면 b는 a로 인하여 만들어지기 때문에 앞이 7로 바뀐다.

    tensor([[7, 2], [3, 4], [5, 6], [7, 8]])      ← c는 a를 카피했으므로 a를 바꿔도 c는 바뀌지 않는다.(원본은 안건드렸으니깐)

     

     

    5. 텐서의 차원 교환

     

    자, 찐마지막으로 텐서의 차원을 한번 바꿔보겠습니다.

     

    # permute를 통해 차원 자체를 교환할 수 있다.

     

    a = torch.rand((64,32,3))

    print(a.shape)

     

    b = a.permute(2,1,0)

    print(b.shape)

     

    하면 torch.size([64,32,3]) / torch.size([3.32.64])가 된다. 위에 permute로 인덱스를 통해 차원을 바꿔 줄 수 있다.

     

     

    CH04-04. 텐서의 연산과 함수

    텐서의 연산과 어떤 함수들이 더 남았는지 한번 알아보자.(이전 강의와 이번 강의는 자료 전처리 과정에서

    매우 중요한 단계라 꼼꼼히 보고 넘어가자)

     

    1. 텐서의 연산

     

    그냥 그래픽스에서 배웠던 것처럼 행열의 같은 자리끼리 서로 더해주고 빼주고 곱해주고 나눠 줄 수 있다.

     

    a = torch.tensor([

          [1,2],

          [3,4]])

    b = torch.tensor([

          [5,6],

          [7,8]])

     

    print(a+b)

    print(a-b)

    print(a*b)

    print(a/b)

     

    아~~~~주 간단하다. 좀 더 봐보자.

     

    2. 행렬곱

     

    그 뭐야, 그래픽스에서 그래픽 파이프라인에 들어갈 때 행렬곱, 즉 도트프로덕트 연산을 할때가 굉장히 많은데, 

    퍼셉트론의 w값 계산할 때도 필요하더라. 그래서 이게 뭔지 다시 한번 공부해보자.

    [1, 2]                 [5, 6]                        [1,  2]        [5 l  6]

    [3, 4]        X       [7. 8]             =         [3, 4]         [7 l 8]

     

    다행히도 고등학생때 수업은 열심히 들었던것 같아서 까먹지 않고 잘 기억하고 있다.(맞아?)

     

    1과 5를 곱하고, 2와 7을 곱해서 두개를 더한다. 두번째로 1과 6을 곱하고 2와 8을 곱하여 두 값을 더한다.

    이렇게 첫번째 매트릭스에서의 자리를 각각 구한다.

    물론, 파이썬도 이걸 Matirx multiplication 수행이 간단하게 되는데 이게 바로 matmul이다.(짝짝짝)

     

    print(a.matmul(b))

    print(torch.matmul(a, b)) 두개가 같다.

     

    3. 텐서의 평균(mean)

     

    평균도 무지 중요하다. 볼드체!!!

     

     

    이것도 사실 매우매우매우 간단하기 때무에 그냥 캡쳐이미지로 지나가겠다.

    요약하자면 mean을 그냥 쓰면 전체 원소에 대한 평균을 구하는 것이고,

    mean(dim=1)이면 각 열에 대한 즉 세로줄에 대한 평균을 구해주고,

    mean(dim=0)이면 각 행기준에 대한 평균을 구해준다.

     

    4. 텐서의 합계 함수

    mean 과 동일하고, mean을 sum으로만 바꿔주면 된다.

     

    5. 텐서의 최대함수

    지금 나오는 함수는 몇번 plot 할때 봤던 것 같은 함수들이다. 기억해두자.

     

    max() 함수는 원소의 최댓값을 반환, argmax 는 가장 큰 원소(최댓값)의 인덱스를 반환한다.

     

     

    value와 indicate가 다 나오니 얼마나 친절한가.

     

     

    6. unsqueeze와 squeeze

    텐서의 타입을 맞춰주기 위해선 차원을 추가하거나 빼거나 해야할 경우들이 많은데, 이 (un)squeeze 를 통해 손쉽게

    차원의 추가 및 제거가 가능하다.

    (헷갈릴만한게, 스퀴즈가 쥐어 짜다라는 뜻이라, 스퀴즈를 하면 한차원이 줄어드는거고, 언스퀴즈를 하면 한 차원이

      늘어나는 것이다.)

     

    a = torch.tensor([

          [1,2,3,4],

          [5,6,7,8]])

     

    #첫번째 축에 차원 추가

    prinit(a)

    a = a.unsqueeze(0)

    print(a)

    print(a.shape)

     

    #네번째 축에 차원 추가

    a = a.unsqueeze(3)

    print(a)

    print(a.shape)

     

    12일차 끝.

     

     

     

    본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

    https://bit.ly/48sS29N

Designed by Tistory.