첫 번째 신경망: TensorFlow 2 파트 03

Tensorflow는 초보자를 위한 keras Sequential API와 전문가를 위한 Subclassing API인 두 가지 종류의 API를 제공합니다.

Sequential API는 많은 것을 추상화하고 알고리즘 구현을 훨씬 쉽게 만드는 반면, Subclassing API는 모델에 대한 클래스를 생성한 다음 정방향 패스를 명령적으로 작성하고 사용자 지정 레이어, 활성화 및 교육 루프를 쉽게 작성하여 더 많은 유연성을 제공합니다. 오늘 부분에서는 Sequential API를 사용하여 첫 번째 신경망을 구축할 것입니다.

코드를 실행하는 동안 처음에 다음 코드를 사용하여 일부 경고를 음소거합니다.

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'


수입:
먼저 tensorflow, keras, numpy 및 matplotlib를 가져와야 합니다.

# First Neural Net
# Train, evaluate, and predict with the model

import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt


데이터세트:
이제 데이터 세트를 가져와야 합니다. 여기서는 숫자 분류를 위해 손으로 쓴 숫자의 mnist 데이터셋을 사용할 것이며 keras.datasets에 포함되어 있습니다.

# get the dataset
mnist = keras.datasets.mnist


데이터세트를 분할합니다.
mnist 데이터 세트에서 로드하여 학습 및 테스트 세트 가져오기

(x_train, y_train), (x_test, y_test) = mnist.load_data()
print(x_train.shape, y_train.shape)


다음으로, 현재 이미지의 값이 0에서 255 사이이기 때문에 데이터를 정규화하려고 합니다. 정규화를 통해 값을 0에서 1 사이로 만들 것입니다.

# normalize: 0,255 -> 0,1
x_train, x_test = x_train / 255.0, x_test / 255.0


다음 코드를 실행하는 데이터를 플로팅하려고 하면 손으로 쓴 처음 6자리 숫자가 제공됩니다.

for i in range(6):
    plt.subplot(2,3 i+1)
    plt.imshow(x_train[i], cmap='gray')
plt.show()


모델:
이제 이미지를 플로팅하기 위해 위의 코드를 제거하고 모델을 빌드합니다. 우리는 keras.models.Sequential()을 사용하고 모든 다른 레이어의 목록을 전달할 것입니다.

# model
model = keras.models.Sequential([
    keras.layers.Flatten(input_shape=(28,28)), # to flattens image by reducing one dimension of 28 * 28
    keras.layers.Dense(128, activation='relu'), # fully connected layer (Dense layer with hidden size of 128),,, we will use relu activation function
    keras.layers.Dense(10), # final layer, specify output size, 10 differennt classes
])


모든 다른 레이어를 표시하는 모델 요약을 인쇄합니다.

print(model.summary())


순차 모델을 사용하여 모델을 구축하는 또 다른 방법:

#model = keras.models.Sequential()
#model.add(keras.layers.Flatten(input_shape=(28,28))
#model.add(keras.layers.Dense(128, activation='relu'))
#model.add(keras.layers.Dense(10))


손실 및 옵티마이저를 정의합니다.
일반적으로 다중 클래스 분류 문제의 경우 일반적으로 CategoricalCrossentropy 손실이 사용됩니다. Adam 옵티마이저가 모델에 사용됩니다.

# loss and optimizer
loss = keras.losses.SparseCategoricalCrossentropy(from_logits=True)
optim = keras.optimizers.Adam(lr=0.001)
metrics = ["accuracy"]


모델 컴파일

model.compile(loss=loss, optimizer=optim, metrics=metrics)


훈련:
일부 하이퍼파라미터를 지정하고 훈련 데이터를 공급하여 모델을 훈련할 것입니다. 다음 코드를 실행하고 훈련하는 동안 정확도를 확인하십시오.

# 
batch_size = 64
epochs = 5

model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, shuffle=True, verbose=2) # verbose for logging, 0 - no output, 1..progress bay, 2-normal logging


모델 평가:
평가를 위해 x 및 y 데이터 모두에 대해 테스트 데이터 세트를 사용합니다. batch_size는 이미지의 일부 배치를 가져오고 배치에서 일부 계산을 수행합니다.

model.evaluate(x_test, y_test, batch_size=batch_size, verbose=2)


예측:
예측에 모델을 사용할 수 있는 여러 가지 옵션이 있습니다.

옵션 1: Softmax 레이어로 새 모델 구축

probability_model = keras.models.Sequential([
    model,
    keras.layers.Softmax()
])

predictions = probability_model(x_test)
pred_0 = predictions[0]
print(pred_0)

# use np.argmax to get label with highest probability
label_0 = np.argmax(pred_0)
print(label_0)


옵션 2: 원래 모델 + nn.softmax 및 호출 모델(x)

predictions = model(x_test)
predictions = tf.nn.softmax(predictions)
pred_0 = predictions[0]
print(pred_0)
label_0 = np.argmax(pred_0)
print(label_0)


옵션 3: 원래 모델 + nn.softmax 및 호출 model.predict(x)

predictions = model.predict(x_test, batch_size=batch_size)
predictions = tf.nn.softmax(predictions)
pred_0 = predictions[0]
print(pred_0)
label_0 = np.argmax(pred_0)
print(label_0)


두 개 이상의 예측이 있을 때 여러 레이블에 대해 argmax를 호출하십시오.

pred_05s = predictions[0:5]
print(pred_05s.shape)
label_05s = np.argmax(pred_05s, axis=1)
print(label_05s)

좋은 웹페이지 즐겨찾기