진행중인 프로젝트입니다.

밥을 잘 먹는 유전자를 가진 박테리아를 육성하는 시뮬레이터를 만들 것이다.

 

이 시뮬레이터는 유전 알고리즘을 기반으로 만들어진다.

실제로 박테리아는 유성생식을 하진 않지만, 유전물질을 교환하여 접합, 교차, 변이를 수행하기도 한다.

< 실제 생명공학의 유전 방법과는 다르다. 해당 알고리즘은 실제 현상을 모방하여 만들어졌을 뿐이다. >

 

 

lunaB/Genetic-Algorithm-Simulation

genetic algorithem simulator with HTML5 Canvas and Typescript - lunaB/Genetic-Algorithm-Simulation

github.com


개발 스펙

  • HTML5, CSS3, Javascript
  • Webpack, Typescript

요약

설계한 구조에 대한 간단한 요약이다.

시뮬레이터 로직은 아래와 같이 구성된다.

대충 요런식.

유전 알고리즘은 선택, 교차, 돌연변이 3개의 알고리즘을 사용했다.

세대 적합도 평가에서 목표 적합도 이상이 나올 시 루프를 중지하고 테스트를 하며 상태를 확인해 보려고 한다.


개발

시뮬레이터 로직에 대한 간단한 설명과 개발물을 정리한다.

환경 생성

시뮬레이터는 HTML5 Canvas 기능을 이용하여 만든다.

하나의 세대에서 환경은 다음과 같다.

  • 배양판
    • size: 800*600
    • step: 1000 
  • 배지 (영양분)
    • num: 300
    • size: 5*5
  • 박테리아
    • num: 20
    • size: 15*15
    • gene size: 20
    • mutation rate: 15%
  • 보상
    • 영양분을 섭취했을 때 +1

시뮬레이션

설계 편에서 설명했던 유전자 프로그래밍으로 각각의 박테리아가 움직일 수 있도록 하고.

박테리아에게 닿은 먹이는 해당 박테리아가 먹고 몇 개의 먹이를 먹었는지 저장하게 만들었다. 

세대가 처음 시작되면 설계 편에서 언급한 박테리아의 움직임을 프로그래밍하는 "AGC"염기가 존재하지 않아서 움직이지 못하는,

즉 장애를 가진 박테리아들이 존재한다.

 

세대 초반에는 "AGC"염기를 가진, 움직일 수 있는 박테리아가 높은 적합도를 얻었다. (보상 = 적합도)

 

하지만 세대 초반만 넘어가면 유전 로직에 따라 거의 모든 박테리아가 "AGC"염기를 가지게 된다.

 

모든 박테리아가 "AGC"염기를 가지게 된다면 더 활발한 움직임을 코딩하는 염기를 가지도록 진화할 것으로 예상한다.

 

세대 적합도 평가

세대에 대하여 적합도를 평가하고, 세대의 모든 박테리아에 대한 적합도를 평가한다.

적합도는 박테리아가 먹은 먹이의 개수로 정했다.

0세대 박테리아의 총 스코어는 17점

300개의 먹이 중에  150개인 절반을 먹는 세대를 만들어 내는 것을 목표로 해보자.

* score: 150 일 때 loop 멈춤.

유전자 선택

다음 세대의 부모가 되어줄 유전자를 선택한다.

유전자 선택 알고리즘은 룰렛 휠 알고리즘을 사용했다.

모든 유전자를 룰렛 위에 적합도의 비율로 공간을 분배하여 그리고 룰렛을 던져 맞춘 유전자를 뽑는 느낌으로 지어진 이름 같다.

각 필자의 코드에서 선택되는 박테리아는 모두 (박테리아(i)의 적합도 / 모든 박테리아의 적합도 합)의 확률로 선택되게 했다.

 

적합도가 높은 유전자를 높은 확률로 선택하는 알고리즘으로, 적합도가 낮은 유전자가 뽑힐 확률도 남겨 두는 느낌이다.

박테리아의 관점으로 보면 먹이를 많이 먹은 유전자가 자손을 만드는.. 느낌.

유전자 교차

부모로 선택된 박테리아는 자손을 만든다.

선택 연산을 2번 하여 부모 A와 부모 B를 선출한 뒤, 교차 포인트는 랜덤으로 하나 지정하고, 포인트를 기준으로 교차하게 만든다.

유전자 선택으로 뽑은 부모 A, B를 교차하여 자손 A, B를 만들었다.

직관적으로 이해할 수 있도록 그려봤다.

위에선 1개의 교차 포인트를 두었지만 2개 이상 사용하는 방법도 있다고 한다.

유전자 돌연변이

교차로 나온 자손을 다음 세대에 투입하기 전 낮은 확률로 돌연변이가 일어날 수 있게 한다.

15% 확률로 유전자 돌연변이가 일어나도록 했다.

돌연변이는 보통 반전(reverse) 연산이나 교환(exchange) 연산을 하는 경우가 많은데

 

위 시뮬레이터에서는 교환 연산만 이용했다.

단순히 위치가 바뀌는 것이다.

 

자손 B가 15% 확률로 돌연변이가 생긴다면, 랜덤 한 두 염기의 위치가 바뀌게 되는 것이다.

 

새로운 세대 생성

위와 같은 연산으로 세대를 생성하여 다음 세대의 시뮬레이션에 투입시킬 준비를 한다.

다시 환경 생성과 시뮬레이션

다시 먹이를 랜덤으로 깔고

새로운 세대를 랜덤 한 위치에 배치하고 

위의 과정을 반복한다.


결과

초기 세대
목표 달성

세대가 갈수록 항상 더 높은 적합도를 갖는 박테리아가 나타나지는 않지만, 대체적으로 점점 적합도가 높아지는 경향을 보였다.

그리고 목표한 총적합도 150을 넘는 세대도 만들 수 있었다. 161세대에 172점으로 성공했다.

이동패턴을 프로그래밍하는 "AGC"염기도 가장 앞으로 나온 모습을 볼 수 있다.

슝~


분석

성공한 세포의 움직임이다. 얼추 예상했던 패턴과 예상 못했던 패턴이 있었다.

위 세포를 분석해보자면 아래와 같다.

  • 진동하며 이동한다. 
    • 비교적 크기가 작은 먹이를 스쳐서 지나치지 않기 위해 최대한 진동하며 이동하여 더 많은 먹이를 먹을 수 있게 진화한 것이라고 분석했다.
  • 옆쪽 방향으로 이동한다. 
    • 이동은 유전자의 조합을 통해 모든 방향으로 움직일 수 있지만 보통 옆으로 움직이도록 진화했다.
    • 세포는 매 세대마다 랜덤 한 위치에 스폰됨으로 대각선으로 이동해버리면 먹이를 거의 먹지 못하고 배양판을 탈출해 버리는 문제가 발생하고, 위로 이동한다면 가로보다 세로 길이가 짧기 때문에 더 적은 먹이를 먹게 될 확률이 크기 때문이라고 분석했다.
    • 디테일하게 짚자면 옆쪽 방향으로 각도가 많이 기울어진 대각선이 가장 좋은 듯하다. (이동 가능 거리 + 진동 여부 고려)
  • 이동패턴을 프로그래밍하는 "AGC"염기가 앞으로 이동했다.
    • 활발하게 움직이는 진화 전략이 선택된 만큼 이동패턴이 복잡할수록 먹이를 잘 먹을 수 있기 때문인 것이라고 분석했다.

다음 모델에서는 어떤 점을 개선해야 할까?

  • 처음 기획할 때 예측하길 배양판 밖에는 먹이가 없음으로 진화를 거듭한다면 원을 그리며 움직여 배양판을 쉽게 나가지 않고 최대한 많이 휘젓고 다니게 진화하지 않을까 생각했지만 그러진 않았다.
  • 배양판을 나가지 않고 최대한 많이 움직여야 높은 점수를 얻을 수 있을 거라고 생각했다.
    • 배양판을 나가서 오래 있을수록 적합도 점수를 깎아볼까?
    • 돌연변이 확률을 올리거나, 세대에 완전 랜덤 한 박테리아를 섞어서 넣어볼까?

우선 이 정도 생각해 볼 수 있을 것 같다.

분석편에서 이부분을 더 자세하게 짚어보겠다.

 

진행중인 프로젝트입니다.

밥을 잘 먹는 유전자를 가진 박테리아를 육성하는 시뮬레이터를 만들 것이다.

 

이 시뮬레이터는 유전 알고리즘을 기반으로 만들어진다.

실제로 박테리아는 유성생식을 하진 않지만, 유전물질을 교환하여 접합, 교차, 변이를 수행하기도 한다.

< 실제 생명공학의 유전 방법과는 다르다. 해당 알고리즘은 실제 현상을 모방하여 만들어졌을 뿐이다. >

 

 

lunaB/Genetic-Algorithm-Simulation

genetic algorithem simulator with HTML5 Canvas and Typescript - lunaB/Genetic-Algorithm-Simulation

github.com


간단 이론

유전

유전에 대하여 알아보자. 아니 사실 알필요도 없다.

유전학 하나로 책이 수천 권이 나올 정도로 내용이 많음으로 필요한 개념만 정리한다.

 

유전자는 A, G, C, T의 염기의 배열로 이루어져 있다.

이러한 유전물질은 박테리아가 복제할 때 같이 복제되어 나누어지는데,

이때 많은 오류들이 발생하고 중합요소에 의하여 수리되지 못한 염기서열로 인하여 돌연변이가 발생하기도 한다.

(이외에도 돌연변이가 발생하는 원인은 많다)

 

이렇게 만들어진 유전자는 박테리아의 구성과 박테리아의 행동지침을 프로그래밍한다.

 

여기서 우리는 정말 간단한 유전 알고리즘을 만들 것임으로 이 정도만 알고 가도록 하자. (더 알면 만들기도 골치 아프다)

 

유전 알고리즘

유전 알고리즘은 우리가 통상적으로 배운 유전과는 조금 다르다.

 

시뮬레이션에서 각각의 유전자를 가진 개체들이 유전자에 대응되는 행동을 수행하게 하며,

시뮬레이션이 끝나면 이를 한 세대 (generation)이라고 한다.

 

이후 시뮬레이션 환경을 초기화하고 다시 개체들을 투입시켜 다음 세대를 시작하고 이를 높은 성능을 내는 개체가 나올 때까지 반복한다.

이때 다음 세대에 투입되는 개체의 유전자를 결정하는 것이 유전 알고리즘의 핵심이다.

 

 

여기에 사용되는 여러 가지 연산 방법 중 선택, 교차, 변이를 알아보자.

- 선택

현재 세대에서 우수했던 개체를 골라 다음 세대의 부모로 선정하는 방법입니다.

우수했던 개체를 고르는 방법도 균등 비례 룰렛 휠 선택, 토너먼트 선택, 순위 기반 선택 등 여러 가지 방법이 있다.

 

- 교차

현재 세대 내에서 교배를 통해 만들어진 자손을 다음 세대에 투입시키는 방법입니다.

여러 가지 방법이 있지만 하나만 예를 들자면, 유전자배열의 랜덤한 부위를 잘라 교차로 붙여 자손을 만드는 방법이 있다.

 

- 변이

교배를 통해 만들어진 자손의 유전자 배열을 교체하거나 순서를 바꾼 돌연변이를 다음 세대에 투입시키는 방법이다.

이것도 여러가지 방법이 있다

 


설계

환경 설계

  • 800 X 600 사이즈의 맵에 무작위 위치에 여러 개의 먹이가 배치된다.
  • 박테리아 또한 세대 초기화 때마다 무작위 위치에 배치된다.
  • 박테리아와 닿는 먹이는 해당 박테리아가 먹이를 먹는 것으로 판정한다.
  • 적합도 계산은 먹은 먹이의 개수로 판단한다.
  • 유전자 요소는 실제로 유전자를 구성하는 A, G, C, T 염기를 이용하기로 했다.

유전자 번역 시스템

유전자에서 첫 AGC 염기가 발견된 시점부터 끝까지의 내용이 이동 시스템으로 프로그래밍된다.

* 방향
A = 0도
G = 90도
C = 180도
T = 270도

* 속도
A = 최대 속력
G = 최대 속력 * 0.9
C = 최대 속력 * 0.8
T = 최대 속력 * 0.7

AGCAA <end>
는 표적 각도로 최대 속력을 1 step으로 하여 반복이다.

AGCAAAGGG <end>
일 경우 2개씩 끊어서 AA AG GG 3 step을 반복한다.

AGCAAA <end>
다음과 같이 짝이 안 맞는 경우엔 맨 뒤의 A가 잘린다.

 

* 최종

<start> CTAGCAAGGA <end>

시작 염기인 AGC 앞에 있는 CT는 번역하지 않는다.

시작 염기인 AGC 뒤에 있는 AAGGA를 번역한다.

AA GG로 쌍을 이루었으므로 짝이 없는 A를 버린다.

위의 유전자를 가진 개체는

  • 0도 방향으로 최대속력으로 이동하기
  • 90도 방향으로 최대속력 * 0.9로 이동하기

위 2개의 행동을 반복하게 된다.

 

유전 시스템

유전 시스템은 위에서 설명한 3가지 선택, 교차, 변이를 모두 이용할 것이다.

유전 알고리즘에서는 이 부분이 가장 중요하니 개발 편을 작성하면서 마저 설명하도록 한다.


위 포스트는 개발 편에서 이어집니다.

날렵한 곰의 논문 리뷰 시리즈 입니다.
* 논문 읽는 연습을 하는 단계에서 쓴 글입니다.

- 논문 링크 : https://arxiv.org/abs/1512.03385

 

Deep Residual Learning for Image Recognition

Deeper neural networks are more difficult to train. We present a residual learning framework to ease the training of networks that are substantially deeper than those used previously. We explicitly reformulate the layers as learning residual functions with

arxiv.org

Abstract

문제점

- neural network는 깊게 쌓을수록 학습하기가 어렵다.

해결점

- 이전의 모델들보다 더 깊은 모델을 학습하기 위한 residual learning framework (잔차 학습 프레임워크)를 제안한다.

- 해당 모델은 레이어의 입력을 참조하여 레이어를 잔차 학습 함수로 재구성한다.

- 해당 논문은 residual network가 쉽게 optimize가 되며, 상당히 깊은 모델에서 정확도를 얻는 경험적인 증거를 제공한다.

내용

- ImageNet dataset에서 VGG net보다 5배 더 깊지만 여전히 복잡도가 낮은 최대 152 레이어 깊이의 residual network를 평가했다.

- 해당 논문은 CIFAR-10을 100개와 1000개 레이어로 분석한 내용을 담았다.

결과

- test set에서 3.57%의 에러율로 ILSVRC 2015 분류 대회에서 1위를 달성했다.

- 이외 COCO와 ImageNet에서 좋은 성과를 거두었다.


Summary

최근 연구결과들에서 convolutional neural network는 deep 하게 쌓을수록 결과가 좋아서 이미지 분류에서 많이 사용되고 있으며 모델의 깊이가 매우 중요함을 시사한다.

Is learning better networks as easy as stacking more layers?

"그렇다면 레이어를 많이 쌓을수록 더 괜찮은 모델을 학습할 수 있을까?"라는 의문을 가질 수 있다.

해당 질문에 대하여 대답하는 데에는 Vanishing gradients, Exploding gradients 때문이라고 생각할 수 도 있었지만,

해당 문제들은 Normalized Initialization와 Intermediate Normalization Layers에 의하여 해결되었다.

(Intermediate Normalization Layers는 Batch Normalization같은 것을 말하는 것)

 

깊은 게 쌓은 모델은 수렴을 시작할 때 성능 저하(degradation problem)를 보였고 모델 깊이가 증가할수록 정확도는 빠르게 떨어졌다.

기대와 다르게 이러한 성능저하는 Overfitting으로 야기된 것이 아니었다. 

 

위의 실험으로 이를 증명했다. Figure 1을 보면 레이어를 56개 쌓은 모델과 20개를 쌓은 모델로 CIFAR10을 학습한다.

56개 쌓은 모델은 train set과 test set에서 모두 20개 쌓은 모델보다 낮은 성능을 보였다.

(Overfitting이 문제였다면 적어도 training set에서는 낮은 에러를 보여야 하지만 그렇지 않다.)

 

 

이러한 학습정확도의 저하(degradation)는 모든 시스템을 비슷하게 최적화 하기가 어려움을 보여준다.

 

깊은 모델을 구성하는 해결책으로는 identity를 매핑하는 레이어를 추가하고 이외의 레이어는 학습된 하위 모델을 복사하는 방법이 있었다.

하지만 해당방법이 실험을 통해 좋은 성능을 내진 못했으며, 해당 방법보다 더 동등하거나 더 좋은 방법을 찾지 못했다.

 

그렇기에 해당 논문에서 deep residual learning 이라는 방법을 도입했다.

 

각 쌓여진 레이어들이 기본 매핑으로 fit 되길 바라는 것이 아닌 잔차매핑에 fit 되도록 했다.

기본매핑을 H(x)로 표시할 때, 우리는 비선형 매핑인 F(x) = H(x) - x를 제시한다. 그리고 이를 전개하면 H(x) = F(x) + x가 된다.

이는 참조되지 않은 기본매핑을 fit 시키는 것보다 잔차 매핑(residual mapping)을 fit 시키기가 더 쉽다는 가정을 기반으로 한다.

To the extreme, if an identity mapping were optimal, it would be easier to push the residual to zero than to fit an identity mapping by a stack of nonlinear layers.

극단적으로 identity mapping이 optimal 하면 잔차를 0으로 만드는 것이 비선형 레이어로 identity mapping을 fit 하는 것보다 쉬울 것이다.

즉 F(x) = 0 이 되도록 학습하는 것이 더 최적화하기에 쉬운 방법이라는 것이다.

 

F(x) + x는 "shortcut connectons"로 실현 가능하다. shortcut connectons는 한 개 이상의 레이어를 skip 하는 것이다.

위의 경우 간단한 identity mapping을 수행하며 이것의 출력과 쌓인 레이어의 출력이 더해진다.

 

Identity shortcut connections 은 추가적인 파라미터와 복잡한 계산이 필요하지 않으며, 위 모델은 여전히 end-to-end로 SGD를 이용한 backpropagation이 가능하며 기본 라이브러리로 쉽게 구현할 수 있다.

 

 

위 논문에서 2가지를 보여주려고 한다.

1) deep residual net은 쉽게 optimize 되지만 plain은 deep 해질수록 높은 에러를 보이는 것

2) deep residual net은 쉽고 즐겁게(?) 레이어가 깊어질수록 이전 모델들에 비하여 높은 정확도를 얻어내는 것 

 

Residual Learning

위와 마찬가지로 H(x)를 근사 시키는 것보다 이항 하여 F(x)를 근사 시키는 것이 학습에 있어 더 유리하다는 내용이다.

 

Identity Mapping by shortcut

식은 대강 이런식으로 생겼다

Fig.2에서의 모델로 재구성하면 F = W2σ(W1x) 이런 모양이 된다. 여기서는 표기를 위해 bias를 생략했다고 하니 F = W2+b2σ(W1x+b1)라고 생각하면 될 것 같다. 또한 위 식을 구현하기 위해서는 F와 x를 같은 차원으로 맞춰주어야 한다.

 

만약 F에서 output size가 x size와 달라졌다면 linear projection으로 차원을 맞춰 줄 수 있다.

 

Network Architectures

plain net과 residual net을 테스트한다.

 

Plain Network

plain baseline은 주로 VGG net에 영감을 얻어 만들어졌다. 합성곱 레이어는 3x3 필터와 2개의 규칙으로 설계되었다.

i) 같은 output feature map size와 같은 크기의 필터

Ii) 만약 feature map size가 절반으로 줄어들면 필터 크기가 2배로 늘어나 시간 복잡도를 보존한다.

 

합성곱 레이어에서 stride 2로 downsampling을 하고,

모델의 마지막엔 global average pooling layer, 1000-way의 fully-connected layer, softmax를 사용했다.

34개의 레이어로 되어있으며, 이 모델은 VGG net보다 필터가 많고 복잡도가 낮다. (VGG-19의 18% 정도의 연산량)

 

Residual Network

Plain Network를 기반으로 하며 shortcut connection이 추가되었다.

Residual Network는 input과 output을 같은 크기로 맞추어 주어야 한다. 그렇게 하기 위해 2가지를 고려해 볼 수 있다.

(A) zero padding을 추가하여 사이즈를 맞춘다. 해당 방법은 파라미터가 추가로 발생하지 않음.

(B) projection을 이용하여 사이즈를 맞추어 준다.

 

Implementation

구현 방법과 파라미터 설정에 대하여 설명한다.

- 224x224 size의 데이터를 사용한다.

- batch normalization을 이용한다. (conv net과 activate 사이에)

- Initialize Weights

- SGD

- mini-batch 256개

- learning rate 0.1

- iteration 60 x 10^4

- weight decay 0.0001

- momentum 0.9

- dropout은 사용 안 함

 

 

Experiments

ImageNet Classification

Plain Network.

plain net의 경우 이전의 결과에서 실험 결과에서 34-layer가 18-layer보다 더 성능이 안 좋은걸 확인했었는데 이는 Batch normailization을 사용한 결과이기에 vanishing gradient 때문이라고 보기 어렵다.

아래 결과를 보면 plain은 34-layer가 더 낮은 성능을 보이는 반면 ResNet은 34-layer가 더 높은 성능을 내며 degration문제가 어느 정도 해결된 것이 관측 가능하다.

ResNet.

resnet의 모든 shortcuts에 identity mapping을 이용하고 사이즈를 맞추기 위해 zero padding을 사용한다.

그렇기에 다른 추가 파라미터가 없다. 위에서 말한 (A) 방법을 사용함.

 

1. 34-layer resnet이 18-layer resnet 보다 더 높은 성능으로 degration문제를 잘 잡았다.

2. plain과 비교했을 때 34-layer는 성공적으로 training error를 줄였다.

3. 18-layer의 두모델은 정확도는 비슷하지만 더 빠르게 수렴한다. SGD를 이용하여 수렴할 때 Plain보다 ResNet이 더 좋은 성능을 낸다.

 

Identity vs. Projection Shortcuts.

Identity 방식으로 해봤으니 이번엔 projection shortcuts방식으로 해본다.

 

아래 표에서 ResNet-34의 A, B, C 방법을 비교한 것을 보자

(A) 현재까지 봤던 zero padding으로 차원을 증가시킨 방법이다. 이 방법은 추가적인 파라미터가 필요 없다

(B) projection shortcuts를 이용하여 차원을 증가시킨 방법이다. 다른 shortcut은 identity

(C) 모든 shortcut이 projection

위의 표를 보면 C > B > A 순의 성능을 확인할 수 있다.

A는 zero padding에 대하여는 잔차 학습이 이루어지지 않기에 B보다 성능이 약간 낮고

C가 B보다 projection shortcuts에 extra parameters가 많이 들어가기 때문에 성능이 더 높다.

 

= degradation problem의 문제의 해결에 projection shortcuts이 필수적이지 않다는 것을 말하려고 한다.

그래서 해당 논문에서는 C 모델을 사용하지 않는다.

 

Deeper Bottleneck Architectures.

아래는 deep 한 net을 설명한다.

위 모델에서는 학습시간을 고려하여 Bottleneck 구조를 사용한다.

각각의 잔차 함수는 2개 대신 3겹으로 쌓는다. 모양은 오른쪽 그림과 같은 구조로 이루어져 있다.

1x1은 차원을 감소시키고 복원하는 역할을 하여 3x3이 더 적은 입력과 출력을 갖게 한다.

이를 통해 기존과 비슷한 복잡성을 유지할 수 있다.

 

50-layer ResNet.

2-block인 34-layer를 -> 3-block으로 바꾸어 50-layer로 만들었다.

(B) 모델을 이용했다.

해당 모델은 3.8 billion FLOPs

 

*플롭스(FLOPS, FLoating point Operations Per Second)는 컴퓨터의 성능을 수치로 나타낼 때 주로 사용되는 단위이다.

 

101-layer and 152-layer ResNets.

3-layer를 더 쌓아봤다.

해당 모델은 11.3 billion FLOPs

여전히 VGG모델들보다 복잡성이 낮다

* VGG-16/19 nets (15.3/19.6 billion FLOPs)

이렇게 만든 ResNet은 34-layer 보다 확실하게 높은 성능을 보인다.

 

Comparisons with State-of-the-art Methods.

6개의 각기 다른 깊이의 모델을 앙상블 하여 test set에서 3.57%의 top-5 error를 보였다.

해당 모델로 ILSVRC 2015 1등 했다.

 

-끝-

react-native-make를 설치한 뒤에

아이콘은 1024*1024 사이즈로 설정하고 아래 코드를 실행한다.

react-native set-icon --path ./src/Assets/Images/app_icon.png

에러가 뜨지만 문제없이 잘 돌아간다. (???)

 

project/ios/{{project_name}}/Images.xcassets/AppIcon.appiconset

위경로에서 아이콘이 잘 들어갔는지 확인 할 수 있으며 아이콘을 새로 생성한 이후에는 빌드를 다시 해줘야한다.

(auto hot으로 바뀌진 않음)

2021-03-01 기준으로 작성된 포스트 입니다.

빌드할때 알수없는 오류가 읽을수 없을 정도로 많이 떠버린다.

 

project/ios/podfile

use_flipper!

아래와 같이 바꾸면된다.

use_flipper!({ 'Flipper-Folly' => '2.3.0' }) 

Facebook쪽에서 뭔가 수정해서 그렇다는것 같다.

2021-02-28 기준으로 작성된 포스트 입니다.

styled-components 와 @types/styled-components 를 사용할때 생기는

Could not find a declaration file for module 'styled-components/native'.

코드는 문제없이 돌아가나 자동완성이 생성되지 않고 위와같은 문구가 에디터에 뜰때

npm add @types/styled-components-react-native -D

다음과같이 입력하면 해결됩니다.

+ Recent posts