댑덥딥 8주차 정리
Tags: ai, deeplearning, 스터디, 모두를위한딥러닝시즌2
Published: 2023-12-28 11:16:30

> '모두를 위한 딥러닝 시즌 2' 강의를 듣고 공부하는 스터디 입니다. https://deeplearningzerotoall.github.io/season2/lec_tensorflow.html
> 

---

***비대면 31 May, 2023***

# 10-7 next step of CNN

### CV 관련 앞으로 할만한 것들

classification: 분류

-DenseNet, SENet, MobileNet, SqueezeNet, AutoML(NAS, NASNet)

object detection: 탐지

-Latest Object Detection을 검색
{% embed https://github.com/hoya012/deep_learning_object_detection %}

object tracking: 프레임 간의 연관관계

-MDNet, GOTURN, CFNet, ROLO, Tracking the Untrackable

segmetation: 배경과 객체 분할

-FCN, U-Net, Mask RCNN

Image Captioning

Super Resolution

Generative Model(AutoEncoder, GAN)

OpenPose

- [ ]  Pytorch가 가지고 있는 다양한 기능들 직접 사용해보기!
- [ ]  Custom DataSet 만드는 방법 익히기
- [ ]  Pytorch가 제공하지 않는 데이터셋을 다운받아서 학습해보기 (Tiny-ImageNet Challenge 추천!)

# 11-0 RNN intro

RNN? sequential data를 다루기 위해 고안됨. ex) word, sentence, time series

sequential data? 순서가 중요한 data. ex) “hello”를 “elhol”로 바꾸면 알아듣지 못 함

-RNN 이전에도 position index를 활용하여 sequential data를 처리할 수 있었음. 다만, 복잡한 구조 파악 어려웠음


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/upru8wq3w6o7l4xt1lqh.png)

: A라는 셀에 t번째 입력값이 들어오면, t번째 출력값이 나오고, 동시에 다른 출력값이 셀 A로 들어감. 이때 다른 출력값을 hidden state라고 하며, 다음 셀로 전달됨. 따라서 t+1번째의 출력값은 t번째의 영향을 받음. 다음 셀은 사실 원래의 셀과 같은 것임(=모든 셀 A는 같음. 모두 같은 함수(파라미터)를 공유하기 때문)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mtzl1rcasn6z7putt69f.png)

Ht는 기본적으로 w를 인자로 갖는 함수 연산에 의해 나옴. Ht-1은 hidden state이고, y는 Ht와 같음.

ex) (vanilla) recurrent neural network


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v7i99x2djolidt8yppcr.png)

#### caracter-level language model example


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qtql5j6sp0xcqimsablf.png)

### Usages of RNN


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fwfnup3dmwmd5afs8hhr.png)

ex)

1) 이미지→이미지에 대한 설명

2) 문장 → 감정 레이블

3) 문장 → 문장 (문장이 다 끝난 시점부터 다음 문장이 나옴)

4) 비디오 → 비디오

#### multilayered RNN


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v0fgbx4z47axrtbogclz.png)

### RNN applications


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/efqgzzhpw2s3okfw29d6.png)

cf) advanced model examples

-LSTM(http://colah.github.io/posts/2015-08-Understanding-LSTMs/)

-GRU

# 11-1 RNN basics

### RNN in PyTorch

```python
rnn = torch.nn.RNN(input_size, hidden_size)
outputs, _status = rnn(input_data)
```

- input/output shape: dimension 3짜리 torch tensor
    
    input shape = (batch size, sequence length, input_size)
    
    output shape = (batch size, sequence length, hidden_size)
    

-batch size, sequnece length는 pytorch가 input data에 따라 자동으로 판별함

#### example_hello를 입력 받았을 때, ello-를 출력받기

```python
import torch
import numpy as np

input_size = 4
hidden_size = 2

# 1-hot encoding
h = [1, 0, 0, 0]
e = [0, 1, 0, 0]
l = [0, 0, 1, 0]
o = [0, 0, 0, 1]
#input_size = 4

input_data_np = np.array([[h, e, l, l, o],
												[e, o, l, l, l],
												[l, l, e, e, l]], dtype=np.float32)
#batch size = 3

# transform as torch tensor
input_data = torch.Tensor(input_data_np)

rnn = torch.nn.RNN(input_size, hidden_size)
outputs, _status = rnn(input_data)
```

# 11-2 RNN hihello and charseq

### Hihello problem

h가 들어오면 i를, i가 들어오면 h를, h가 들어오면 e를, … 예측하는 문제

-위의 example과 비슷

```python
##prepare data for hihello problem
char_set = ['h', 'i', 'e', 'l', 'o']
# hyper parameters
input_size = len(char_set)
hidden_size = len(char_set)
learning_rate = 0.1
# data setting
x_data = [[0, 1, 0, 2, 3, 3]]
x_one_hot = [[[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0]]]
y_data = [[1, 0, 2, 3, 3, 4]]
# transform as torch tensor variable
X = torch.FloatTensor(x_one_hot)
Y = torch.LongTensor(y_data)
```

### charseq

hihello problem에서 입력을 일반화한 것

```python
sample = " if you want you"
# make dictionary
char_set = list(set(sample))
char_dic = {c: i for i, c in enumerate(char_set)}
# hyper parameters
dic_size = len(char_dic)    #=input_size
hidden_size = len(char_dic)
learning_rate = 0.1
# data setting
sample_idx = [char_dic[c] for c in sample]
x_data = [sample_idx[:-1]]
x_one_hot = [np.eye(dic_size)[x] for x in x_data]
y_data = [sample_idx[1:]]
# transform as torch tensor variable
X = torch.FloatTensor(x_one_hot)
Y = torch.LongTensor(y_data)

# declare RNN
rnn = torch.nn.RNN(input_size, hidden_size, batch_first=True) # batch_first guarantees the order of output = (B, S, F)
# loss & optimizer setting
criterion = torch.nn.CrossEntropyLoss()
optimizer = optim.Adam(rnn.parameters(), learning_rate)

# start training
for i in range(100):
	optimizer.zero_grad()
	outputs, _status = rnn(X)
	loss = criterion(outputs.view(-1, input_size), Y.view(-1))
	loss.backward()
	optimizer.step()
	result = outputs.data.numpy().argmax(axis=2)
	result_str = ''.join([char_set[c] for c in np.squeeze(result)])
	print(i, "loss: ", loss.item(), "prediction: ", result, "true Y: ", y_data, "prediction str: ", result_str)
```

# 11-3 RNN Long sequence

### longseq

-loger dataset를 특정 사이즈로 잘라 사용(=특정 사이즈의 윈도우를 하나씩 옆으로 옮기며 자름)→자른 데이터를 인덱스로 저장→one-hot encoding→torch tensor화

ex)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5a2yuz7proz8a25n79f5.png)

```python
# data setting
x_data = []
y_data = []
for i in range(0, len(sentence) - sequence_length):
    x_str = sentence[i:i + sequence_length]
    y_str = sentence[i + 1: i + sequence_length + 1]
    print(i, x_str, '->', y_str)
    x_data.append([char_dic[c] for c in x_str]) # x str to index
    y_data.append([char_dic[c] for c in y_str]) # y str to index

x_one_hot = [np.eye(dic_size)[x] for x in x_data]

# transform as torch tensor variable
X = torch.FloatTensor(x_one_hot)
Y = torch.LongTensor(y_data)
	
# declare RNN + FC
# (adding FC and stacking RNN)
class Net(torch.nn.Module):
    def __init__(self, input_dim, hidden_dim, layers):
        super(Net, self).__init__()
        self.rnn = torch.nn.RNN(input_dim, hidden_dim, num_layers=layers, batch_first=True)
        self.fc = torch.nn.Linear(hidden_dim, hidden_dim, bias=True)

    def forward(self, x):
        x, _status = self.rnn(x)
        x = self.fc(x)
        return x
net = Net(dic_size, hidden_size, 2)

# loss & optimizer setting
criterion = torch.nn.CrossEntropyLoss()
optimizer = optim.Adam(net.parameters(), learning_rate)
# start training
for i in range(100):
    optimizer.zero_grad()
    outputs = net(X)
    loss = criterion(outputs.view(-1, dic_size), Y.view(-1))
    loss.backward()
    optimizer.step()

    results = outputs.argmax(dim=2)
    predict_str = ""
    for j, result in enumerate(results):
        # print(i, j, ''.join([char_set[t] for t in result]), loss.item())
        if j == 0:
            predict_str += ''.join([char_set[t] for t in result])
        else:
            predict_str += char_set[result[-1]]

    print(predict_str)
```
---

***대면 8 April, 2023***

###gradient descent and linear regression
Q. train run을 여러번 돌릴 때, data 쪽 셀을 run하지 않고 돌리면 그 전 런타임에서 발생한 오버피팅이 그다음 런타임 시작부터 누적되어 발생하는 느낌? 왜 그런거지?

Q. train loss 왜 증가? 
A. learning_rate 너무 컸음

{% embed https://colab.research.google.com/drive/1YqWHTcLhSPHBBR-XPm5GbFWj9bCK8IRs?usp=sharing %}