커맨드 (Command)에서 실행 결과를 파일로 저장하는 방법을 기술하도록 하겠습니다.


커맨드 실행 방법은 여기 링크를 참고하세요.


기본적인 형식(basic form)은 아래와 같습니다.


<command> ">" (without quotes) <a filenname of the result>


즉, 예제로 보면 아래와 같습니다(a example to explain).


ipconfig > result_of_ipconfig.txt


* ipconfig : (명령어) 네트워크 설정을 확인할 수 있는 명령어 입니다.

(a command to describe)

* >           : (여기서는) ipconfig의 결과를 ">" 뒤에 나오는 곳으로

전달을 해줍니다.

(send the result to "result_of_ipconfit.txt")

* result_of_ipconfig.txt : 결과를 저장하는 파일입니다.

(save the example of command of result)("result_of_ipconfig.txt" 이름의 새로운 파일이 생성 됩니다.)



실행 결과를 캡쳐 이미지로 보여 드리면 아래와 같습니다.


제일 먼저, 실행할 폴더에 파일이 존재하지 않음을 확인을 했습니다. 그 이후 'ipconfig'의 결과를 출력을 아래 이미지로 확인하실 수 있습니다.


단순히 'ipconfig'의 명령만 실행했을때는 결과 파일이 생성되지 않았음을, 아래의 이미지로 확인할 수 있습니다.



마지막으로, 'ipconfig' 명령어를 실행한 결과를 ">"를 이용하여 "result_of_ipconfig.txt"파일에 저장하고, 메모장을 이용하여 제대로 저장되었음을 아래 이미지로 확인할 수 있습니다.

( ipconfig > result_of_ipconfig.txt )


제가 알고 있는 커맨드 윈도우 실행 방법은 다음과 같습니다.

- 검색

- 실행 대화 상자


첫 번째, 검색 방법은 버튼을 누르시고, "command prompt"를 입력하시고 엔터 (혹은 마우스 클릭)을 누르시면 됩니다. 아래의 그림은 "command" 까지만 입력한 상태에서의 "command prompt"가 검색된 화면 입니다.



두 번째, 실행 대화 상자 방법은 " + r"동시에 누르시면 됩니다. 버튼을 누르시면 아래와 같습니다.




위에서의 두가지 방법을 실행하면 결과 화면은 아래와 같습니다.



< 출처 : http://loenahmik.blogspot.kr/2016/09/windows-caffe.html >


테스트 환경은 아래와 같습니다.

- Windows 7(64bit)

- Visual Studio 2013

- Caffe

- MNIST


설치과정은 생략하고 데스트 위주로 정리합니다.


LeNet을 활용한 MNIST 예제

- Training과 Test에 사용할 데이터 다운로드

< 참고파일 : .\data\mnist\get_mnist.sh >

(caffe가 설치된 폴더를 기준으로 작성하였습니다.)


* 아래 링크들을 클릭하시면 다운로드 하실 수 있습니다.

TrainingImages

TrainingLabels

TestImages

TestLabels


* 압축을 해제하시면 아래의 파일들이 있습니다.

(이 파일들을 '.\data\mnist\'로 옮겨 주세요, 이후에 경로 지정을 이곳으로 합니다.)

train-images.idx3-ubyte

train-labels.idx1-ubyte

t10k-images.idx3-ubyte

t10k-labels.idx1-ubyte



- lmdb로 변환

< 참고파일 : .\examples\mnist\create_mnist.sh >


* convert_minist_data.exe을 활용하여 lmdb로 변환합니다.

첫 번째 training 데이터 입니다.

> .\Build\x64\Debug\convert_mnist_data.exe .\data\mnist\train-images.idx3-ubyte .\data\mnist\train-labels.idx1-ubyte .\examples\mnist\mnist_train_lmdb --backend=lmdb


두 번째로는 test 데이터 입니다.

> .\Build\x64\Debug\convert_mnist_data.exe .\data\mnist\t10k-images.idx3-ubyte .\mnist\t10k-labels.idx1-ubyte .\examples\mnist\mnist_test_lmdb --backend=lmdb


결과는 아래의 그림과 같이 새로 만들어진 폴더를 확인 하실 수 있습니다.



- Net과 Solver는 caffe에서 제공해주는 것을 그대로 사용하겠습니다.

* Net 위치 : .\examples\mnist\lenet_train_test.prototxt

* Solver 위치 : .\examples\mnist\lenet_solver.prototxt


<TroubleShooting>

lenet_train_test.prototxt 파일에 보시면 아래 그림과 같이 레이어 안에 'source' 위치를 지정하는 곳이 있습니다. 이 곳은 이전 "lmdb로 변환"에서 결과를 저장하는 곳 ("training : .\examples\mnist\mnist_train_lmdb""test : .\examples\mnist\mnist_test_lmdb"로 각각 지정한 곳입니다.)


- Training 과정

< 참고파일 : .\examples\mnist\train_lenet.sh >


> .\Builtx64\Debug\caffe.exe train --solver=examples\mnist\lenet_solver_prototxt


결과로 생성된 파일은 아래의 그림과 같습니다.




이 글은 Visual Studio를 활용하여 MEX함수를 Debug하는 방법입니다.


일단 저의 환경설정은 아래와 같습니다.
(아래에 설명하는 방법은 버전과는 상관없이 작동합니다. 참고만 하세요)

- Windows 7(64bit)

- MATLAB R2016a

- Visual Studio 2013


실행 예제는 MATWORKS사에서 기본 적으로 제공하는 예제로 설명을 드리겠습니다.

- arrayProduct.c

- demo_arrayProduct.m


첫 번째 소스는 MATLAB Command windows에서 아래와 같이 입력하시면 바로 보실수 있습니다.


>> edit([matlabroot '/extern/examples/mex/arrayProduct.c']);


두 번째 소스는 아래와 같습니다.


%% demo_arrayProduct.m


%% clear

clear all; close all; clc;


%% call arrayProduct

scalar = 5

A = [1.6, 2, 5.2]

B = arrayProduct(scalar, A)


위의 두 소스는 소스 목록에 보시면 링크 되어있으므로 다운 받으셔도 됩니다.



자, 이제 준비를 마쳤으므로 디버깅 (Debugging)하는 방법을 설명 드리겠습니다.


첫 번째, mex 파일을 디버깅할 수 있도록 빌드한다.


>> mex -g arrayProduct.c




두 번째, Visual Studio와 연결한다.


Visual Studio를 실행하시고, [DEBUG] -> [Attach to Process] 선택을 하시면 됩니다.



그 다음 MATLAB.exe을 더블클릭 해주시면 됩니다.


이제 파일을 선택해주시면 됩니다.
(모두들 잘 아시겠지만, 파일 선택은 [FILE] -> [Open] -> [File] 선택해 주시면 됩니다.)


여기서는 MEX파일을 선택해 줍니다.

(예제에서는 'arrayProduct.c'가 이에 해당됩니다.)


예제 파일이 열렸습니다.

저희들은 디버깅을 원하기 때문에 디버깅 포인트를 아래 그림과 같이 클릭해 주시면 됩니다.
(mex는 'mexFunction()'가 메인 이라고 보시면 되기때문에 이 함수 안에 찍으시면 됩니다.)


이제 실제적으로 MATLAB에서 디버깅을 시작하시면 '스텝 인'을 함수 'arrayProduct()'에서 누르시면 됩니다.


위와 같이 실행을 하시면 Visual Studio에서 바로 디버깅 포인터를 확인 하실 수 있습니다.


즐 코딩하세요~

맥 파인더 (Finder)에서 미리보기 기능을 제공하고 있습니다.

- 단축키 :  command + shift + p


- 첫 번째 예제는 pdf 파일을 확인한 결과 입니다.


    - 두 번째 예제는 영상(.mp4) 파일을 확인한 결과 입니다.


- 마지막으로 파워포인트(.pptx)를 확인한 결과 입니다.


'STUDY > Mac' 카테고리의 다른 글

XQuartz 설치  (0) 2016.02.11
Xcode란??  (0) 2013.01.09

 - 현재 폴더에서 파일 찾기 (파일이름 검색)

현재 디렉토리 (Directory, 경로, 폴더)에서 파일 이름 'ga'로 시작하는 파일들을 찾습니다.


find -name 'ga*'


 - 루트 폴더에서 파일 찾기 (파일이름 검색)

현재 폴더가 아닌 루트 (root)폴더에서 찾고 싶으시면 다음과 같이 하시면 됩니다.


find / -name 'ga*'


이 명령은 찾는데 시간이 오래 걸리고 결과물이 많이 나옵니다.


 - 특정 폴더에서 파일 찾기 (파일이름 검색)

그래서 특정한 폴더를 선택하여 찾고 싶으시면 더욱 정확하고 빠르게 찾으실 수 있으시겠죠? 명령은 다음과 같습니다.


find (경로) -name 'ga*'


경로 부분에 원하시는 경로를 지정해 주시면 됩니다.
(경로는 상대 경로와 절대 경로를 사용할 수 있습니다.)




* 파일 이름을 시작이 아닌 중간에 포함한다면 다음과 같이하시면 됩니다.


find -name '*ga*'


마지막에 포함 된다면, 다음과 같이 하시면 되겠죠?


find -name '*ga'


우분투 버전 확인 두가지 방법이 있습니다.
(It has two methods to check Ubuntu version)





첫 번째 방법은 아래와 같습니다.

(below is first)

$ cat /etc/issue


결과는 아래와 같습니다.
(Below is the result of the first method)





두 번째 방법은 아래와 같습니다.

(the next is second)

$ lsb_release -a


결과는 아래와 같습니다.
(Below is the result of the final method)


 - 현재 폴더에서 파일 찾기 (확장자 검색)

현재 디렉토리 (Directory, 경로, 폴더)에서 확장자 txt를 가진 파일들을 찾습니다.


find -name '*.txt'


현재 폴더에서 확장자를 png로 찾고 싶으시다면 다음과 같이 바꾸시면 되겠죠?


find -name '*.png'


 - 루트 폴더에서 파일 찾기 (확장자 검색)

현재 폴더가 아닌 루트 (root)폴더에서 찾고 싶으시면 다음과 같이 하시면 됩니다.


find / -name '*.txt'


이 명령은 찾는데 시간이 오래 걸리고 결과물이 많이 나옵니다.


 - 특정 폴더에서 파일 찾기 (확장자 검색)

그래서 특정한 폴더를 선택하여 찾고 싶으시면 더욱 정확하고 빠르게 찾으실 수 있으시겠죠? 명령은 다음과 같습니다.


find (경로) -name '*.txt'


경로 부분에 원하시는 경로를 지정해 주시면 됩니다.
(경로는 상대 경로와 절대 경로를 사용할 수 있습니다.)


 - 결과를 더욱 상세하게 보고 싶으시면 옵션을 추가해 줍니다.

코드는 아래와 같습니다.


find -name '*.txt' -ls


뒤에 -ls 옵션을 추가하여 주시면 -ls 형식으로 보실 수 있습니다.



A Step by Step Backpropagation Example
(Backpropagation 예제를 활용한 한걸음)

               

Background (배경)

Backpropagation is a common method for training a neural network. There is no shortage of papers online that attempt to explain how backpropagation works, but few that include an example with actual numbers. This post is my attempt to explain how it works with a concrete example that folks can compare their own calculations to in order to ensure they understand backpropagation correctly.

If this kind of thing interests you, you should sign up for my newsletter where I post about AI-related projects that I’m working on.
(Backpropagation 은 뉴럴 네트워크 훈련에 일반적인 방법이다. 온라인상의 논문 부제로 backpropagation이 어떻게 작업을 하는지 실제 숫자를 포함하여  설명을 시도한다. )

Backpropagation in Python (파이썬에서 Backpropagation)

You can play around with a Python script that I wrote that implements the backpropagation algorithm in this Github repo.
(독자는 링크된 Github에서 구현된 backpropagation 알고리즘을 Python과 함께 실행할 수 있다.)

Backpropagation Visualization (Backpropagation 시각화)

For an interactive visualization showing a neural network as it learns, check out my Neural Network visualization.

(눈으로 볼수 있는 뉴런 네트워크는 학습은 "Neural Network Visualization"에서 확인해 보세요 )

Additional Resources (추가 자료)

If you find this tutorial useful and want to continue learning about neural networks and their applications, I highly recommend checking out Adrian Rosebrock’s excellent tutorial on Getting Started with Deep Learning and Python.

(독자들이 이 유용한 학습과 뉴런네트워크과 그 어플리케이션에 관심이 있으면, Adrian Rosebrock's의 훌륭한 가이드 "Getting Started with Deep Learning and Python"을 확인하기를 강력히 추천합니다.)

Overview (개요)

For this tutorial, we’re going to use a neural network with two inputs, two hidden neurons, two output neurons. Additionally, the hidden and output neurons will include a bias.

Here’s the basic structure:

(우리는 뉴런네트워크에 두개의 입력, 두개의 히든 뉴런, 두개의 출력을 사용한다. 추가적으로, 히든과 출력 뉴런은 바이어스를 포함한다. 여기는 기본 구조이다.
여기는 Backpropagation의 기본 구조이다.)

neural_network (7)

In order to have some numbers to work with, here are the initial weights, the biases, and training inputs/outputs:

(실제 숫자를 사용한 예제를 보이기 위해서 여러개의 초기 가중치, 여러개의 바이어스,  입력과 출력의 초기 값들을 아래와 같이 사용하였다.)

neural_network (9)

The goal of backpropagation is to optimize the weights so that the neural network can learn how to correctly map arbitrary inputs to outputs.

For the rest of this tutorial we’re going to work with a single training set: given inputs 0.05 and 0.10, we want the neural network to output 0.01 and 0.99.

(backpropabation의 목적은 가중치들을 최적화 하는것이다. 따라서 뉴런 네트워크는 임의 입력들에서 출력으로 정확한 맵을 학습할 수 있다. 아래의 학습을 설명하기 위해서 단일 훈련셋을 사용하였다. 주어진 입력은 0.05와 0.10,  출력은 0.01과 0.99이다.)

The Forward Pass (순 방향)

To begin, lets see what the neural network currently predicts given the weights and biases above and inputs of 0.05 and 0.10. To do this we’ll feed those inputs forward though the network.

(뉴럴 네트워크의 0.05와 0.10의 입력들의 주어진 가중치들과 바이어스들의 예측을보자. 이러한 입력값들을 이 네트워크를 향해서 넣어준다.)

We figure out the total net input to each hidden layer neuron, squash the total net input using an activation function (here we use the logistic function), then repeat the process with the output layer neurons.

(우리는 각각의 히든 레이어 뉴런에대한 전체 입력넷은 위와같다. 활성화 함수(여기서는 로직 함수를 사용)를 사용한 전체 입력망을 밀어 넣고, 다음으로 출력레이어 뉴런의 과정을 반반한다. )

Total net input is also referred to as just net input by some sources.


Here’s how we calculate the total net input for h_1:

net_{h1} = w_1 * i_1 + w_2 * i_2 + b_1 * 1

net_{h1} = 0.15 * 0.05 + 0.2 * 0.1 + 0.35 * 1 = 0.3775

(전체 입력넷<h_1>을 다음과 같이 계산했다.

    <h1의 입력은 각각 i1, i2와 b1과 연결되어있음을 그림에서 볼수 있고,

    수식과 각각의 숫자를 대입하면 다음과 같다.> )


We then squash it using the logistic function to get the output of h_1:

out_{h1} = \frac{1}{1+e^{-net_{h1}}} = \frac{1}{1+e^{-0.3775}} = 0.593269992

( h1의 출력을 얻기위해서 로직함수를 사용하여 결과를 얻는다.)


Carrying out the same process for h_2 we get:

out_{h2} = 0.596884378

(같은 절차대로 h2 결과를 얻는다.)


We repeat this process for the output layer neurons, using the output from the hidden layer neurons as inputs.

Here’s the output for o_1:

net_{o1} = w_5 * out_{h1} + w_6 * out_{h2} + b_2 * 1

net_{o1} = 0.4 * 0.593269992 + 0.45 * 0.596884378 + 0.6 * 1 = 1.105905967

out_{o1} = \frac{1}{1+e^{-net_{o1}}} = \frac{1}{1+e^{-1.105905967}} = 0.75136507

(히든 레이어 뉴런들로부터 결과를 사용하여, 출력 레이어 뉴런들에 위의 과정을 반복하였다<입력 레이어에서 했던것과 같이>.)


And carrying out the same process for o_2 we get:

out_{o2} = 0.772928465

( 같은 절차대로 하여 02를 얻었다. )

Calculating the Total Error (전체 오차 계산)

We can now calculate the error for each output neuron using the squared error function and sum them to get the total error:

E_{total} = \sum \frac{1}{2}(target - output)^{2}

(전체 에러를 구하기 위해서 제곱 에러 함수와 그 합을 이용하여 각각의 아웃 뉴런의 에러를 계산한다.)

Some sources refer to the target as the ideal and the output as the actual.


The \frac{1}{2} is included so that exponent is cancelled when we differentiate later on. The result is eventually multiplied by a learning rate anyway so it doesn’t matter that we introduce a constant here [1].


For example, the target output for o_1 is 0.01 but the neural network output 0.75136507, therefore its error is:

E_{o1} = \frac{1}{2}(target_{o1} - out_{o1})^{2} = \frac{1}{2}(0.01 - 0.75136507)^{2} = 0.274811083

(예를 들어, o1에 대한 타겟 출력이 0.01 그러나 뉴럴 네트워크의 출력은 0.75136503, 그러므로 그 에러는 수식과 같다)


Repeating this process for o_2 (remembering that the target is 0.99) we get:

E_{o2} = 0.023560026

(o2에대하여 똑같이 적용하면 (o2의 타겟은 0.99를 상기하며) 우리는 0.023560026를 얻는다)


The total error for the neural network is the sum of these errors:

E_{total} = E_{o1} + E_{o2} = 0.274811083 + 0.023560026 = 0.298371109

(뉴럴 네트워크에대한 출력의 전체 에러는 이 에러들의 합이다.)

The Backwards Pass (역방향)

Our goal with backpropagation is to update each of the weights in the network so that they cause the actual output to be closer the target output, thereby minimizing the error for each output neuron and the network as a whole.

(backpropagation과 우리의 목적은 네트워크들의 가중치들을 각각 업데이트 시키는 것이다. 따라서 그 실체 출력은 타겟 출력에 더 가깝게 된다. 각각의 출력 뉴런과 네트워크의 에대한 에러가 최소화된다.)

Output Layer (출력 레이어)

Consider w_5. We want to know how much a change in w_5 affects the total error, aka \frac{\partial E_{total}}{\partial w_{5}}.

(w5를 고려하자. w5의 변화가 전체 에러에 영항을 주는지 알고 싶다.)


\frac{\partial E_{total}}{\partial w_{5}} is read as “the partial derivative of E_{total} with respect to w_{5}“. You can also say “the gradient with respect to w_{5}“.


By applying the chain rule we know that:

\frac{\partial E_{total}}{\partial w_{5}} = \frac{\partial E_{total}}{\partial out_{o1}} * \frac{\partial out_{o1}}{\partial net_{o1}} * \frac{\partial net_{o1}}{\partial w_{5}}

( 체인 룰을 적용하여 우리는 알수 있다.)


Visually, here’s what we’re doing:

(시각화하면 아래와 같다)

output_1_backprop (4)

We need to figure out each piece in this equation.

First, how much does the total error change with respect to the output?

E_{total} = \frac{1}{2}(target_{o1} - out_{o1})^{2} + \frac{1}{2}(target_{o2} - out_{o2})^{2}

\frac{\partial E_{total}}{\partial out_{o1}} = 2 * \frac{1}{2}(target_{o1} - out_{o1})^{2 - 1} * -1 + 0

\frac{\partial E_{total}}{\partial out_{o1}} = 2 * \frac{1}{2}(target_{o1} - out_{o1})^{2 - 1} * -1 + 0

\frac{\partial E_{total}}{\partial out_{o1}} = -(target_{o1} - out_{o1}) = -(0.01 - 0.75136507) = 0.74136507

(이 방정식의 각 일부는 출력이 필요하다)


-(target - out) is sometimes expressed as out - target


When we take the partial derivative of the total error with respect to out_{o1}, the quantity \frac{1}{2}(target_{o2} - out_{o2})^{2} becomes zero because out_{o1} does not affect it which means we’re taking the derivative of a constant which is zero.


Next, how much does the output of o_1 change with respect to its total net input?

The partial derivative of the logistic function is the output multiplied by 1 minus the output:

out_{o1} = \frac{1}{1+e^{-net_{o1}}}

\frac{\partial out_{o1}}{\partial net_{o1}} = out_{o1}(1 - out_{o1}) = 0.75136507(1 - 0.75136507) = 0.186815602

Finally, how much does the total net input of o1 change with respect to w_5?

net_{o1} = w_5 * out_{h1} + w_6 * out_{h2} + b_2 * 1

\frac{\partial net_{o1}}{\partial w_{5}} = 1 * out_{h1} * w_5^{(1 - 1)} + 0 + 0 = out_{h1} = 0.593269992

Putting it all together:

\frac{\partial E_{total}}{\partial w_{5}} = \frac{\partial E_{total}}{\partial out_{o1}} * \frac{\partial out_{o1}}{\partial net_{o1}} * \frac{\partial net_{o1}}{\partial w_{5}}

\frac{\partial E_{total}}{\partial w_{5}} = 0.74136507 * 0.186815602 * 0.593269992 = 0.082167041

You’ll often see this calculation combined in the form of the delta rule:

\frac{\partial E_{total}}{\partial w_{5}} = -(target_{o1} - out_{o1}) * out_{o1}(1 - out_{o1}) * out_{h1}

Alternatively, we have \frac{\partial E_{total}}{\partial out_{o1}} and \frac{\partial out_{o1}}{\partial net_{o1}} which can be written as \frac{\partial E_{total}}{\partial net_{o1}}, aka \delta_{o1} (the Greek letter delta) aka the node delta. We can use this to rewrite the calculation above:

\delta_{o1} = \frac{\partial E_{total}}{\partial out_{o1}} * \frac{\partial out_{o1}}{\partial net_{o1}} = \frac{\partial E_{total}}{\partial net_{o1}}

\delta_{o1} = -(target_{o1} - out_{o1}) * out_{o1}(1 - out_{o1})

Therefore:

\frac{\partial E_{total}}{\partial w_{5}} = \delta_{o1} out_{h1}

Some sources extract the negative sign from \delta so it would be written as:

\frac{\partial E_{total}}{\partial w_{5}} = -\delta_{o1} out_{h1}


To decrease the error, we then subtract this value from the current weight (optionally multiplied by some learning rate, eta, which we’ll set to 0.5):

w_5^{+} = w_5 - \eta * \frac{\partial E_{total}}{\partial w_{5}} = 0.4 - 0.5 * 0.082167041 = 0.35891648

Some sources use \alpha (alpha) to represent the learning rate, others use \eta (eta), and others even use \epsilon (epsilon).

We can repeat this process to get the new weights w_6, w_7, and w_8:

w_6^{+} = 0.408666186

w_7^{+} = 0.511301270

w_8^{+} = 0.561370121

We perform the actual updates in the neural network after we have the new weights leading into the hidden layer neurons (ie, we use the original weights, not the updated weights, when we continue the backpropagation algorithm below).

Hidden Layer (히든 레이어)

Next, we’ll continue the backwards pass by calculating new values for w_1, w_2, w_3, and w_4.

Big picture, here’s what we need to figure out:

\frac{\partial E_{total}}{\partial w_{1}} = \frac{\partial E_{total}}{\partial out_{h1}} * \frac{\partial out_{h1}}{\partial net_{h1}} * \frac{\partial net_{h1}}{\partial w_{1}}

Visually:

nn-calculation

We’re going to use a similar process as we did for the output layer, but slightly different to account for the fact that the output of each hidden layer neuron contributes to the output (and therefore error) of multiple output neurons. We know that out_{h1} affects both out_{o1} and out_{o2} therefore the \frac{\partial E_{total}}{\partial out_{h1}} needs to take into consideration its effect on the both output neurons:

\frac{\partial E_{total}}{\partial out_{h1}} = \frac{\partial E_{o1}}{\partial out_{h1}} + \frac{\partial E_{o2}}{\partial out_{h1}}

Starting with \frac{\partial E_{o1}}{\partial out_{h1}}:

\frac{\partial E_{o1}}{\partial out_{h1}} = \frac{\partial E_{o1}}{\partial net_{o1}} * \frac{\partial net_{o1}}{\partial out_{h1}}

We can calculate \frac{\partial E_{o1}}{\partial net_{o1}} using values we calculated earlier:

\frac{\partial E_{o1}}{\partial net_{o1}} = \frac{\partial E_{o1}}{\partial out_{o1}} * \frac{\partial out_{o1}}{\partial net_{o1}} = 0.74136507 * 0.186815602 = 0.138498562

And \frac{\partial net_{o1}}{\partial out_{h1}} is equal to w_5:

net_{o1} = w_5 * out_{h1} + w_6 * out_{h2} + b_2 * 1

\frac{\partial net_{o1}}{\partial out_{h1}} = w_5 = 0.40

Plugging them in:

\frac{\partial E_{o1}}{\partial out_{h1}} = \frac{\partial E_{o1}}{\partial net_{o1}} * \frac{\partial net_{o1}}{\partial out_{h1}} = 0.138498562 * 0.40 = 0.055399425

Following the same process for \frac{\partial E_{o2}}{\partial out_{o1}}, we get:

\frac{\partial E_{o2}}{\partial out_{h1}} = -0.019049119

Therefore:

\frac{\partial E_{total}}{\partial out_{h1}} = \frac{\partial E_{o1}}{\partial out_{h1}} + \frac{\partial E_{o2}}{\partial out_{h1}} = 0.055399425 + -0.019049119 = 0.036350306

Now that we have \frac{\partial E_{total}}{\partial out_{h1}}, we need to figure out \frac{\partial out_{h1}}{\partial net_{h1}} and then \frac{\partial net_{h1}}{\partial w} for each weight:

out_{h1} = \frac{1}{1+e^{-net_{h1}}}

\frac{\partial out_{h1}}{\partial net_{h1}} = out_{h1}(1 - out_{h1}) = 0.59326999(1 - 0.59326999 ) = 0.241300709

We calculate the partial derivative of the total net input to h_1 with respect to w_1 the same as we did for the output neuron:

net_{h1} = w_1 * i_1 + w_2 * i_2 + b_1 * 1

\frac{\partial net_{h1}}{\partial w_1} = i_1 = 0.05

Putting it all together:

\frac{\partial E_{total}}{\partial w_{1}} = \frac{\partial E_{total}}{\partial out_{h1}} * \frac{\partial out_{h1}}{\partial net_{h1}} * \frac{\partial net_{h1}}{\partial w_{1}}

\frac{\partial E_{total}}{\partial w_{1}} = 0.036350306 * 0.241300709 * 0.05 = 0.000438568


You might also see this written as:

\frac{\partial E_{total}}{\partial w_{1}} = (\sum\limits_{o}{\frac{\partial E_{total}}{\partial out_{o}} * \frac{\partial out_{o}}{\partial net_{o}} * \frac{\partial net_{o}}{\partial out_{h1}}}) * \frac{\partial out_{h1}}{\partial net_{h1}} * \frac{\partial net_{h1}}{\partial w_{1}}

\frac{\partial E_{total}}{\partial w_{1}} = (\sum\limits_{o}{\delta_{o} * w_{ho}}) * out_{h1}(1 - out_{h1}) * i_{1}

\frac{\partial E_{total}}{\partial w_{1}} = \delta_{h1}i_{1}


We can now update w_1:

w_1^{+} = w_1 - \eta * \frac{\partial E_{total}}{\partial w_{1}} = 0.15 - 0.5 * 0.000438568 = 0.149780716

Repeating this for w_2, w_3, and w_4

w_2^{+} = 0.19956143

w_3^{+} = 0.24975114

w_4^{+} = 0.29950229

Finally, we’ve updated all of our weights! When we fed forward the 0.05 and 0.1 inputs originally, the error on the network was 0.298371109. After this first round of backpropagation, the total error is now down to 0.291027924. It might not seem like much, but after repeating this process 10,000 times, for example, the error plummets to 0.000035085. At this point, when we feed forward 0.05 and 0.1, the two outputs neurons generate 0.015912196 (vs 0.01 target) and 0.984065734 (vs 0.99 target).

If you’ve made it this far and found any errors in any of the above or can think of any ways to make it clearer for future readers, don’t hesitate to drop me a note. Thanks!


'STUDY > AI' 카테고리의 다른 글

[Caffe] Windows + Visual Studio + Caffe + MNIST Training  (0) 2016.11.01

< 영국 버전 >

- 해외에서 영어공부를 하다보면 아래와 같이 반을 나누게 됩니다..


- Element

- (Pre Intermediate)

- Intermediate

- (Upper Intermediate)

- Advanced

- (High Advanced)


1. 가처음 배우며 기초(Element) 및 초-중급(Pre Intermediate) 단계의 해당하는 책은 아래와 같습니다.


2. 첫번째 책을 본 후 보게 되는 것이 아래의 책이며, 중급(Intermediate) 및 중-고급(Upper Intermediate)에 해당 됩니다.


3. 마지막으로 고급(Adavanced or High Advanced) 단계에 해당하는 책입니다. 영어를 잘하시는 분들이 보시겠죠?


< 미국 버전 >

미국 버전은 두가지 버전으로 나누어져 있습니다.

1. 첫번째가 초급 및 초-중급 단계에 해당하는 책입니다.


2. 두번째이자 마지막으로 중금 및 중-고급 단계에 해당하는 책입니다.




좋은 책들로 향상된 여러분의 실력을 만끽하세요
(By If you never try, you'll never known it)

+ Recent posts