텐서는 다차원의 배열을 말한다.
텐서가 가장 큰 개념이다.
텐서는 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사이의 값을 가집니다.
대부분 경우가 해당된다. 이런 데이터셋에서는 하나의 데이터 포인트가 벡터로 인코딩 될 수 있으므로 배치여기에서 첫번째 축은 샘플 축
이고, 두번째 축은 특성 축
이다.
데이터에서 시간이 중요할 떄는 시간 축을 포함하여 3차원 텐서로 저장됩니다. 각 샘플은 벡터 2차원의 시퀀스로 인코딩되므로 배치 데이터는 3차원 텐서로 인코딩 될것입니다.
이미지는 전형적으로 높이, 너비, 컬러 채컬의 3차원으로 이루어져있습니다. 흑백은 하나의 컬러 채널만 가지고 있어 2차원 텐서로 저장 될 수 있지만 관례상 이미지 텐서는 항상 3차원으로 저장됩니다.
이미지 텐서의 크기를 지정하는 방식은 2가지가 있다.
채널 마지막 방식. (samples,height,width,color_depth)처럼 컬러 채널의 깊이를 끝에 놓습니다.
비디오 데이터는 현실에서 5차원 텐서가 필요하는 몇 안되는 데이터 중 하나이다.
# 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]])
# 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)