Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Xception

TensorFlow 구현

import sys, platform
import tensorflow as tf
import keras

print(f'Python version: {sys.version}')
print(f'platform: {platform.platform()}')
print(f'TensorFlow version: {tf.__version__}')
print(f'keras version: {keras.__version__}')
# GPU check
try:
    assert tf.config.list_physical_devices('GPU')
except:
    print('No GPU detected')
Python version: 3.10.14 | packaged by conda-forge | (main, Mar 20 2024, 12:45:18) [GCC 12.3.0]
platform: Linux-5.15.146.1-microsoft-standard-WSL2-x86_64-with-glibc2.36
TensorFlow version: 2.16.1
keras version: 3.3.3
def print_scores(loss, **metrics):
    print(f'Loss: {loss:.3f}', end='\t')
    for k, v in metrics.items():
        print(f'{k}: {v:.3f}', end='\t')

1Dataset

Kaggle Cats and Dogs

import os.path

data_dir = '../data/cats_dogs_small'
join_path = lambda *args: os.path.join(data_dir, *args)

batch_size = 32
image_size = (180, 180)
train_dataset = keras.utils.image_dataset_from_directory(
    join_path('train'), batch_size=batch_size, image_size=image_size)
validation_dataset = keras.utils.image_dataset_from_directory(
    join_path('validation'), batch_size=batch_size, image_size=image_size)
test_dataset = keras.utils.image_dataset_from_directory(
    join_path('test'), batch_size=batch_size, image_size=image_size)

train_dataset = train_dataset.prefetch(tf.data.AUTOTUNE)
validation_dataset = validation_dataset.prefetch(tf.data.AUTOTUNE)
test_dataset = test_dataset.prefetch(tf.data.AUTOTUNE)
Found 2000 files belonging to 2 classes.
Found 1000 files belonging to 2 classes.
Found 2000 files belonging to 2 classes.

1.1데이터 증식 활용

1.2Xception 패턴

def residual_block(x, units):
    residual = x
    x = layers.BatchNormalization()(x)
    x = layers.Activation('relu')(x)
    x = layers.SeparableConv2D(
        units, 3, padding='same', use_bias=False)(x)
    
    x = layers.BatchNormalization()(x)
    x = layers.Activation('relu')(x)
    x = layers.SeparableConv2D(
        units, 3, padding='same', use_bias=False)(x)
    
    x = layers.MaxPooling2D(3, strides=2, padding='same')(x)
    residual = layers.Conv2D(
        units, 1, strides=2, padding='same', use_bias=False)(residual)
    x = layers.add([x, residual])
    return x

def 개냥이모델(inputs):
    x = layers.Rescaling(1./255)(inputs)
    x = layers.Conv2D(32, 5, strides=2, padding='same', use_bias=False)(x)
    for units in [32, 64, 128, 256, 512]:
        x = residual_block(x, units)
    x = layers.GlobalAveragePooling2D()(x)
    x = layers.Dropout(0.5)(x)
    outputs = layers.Dense(1, activation='sigmoid')(x)
    model = keras.Model(inputs, outputs)
    return model

keras.backend.clear_session()
inputs = keras.Input(shape=input_shape)
model = 개냥이모델(inputs)
model.summary()
import keras

compile_args = dict(
    optimizer='adam',
    loss=keras.losses.BinaryCrossentropy(from_logits=True),
    metrics=['accuracy']
)
keras.backend.clear_session()
model = create_xception(block_sizes=[32, 64, 128, 256, 512])
model.compile(**compile_args)
checkpoint_filepath = 'checkpoints/xception.keras'
history = model.fit(
    train_dataset, epochs=100, validation_data=validation_dataset, 
    callbacks=[
        tf.keras.callbacks.ModelCheckpoint(checkpoint_filepath, save_best_only=True),
        tf.keras.callbacks.TensorBoard('logs/xception')
])
Epoch 1/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 13s 102ms/step - accuracy: 0.5303 - loss: 0.7022 - val_accuracy: 0.5000 - val_loss: 0.6942
Epoch 2/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.5798 - loss: 0.6583 - val_accuracy: 0.5000 - val_loss: 0.7055
Epoch 3/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.5858 - loss: 0.6699 - val_accuracy: 0.5000 - val_loss: 0.7026
Epoch 4/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 73ms/step - accuracy: 0.6081 - loss: 0.6419 - val_accuracy: 0.5000 - val_loss: 0.7038
Epoch 5/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 4s 71ms/step - accuracy: 0.6220 - loss: 0.6257 - val_accuracy: 0.5000 - val_loss: 0.7497
Epoch 6/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.6572 - loss: 0.6123 - val_accuracy: 0.5000 - val_loss: 0.7139
Epoch 7/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.6727 - loss: 0.5922 - val_accuracy: 0.5100 - val_loss: 0.7328
Epoch 8/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.6742 - loss: 0.5926 - val_accuracy: 0.5230 - val_loss: 0.7654
Epoch 9/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 73ms/step - accuracy: 0.6769 - loss: 0.5914 - val_accuracy: 0.5220 - val_loss: 0.8788
Epoch 10/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.6960 - loss: 0.5659 - val_accuracy: 0.5490 - val_loss: 0.7769
Epoch 11/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 76ms/step - accuracy: 0.7079 - loss: 0.5600 - val_accuracy: 0.6880 - val_loss: 0.5495
Epoch 12/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 71ms/step - accuracy: 0.7281 - loss: 0.5291 - val_accuracy: 0.6190 - val_loss: 0.6472
Epoch 13/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.7241 - loss: 0.5332 - val_accuracy: 0.7060 - val_loss: 0.6986
Epoch 14/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 71ms/step - accuracy: 0.7626 - loss: 0.4929 - val_accuracy: 0.7290 - val_loss: 0.6245
Epoch 15/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.7392 - loss: 0.5160 - val_accuracy: 0.6900 - val_loss: 0.5841
Epoch 16/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 73ms/step - accuracy: 0.7761 - loss: 0.4836 - val_accuracy: 0.7820 - val_loss: 0.5153
Epoch 17/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.7512 - loss: 0.4821 - val_accuracy: 0.6980 - val_loss: 0.5732
Epoch 18/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.7739 - loss: 0.4770 - val_accuracy: 0.7570 - val_loss: 0.6087
Epoch 19/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.7786 - loss: 0.4579 - val_accuracy: 0.7190 - val_loss: 0.7942
Epoch 20/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 74ms/step - accuracy: 0.7973 - loss: 0.4171 - val_accuracy: 0.7440 - val_loss: 0.4762
Epoch 21/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 4s 71ms/step - accuracy: 0.7983 - loss: 0.4416 - val_accuracy: 0.7720 - val_loss: 0.5663
Epoch 22/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.7822 - loss: 0.4584 - val_accuracy: 0.7360 - val_loss: 0.5147
Epoch 23/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 4s 71ms/step - accuracy: 0.8018 - loss: 0.4099 - val_accuracy: 0.7810 - val_loss: 0.5259
Epoch 24/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 73ms/step - accuracy: 0.8022 - loss: 0.4138 - val_accuracy: 0.5600 - val_loss: 1.0721
Epoch 25/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 4s 71ms/step - accuracy: 0.8013 - loss: 0.3925 - val_accuracy: 0.7930 - val_loss: 0.5107
Epoch 26/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.8177 - loss: 0.3856 - val_accuracy: 0.6160 - val_loss: 0.8136
Epoch 27/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 73ms/step - accuracy: 0.8290 - loss: 0.3592 - val_accuracy: 0.8040 - val_loss: 0.4670
Epoch 28/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.8275 - loss: 0.3860 - val_accuracy: 0.8010 - val_loss: 0.5200
Epoch 29/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 71ms/step - accuracy: 0.8197 - loss: 0.3669 - val_accuracy: 0.8010 - val_loss: 0.5686
Epoch 30/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 73ms/step - accuracy: 0.8277 - loss: 0.3630 - val_accuracy: 0.8210 - val_loss: 0.4074
Epoch 31/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.8537 - loss: 0.3279 - val_accuracy: 0.8160 - val_loss: 0.4649
Epoch 32/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 74ms/step - accuracy: 0.8409 - loss: 0.3618 - val_accuracy: 0.8400 - val_loss: 0.3877
Epoch 33/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.8479 - loss: 0.3195 - val_accuracy: 0.8220 - val_loss: 0.4508
Epoch 34/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 4s 71ms/step - accuracy: 0.8644 - loss: 0.3128 - val_accuracy: 0.6640 - val_loss: 1.1468
Epoch 35/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.8561 - loss: 0.3140 - val_accuracy: 0.7910 - val_loss: 0.7653
Epoch 36/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 4s 71ms/step - accuracy: 0.8745 - loss: 0.3058 - val_accuracy: 0.7900 - val_loss: 0.4289
Epoch 37/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 73ms/step - accuracy: 0.8679 - loss: 0.2886 - val_accuracy: 0.8270 - val_loss: 0.4772
Epoch 38/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 71ms/step - accuracy: 0.8810 - loss: 0.2776 - val_accuracy: 0.8210 - val_loss: 0.4979
Epoch 39/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.8720 - loss: 0.2929 - val_accuracy: 0.8310 - val_loss: 0.4401
Epoch 40/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 74ms/step - accuracy: 0.8706 - loss: 0.2871 - val_accuracy: 0.8590 - val_loss: 0.3424
Epoch 41/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.8818 - loss: 0.2821 - val_accuracy: 0.8160 - val_loss: 0.4557
Epoch 42/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 74ms/step - accuracy: 0.8792 - loss: 0.2688 - val_accuracy: 0.8490 - val_loss: 0.3902
Epoch 43/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 73ms/step - accuracy: 0.8959 - loss: 0.2535 - val_accuracy: 0.8510 - val_loss: 0.3125
Epoch 44/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.8884 - loss: 0.2511 - val_accuracy: 0.8100 - val_loss: 0.6240
Epoch 45/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.8853 - loss: 0.2542 - val_accuracy: 0.7780 - val_loss: 0.4925
Epoch 46/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.9042 - loss: 0.2242 - val_accuracy: 0.8880 - val_loss: 0.3320
Epoch 47/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 4s 71ms/step - accuracy: 0.8978 - loss: 0.2357 - val_accuracy: 0.8450 - val_loss: 0.3724
Epoch 48/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 74ms/step - accuracy: 0.8920 - loss: 0.2384 - val_accuracy: 0.8710 - val_loss: 0.3055
Epoch 49/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 71ms/step - accuracy: 0.9050 - loss: 0.2245 - val_accuracy: 0.8830 - val_loss: 0.3156
Epoch 50/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.8968 - loss: 0.2213 - val_accuracy: 0.8260 - val_loss: 0.4339
Epoch 51/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.9175 - loss: 0.2011 - val_accuracy: 0.8590 - val_loss: 0.3907
Epoch 52/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.9138 - loss: 0.1920 - val_accuracy: 0.8590 - val_loss: 0.3862
Epoch 53/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 73ms/step - accuracy: 0.9017 - loss: 0.2145 - val_accuracy: 0.8170 - val_loss: 0.5633
Epoch 54/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 74ms/step - accuracy: 0.9157 - loss: 0.2056 - val_accuracy: 0.9060 - val_loss: 0.2675
Epoch 55/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.9220 - loss: 0.1884 - val_accuracy: 0.8590 - val_loss: 0.3360
Epoch 56/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 4s 71ms/step - accuracy: 0.9115 - loss: 0.2160 - val_accuracy: 0.8420 - val_loss: 0.4735
Epoch 57/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 73ms/step - accuracy: 0.9268 - loss: 0.1878 - val_accuracy: 0.8750 - val_loss: 0.3426
Epoch 58/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 4s 71ms/step - accuracy: 0.9169 - loss: 0.1720 - val_accuracy: 0.8510 - val_loss: 0.3367
Epoch 59/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 73ms/step - accuracy: 0.9355 - loss: 0.1635 - val_accuracy: 0.7400 - val_loss: 0.7990
Epoch 60/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.9363 - loss: 0.1636 - val_accuracy: 0.8670 - val_loss: 0.4162
Epoch 61/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 73ms/step - accuracy: 0.9344 - loss: 0.1640 - val_accuracy: 0.8810 - val_loss: 0.3481
Epoch 62/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 4s 71ms/step - accuracy: 0.9420 - loss: 0.1492 - val_accuracy: 0.7340 - val_loss: 0.9418
Epoch 63/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.9208 - loss: 0.1821 - val_accuracy: 0.8880 - val_loss: 0.3124
Epoch 64/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.9348 - loss: 0.1515 - val_accuracy: 0.8430 - val_loss: 0.4575
Epoch 65/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.9308 - loss: 0.1680 - val_accuracy: 0.8970 - val_loss: 0.2726
Epoch 66/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 73ms/step - accuracy: 0.9351 - loss: 0.1424 - val_accuracy: 0.8880 - val_loss: 0.2741
Epoch 67/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.9305 - loss: 0.1561 - val_accuracy: 0.8890 - val_loss: 0.2951
Epoch 68/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 75ms/step - accuracy: 0.9361 - loss: 0.1569 - val_accuracy: 0.8920 - val_loss: 0.2631
Epoch 69/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 4s 71ms/step - accuracy: 0.9493 - loss: 0.1355 - val_accuracy: 0.8490 - val_loss: 0.4281
Epoch 70/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 73ms/step - accuracy: 0.9343 - loss: 0.1496 - val_accuracy: 0.8710 - val_loss: 0.3434
Epoch 71/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.9514 - loss: 0.1166 - val_accuracy: 0.8200 - val_loss: 0.4614
Epoch 72/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 74ms/step - accuracy: 0.9530 - loss: 0.1261 - val_accuracy: 0.7880 - val_loss: 0.6247
Epoch 73/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.9530 - loss: 0.1196 - val_accuracy: 0.8780 - val_loss: 0.4975
Epoch 74/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.9350 - loss: 0.1574 - val_accuracy: 0.8970 - val_loss: 0.2994
Epoch 75/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.9503 - loss: 0.1157 - val_accuracy: 0.8850 - val_loss: 0.3503
Epoch 76/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 4s 71ms/step - accuracy: 0.9502 - loss: 0.1170 - val_accuracy: 0.8660 - val_loss: 0.4235
Epoch 77/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 73ms/step - accuracy: 0.9436 - loss: 0.1332 - val_accuracy: 0.8470 - val_loss: 0.6249
Epoch 78/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 4s 71ms/step - accuracy: 0.9524 - loss: 0.1167 - val_accuracy: 0.8870 - val_loss: 0.3071
Epoch 79/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 73ms/step - accuracy: 0.9493 - loss: 0.1254 - val_accuracy: 0.8930 - val_loss: 0.2864
Epoch 80/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 4s 71ms/step - accuracy: 0.9551 - loss: 0.1111 - val_accuracy: 0.9010 - val_loss: 0.2919
Epoch 81/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.9609 - loss: 0.0962 - val_accuracy: 0.8730 - val_loss: 0.4089
Epoch 82/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.9380 - loss: 0.1647 - val_accuracy: 0.8530 - val_loss: 0.4318
Epoch 83/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 73ms/step - accuracy: 0.9522 - loss: 0.1091 - val_accuracy: 0.8870 - val_loss: 0.3181
Epoch 84/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 4s 71ms/step - accuracy: 0.9518 - loss: 0.1179 - val_accuracy: 0.8950 - val_loss: 0.3326
Epoch 85/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.9375 - loss: 0.1242 - val_accuracy: 0.8820 - val_loss: 0.3311
Epoch 86/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.9448 - loss: 0.1414 - val_accuracy: 0.8870 - val_loss: 0.3492
Epoch 87/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 71ms/step - accuracy: 0.9463 - loss: 0.1233 - val_accuracy: 0.8860 - val_loss: 0.4227
Epoch 88/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.9478 - loss: 0.1366 - val_accuracy: 0.8750 - val_loss: 0.3243
Epoch 89/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.9475 - loss: 0.1347 - val_accuracy: 0.8990 - val_loss: 0.2686
Epoch 90/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 73ms/step - accuracy: 0.9746 - loss: 0.0772 - val_accuracy: 0.9090 - val_loss: 0.3033
Epoch 91/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 4s 71ms/step - accuracy: 0.9736 - loss: 0.0725 - val_accuracy: 0.9150 - val_loss: 0.2652
Epoch 92/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 73ms/step - accuracy: 0.9631 - loss: 0.1006 - val_accuracy: 0.8330 - val_loss: 0.5661
Epoch 93/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.9522 - loss: 0.1120 - val_accuracy: 0.8880 - val_loss: 0.2881
Epoch 94/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.9629 - loss: 0.0874 - val_accuracy: 0.8980 - val_loss: 0.3353
Epoch 95/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.9578 - loss: 0.0993 - val_accuracy: 0.8820 - val_loss: 0.3404
Epoch 96/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.9595 - loss: 0.1136 - val_accuracy: 0.9070 - val_loss: 0.2655
Epoch 97/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.9678 - loss: 0.0800 - val_accuracy: 0.8740 - val_loss: 0.3634
Epoch 98/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.9621 - loss: 0.1013 - val_accuracy: 0.7600 - val_loss: 0.5931
Epoch 99/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 73ms/step - accuracy: 0.9559 - loss: 0.1161 - val_accuracy: 0.8930 - val_loss: 0.3211
Epoch 100/100
63/63 ━━━━━━━━━━━━━━━━━━━━ 5s 72ms/step - accuracy: 0.9679 - loss: 0.0760 - val_accuracy: 0.8620 - val_loss: 0.4293
best_model = keras.models.load_model('checkpoints/xception.keras')
test_loss, *metrics = best_model.evaluate(test_dataset)
print_scores(test_loss, accuracy=metrics[0])
63/63 ━━━━━━━━━━━━━━━━━━━━ 2s 15ms/step - accuracy: 0.8487 - loss: 0.4199
Loss: 0.372	accuracy: 0.864