본문 바로가기

전체

(156)
[PyTorch] squeeze, unsqueeze함수: 차원 삭제와 차원 삽입 squeeze함수 squeeze함수는 차원이 1인 차원을 제거해준다. 따로 차원을 설정하지 않으면 1인 차원을 모두 제거한다. 그리고 차원을 설정해주면 그 차원만 제거한다. Python 코드 import torch x = torch.rand(3, 1, 20, 128) x = x.squeeze() #[3, 1, 20, 128] -> [3, 20, 128] 주의할 점은 생각치도 못하게 batch가 1일 때 batch차원도 없애버리는 불상사가 발생할 수있다. 그래서 validation단계에서 오류가 날 수 있기 때문에 주의해서 사용해야 한다. import torch x = torch.rand(1, 1, 20, 128) x = x.squeeze() # [1, 1, 20, 128] -> [20, 128] x2 =..
[PyTorch] Tensor 합치기: cat(), stack() 실험이 돌아가는 동안 심심하니까 하는 포스팅. PyTorch에서 tensor를 합치는 2가지 방법이 있는데 cat과 stack이다. 두가지는 현재 차원의 수를 유지하느냐 확장하느냐의 차이가 있다. 그림과 코드를 통해 사용법을 알아보자. Cat함수란? cat함수는 concatenate를 해주는 함수이고 concatenate하고자 하는 차원을 증가시킨다 (차원의 갯수는 유지되고 해당 차원이 늘어난다.. 설명이 애매하네 코드 참고). concatenate하고자하는 차원을 지정해주면 그 차원으로 두 tensor의 차원을 더한 값으로 차원이 변경된다. concatenate하고자하는 dimension을 지정해주지 않으면 default=0으로 설정된다. 자주 사용하는 용도로는 network 내에서 다른 두 featu..
[C++ STL] list(연결리스트) 연결리스트(list) 연결리스트는 배열의 각 요소가 값만 갖고있는 것이 아니라 다음 요소를 가리키는 포인터를 함께 가지고 있다. 이는 배열에서 중간에 추가 혹은 삭제할 때 뒤의 원소를 쭉 밀거나 뒤의 원소를 쭉 당겨와야하는 단점을 보완한 것이다. 배열의 요소들을 직접 미는 것이 아닌 포인터값만 변경해주는 것으로 임의의 위치에 추가/삭제 연산을 할 수 있다. C++에서는 list라는 자료형으로 연결리스트가 구현되어 있다. 리스트 각 요소는 포인터로 연결되어있기 때문에 메모리 상에 연속적으로 존재하지 않아도 된다. 그래서 각 요소에 접근할 때도 포인터를 이용해서 순서대로 접근해야한다. 이를 아래의 예제를 통해 소개한다. 리스트 선언 양 끝의 요소 삭제(삽입) 임의의 위치에 새로운 요소 추가(삭제) 리스트의 ..
[C++ STL] queue(큐) 큐(queue) 큐 한쪽 끝에서 자료를 넣고 반대 쪽 끝에서 자료를 꺼낼 수 있는 선입선출(FIFO, First In First Out)의 속성을 지닌다. (동적배열(vector)의 경우 맨 끝에서 자료를 넣는 것이 유사하지만 맨 앞에서 자료를 꺼내진 않음) 이는 일상생활과 아주 밀접한 자료구조이다. 예를들면 놀이공원이나 음식점에서 선 줄이나 할 일의 목록을 큐를 이용해 표현할 수 있다. 간단한 예제를 통해 기본적인 큐의 연산을 살펴보자. 큐 선언 요소 삽입/삭제 큐에서 꺼낸(삭제한) 요소 저장 큐의 각 요소 출력 #include #include using namespace std; int main() { //큐 선언 queue que; //큐에 요소 추가하기 for (int i = 0; i < 5; i..
[C++ STL] stack(스택) 스택(stack) 스택은 한쪽 끝에서만 자료를 넣고 빼는 후입선출(LIFO, Last In Last Out)의 속성을 지닌다. 이런 속성으로 스택은 전산학에서 많이 쓰인다. 함수의 호출이 끝나고 이전 함수로 돌아갈 때, 이 함수 바로 이전의 함수로 돌아가야 한다. 이때 컴퓨터 내부적으로 스택을 이용해 함수들의 문맥을 관리한다. 스택 선언 요소 삽입/삭제 스택에서 꺼낸(삭제한) 요소 저장 스택의 각 요소 출력 #include #include using namespace std; int main() { //스택선언 stack stk; //스택에 요소 삽입 for (int i = 0; i < 5; i++) { stk.push(i); } //스택에서 요소 제거 int out = stk.top(); stk.pop..
[C++ STL] vector(동적배열) 동적배열(vector) 동적배열은 배열의 크기를 미리 정하지 않고 자료의 개수가 변함에 따라 배열의 크기가 변경되는 배열이다. 이는 C++에서 배열(정적배열)을 선언 시 배열의 크기를 정해야하는 단점을 보완한 것이다. C++의 STL에서는 vector라는 자료형으로 동적배열이 구현되어 있다. vector가 동적으로 배열을 할당하는 과정을 이해해보자. vector는 맨 뒤쪽에서 삽입과 삭제가 이루어진다. 이렇게 들어간 요소들이 배열의 크기인 vec.size()를 형성한다. 또한 vector자료형은 배열 요소들의 갯수가 증가함에 따라 공간을 점점 늘려가며 할당하므로 배열의 크기보다 더 큰 여유공간을 할당해둔다. 이를 vec.capacity()라고 한다. 벡터가 너무 커져 연속된 메모리를 할당할 수 없을 경우..
[백준/C++] 1966번: 프린터 큐 (우선순위 큐) 일단 우선순위 큐를 쓸 줄 몰라서 안쓰고 풀어봤다. queue 뿐만 아니라 vector를 활용해서 다시 큐에 들어가지 않는 프린트물이 생길 때 max값을 갱신하였고, 내 프린트물엔 flag를 1로 주어 같이 queue에 넣어주는 형태로 queue의 자료형이 int쌍이 되도록 설정하였다. #include #include #include #include using namespace std; int main() { int test_case; cin >> test_case; for (int i = 0; i > N >> M; vector for_max; queue q; for (int j = 0; j < N; j++) { int a; c..
[백준/C++] 1874번: 스택수열 while문을 돌릴 때 2개의 변수를 사용하였다. (stack에 넣어줄 숫자를 나타내는 num과 현재 target으로 하는 숫자를 가리키는 start변수) 1. top과 target이 같으면 pop하고 아니면 push한다. 2. 종료조건은 start가 target의 마지막 방을 가리킬 때 혹은 지금 num이 target숫자보다 클 때 #include #include #include using namespace std; int main() { int N; cin >> N; vector v; for (int i = 0; i > temp; v.push_back(temp); } stack s; vector oper; int num = 1; int start = 0..