Day60 - 케라스(2) 22.11.21.월

류소리·2022년 11월 21일
0

케라스

목록 보기
2/11

신경망의 핵심 구조 p62

  • 신경망의 핵심 구성 요소는 층입니다.
  • 신경망이 훈련 준비를 마치기 위해서 컴파일 단계에 포함된 세 가지를 있다.
    • 옵티마이저 : 성능을 향상시키기 위해 입력된 데이터를 기반으로 모델을 업데이트 하는 메커니즘
    • 손실함수 : 훈련 데이터에서 모델의 성능을 측정하는 방법으로 모델이 옳은 방향으로 학습될 수 있도록 도와준다.
    • 훈련과 테스트 과정을 모니터링할 지표 :여기에서는 정확도(정확히 분류된 이미지의 비율)만 고려하겠다.

신경망을 위한 데이터 표현 p65

텐서는 다차원의 배열을 말한다.

  • 0차원 : 스칼라
  • 1차원 : 벡터
  • 2차원 : 행렬 tensor -> (numpy의 array) = np.array
  • 3차원 이상 : 텐서 (일반적으로)

텐서가 가장 큰 개념이다.

  • 랭크=차원=축

핵심 속성 p68

텐서는 3가지의 핵심 속성으로 정의 됩니다.

  • 축의 개수(랭크) : 예를 들어 3차원 텐서에는 3가지의 축이 있고, 행렬에는 2가지의 축이 있습니다. 넘파이나 텐서플로우 같은 파이썬 라이브러리에서는 ndim 속성에 저장되어 있습니다.

  • 크기 : 텐서의 각 축을 따라 얼마나 많은 차원이 있는지를 나타낸 파이썬의 튜플입니다. 예를 들어 앞에 나온 행렬의 크기는 (3,5)이고, 3차원텐서의 크기는(3,3,5)입니다. 백테의 크기는 (5, )처럼 1개의 워소로 이루어진 튜플입니다. 배열 스칼라는 ( ) 처럼 크기가 없습니다.

  • 데이터 타입( 파이썬 라이브러리에서는 보통 dtype이라고 부릅니다.) : 텐서에 포함된 데이터의 타입입니다. 텐서플로에서는 string 텐서를 사용하기도 합니다.

train_images.ndim # 차원, 속성 축의 개수
>> 3
train_images.shape # 배열의 크기
>> (60000, 28, 28)
train_images.dtype #데이터 타입
>> dtype('uint8')

각 형렬은 하나의 흑백 이미지고, 행렬의 각 원소는 0~255사이의 값을 가집니다.


텐서의 실제 사례 p71

  • 벡터 데이터 (samle, features) : 2차원 텐서. 각 샘플은 수치 속성으로 구성된 벡터이다.
  • 시계열 데이터, 시퀀스 (samples,timesteps,features) : 3차원 텐서. 각 샘플은 특성 벡터의 (길이가 timesteps인) 시퀀스 입니다.
  • 이미지 (samples,height,width,channels) : 4차원 텐서. 각 샘플은 픽셀의 2d rurwkrh rkr vlrtpfdms tncl rkqt(channel)의 벡터입니다.
  • 동영상 (samples,frames,height,width,channels) : 5차원 텐서. 각 샘플은 이미지의 (길이가 frames인) 시퀀스입니다.

1. 벡터 이미지

대부분 경우가 해당된다. 이런 데이터셋에서는 하나의 데이터 포인트가 벡터로 인코딩 될 수 있으므로 배치여기에서 첫번째 축은 샘플 축이고, 두번째 축은 특성 축이다.

2. 시계열 데이터 또는 시퀀스 데이터

데이터에서 시간이 중요할 떄는 시간 축을 포함하여 3차원 텐서로 저장됩니다. 각 샘플은 벡터 2차원의 시퀀스로 인코딩되므로 배치 데이터는 3차원 텐서로 인코딩 될것입니다.

3. 이미지 데이터

이미지는 전형적으로 높이, 너비, 컬러 채컬의 3차원으로 이루어져있습니다. 흑백은 하나의 컬러 채널만 가지고 있어 2차원 텐서로 저장 될 수 있지만 관례상 이미지 텐서는 항상 3차원으로 저장됩니다.

이미지 텐서의 크기를 지정하는 방식은 2가지가 있다.
채널 마지막 방식. (samples,height,width,color_depth)처럼 컬러 채널의 깊이를 끝에 놓습니다.

4. 비디오 테이터

비디오 데이터는 현실에서 5차원 텐서가 필요하는 몇 안되는 데이터 중 하나이다.


영화리뷰 이진분류. p147~159

# 4-1) IMDB 데이터셋 로드하기

from tensorflow.keras.datasets import  imdb
(train_data,train_labels),(test_data,test_labels)=imdb.load_data(num_words=10000)

len(train_data[0]) #숫자가 단어로 만들었음. 단어 218개의 문장인거다.
>>>218

train_labels[:10]
>> array([1, 0, 0, 1, 0, 0, 1, 0, 1, 0])
# 4-2) 리뷰를 다시 텍스트로 디코딩하기

word_index = imdb.get_word_index()
reverse_word_index = dict(
    [(value,key)for (key,value) in word_index.items()])
decoded_review = "".join(
    [reverse_word_index.get(i-3,"?") for i  in train_data[0]])

데이터 준비 p149

  • 리스트르르 텐서로 바꾸는 두가지 방법이 있다.
  • 같은 길이가 되도록 리스트에 패딩을 추가하고 크기를 정수 텐서로 변환한다.
  • 리스트를 원-핫 인코딩으로 하여 0,1의 벡터로 변환한다.
  • 여기서는 원-핫 인코딩 방법을 사용하였다.
# 4-3) 정수 시퀀스를 멀티-핫 인코딩으로 인코딩하기

from pyparsing import results
import numpy as np

def vectorize_sequences(sequences,dimension =10000):
    results= np.zeros((len(sequences),dimension)) #크기가 ()인 모든원소가 0인 행렬를 만든다.
    for i, sequence in enumerate(sequences):
        for j in sequence:
            results[i,j]= 1.   # 특정 인덱스 위치만 1로 바꾼다.
    return results
    
x_train= vectorize_sequences(train_data)  # 훈련 데이터를 벡터로 바꾼다.
x_test = vectorize_sequences(test_data)  #테스트 데이터를 벡터로 바꾼다.

x_train[0]   # 벡터화 됨.
>> array([0., 1., 1., ..., 0., 0., 0.])

x_train.shape #10000개의 1이 생성되었다.    
>> (25000, 10000)
# 4-4) 모델 정의하기, 프레임 설정

from keras.layers.attention.multi_head_attention import activation

from tensorflow import keras
from tensorflow.keras import layers

model = keras.Sequential([
    layers.Dense(16,activation="relu"),   # 16개의 유닛을 가진 2개의 중간층
    layers.Dense(16,activation="relu"),   # 활성화함수- > relu:음수를 0으로 만드는 함수이다. 
    layers.Dense(1,activation="sigmoid")  #이진분류때 사용함. # 스칼라 값(0,1)의 예측으로 출력하는 세번째 층
])
# 4-5) 모델 컴파일하기, 실행 환경 설정

from tensorflow.python import metrics

model.compile(optimizer="rmsprop",        #옵티마이저
              loss="binary_crossentropy", #손실함수, 이진분류 일때
              metrics =["accuracy"] ) 
# 4-6) 검증 센트 준비하기

from prompt_toolkit.widgets.base import partial

x_val = x_train[:10000]     # 10000개를 떼어 검증세트로 만든다.
partial_x_train = x_train[10000:]
y_val = train_labels[:10000]
partia_y_train = train_labels[10000:]
# 4-7) 모델 실행

history = model.fit(partial_x_train,
                    partia_y_train,
                    epochs = 20,
                    batch_size = 512,
                    validation_data=(x_val,y_val)) #매개변수에 검증 데이터를 전달한다.
                    
history_dict.keys()
>> dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy'])
# 4-8) 훈련과 검증 손실 그리기

import matplotlib.pyplot as plt

history_dict = history.history
loss_values = history_dict["loss"] #학습셋의 오차
val_loss_values = history_dict["val_loss"] #테스트셋의 오차
epochs = range(1,len(loss_values)+1)

plt.plot(epochs,loss_values,"bo",label="Training loss")  # 그래프로 표현하기
plt.plot(epochs,val_loss_values,"b",label="Validation loss")
plt.title("Training and validation loss")  #그래프 레이블 표시
plt.xlabel("Epochs")
plt.ylabel("Loss")
plt.legend()
plt.show()

# 4-9)훈련과 검증 정확도 그리기 p156

plt.clf()
acc=history_dict["accuracy"]
val_acc = history_dict["val_accuracy"]
plt.plot(epochs,acc,"bo", label ="Training acc")
plt.plot(epochs, val_acc, "b", label="Validation acc")
plt.title("Training asd validation accuracy")
plt.xlabel("Epochs")
plt.ylabel(" Accuracy")
plt.legend()
plt.show()

# 4-10)모델을 처음부터 다시 훈련하기 p157

model = keras.Sequential([
    layers.Dense(16,activation="relu"),
    layers.Dense(16,activation="relu"),
    layers.Dense(1,activation="sigmoid") #이진분류때 사용함.
])
model.compile(optimizer="rmsprop",
              loss="binary_crossentropy", #이진분류 일때
              metrics =["accuracy"] ) 
model.fit(x_train,train_labels,epochs = 4,batch_size = 512)
results = model.evaluate(x_test,test_labels)


results
>>[0.29977530241012573, 0.8827599883079529]

model.predict(x_test)
>>782/782 [==============================] - 2s 3ms/step
array([[0.1725832 ],
       [0.9998822 ],
       [0.80578035],
       ...,
       [0.08106101],
       [0.05315929],
       [0.44682342]], dtype=float32)

정리하기 p159

  • 원본 데이터를 신경망에 텐서로 주입하기 위해서 꽤 많은 전처리가 필요하다. 단어 시퀀스는 이진 벡터로 인코딩될 수 있지만 다른 인코딩 방식도 있다.
  • relu 활성화 함수와 함께 Dense층을 쌓은 모델은(감성 분류를 포함하여) 여러 종류의 문제에 적용 할 수 있어 앞으로 자주 사용하게 될 것이다.
  • (출력 클래스가 2개인) 이진 분류 문제에서 모델은 하나의 유닛과 sigmoid 활성화 함수를 가진 Dense 층으로 끝내야 한다. 이 모델의 출력은 확률을 나타내는 0,1사이의 스칼라 값이다.
  • 이진 분류 문제에서 이런 스칼라 시그모이드 출력에 대해 사용할 손실함수는 binary_crossentropy 입니다.
  • rmsprop 옵티마이저는 문제에 상관없이 일반적으로 충분히 좋은 선택이다. 걱정할 거리가 하나 줄었다.
  • 훈련 데이터에 대해 성능이 향상됨에 따라 신경망은 과대적합되기 시작하고 이전에 본 적 없는 데이터에서는 결과가 점점 나빠지게 됩니다. 항상 훈련 세트 이외의 데이터에서 성능을 모니터링해야 한다.

https://www.insilicogen.com/blog/346

profile
새싹 빅테이터 개발자

0개의 댓글