반응형


 

ImportError: No module named 'keras_resnet' 해결법

 

Keras기반의 모델에서 resnet backbone을 쓰는 경우 keras_resnet module이 없다는 에러가 발생할 수 있다.

필자의 경우 RetinaNet을 구현할 때 에러가 발생했다.

 

이런 경우에는 클론받은 소스코드가 잘못된 것이 아니라, 다른 라이브러리와 같이 keras_resnet을 설치할 수 있다.

 

pip install keras-resnet
반응형
블로그 이미지

Hyunsoo Luke HA

석사를 마치고 현재는 Upstage에서 전문연구요원으로 활동중인 AI 개발자의 삽질 일지입니다! 이해한 내용을 정리하는 용도로 만들었으니, 틀린 내용이 있으면 자유롭게 의견 남겨주세요!

,
반응형


 

Ubuntu에서 원격으로 재부팅, 재시작 하는 법

 

 

우분투 클라우드를 사용하거나, 원격 환경에서 작업을 할 때,

패키지 업데이트 등을 진행한 뒤 재부팅을 해야 하는 경우가 있다.

 

이때 터미널을 통해서 아래와 같은 커맨드를 통해 재부팅이 가능하다.

 

 

sudo shutdown -r now
반응형
블로그 이미지

Hyunsoo Luke HA

석사를 마치고 현재는 Upstage에서 전문연구요원으로 활동중인 AI 개발자의 삽질 일지입니다! 이해한 내용을 정리하는 용도로 만들었으니, 틀린 내용이 있으면 자유롭게 의견 남겨주세요!

,
반응형


apt-install update 에러 해결법

 

Ubuntu에서 apt update를 진행하려고 하는데 아래와 같은 에러가 발생하였다.

 

N: Updating from such a repository can't be done securely, and is therefore disabled by default. 

구글링을 해 본 결과, GPG 키를 다시 다운받는 방법과, allow-unauthenticated 옵션을 사용하는 방법이 있었는데,

필자는 GPG키를 다시 다운받은뒤 정상 작동하였다.

 

아마도, nvidia-docker를 다운받을 때 레포지토리 리스트에 잘못된 링크를 입력한 것이 원인인 듯 하다.

 

  • 해결방법 1 - 잘못된 링크(서명이 되지 않은)를 레포지토리 리스트에 추가한 경우

 

sudo apt-get update --allow-unauthenticated

 

  • 해결방법 2 - GPG 키파일이 소실됐을 경우
sudo apt-key adv --keyserver pgp.mit.edu --recv-keys 5C808C2B65558117

 

wget http://www.deb-multimedia.org/pool/main/d/deb-multimedia-keyring/deb-multimedia-keyring_2012.05.05_all.deb -O deb-multimedia-keyring.deb
sudo dpkg -i multimedia-keyring_all.deb

 

위 해결방법으로 대부분의 이슈는 해결되는듯 하다.

반응형
블로그 이미지

Hyunsoo Luke HA

석사를 마치고 현재는 Upstage에서 전문연구요원으로 활동중인 AI 개발자의 삽질 일지입니다! 이해한 내용을 정리하는 용도로 만들었으니, 틀린 내용이 있으면 자유롭게 의견 남겨주세요!

,
반응형


iTerm2 한글 깨짐, 자소 분리 현상 해결

 

최근 iTerm2가 업데이트 되면서 멀쩡하던 한글파일이 자소분리되는 현상이 발생하고 있습니다.

 

 

 

 

현재 제 iTerm2의 버전은 3.3.12로,

특징은 파일 자체가 깨져있는게 아니라, Finder에서는 정상적으로 보이는 파일인데 iTerm2에서만 이렇게 자소분리가 일어난다는 것이죠.

 

해결책을 검색해봐도 대부분이 iTerm 삭제 후 다운그레이드나, zshrc등을 고치는 방법들인데 정상적으로 동작하지 않아 해결법을 포스팅합니다.

 

 

 

iTerm2를 키고, 위 상태바에서 Preferences -> Profiles -> Text -> Unicode -> Unicode normalization form: None을 NFC로 변경하시고 창을 닫았다 키시면, 정상적으로 출력이 되는것을 확인할 수 있습니다.

 

 

 

반응형
블로그 이미지

Hyunsoo Luke HA

석사를 마치고 현재는 Upstage에서 전문연구요원으로 활동중인 AI 개발자의 삽질 일지입니다! 이해한 내용을 정리하는 용도로 만들었으니, 틀린 내용이 있으면 자유롭게 의견 남겨주세요!

,
반응형


[Review/서평] 핸즈온 머신러닝

책프협 골라받는 서평 이벤트를 통해서 도마뱀책(?)이라고 불리우는 핸즈온 머신러닝의 한국어 번역판을 받게 되었다.

개인적으로, 흑백 서적과 컬러 서적은 딱 책을 봤을 때의 느낌이 너무 다른 것 같다. 본 책은 전면 컬러판으로, 표지를 받았을 때, 어렵고 딱딱해보이지 않고 편하게 읽어보고 싶다는 느낌을 주는 디자인이었다.

 

책은 크게 두가지 부분으로 나뉘어져 있는데, 1부에서는 마치 앤드류 응 교수의 코세라 강의처럼 머신 러닝의 기초와 개념을 다루는 내용이고, 텐서플로우보다는 사이킷런 프레임워크를 사용한 개념 학습을 다루고 있으며, 2부에서는 DNN과 DL에 대해서 Tensorflow2 버전 기준의 코드를 다룬다. CNN과 GAN등의 재미있는 분야를 직접 실습함으로써, 독자들의 흥미를 크게 끌어올리는 느낌이다.

 

MNIST등의 기본 예제부터 다루면서 차근차근 ML에 대해 설명을 해주고, 연습문제등을 통해서 독자가 직접 문제를 해결하는 방식으로 구성되어 있다. 혼자서 독학하기에 알맞은 책이 아닐까 생각한다.

또한 시각자료도 친절하게 나와있어, 직접 plot을 그리는법을 익히면서 "뭔가 내가 해내고 있구나!"라는 뿌듯함이 들게끔 유도한 부분이 많이 보인다. 실제로 학습에서 이러한 뿌듯함은 학습 의지 고취를 위해서 반드시 필요한 부분이 아닐까 생각한다.

또한 뒷부분의 TF코드는 2.0기준으로 완벽히 변환되어있어, TF2로의 갑작스러운 변화로 인해 혼란을 겪고 있는 독자들에게 최신 트렌드를 잘 반영하고 있다고 생각한다.

 

총평


장점

 

  • ML에 대해 전혀 모르는 학생/직장인들도 Part1을 통해 ML 기초 지식을 습득하고 공부할 수 있다.
  • 예제 소스코드를 깃허브에서 다운받을 수 있어, 즉각적인 실행이 가능하다.
  • Tensorflow.js등 다양한 모듈에 대해서도 다루고 있다.
  • GAN, CNN등의 Deep Neural Network를 Tensorflow 2.1 기준의 코드로 실험해볼 수 있어서 좋았다.
  • 한국어 명칭을 통해 학습하는것은 어떻게 보면 IT 자료 검색의 측면에서 매우 불리할 수 있다. 그래서 보통 필자는 영어로 된 명칭을 사용하는것을 선호하는데, 이 책에서는 한글 명칭 옆에 작은 글씨로 영어 명칭을 적어놓아서 자료 검색이나 학습에 편리했다.
  • 전면 컬러판이기 때문에, 흑백 책에 대한 딱딱한 느낌이 들지 않아서 매우 만족스러웠다.

아쉬운 점 (장점에 비해서는 매우 사소한 사항이지만 아쉬운 점을 적어보자면 다음과 같다.)

 

  • 952페이지의 책으로, 2판으로 넘어오면서 페이지가 크게 늘었다. 책이 두껍고 내용이 많다보니, 다 읽기 굉장히 방대할 수 있다.
  • 개인적으로는 이미 머신러닝에 대해 알고 있는 독자들에게는 Part1의 내용이 너무 길지 않았나 생각한다. (이는 ML을 처음 공부하고자 하는 분에게는 장점이기도 하다.) 

이런 사람에게 추천!

 

  • ML을 모르지만, 이 책을 구입해서 기초부터 실제 코드까지 공부해보고 싶은 비전공자
  • 한권의 책으로 AutoEncoder, CNN, GAN등 다양한 실제 기술들을 모두 공부해보고 싶은 사람
  • TF2.0에 익숙하지 않아 TF2.0 코드를 공부해보고 싶은 사람
  • 줄글보다는 간단한 그림과 소스코드를 보며 공부하는것이 더 효율적인 사람

 

참조


핸즈온 머신 러닝 2판 - 오렐리앙 제롱 지음, 한빛미디어, 2020

 

좋은 책 지원해주신 책프협 이벤트를 진행해주신 관계자분들께 감사인사를 드립니다!

반응형
블로그 이미지

Hyunsoo Luke HA

석사를 마치고 현재는 Upstage에서 전문연구요원으로 활동중인 AI 개발자의 삽질 일지입니다! 이해한 내용을 정리하는 용도로 만들었으니, 틀린 내용이 있으면 자유롭게 의견 남겨주세요!

,
반응형


 

백준 - 단계별로 풀어보기 [1149] 

https://www.acmicpc.net/problem/1149

문제

 

 

 

풀이

 

동적 계획법의 기본은 큰 문제를 작은 문제로 쪼개는 것이다.

이번 문제를 작은 단위로 쪼개보면,

i번째 집을 빨강, 초록, 파랑으로 칠했을 때의 비용의 최소값을 구해 나가는 것이다.

 

이를 구하고 저장하기 위한 배열 house[1001][3]을 선언한다.

house[i][0] 에는 i번째 집을 빨강색으로 칠할 때의 최소비용,

house[i][1] 에는 i번째 집을 초록색으로 칠할 때의 최소비용,

house[i][2] 에는 i번째 집을 파란색으로 칠할 때의 최소비용을 저장한다.

 

house[i]가 빨강색으로 칠해지기 위해서는 이전 집이 초록색이거나 파란색이어야하고,

파란색으로 칠해지기 위해서는 이전 집이 빨강색이거나 초록색이어야하고,

초록색으로 칠해지기 위해서는 이전 집이 빨강색이거나 파란색이어야한다.

 

따라서 이를 반복문으로 구현하면, 다음과 같다.

 

    for(int i = 1; i <= N; ++i)
    {
        cin >> cost[0] >> cost[1] >> cost[2];
        house[i][0] = min(house[i-1][1],house[i-1][2]) + cost[0];
        house[i][1] = min(house[i-1][0],house[i-1][2]) + cost[1];
        house[i][2] = min(house[i-1][1],house[i-1][0]) + cost[2];
    }

 

 

코드

 

#include <iostream>
#include <algorithm>
using namespace std;
int house[1001][3];
int main() {
    int N;
    int cost[3];
    house[0][0] = 0;
    house[0][1] = 0;
    house[0][2] = 0;
    cin >> N;
    for(int i = 1; i <= N; ++i)
    {
        cin >> cost[0] >> cost[1] >> cost[2];
        house[i][0] = min(house[i-1][1],house[i-1][2]) + cost[0];
        house[i][1] = min(house[i-1][0],house[i-1][2]) + cost[1];
        house[i][2] = min(house[i-1][1],house[i-1][0]) + cost[2];
    }
    cout << min(house[N][2],min(house[N][0],house[N][1]));
}

 

 

평가

 

큰 문제를 작은 단위의 문제로 쪼개고,

작은 문제들의 결과값을 배열에 저장하여 사용하는 방법을 배우고 넘어가면 좋을 듯한 문제이다.

 

 

 

반응형
블로그 이미지

Hyunsoo Luke HA

석사를 마치고 현재는 Upstage에서 전문연구요원으로 활동중인 AI 개발자의 삽질 일지입니다! 이해한 내용을 정리하는 용도로 만들었으니, 틀린 내용이 있으면 자유롭게 의견 남겨주세요!

,
반응형


 

백준 - 단계별로 풀어보기 [9461] 

https://www.acmicpc.net/problem/9461

문제

 

 

 

풀이

 

파도반 수열의 규칙성을 찾아보자.

P(1) = 1

P(2) = 1

P(3) = 1 

P(4) = 2 ( P(1) + P(2) )

P(5) = 2 ( P(2) + P(3) )

P(6) = 3 ( P(3) + P(4) )

P(7) = 4 ( P(4) + P(5) )

 

이를 통해 다음과 같은 일종의 피보나치 수열 꼴의 점화식을 생성할 수 있다.

P(N) = P(N-3) + P(N-2)

 

 

코드

 

#include <iostream>
using namespace std;
long long Parray[101] = {0,1,1,};
long long P(int N)
{
    if(N < 3)
        return Parray[N];
    else if(Parray[N] == 0)
        Parray[N] = P(N-2) + P(N-3);
    return Parray[N];
}
int main() {
    int T;
    int N;
    cin >> T;
    for(int i = 0; i < T; i++)
    {
        cin >> N;
        cout << P(N) << '\n';
    }
}

 

 

평가

 

분명히 테스트케이스도 맞고, 점화식도 맞는데 틀리는 경우는 무조건 자료형을 의심해야한다.

피보나치 수열의 값은 N이 커짐에 따라 빠르게 증가하므로, 반드시 long long 자료형을 사용해야한다.

 

 

반응형
블로그 이미지

Hyunsoo Luke HA

석사를 마치고 현재는 Upstage에서 전문연구요원으로 활동중인 AI 개발자의 삽질 일지입니다! 이해한 내용을 정리하는 용도로 만들었으니, 틀린 내용이 있으면 자유롭게 의견 남겨주세요!

,
반응형


 

백준 - 단계별로 풀어보기 [1904] 

https://www.acmicpc.net/problem/1904

문제

 

 

 

풀이

 

규칙성을 찾는것이 중요한 문제이다.

결국 계산을 해보면,

 

N = 3 일때

001, ( N1)

100, 111 (N2)

3개 (N1 + N2)

 

N = 4 일때

0000, 0011, (N2)

1001, (N1)

1100, 1111 (N2)

5개 (N2+N3)

 

N = 5 일때

00001, 00100, 00111 (N3)

10000 , 10011 (N2)

11001, (N1)

11100, 11111 (N2)

8개 (N3 + N4)

 

피보나치 수열을 따른다는것을 알 수 있다.

이를 통해 DP로 풀이를 진행해야 하는데, 피보나치 수열의 값이 매우 커지므로 long long타입으로 데이터를 표현해야하며,

1000000번째 피보나치 수는 long long 타입의 최대값 또한 크게 넘어서므로, 15746 나머지연산을 미리 진행하고 풀이를 진행한다.

 

코드

 

#include <cstdio>
#include <vector>
using namespace std;
int N;
vector<long long> answer = {0,1,2};
void find_answer()
{
    long long tmp;
    for(int i = 3; i <= N; i++)
    {
        tmp = 0;
        tmp = answer[i - 1] + answer[i - 2];
        answer.push_back(tmp%15746);
    }
}
int main() {
    scanf("%d",&N);
    find_answer();
    printf("%lld",answer[N]%15746);
}

 

 

평가

 

피보나치 규칙성을 찾아내는 것이 중요한 문제이며, long long 타입으로도 감당이 되지 않는 큰 숫자를 커버하기 위해 미리 15746 나머지연산을 수행해야한다.

 

 

반응형
블로그 이미지

Hyunsoo Luke HA

석사를 마치고 현재는 Upstage에서 전문연구요원으로 활동중인 AI 개발자의 삽질 일지입니다! 이해한 내용을 정리하는 용도로 만들었으니, 틀린 내용이 있으면 자유롭게 의견 남겨주세요!

,
반응형


 

백준 - 단계별로 풀어보기 [1003] 

https://www.acmicpc.net/problem/1003

 

문제

 

 

풀이

 

규칙성을 찾는것이 중요한 문제이다.

 

N = 0, 1 0
N = 1, 0 1

N = 2, 1 1

N = 3, 1 2

N = 4, 2 3

 

여기서 알 수 있는 규칙성은 무엇일까? 0이 출력되는 횟수와 1이 출력되는 횟수를 각각 두고 봐보자.

0의 출력 횟수 1, 0, 1, 1, 2, 3, ...

1의 출력 횟수 0, 1, 1, 2, 3, 5, ...

 

0의 출력횟수는 맨앞은 N이 0일때는 1이고 1부터는 0부터 시작하는 피보나치 수열이며

1의 출력횟수는 N이 0일때 부터 시작하는 피보나치 수열이다.

 

따라서 본 문제는 피보나치 수열을 DP로 구하는 코드를 그대로 사용하여 풀 수 있다.

 

 

코드

 

#include <iostream>
using namespace std;
long long fiboarr[50] = {0,1,};
long long fibo(int N)
{
    if(N == 0 || N == 1)
        return fiboarr[N];
    else if(fiboarr[N] == 0)
        fiboarr[N] = fibo(N-1) + fibo(N-2);
    return fiboarr[N];
}
int main() {
    int T;
    cin >> T;
    int tmp;
    for(int i = 0; i < T; i++)
    {
        cin >> tmp;
        if(tmp == 0)
            cout << "1 0" << '\n';
        else
            cout << fibo(tmp-1) << ' ' << fibo(tmp) << '\n';
    }
}

 

 

평가

 

규칙성을 찾으면 풀 수 있는 문제이다.

앞에서 만들었던 DP로 피보나치 수열 풀기 코드를 활용하여 fibo(N-1)과 fibo(N)을 출력해주면 답을 얻을 수 있다.

 

 

반응형
블로그 이미지

Hyunsoo Luke HA

석사를 마치고 현재는 Upstage에서 전문연구요원으로 활동중인 AI 개발자의 삽질 일지입니다! 이해한 내용을 정리하는 용도로 만들었으니, 틀린 내용이 있으면 자유롭게 의견 남겨주세요!

,
반응형


 

백준 - 단계별로 풀어보기 [2748] 

https://www.acmicpc.net/problem/2748

문제

 

 

 

풀이

 

일반적인 재귀를 활용한 피보나치 풀이법은, 풀이 방법 자체는 매우 간단하지만 이미 구했던 fibo(1), fibo(2), fibo(3), fibo(4)등의 값을 매번 다시 계산하기때문에 연산량이 과하게 많아 실행 속도가 매우 느리다.

 

본 문제는 시간 제한이 1초이고, n이 90까지이므로 재귀를 사용할경우 타임아웃이 발생하기 때문에, 

이미 구한 값들을 다시 활용하는 DP방식을 사용해야한다.

 

또한 Fibonacci 수열은 N이 커질수록 값이 급속도로 증가하므로 자료형은 long long을 사용한다.

코드

 

#include <iostream>
using namespace std;
long long fiboarr[100] = {0,1,};
long long fibo(int N)
{
    if(N == 0 || N == 1)
        return fiboarr[N];
    else if(fiboarr[N] == 0)
        fiboarr[N] = fibo(N-1) + fibo(N-2);
    return fiboarr[N];
}
int main() {
    int N;
    cin >> N;
    cout << fibo(N);
}

 

 

평가

 

자료형을 int가 아닌 long long으로 풀어야하며, 배열에 각 피보나치 수를 저장하는 방식으로 풀 수 있다면 간단히 해결이 가능한 문제이다. 거대한 문제를 작은 문제로 나누고, 이미 구한 값을 활용하는 DP 방법론에 대해서 잘 알아두고 넘어가자.

 

 

반응형
블로그 이미지

Hyunsoo Luke HA

석사를 마치고 현재는 Upstage에서 전문연구요원으로 활동중인 AI 개발자의 삽질 일지입니다! 이해한 내용을 정리하는 용도로 만들었으니, 틀린 내용이 있으면 자유롭게 의견 남겨주세요!

,