도서 : 신경망 첫걸음(한빛미디어)
지음 : 타리크라시드(송교석 옮김)
- 인공 신경망의 뼈대를 책을 보고 만들어 보았습니다.(책 내용 그대로 입니다.)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86 |
import numpy
import scipy.special
#신경망 클래스의 정의
class neutalNetwork:
#신경망 초기화하기
def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
#입력, 은닉, 출력 계층의 노드 개수 설정
self.inodes = inputnodes
self.hnodes = hiddennodes
self.onodes = outputnodes
#가중치 행렬 wih와 who -> 정규분포의 중심은 0.0으로 설정, 표준편차는 노드로 들어오는 연결 노드의 개수에 루트를 씌우고 역수를 취함(pow함수)
#배열 내 가중치는 w_i_j로 표기. 노드 i에서 다음 계층의 j로 연결됨을 의미
#w11 w21
#w12 w22 등
self.wih = numpy.random.normal(0.0, pow(self.hnodes, -0.5), (self.hnodes, self.inodes))
self.who = numpy.random.normal(0.0, pow(self.onodes, -0.5), (self.onodes, self.hnodes))
#학습률
self.lr = learningrate
#활성화 함수는 시그모이드 함수를 이용
self.activation_function = lambda x: scipy.special.expit(x)
pass
#신경망 학습시키기
def train(self, inputs_list, targets_list) :
#입력 리스트를 2차원의 행렬로 변환
inputs = numpy.array(inputs_list, ndmin=2).T
targets = numpy.array(targets_list, ndmin=2).T
#은닉 계층으로 들어오는 신호를 계산
hidden_inputs = numpy.dot(self.wih, inputs)
#은닉 계층에서 나가는 신호를 계산
hidden_outputs = self.activation_function(hidden_inputs)
#최종 출력 계층으로 들어오는 신호를 계산
final_inputs = numpy.dot(self.who, hidden_outputs)
#최종 출력 계층에서 나가는 신호를 계산
final_outputs = self.activation_function(final_inputs)
#오차는 (실제 값 - 계산 값)
output_errors = targets - final_outputs
#은닉 계층의 오차는 가중치에 의해 나뉜 출력 계층의 오차들을 재조합해 계산
hidden_errors = numpy.dot(self.who.T, output_errors)
#은닉 계층과 출력 계층 간의 가중치 업데이트
self.who += self.lr*numpy.dot((output_errors*final_outputs*(1.0 - final_outputs)), numpy.transpose(hidden_outputs))
#입력 계층과 은닉 계층 간의 가중치 업데이트
self.wih += self.lr*numpy.dot((hidden_errors*hidden_outputs*(1.0 - hidden_outputs)), numpy.transpose(inputs))
pass
#신경망에 질의하기
def query(self, inputs_list):
#입력 리스트를 2차원 행렬로 변환
inputs = numpy.array(inputs_list, ndmin=2).T
#은닉 계층으로 들어오는 신호를 계산
hidden_inputs = numpy.dot(self.wih, inputs)
#은닉 계층에서 나가는 신호를 계산
hidden_outputs = self.activation_function(hidden_inputs)
#최종 출력 계층으로 들어오는 신호를 계산
final_inputs = numpy.dot(self.who, hidden_outputs)
#최종 출력 계층에서 나가는 신호를 계산
final_outputs = self.activation_function(final_inputs)
return final_outputs
#입력, 은닉, 출력 노드의 수
input_nodes = 3
hidden_nodes = 3
output_nodes = 3
#학습률은 0.3으로 정의
learning_rate = 0.3
#신경망의 인스턴스를 생성
n = neutalNetwork(input_nodes,hidden_nodes,output_nodes,learning_rate)
n.query([1.0, 0.5, -1.5])
|
cs |
- 3개의 계층과 3개의 노드를 가진 신경망을 구현했습니다.
- 완전히 초기 단계이므로 다음 실습에서 학습하는 과정을 해보도록 하겠습니다.
'Deep-Learning > Deep-Learning 기초 지식' 카테고리의 다른 글
[신경망 첫걸음]신경망의 개선 (0) | 2019.02.22 |
---|---|
[신경망 첫걸음]MNIST 손글씨 데이터 인식하기 (0) | 2019.02.21 |
[신경망 첫걸음]데이터 준비하기 (0) | 2019.02.20 |
[신경망 첫걸음]가중치의 진짜 업데이트 (0) | 2019.02.20 |
[신경망 첫걸음]여러 노드에서 가중치 학습하기(역전파) (0) | 2019.02.19 |