목록전체보기 (408)
NeuroWhAI의 잡블로그
코틀린 강좌를 조금씩 보고 있습니다.앱 개발을 하고 싶기에...다만 사정상 안드로이드 에뮬레이터를 돌리기가 힘들어서 진짜 앱 개발 공부는 힘들고언어만 좀 배워두려고 합니다.아래는 끄적여본 첫 코틀린 코드 ㅎㅎ.. package com.neurowhai fun sum(a: Int, b: Int) = a + b fun getStringLengthIfCan(obj: Any): Int? { return if (obj is String) { obj.length } else { null } } fun stringWhatever(obj: Any): String = when (obj) { 1 -> "One" "What" -> "??" is Int -> "is Int" else -> "wtf?" } fun main(ar..
※ 실제로 동작하는 전체 소스코드는 GitHub에서 보실 수 있습니다. (가중치 초기화 방법들(Xavier, He)은 코드로 구현은 하였지만 글은 넘어갑니다.) 드롭아웃은 오버피팅(과적합)을 방지하기 위해서 순전파시 일정 확률로 특정 출력값을 0으로 만들고 역전파시에도 기울기의 해당 부분들을 0으로 만들어서 보냅니다. 보통 일정 확률로 신경망의 뉴런을 비활성화한다 혹은 끈다고 설명합니다. 학습이 좀 느려진다는 단점은 있지만 쉽게 과적합을 어느정도 이겨낼 수 있습니다. 비슷하게 배치정규화라는 놈도 과적합을 방지해주지만 이건 학습 속도가 훨씬 빠릅니다. 아래 코드는 드롭아웃 계층을 어떻게 구현했는지만 넣어놨습니다. 코드: impl Layer for Dropout { fn forward(&mut self, x..
케라스로 MNIST 데이터를 학습시키고 외부 이미지 하나를 불러와서 무슨 숫자인지 출력해보는 예제입니다.기본적으로 CNN이고 배치정규화, 드롭아웃을 추가로 사용했습니다. 이미지는 무조건 input.png라는 이름으로 작업 경로에 존재해야 하고 28x28 크기여야 합니다.배경은 검은색, 숫자는 흰색으로 그리세요.input.png가 없으면 구글 드라이브에서 테스트 이미지를 다운로드하는데 번거로우니 그냥 직접 그리세요. 미리 학습된 가중치 데이터를 원하시면 아래 링크에서 받으시고 작업 경로에 넣어주세요. 코드: # !pip install -U -q PyDrive import sys import os.path import numpy as np import keras from keras import layers,..
https://stackoverflow.com/questions/28519997/what-are-rusts-exact-auto-dereferencing-rules 위 글을 공부하여 정리한 글입니다. Rust에서 x.bar()처럼 메소드를 호출하는건 T::bar(x)와 같은데 이때 bar의 self와 x가 일치하지 않으면 auto-dereferencing rules이 수행됩니다. 설명하기 전에 단어, 문자 용어 정리하고 하겠습니다. Receiver type : 메소드의 self 타입 (Self가 Foo이고 fn bar(&self);라면 &Foo가 됩니다. Self가 &Foo이고 fn bar(self);여도 &Foo.) x : 메소드의 self로 들어갈 값 T : x의 타입 U : 각 역참조 단계에서의 타입..
Rust. Change mutable reference to immutable. &mut T 형식으로 받았는데 원하는 메소드가 &T에만 구현된 경우가 있었습니다.(C++ 사용자는 뭔소리야 싶겠지만 Rust는 타입이 사용된 상태?마다 다르게 메소드를 구현할 수 있습니다.)아래는 그 오류를 재연한 예제입니다. https://ideone.com/YeENwm trait FooPow { fn pow(&self) -> i32; } struct Foo(i32); impl i32 { self.0 * self.0 } } /*impl i32 { self.0 * self.0 } }*/ fn test1(x: &Foo) { println!("{}", x.pow()); } fn test2(x: &mut Foo) { println..
※ 실제로 동작하는 전체 소스코드는 GitHub에서 보실 수 있습니다. 매개변수라 함은 학습시 손실을 줄이기 위해 조절하는 변수들을 말합니다. 가중치나 편향 등을 매개변수라고 할 수 있습니다. 이때까지는 매개변수를 단순히 학습률과 기울기의 곱으로 빼서 갱신했지만 그것보다 더 잘할 수 있는 방법이 많습니다. 참고로 이때까지 사용한 방법은 SGD(확률적 경사 하강법)로 볼 수 있습니다. 아래 코드는 5장에서 구현했던 신경망을 살짝 수정해서 여러 매개변수 갱신법을 사용해 MNIST 학습을 진행하는 예제입니다. 코드: use std::collections::HashMap; use rulinalg::matrix::{Matrix, BaseMatrix, BaseMatrixMut}; use common::utils; ..
드디어 다 읽었습니다! 제가 원래 책을 많이 게으르게느리게 읽는 편인데 이건 2개월만에 다 읽었습니다!저는 사정상 파이썬이 아니라 오직 표준 라이브러리만 이용한 C++로 진행했는데 고된 시간이었지만 작동할때의 뿌듯함은 더 컸습니다 ㅎㅎ 정말 재밌었습니다! 재미도 있고 이해도 잘 됩니다. 밑바닥이라고 하니 거부감이 드실지도 모르지만 이미 텐서플로 같은 고수준 라이브러리로 딥러닝을 좀 공부해보신 분들이라도 재밌게 보실 수 있을겁니다. 왜냐면 제가 그렇거든요! 이 책은 특히 신경망이 어떻게 데이터로부터 학습하는지를 제대로 이해할 수 있게됩니다. 행렬에 익숙하지 않은 분들은 CNN에서 이해가 좀 어려우실 수 있지만 책에서 예제 코드도 제공해주니 찬찬히 살펴보시면 됩니다. 또 마지막엔 딥러닝의 최근 동향(DQN,..
※ 실제로 동작하는 전체 소스코드는 GitHub에서 보실 수 있습니다. 5장의 마지막입니다. ReLU, Affine 등의 레이어를 잘 구현해서 쌓아올리기만 하면 학습이 가능한 신경망을 만들 수 있습니다.이게 가능한 이유는 체인룰 덕분이고 이전 글에서 계산 그래프를 통해 설명되었습니다. forward, backward 메소드에 주목하셔야 하는데 forward는 흔히 아시는 순전파에 역전파에 사용할 값을 기억해두는 역할도 합니다. backward가 역전파이고 뒷 계층의 기울기(dout)를 받아 현재 계층의 기울기를 구하여 저장한 뒤 앞 계층으로 넘겨줍니다. 아래 코드는 Affine - ReLU - Affine - Softmax 순서로 계층을 쌓아 만든 신경망으로 MNIST를 학습하는 예제입니다. 이전에 수치..
무려 프로그램 소스코드를 그대로 노래로 불렀네요. ㅋㅋㅋㅋㅋㅋ언어는 아마 프로세싱이 아닌가 싶습니다. [소스코드가사] void setup() {size(400,400);} float a = 0; void draw() {fill(#021050,5); rect(0,0,width,height); translate(200+a*10,200+a*10); rotate(a); scale(a/15); a+= 0.05; kao(0,-50); kao(1,50); if(a>30) a-= 50;} //魔法の筆 呪文で絵描くよ 君も描こう! //마법의 붓, 주문으로 그림 그릴거야! 너도 그려봐! void kao(int don, float b){stroke(0); strokeWeight(2); fill(#f7eedd); ellipse..
※ 실제로 동작하는 전체 소스코드는 GitHub에서 보실 수 있습니다. 5장에서는 계산 그래프라는 방법을 통해 순전파, 역전파를 가르쳐줍니다. 연쇄 법칙(Chain rule) 덕분에 각 층의 자체(?) 기울기를 곱하면서 역전파하면 각 층의 최종 기울기를 얻을 수 있습니다. 아래 코드는 간단하게 덧셈, 곱셈 레이어를 만들고 이를 사용하여 사과, 오렌지의 가격을 순전파로 계산한 다음 역전파로 각 요소가 최종 가격에 끼치는 기울기를 계산하는 예제입니다. 코드: pub struct MulLayer { x: f32, y: f32, } impl MulLayer { pub fn new() -> Self { MulLayer { x: 0.0, y: 0.0 } } pub fn forward(&mut self, x: f32..