본문 바로가기
책&강의 학습/올인원 패키지 :딥러닝&인공지능

[패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 6회차 미션

by 소한보 2020. 7. 4.

Part2-11 Evaluating & Predicting

expert보다 keras로 할수 있는게 많기 때문에 기본으로 진행

history

모델링한 로그가 epoch당 기록됨 (loss, acccuracy)

hist.history
>>> {'loss': [0.21890185427119335], 'accuracy': [0.92983335]}

Evaluating

학습한 모델을 확인 test_set으로 값을 확인

model.evaluate(test_x, test_y, batch_size=batch_size)
>>> [0.040028760529810095, 0.9857]

Prediction

가장 높은 자극을 받은 노드가 정답임. 가장 높은 값은 np.argmax를 활용하면 간편함
평가는 우리가 직접하는 것이기에 레이블이 필요없음

확인해볼 y값

test_image = test_x[0, :, :, 0]
test_image.shape
pred = model.predict(test_image.reshape(1, 28, 28, 1))
pred.shape
>>> (1, 10)
pred #우리가 원하는 형태로 나오지 않음 
>>> array([[2.0396669e-09, 2.5598872e-09, 1.4872910e-07, 5.5574571e-08,
        2.9990253e-11, 3.0660738e-10, 2.1636267e-14, 9.9999964e-01,
        1.1250626e-09, 7.2331815e-08]], dtype=float32)
np.argmax(pred) #가장 높은 자극을 받는 노드 검출
>>> 7

test batch

1개의 이미지가 아닌 여러장(32개)의 이미지를 한번에 예측

test_batch = test_x[:32]
test_batch.shape
>>> (32, 28, 28, 1)
preds = model.predict(test_batch)
preds.shape
>>> (32, 10)
np.argmax(preds, -1) #각 row별로 최대노드를 찾아야하기 때문에 -1(row축)연산
>>> array([7, 2, 1, 0, 4, 1, 4, 9, 5, 9, 0, 6, 9, 0, 1, 5, 9, 7, 3, 4, 9, 6,
       6, 5, 4, 0, 7, 4, 0, 1, 3, 1], dtype=int64)

Part2-12 Pytorch 기초

numpy와 굉장히 유사함

기초 매서드

arange, tpye, reshape, rand, zeros, ones 등 동일한 방법으로 사용가능

 #arange
np.arange(9)
>>> array([0, 1, 2, 3, 4, 5, 6, 7, 8])
nums = torch.arange(9)
nums
>>> tensor([0, 1, 2, 3, 4, 5, 6, 7, 8])
nums.shape
>>> torch.Size([9])
type(nums)
>>> torch.Tensor
nums.numpy() #numpy로 변환
>>> array([0, 1, 2, 3, 4, 5, 6, 7, 8], dtype=int64)
nums.reshape(3,3) 
>>> tensor([[0, 1, 2],
        [3, 4, 5],
        [6, 7, 8]])
torch.rand(3,3)
>>> tensor([[0.2963, 0.9822, 0.5231],
        [0.9371, 0.9171, 0.9328],
        [0.9409, 0.9289, 0.6541]])
torch.zeros((3,3))
>>> tensor([[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]])
ones = torch.ones((3,3))
ones
>>> tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]])
torch.zeros_like(ones)
>>> tensor([[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]])
zeros.size()
>>> torch.Size([3, 3])

수학연산

nums *3  #브로드캐스팅 가능
>>> tensor([ 0,  3,  6,  9, 12, 15, 18, 21, 24])
nums= nums.reshape((3,3))
nums + nums
>>> tensor([[ 0,  2,  4],
        [ 6,  8, 10],
        [12, 14, 16]])
result = torch.add(nums, 10)
result.numpy()
>>> array([[10, 11, 12],
       [13, 14, 15],
       [16, 17, 18]], dtype=int64)

view

reshape과는 큰 차이가 없고 view보다 reshape 사용을 권장하고 있음
하지만 공식홈페이지에서 모델링에서 view를 사용하기 때문에 알아둘 필요가 있음

range_nums = torch.arange(9).reshape((3,3))
range_nums
>>> tensor([[0, 1, 2],
        [3, 4, 5],
        [6, 7, 8]])        
range_nums.view(-1)
>>> tensor([0, 1, 2, 3, 4, 5, 6, 7, 8])
range_nums.view(1,9)
>>> tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]])

슬라이싱과 인덱싱

numpy에서 하던 방법과 큰 차이 없음
정말로 큰차이가 없어서 사진으로 대체

numpy와 다른부분

type변경방법, 및 device 선택방법

arr = np.array([1,1,1])
arr_torch = torch.from_numpy(arr)
arr_torch.float()
>>> tensor([1., 1., 1.])
 # device 선택을 할 수있는 아래는 공식홈페이지에서 gpu가 있으면 gpu 아니면 cpu로하게금 하는 공식
 # default로 쓰면 된다
device = 'cuda' if torch.cuda.is_available() else 'cpu'
arr_torch.to(device) #확인이 바로 되진 않지만 변경됨

AutoGrad

텐서연산에 대해서 자동으로 미분값을 구해주는 기능을 함.
텐서자료를 생성할때 requires_grad인수를 True로 지정하면 텐서에 실행되는 모든 연산에 미분값을 계산함

x  = torch.ones(2,2,requires_grad = True) 
y = x + 2
z = y * y * 3
out = z.mean()
out.backward() #backward 함수를 실행하면 requires_grad가 True 변수의 미분값을 자동으로 갱신 
x.grad #미분값의 속성을 확인
>>> tensor([[4.5000, 4.5000],
        [4.5000, 4.5000]])
 #test모드를 사용할때는 속도를 향상시키기 위해 기울기,배치노말라이제이션, 드롭아웃을 안하게 해서 속도를 높임    
with torch.no_grad():
    print((x ** 2).requires_grad)

후기...

토치 짱신기함. 사람들이 편하다고 이야기하는 이유를 이해했음
Autograd... 설명이 다소 부족하다 느낌...

딥러닝/인공지능 올인원 패키지 Online

댓글