4.15 딥러닝

DNN

신경망의 이름
대부분의 방법을 포함함

순서

신경망 만들기 : 몇개의 레이어를 만들거냐? ->레이어 안에 뉴런을 몇개 넣을것인가
->레이어 추가
->신경망을 완성시킨다

# 신경망을 완성시킨다
network.compile(optimizer='rmsprop', #가중치 조절하는 것
                loss='categorical_crossentropy', #여러가지를 위한 손실 함수
                metrics=['accuracy'])  #무슨 지표로 이 동작을 실행 시킬것이냐

rmsprop : 최적화 알고리즘으로 제일 좋은 것


둘 중 하나일때는 명확하게 sigmoid, tanh 알고리즘 + binary_crossentropy
셋이상일때는 길게 빼주는게 좋다. LU계열 알고리즘(주로 사용) + categorical_crossentropy
activation : 어떤 값이 들어왔을때 통과 유무를 판단하는 함수

activation='sigmoid'면 0 또는 1일때

=====> loss='binary_crossentropy' ====== loss 함수는 항상 마지막 레이어랑 연동

activation='softmax'면 3개이상

=====> loss=' categorical_crossebtropy'

분류로서 sigmoid 랑 softmax 를 쓰기때문에 crossentropy가 겹치게 됨

softmax 의 특징

1대1대1의 관계를 증명 해 준다.
총합이 1이 나와야 한다.

딱 떨어지는 숫자가 아니라도 확률로서 계산해줌

network.add(layers.Dense(512, activation='relu',input_shape=(28* 28,)))
network.add(layers.Dense(10, activation='softmax'))

마지막에 레이어에 softmax를 쓴 이유 : 최종결론이 나와야 됨, 784개의 데이터가 10개의(0~9)데이터로 가게 되는데, 어떤 숫자데이터일지 확률을 따지기 때문

컴퓨터 입장에서 (60000,28,28)은 3차원식 계산,히자만 (60000,28*28)은 2차원식 계산이라 처리속도가 빨라짐

#1행당 784개의 데이터를 넣고 60000개의 행이 있는 것
train_images = train_images.reshape(60000, 28 * 28 )
train_images = train_images.astype('float32') /255 

실수형으로 바꾸고, 바꾼 값이 0~255사이에 존재하게 됨

network.fit(train_images, train_labels, epochs=5, batch_size=128)

epochs 아래 과정을 몇번 반복 할 것인가
batch_size 한 번 돌릴 때 데이터 사이즈를 결정 /128 정도로 끊어서 돌리겠다

network.evaluate(test_images, test_labels)

.evaluate : 평가를 위한 메소드

알고리즘 적용 순서
GD : gradient depression 경사하강법

Movie Review classfication

imdb.load_data(num_words=10000) 

keras문법, imdb.load_data() : 전체 데이터를 다 가져옴= 분석 힘듬

원래 단어로 복원시켜주는 방법

word_index는 단어와 정수 인덱스를 매핑한 딕셔너리입니다

word_index = imdb.get_word_index()

정수 인덱스와 단어를 매핑하도록 뒤집습니다

reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])

리뷰를 디코딩합니다.

0, 1, 2는 '패딩', '문서 시작', '사전에 없음'을 위한 인덱스이므로 3을 뺍니다

decoded_review = ' '.join([reverse_word_index.get(i - 3, '?') for i in train_data[0]])

.get_word_index() 숫자로 된 데이터를 원래의 단어 데이터로 가져오는 명령어

숫자데이터로 남은 이유 : 단어를 숫자로 치환하고 숫자로 학습해서 긍정적,부정적 데이터를 입력하는 것, 1번은 긍정적, 0번은 부정으로

원 윈 인코딩

1~10000개의 칸에 대해
1을 포함하고 싶다면 0번째 칸만 1로 하고 나머지 9999개를 0으로
2를 포함하고 싶다면 1번쨰 칸만 1로 하고 나머지 9999개를 0으로 하는 방법

np.zero((10,dimension))

zero 메소드는 파라미터 한 개만 사용하기 때문에 튜플 타입으로 표현해야됨 (10,dimension)
10 이 행, dimension이 열, 10만큼 배열을 만든다.

for i, sequence in enumerate(sequences):
    results[i, sequence] = 1.

enumerate(sequences) sequences의 값 순서에 따라 자동으로 index번호를 매겨줌
i 에는 인덱스 번호가, sequence에는 sequences의 값이 순서대로 들어가게됨
sequences=[3,5,7,9,12] 일때
result[0,3] 이니까 0행 3열의 값에 1을 넣게됨
=> 0과 1로 이루어진 숫자 모양 데이터 나옴

CNN convolutional Neural Networks

합성곱 신경망

초록색 블럭이 실제 데이터
=9픽셀을 곱해서 1픽셀로 축소한다.
=이것을 반복하는 것
=합성곱 사이즈 지정 가능
valid : 실제 데이터가 가진 특성을 최대한 살리려고 함. 데이터를 넉넉하게 잡는다?

model.add(layer.Conv2D(32,(3,3), input_shape(28,28,1)))

(3,3): 합성곱 사이즈
(28,28,1) 흑백이라 1 컬러면 3

MaxPooling2D(pool_size(2,2)

사소한 변화를 무시하는 레이어
가장큰 값들만 모아서 새 데이터 만드는 레이어

Flatten layer


Dense layer로 최종적으로 값을 뽑아내게 됨

Unicode

Ansi 코드를 각 나라가 자체 표준을 하다가 통일이 안되는 문제가 발생하면서 전 세계에서 모여서 만든 체계,
한자 비율이 제일 크고 그 다음이 한글
고어 (古)도 표현가능

글자의 모양 인식 (수학적 인식)
폰트가 바뀌면 인식을 못하는 문제 발생
-> 머신러닝의 학습으로 인식률을 높임

tip

categorical로 바꾸는 이유

구하고 있는 것이 연산가능한 숫자가 아닌 구별을 위한 숫자이기 때문

from tensorflow.keras.utils import to_categorical

레이어 간 투과할때 뉴런의 갯수는 계속 낮아져야됨

16 => 2 =>16 (X)
16 =>16 => 1 (O)

.history 실행했던 결과를 보여줌

좋은 웹페이지 즐겨찾기