손글씨 숫자 분류 모델로 신경망 살펴보기

#데이터셋 불러오기
from tensorflow.keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

train_images.shape
>>>(60000,28,28)
train_labels.shape
>>>60000

train_images에는 28X28픽셀의 숫자 손글씨 이미지 6만개가 넘파이 배열의 형태로 저장되어있고, train_labels에는 0~9까지의 숫자 태그가 저장되어있다. 이미지와 숫자태그는 일대일 대응이다.

#신경망 구축하기
model = keras.Sequential([
    layers.Dense(512, activation="relu"),
    layers.Dense(10, activation='softmax')
])

신경망의 핵심요소는 층이다. 위 예제는 신경망이 층 두개로 구성되어 있다. layers.Dense()함수는 첫번째 인자로 출력 뉴런의 수를 결정하고, 두번째 인자로 층에서 사용될 활성화 함수를 결정한다.

#신경망 컴파일하기
model.compile(optimizer = "rmsprop",
							loss = "sparse_categorical_crossentropy",
							metrics = ["accuracy"])
#데이터 전처리하기
train_images = train_images.reshape((60000,28*28))
train_images = train_images.astype("float32")/255
test_images = train_images.reshape((10000,28*28))
test_images = train_images.astype("float32")/255

원래 훈련이미지는 0~255사이의 값을 가진 uint8타입의 (60000,28,28) 크기를 가진 배열이었다. 이 이미지를 0~1사이의 값을 가지는 float32타입의 (60000,28*28) 크기를 가지는 배열로 바꾼다.

텐서

텐서의 종류 텐서의 축 개수를 랭크라고도 부르며, ndim속성을 사용하면 랭크를 알 수 있다.(예를 들어, 행렬의 ndim속성은 2 이다.)

  1. 스칼라(랭크-0 텐서)
  2. 벡터(랭크-1 텐서)