'모두를 위한 딥러닝 시즌 2' 강의를 듣고 공부하는 스터디 입니다. https://deeplearningzerotoall.github.io/season2/lec_tensorflow.html
비대면 5 April, 2023
Lab-01-1
basic tensor manipulation
vector(1d)-matrix(2)-tensor(3)
pytorch tensor shape convention
-matrix 크기
2d(typical simple setting)
: |t| = (batch size, dim)으로 표현
3d(typical computer vision)
: |t| = (batch size, width, height)
3d(typical natural language processing)
: |t| = (batch size, length, dim)
: dim x length가 하나의 문장
numpy와 pytorch
##numpy
t = np.array([0., 1., ...,])
t.ndim //rank
t.shape //shape
t[:2] //slicing
##pytorch
t = torch.FloatTensor([0., 1., ...,])
t.ndim() //rank
t.shape() //shape
t.size() //shape
t[:2] //slicing
t.mean() //평균
t.mean(dim=0) //dim=0끼리 평균
t.sum() //합
t.sum(dim=-1) //dim=-1끼리 합
t.max() //최대
t.max(dim=1) //dim=1 중 최대, argument(index)값을 같이 리턴함
broadcasting
- 행렬끼리 연산을 수행할 때 크기를 맞춰야 함→ broadcasting 기능을 통해 자동으로 크기가 맞춰짐
- 자동으로 적용되므로 주의해야 함
#broadcasting
//vector + scalar
m1 = torch.FloatTensor([[1, 2]]) //(1,2)
m2 = torch.FloatTensor([3]) //(1, )->(1,2)
m1+m2
//2X 1 vector + 1X 2 vector
m1 = torch.FloatTensor([[1, 2]]) //(1,2)->(2,2)
m2 = torch.FloatTensor([3],[4]) //(2,1)->(2,2)
Lab-01-2
view(numpy의 reshape)⭐
- -1은 보통 가장 변동이 심한 batch size에
squeez
- 어떤 한 dimension의 element가 1일 때, 그 dimension을 없앰
- dimension을 명시할 수도 있음
unsqueeze
- 원하는 dimension에 1을 넣어줌
- dimension 명시해야 함
- view로 동일한 결과 얻을 수 있음
#view
//|t| = (2,2,3)
t.view([-1,3]) //첫번째 차원 정하지x, 두번째 차원 3으로/(2,2,3)->(2x2, 3)->(4,3)
#squeeze
//|ft| = (3,1)
ft.squeeze() //(3,1)->(3)
ft.squeeze(dim=0) //변화 없음
#unsqueeze
ft.unsqueeze(0) //(3)->(1,3)
type casting
lt = torch.LongTensor([1,2,3,4]) //[1,2,3,4]
lt.float //[1., 2., 3., 4.]
bt = torch.ByteTensor([True, False, False, True])
bt.long //[1,0,0,1]
bt.float //[1., 0., 0., 1.]
concatenate(이어붙이기)
x = torch.FloatTensor([[1,2], [3,4]])
x = torch.FloatTensor([[5,6], [7,8]])
torch.cat([x,y], dim=0) //(2,2)+(2,2)->(4,2)
torch.cat([x,y], dim=1) //(2,2)+(2,2)->(2,4)
stacking(concatenate를 간편화시킨 것)
- unsqueeze한 리스트로 cat하여 똑같은 결과 낼 수 있음
//|x|, |y|, |z| = (2, )
torch.stack([x, y,z]) //(2,)+(2,)+(2,)->(3,2)
torch.stack([x, y,z], dim=1) //(2,)+(2,)+(2,)->(2,3)
ones and zeros
- 똑같은 shape의 1로 채운/0으로 채운 tensor를 만듦
- device 같음
//|x|=(3,2)
torch.ones_like(x)
torch.zeros_like(x)
in-place operation
- ‘_’
- 메모리를 새로 선언하지 않고 결과값을 리스트에 반영함
- garbage collector가 잘 되어 있으므로 큰 차이 없음
x.mul(2.)
x.mul_(2.)
Lab-02, Lab-03
#data definition
x_train = torch.FloatTensor([]) //입력
y_train = torch.FloatTensor([]) //출력
#hypothesis
//hypothesis function: y=Wx+b: 학습 데이터와 가장 잘 맞는 하나의 직선
//w, b 0으로 초기화
W = torch.zeros(1, requires_grad=True)
b = torch.zeros(1, requires_grad=True)
hypothesis = x_train * W +b
#compute loss
//MSE활용
cost = torch.mean((hyphthesis - y_train)**2) //predict-target
#gradient descent
//b가 없는 모델이라고 가정(w=1일 때 가장 좋은 모델(cost=0))
//gradient descent: W= w-lr*gradW
gradient = 2* torch.mean((@*x_train-y_trina)*x_train)
lr = 0.1
W -= lr * gradient
//torch.optim으로 gradient descent를 간편하게 구현
optimizer = optim.SGD([W], lr=0.15)
//cost로 H(x)개선
optimizer.zero_grad() //gradient0으로 초기화
cost.backward() //gradient 계산
optimizer.step //gradient descent
-이를 여러 번의 iteration을 돌려 cost=0에 가까워지도록 함
대면 8 April, 2023
Top comments (0)