Fashion MNIST
import tensorflow as tf
print(f'TensorFlow {tf.__version__}')TensorFlow 2.9.1
def print_scores(X, y):
loss, acc = model.evaluate(X, y)
print(f'Loss: {loss:.3f} Acc.:{acc:.3%}')1데이터 로드¶
동일한 Fashion MNIST 데이터를 TensorFlow와 PyTorch 각각의 방식으로 적재합니다.
TensorFlow
PyTorch
from tensorflow.keras.datasets import fashion_mnist
(X_train, y_train), (X_test, y_test) = fashion_mnist.load_data()
X_train = X_train.reshape(-1, 28, 28, 1)
X_test = X_test.reshape(-1, 28, 28, 1)
X_train = X_train / 255
X_test = X_test / 255from torchvision.datasets import FashionMNIST
fashion_mnist = {}
fashion_mnist['train'] = FashionMNIST(root='data', train=True, download=True)
fashion_mnist['test'] = FashionMNIST(root='data', train=False, download=True)
for split in fashion_mnist.keys():
print(f'{split:<5}: {len(fashion_mnist[split]):,}')
print(f'data: {fashion_mnist[split].data.shape}')
print(f'labels: {fashion_mnist[split].targets.unique()}')
display(pd.DataFrame({'label': FashionMNIST.classes}).T)
sample, label = fashion_mnist['train'][0]
print(f'label: {label}')
sample.show()Q: 형식은 동일한데, 내용이 다르면 같은 신경망이 동일 수준의 성능을 낼까요?
2모델 구현 및 학습¶
동일한 분류 과제를 TensorFlow와 PyTorch로 각각 정의하고 학습합니다.
TensorFlow
PyTorch
from tensorflow.keras import Sequential
from tensorflow.keras import layers
model = Sequential()
model.add(layers.InputLayer((28, 28, 1)))
model.add(layers.Conv2D(32, kernel_size=(3, 3), activation='relu'))
model.add(layers.Conv2D(32, kernel_size=(3, 3), activation='relu'))
model.add(layers.MaxPooling2D())
model.add(layers.Flatten())
model.add(layers.Dense(10, activation='softmax'))
from tensorflow.keras.losses import sparse_categorical_crossentropy
from tensorflow.keras.optimizers import Adam
model.compile(loss=sparse_categorical_crossentropy, optimizer=Adam(), metrics=['acc'])
history = model.fit(X_train, y_train, batch_size=128, epochs=10, validation_split=0.2)def 전처리(images):
표본수 = len(images)
# numpy.astype(float) -> torch.Tensor.float()
X = images.reshape(표본수, -1).float()
X /= 255.0 # 경사 하강 안정성
return X
X = {}
for split in fashion_mnist.keys():
X[split] = 전처리(fashion_mnist[split].data)
assert torch.isclose(X[split].max(), torch.tensor(1.0))
model = torch.nn.Sequential(
torch.nn.Linear(784, 50), # 퍼셉트론 = torch.nn.Linear + 활성화
torch.nn.Sigmoid(),
torch.nn.Linear(50, 100),
torch.nn.Sigmoid(),
torch.nn.Linear(100, 10)
)
outputs = model(X['train'])
print(outputs.shape)
학습률 = 1.0; 배치크기 = 100; 학습횟수 = 10
손실함수 = torch.nn.CrossEntropyLoss()
최적화 = torch.optim.SGD(model.parameters(), lr=학습률) # 경사 하강법 (SGD)
loss_history = []
for epoch in range(학습횟수):
for i in range(0, len(X['train']), 배치크기):
X_batch = X['train'][i:i+배치크기]
y_batch = fashion_mnist['train'].targets[i:i+배치크기]
# 순전파
outputs = model(X_batch)
loss = 손실함수(outputs, y_batch)
loss_history.append(loss.item())
# 역전파
loss.backward()
최적화.step() # 매개변수 갱신 (경사 하강)
최적화.zero_grad() # 경사 초기화
loss_history = pd.Series(loss_history)
print(loss_history.tail().round(3))
scores = {}
for split in ['train', 'test']:
outputs = model(X[split])
예측 = torch.argmax(outputs, dim=1)
scores[split] = (예측 == fashion_mnist[split].targets).float().mean().item()
pd.Series(scores).round(3)print_scores(X_train, y_train)1875/1875 [==============================] - 4s 2ms/step - loss: 0.1708 - acc: 0.9395
Loss: 0.171 Acc.:93.950%
print_scores(X_test, y_test)313/313 [==============================] - 1s 3ms/step - loss: 0.2597 - acc: 0.9090
Loss: 0.260 Acc.:90.900%