본문 바로가기
728x90

전체 글83

MLP에서 1x1을 사용해서 Bottleneck 구조를 설계하고, 그렇게 설계한 이유는? MLP에서의 1x1 conv를 사용한 Bottleneck 구조의 설계는 다음과 같습니다. (n,c) -> (1x1,c/4) -> activation function -> (c/4,c/4) -> activation function -> (1x1, c) -> activation function -> (n,c) 그리고 입력과 출력을 더해주면 완성입니다. CNN에서의 여러 채널들은 여러 filter들을 사용해 이미지에서의 지역적인 다양한 특징들을 추출하여, 특정 채널은 이미지의 특정 특징과 반응하게 된다고 생각합니다. 이와 유사하게 MLP에서의 채널도 이미지의 전체를 보고 해당 이미지에 대한 특징을 대표적으로 표현한다고 할 수 있습니다. 이를 1x1 conv의 Bottleneck구조를 적용한다면, CNN에서와 .. 2023. 8. 3.
1x1 convolution은 언제 사용되며 의미와 효과? 1x1 convolutionn은 적은 파라미터로 깊은 신경망을 학습하기 위해서 사용되며, 대표적으로 ResNet50의 Bottleneck 구조에 이용됩니다. 신경망 특성상 깊어질수록 채널수가 더욱 증가하여 특징들을 고차원화하여 복잡한 패턴을 인식하도록 합니다. 하지만, 신경망이 깊어질수록 그만큼 컴퓨팅이 증가하기 때문에 성능대비 비효율적입니다. 하지만 1x1 conv기반의 Bottleneck구조를 사용하게 되면, 채널을 줄이고 특징을 추출하고 다시 채널을 늘리는 방식으로 적은 채널의 텐서에서 특징을 추출, 중간중간에 relu와 같은 activation function으로 비선형성을 증가시켜줍니다. 그러므로 적은 파라미터로 깊은 신경망을 쌓아 더 복잡한 패턴을 파악할 수 있습니다. Bottleneck의 예.. 2023. 8. 3.
딥러닝은 무엇이며, 머신러닝과의 차이점은? 딥러닝은 깊은 인공신경망을 이용해 대량의 데이터에 대하 복잡한 패턴을 학습하는 것입니다. 딥러닝과 머신러닝의 차이는 깊이와 복잡성에 있습니다. 머신러닝은 딥러닝에 비해 계층구조가 얕고, 비교적 소규모의 데이터에 적합한 학습을 목표로 합니다. 그렇기 때문에 사용자가 데이터의 전처리와 특징추출에 대해서 많이 개입하게 됩니다. 반면에 딥러닝은 대용량의 원시 데이를 기반으로 복잡한 패턴을 모델이 스스로 추출 및 파악하도록 학습하기 때문에 사용자의 개입이 매우 적습니다. 즉, 머신러닝은 의도하는 기계학습만을 사용자가 예측 가능한 수준에서 수행하지만, 딥러닝은 모델이 사용자가 예측하는 것을 넘어서 스스로 매우 복잡한 패턴을 파악하도록 합니다. 2023. 8. 3.
[c++] 백준 텀프로젝트(9466), BFS, 반례추가 문제 https://www.acmicpc.net/problem/9466 팀을 이루지 못하는 학생 수 구하기. 팀을 이루는 조건 1 -> 3 -> 5 -> 1 : 자기 자신으로 돌아와야 함. 1 -> 1 : 혼자 팀 팀을 못 이루는 조건 1 -> 3 -> 5 -> 3 : 1은 팀 x 1 -> 3 -> 5 -> 5 : 1,3은 팀 x 풀이 위의 조건에서와 같이 현재 n에서 탐색을 할 때, 팀을 이루든 이루지 못하든 무조건 순환루프에 걸리게 되어 있습니다. 순환루프에 걸렸을 때, 팀을 이루는 사람과 이루지 못하는 사람을 분리해서 표시를 해주면 됩니다. n번째에서 표시를 마치고, n+1번째에서 탐색을 할 시, 1~n번째에서 표시한 사람을 가르킨다면 이 또한 팀을 이루지 못한다고 할 수 있습니다. 이미 앞에서는 .. 2023. 8. 1.
[Pytorch] Cosin Similarity Loss +역전파 1. Cosin Similarity Loss import torch import torch.nn.functional as F import torch.nn as nn feat1 = torch.tensor([0.1,0.2,0.3], dtype=torch.float32) feat2 = torch.tensor([0.4,0.2,0.5], dtype=torch.float32) loss = F.cosine_similarity(feat1, feat2) # negative cosin loss loss = -F.cosine_similarity(feat1, feat2) # positive cosin loss 두 벡터(feature)를 가깝게 혹은 멀게 만들도록 학습합니다. 저는 여기서 의문점이 들었습니다. 위의 수식의 역전.. 2023. 7. 30.
[Pytorch] Inplace error 해결 inplace error - 텐서의 임의의 값을 변경(대체) 헀을 때 gradient가 끊기면서 발생하는 문제 - ex) a = b 이런식으로 대체할 경우에 발생함. a += 1 이런식의 표현도 에러가 발생할 수 있음. -> a = a + 1, 이렇게 수행해야 한다. a[index] = b 이런식의 표현도 동일. - 해결책은 clone()을 사용해서 텐서를 복사후에 대체를 하고 넘겨주면 된다. - ex) c = a.clone() c[index] = b a = c return a 2023. 7. 29.
[Pytorch] Tensor 다차원 인덱싱 torch tensor를 다루다 보면 3차원 혹은 4차원 이상의 텐서를 다룰 때, 인덱싱의 어려움이 생길 때가 있습니다. 예를 들어, 4차원에서 각 batch마다 다른 channel의 특정 index만 추출하고 싶을 때가 그렇습니다. 아래 코드는 각 배치마다 다른 채널의 값들을 가져오는 예시입니다. import torch a = torch.randn(2,3,2,3) b,c,w,h = a.shape batch_index = list([i] for i in range(b)) # [[0],[1]] channel_index = [[0,0,0],[1,1,1]] # 각 배치마다 가져올 채널 지정 k = a[batch_index, channel_index] # 각 배치에 해당하는 각 채널들을 인덱싱하여 가져옴 a라는.. 2023. 7. 29.
[c++] 백준 벽 부수고 이동하기(2206), BFS 문제 https://www.acmicpc.net/problem/2206 NxM 형태의 맵에서, 0은 이동가능, 1은 벽으로 이동 불가. 상하좌우로만 이동가능. 좌측 상단(1,1)에서 우측하단(N,M)까지 이동 가능한 최단 거리 출력. 이동 불가시 -1 출력. 벽을 1 개만 부실 수 있음. 풀이 일반적으로 최단거리 출력은 방문여부 체크가 중요함. (map과 방문여부 체크하는 map_check를 따로 만듬) 이미 방문한 곳은 최단거리가 아니라고 가정하기 때문. 하지만, 이 문제는 벽을 1개 부실 수 있기 때문에 이미 방문한 곳이라도 벽을 부수고 방문했느냐 혹은 부수지 않고 방문 했느냐로 나뉘게 됩니다. 다시 말해, 방문여부 체크를 벽을 1개 부셨을 때와 부수지 않았을 때를 나누어서 생각해야 합니다. 따라서,.. 2023. 7. 29.
[c++] Tuple 사용법 여러 자료형을 묶어서 사용할 수 있음. #include tuple t(1, 'a', "abcd"); pair는 2쌍까지만 가능하지만, tuple은 여러 쌍 가능. 그렇지만, 같은 자료형을 사용하는 것을 추천. 3쌍 이상 묶어야 할 때 사용. 예를 들어, 큐에 3차원 좌표를 쌓을 때. 1. Tuple 선언 및 초기화 2. Tuple 원소 접근 3. Tuple 원소분해 4. 두 개의 튜플 연결 5. Tuple swap 2023. 7. 28.
[c++] 3차원 배열(백터) 선언 및 초기화 3차원 배열을 선언하는 2가지 방법에 대해서 소개합니다. 1. 기본 배열로 선언 및 초기화 2. vector를 이용한 선언 및 초기화 1. 기본 배열로 선언 및 초기화 fill(arr[i], arr[i] + column, value) : i번째 행마다 column까지의 원소에 value를 할당함 2. vector를 이용한 선언 및 초기화 (M,N,H) 형태의 3차원 벡터 생성함. vector안에 또 다른 벡터를 선언하고 이를 높이(H)만큼 선언 초기값은 0으로 할당되며, 원할시 값을 할당할 수 있음. fill()을 사용해서도 초기화가 가능하다. 함수로 넘길시 vector를 복사할 것인지, 주소만 넘길 것인지 생각해야 함. 벡터의 가장 큰 장점은 공간을 미리 할당하지 않아도 됨. 입력받은 공간 크기만큼 할.. 2023. 7. 27.
[c++] 반복문 iterator처럼 사용하기. 2023. 7. 26.
[c++] 백준 숨바꼭질(1679), BFS, 반례모음 문제 https://www.acmicpc.net/problem/1697 수빈이(N)이 동생(K)를 찾는 가장 빠른 시간 출력 수빈이는 현재 위치(X)에서 3가지 동작(X+1, X-1, 2*X) 가능 5 17 -> 4출력(5-10-9-18-17) 풀이 1차원에서 수빈이의 이동 가능한 모든 방향을 탐색, 동생을 찾을 때까지 계속한다. 마치 가능한 모든 경우의 수를 탐색하는 것과 같음. 1차원 벡터(배열)의 map을 만들고, 수빈이의 시작지점에 1의 값을 넣고, 다음 이동 배열 값에 현재 위치의 값+1을 해주며 확산한다. 동생을 찾을 시 종료. 예외 처리 - 이전에 방문한 좌표는 패스 - 배열의 일정 크기를 넘으면 패스 - 0 0을 받을시 0을 출력 - 기타 반례모음 아래에. 반례모음 입력 6 11 정답 (6.. 2023. 7. 26.
728x90