Numpy, Pytorch기초
실습으로는 pytorch의 기초와 numpy의 기초를 할 겁니다.
앞서 공부 했던 1차원 Tensor 2차원 Tensor 3차원 Tensor들을 합하고 곱하고 지지고 볶고
하는 과정을 실습으로 할 예정입니다.
저 Pytorch가 안깔려요 하시는 분은 Google Colab에서 하시면 편하게 하실 수 있어요.
먼저 Pytorch를 이용해서 1차원 Tensor부터 만들기
Pytorch에서는 FloatTensor 함수를 이용하여 Tensor를 만들 수 있습니다.
일단은 1차원 Tensor부터 만들어 보죠
1차원부터 2차원 3차원 다차원 다 만들 수 있어요 여러가지 차원을 만들어 보는 경험을 가져봅시다.
추가로 dim(), shape(), size()라는 메서드를 이용해서 Tensor의 차원 크기도 알 수 있습니다.
우리가 1차원 형태의 Tensor를 만들었기 때문에 t.dim()을 통해서 1차원 Tensor라는 것을 확인 할 수 있고 shape()이나 size()를 사용하면 Tensor의 크기도 알 수 있습니다.
해당 Tensor에 총 7개의 인자가 들어 있기 때문에 크기가 7인 것을 확인 할 수 있습니다.
슬라이싱과 인덱싱
- 인덱싱은 뭐고 슬라이싱은 뭐임?
인덱싱은 내가 지정해서 무언가를 가리키는 것이라고 생각하면 됩니다.
연속적인 객체에 있는 인자들은 각각 번호를 가지고 있는데 번호를 입력해서 원하는 인자에 접근하는 방식 입니다.
슬라이싱은 영문 뜻대로 잘라 낸다는 의미로 연속적인 객체에서 내가 원하는 범위 만큼 잘라내어 접근하는 방식입니다.
-
그럼 저기서 -1은 뭐임?
여기서 -1은 마지막 번호를 의미합니다 우리가 만든 1차원 Tensor에서 마지막 번호는 6번 입니다.(0번부터 시작하기 때문에 0번이 1번째임) 그렇기 떄문에 -1은 6번을 의미합니다.
2차원 Tensor 만들어 보기
이번에는 FloatTensor 함수를 이용해서 2차원 Tensor를 직접 만들어 볼 겁니다.
보시면 4x3크기의 2차원 Tensor 즉 행렬이 완성이 되었습니다.
아까 배웠던 dim(),size()메서드를 응용 해봅시다.
dim()메서드는 차원을 구해주고 size()는 크기를 구해주는 메서드였죠
해당 함수는 4x3크기의 행렬이기 때문에 dim()을 활용 하였을 때 2라는 값이 나왔고
4x3크기 이기 때문에 size()을 활용 하였을 때 torch.Size([4,3])이라는 값이 나왔습니다.
아까 이론 부분에서 Tensor들을 수식으로 정의 할때 말한 것 처럼 ,(comma)는 x 곱하기라는 의미를 가지고 있습니다.
그리고 슬라이싱도 응용해보죠
우리는 슬라이싱 메서드의 문법이 [가져올 첫 범위:가져올 끝 범위]인걸 확인 했습니다.
그런데 아무것도 안쓴 [ : ]이걸 쓰게 되면 어떻게 될까요?
해당 객체의 첫 번째 번호부터 끝 번호까지 슬라이싱 해온 다는 의미 입니다.
또한 슬라이싱 [ : ].size()를 해줌 으로써 슬라이싱 해온 인자들의 크기를 구할 수도 있습니다.
- 그럼 [ : ,1]은 뭐임?
슬라이싱 문법이 [가져올 첫 범위: 가져올 마지막 범위]인거는 다들 아실 겁니다.
이를 2차원 행렬에서 적용할 경우
[가져올 행의 첫 범위: 가져올 행의 마지막 범위, 가져올 열의 첫 범위: 가져올 열의 마지막 범위]로 적용 시킬 수 있습니다.
그래서 가져올 행의 범위는 전부를 설정하고 가져올 열의 범위는 1번 즉 두 번째 열의 전체를 가져온다고 해석 할 수 있습니다.
브로드 캐스팅
이번에는 브로드 캐스팅에 대해 배워 볼 것입니다.
여러분도 알다 싶이 수학에서 행렬의 덧셈과 곱셈을 하기 위해서는 행렬의 크기가 같아야 할 수 있습니다.
하지만? Pytorch는 행렬의 크기가 달라도 가능하게 해줍니다. 알아서 맞춰 주거든요~
아래는 일반적인 행렬의 크기가 같은 경우 입니다.
일반적인 크기가 같은 행렬끼리 더하는 것은 정상적으로 더할 수 있습니다.
서로 크기가 다른 vector와 scalar를 더하는 경우 입니다.
m1은 1x2크기이고 m2는 1x1크기입니다.
하지만 Pytorch에서는 브로드 캐스팅이라는 기능이 있기 때문에 따로 변환해주지 않아도
자동으로 크기를 맞추어 위의 예제 코드처럼 자동으로 변환해서 더해줍니다.
또 다른 예제 입니다.
이와 같이 1x2 크기의 2차원 Tensor와 2x1크기의 Tensor를 더하는 과정입니다.
이렇게 자동으로 Pytorch에서는 수학적으로 불가능한 행렬 덧셈을 브로드 캐스팅으로 가능하게 만들어 줍니다.
View를 알아보자
이번에는 View다뤄 볼껍니다.
???:내가 아는 View는 한강 View밖에 없는데요
그 보이는 View가 아닙니다 아무리 프로그래밍 언어가 영단어의 뜻을 기반으로 메서드나 함수가 만들어지지만 그래도 이건 그게 아니에요
-
그럼 너가 아는 View는 뭐임?
Pytorch의 View는 텐서의 차원을 변환시켜주는 메서드입니다.
Numpy의 Reshape과 같은 메서드죠.
여러분이 나중에 인공지능을 더 다루고 공부하다 보면 인공지능의 Input은 2차원의 Tensor를 받아야 하지만 여러분의 데이터는 3차원 Tensor인 경우와 같은 비슷한 경우가 발생 할 수 있습니다.
이때 3차원의 Tensor를 2차원의 Tensor로 바꾸어 주는게 View메서드 입니다. 대신 원소의 수는 그대로 유지하면서 차원만 바꿔주는 아주 좋은 메서드이고 매우 중요합니다
이와 같이 3차원의 Tensor를 임의로 만들어 주겠습니다.
해당 텐서를 그림으로 표현하즈면 이러한 그림이 형태가 됩니다.
이제 실습을 통해 View메서드를 활용해서 3차원 Tensor를 2차원 Tensor로 변환해줍니다.
(2,2,3)크기의 Tensor를 (4,3)으로 바꾸어 줬습니다
-1의 값은 해당 차원의 크기를 pytorch 에서
알잘딱깔센하게 설정하는 것입니다. 그런데 2번째 차원의 크기가 3이기 때문에 강제로 4로 설정이 됩니다.이번에는 View를 이용하여 3차원으로 변경할 뿐만 아니라 각 차원의 원소 개수도 변경 해봅시다. 각 차원의 원소 수는 변경 할 수 있지만 항상 Tensor의 총 원소는 같다는 것을 명심하세요
Squeeze를 알아보자
이번에는 Squeeze를 알아보도록 하겠습니다.
스퀴즈는 차원의 크기가 1인 경우 해당 차원을 제거하는 메서드입니다.
예를 들어 3x1크기의 Tensor가 있다고 할 때 해당 Tensor에 Squeeze를 적용하게 된다면 2번째 차원이 제거되어 3의 크기가 됩니다.
이와 같이 1x3 크기의 텐서를 3으로 바꾸어 줄 수 있습니다.
Unsqueeze를 알아보자
이번에는 Squeeze의 반대인 Unsqueeze입니다.
우리가 앞서 다루었던 Squeeze의 역할을 다시 한번 되새겨봅시다.
Squeeze는 차원의 크기가 1인 차원을 지우는 역할을 했죠.
Unsqueeze는 특정 위치에 1인 크기의 차원을 새로 추가합니다.
이와 같이 크기가 [3]인 1차원 Tensor에 Unsqueeze를 적용시켜 (1,3)크기의 2차원 Tensor로 만들 수 있습니다.
그런데 우리가 앞서 배웠던 View를 Unsqueeze처럼 사용할 수 있습니다.
복습할겸 해서 다시 한번 View메서드의 역할을 생각해봅시다.
View는 Tensor의 원소 수는 그대로 유지하되 차원을 변경시키는 메서드였습니다.
이를 Unsqueeze메서드 처럼 특정 차원에 1의 크기를 한번 추가 해봅시다.
2번째 차원에 -1을 부여해서 해당 원소의 총 개수에 맞게 자동으로 조절하여 (1x3)크기의 2차원 Tensor를 만들었습니다.
Type Casting에 대해 Araboza
컴퓨터 공학, 전자 공학 등 이공계 여러분이라면 코딩을 배우신 적이 있을겁니다. 혹은 이공계 분들이 아니더라도 인공지능을 공부하기 위해 파이썬 공부를 해보신 분들도 아실겁니다.
모든 변수에는 자료형이라는 것이 있습니다.
이는 Tensor에도 자료형이 있습니다.
위의 표는 각 자료형을 변환시키는 메서드들 입니다.
예를 들어 64비트의 int형 Tensor가 있다 칩시다.
근데 우리가 인공지능에 넣을 자료형은 float형 자료형이 필요합니다. 이때 int형 →float형으로 바꾸어주는 메서드가 바로 Type Casting입니다.
위와 같이 t라는 자료형을 LongTensor를 통해 long타입의 Tensor를 만든 후 t라는 변수에 저장해봅시다 그럼 t라는 변수는 자료형이 long타입일 것 입니다.
t 뒤에 float()라는 메서드를 추가해주기만 하면 long타입 이였던 t가 float형으로 변경이 되는 것을 확인 할 수 있습니다.
다음 실험을 위해 byte타입의 Tensor도 한번 만들어 보죠.
이렇게 byte 타입의 Tensor를 저장하고 있는 변수 byte뒤에 .long() 혹은 .float()만 넣어주면 해당 타입의 Tensor로 바뀌게 됩니다.
연결(concatenate)에 대해 araboza
- 이번에는 두 개의 Tensor를 연결해주는 메서드에 대해 알아보도록 하겠습니다.
이는 아래와 같은 그림 처럼 y에 x를 쌓아 올린 형태랑 같습니다
dim=0값을 부여함으로써 1번째 차원인 행을 늘리라는 의미 입니다.
그림 ㅈㄴ 못 그린다고 생각하실 수 있는데 저도 그렇게 생각합니다.
이번에는 dim=1을 부여해서 2번째 차원인 열을 늘리라는 의미를 부여한 것과 같습니다.
-
Stacking에 대해 araboza
Stacking은 많이 익숙한 단어라고 생각하실 겁니다.
예를 들어 롤에서 나서스 Q스택을 쌓는다던가 혹은
약물 스택을 쌓는다던가파이썬의 자료구조 중에 Stack알고리즘이라던가 등등 어떠한거를 위에 쌓는다는 의미입니다.문법은 연결 메서드와 똑같습니다. 그렇기 때문에 자세한 설명은 하지 않겠습니다.
???:둘 다 똑같은데 왜 알려줌? 하나만 알려주면 되는거아님?
이렇게 생각 하실 수 있습니다. 하지만 비슷한 역할을 한다고 했지 완전히 똑같다고는 하지 않았습니다. 왜냐하면 스택킹 메서드가 연결 메서드보다 훨씬 더 많은 연산을 포함하기 때문에 상황에 따라 스택킹이 더 편리할 경우가 있기 때문입니다.
스택킹도 이런 원리라고 생각하시면 편합니다 x를 y 위에 쌓아 올리는거죠
Ones_like와 Zeros_like에 대해 araboza
Ones_like와 Zeros_like는 굉장히 쉽습니다.
Ones_like는 해당 텐서의 크기와 모양은 그대로 유지하되
모든 원소를 1로 바꿉니다.
Zeros_like는 Ones_like와 마찬가지로 해당 텐서의 크기와 모양은 그대로 유지하되 모든 원소를 0으로 바꿉니다.
예제 코드를 한번 봐보도록 합시다.
그냥 torch.ones_like(변수),torch.zeros_like(변수) 이렇게만 넣어 주시면 끝입니다.
찐막) 덮어쓰기 연산(In-place Operation)
여러분 긴 글을 읽으며 따라오시느라 정말 고생이 많으셨습니다.
마지막 기본 실습입니다.
마지막은 바로 덮어쓰기 연산입니다.
???:연산이면 연산이고 덮어쓰기면 덮어쓰기지 덮어쓰기 연산이 뭔 말임??? 국평오임?
이라고 하실 수 있습니다. 이것은 알아두면 간편한 메서드인데요.
우리는 보통 연산이 완료된 변수는 다시 다른 변수에 저장을 해둡니다.
예를 들어 x=y*2와 같이 y라는 변수에 2를 곱한 뒤 x에 저장을 해두죠
하지만 이 메서드는 따로 y의 연산 결과 값을 x라는 변수에 저장한다는 선언 없이 자동으로 저장이 되는 메서드입니다.
만약 위의 예제 코드와 같이 y의 연산 결과 값을 다른 변수에 저장하겠다 혹은 y에 저장하겠다 라는 선언이 없으면 연산을 하더라도 기존의 y값이 출력이 됩니다.
하지만 이처럼 mul이라는 곱셈 메서드 뒤에 _이 한 글자만 적어주시면
자동으로 y의 연산 결과 값이 y에 저장이 되는 것을 확인 하실 수 있습니다.
여기까지가 기본 Tensor에 대한 기초 내용입니다.
여기까지 따라오느라 수고가 많으셨습니다.
제발 이거 보고 그냥 복사 붙여넣기 딸깍 딸깍 하지마시고 직접 코드도 작성해보고 문법이나 코드의 의미를 해석하면서 주석도 작성하는 연습도 해보십쇼
-
하기싫은데요?
댓글남기기