Hello Everyone
I am new to Tensorflow (versrion 2.19.0) and face problem which i can’t solve and understand. I am trying to train MobileNetV3 Small for image classification of my custom image dataset.
First i have selected MobileNetV3 small, because i need small model which can run on edge device. Input and ouput shape were modifed. No initial weights.
model = keras.applications.MobileNetV3Small(
input_shape=(64, 256, 1),
weights=None,
classes=4,
alpha=0.50,
include_top=True,
include_preprocessing=False,
)
Than for Tensorflow learning purpose i have selected Cifar10 database and modify shape and label so they fit my final model purpose. I have also shrink database only to 3000 image (2600 train, 400 validation), because this i how large is my current custom image database.
(train_ds, test_ds), ds_info = tfds.load(
'cifar10',
split=['train', 'test'],
as_supervised=True
)
def preprocess(image, label):
image = tf.image.resize(image, [64, 256])
image = tf.image.rgb_to_grayscale(image)
label = tf.one_hot(label % 4, 4)
return image, label
train_ds = train_ds.map(preprocess).take(2600)
test_ds = test_ds.map(preprocess).take(400)
My compilation setup:
model.compile(
optimizer=tf.keras.optimizers.Adam(1e-4),
loss=tf.keras.losses.CategoricalCrossentropy(from_logits=False),
metrics=[tf.keras.metrics.CategoricalAccuracy()]
)
Than i start training:
history = model.fit(
train_ds,
validation_data=test_ds,
epochs=50,
)
During training i am facing fallowing problem:
- model is very strong overfitting for traning data, accuracy is 100%
- accuracy for validation is not changing at all, looks model is not training at all
Epoch 1/50
94/94 ━━━━━━━━━━━━━━━━━━━━ 18s 84ms/step - categorical_accuracy: 0.3531 - loss: 1.3429 - val_categorical_accuracy: 0.1860 - val_loss: 1.3841
Epoch 2/50
94/94 ━━━━━━━━━━━━━━━━━━━━ 7s 79ms/step - categorical_accuracy: 0.4496 - loss: 1.2161 - val_categorical_accuracy: 0.1860 - val_loss: 1.3847
Epoch 3/50
94/94 ━━━━━━━━━━━━━━━━━━━━ 7s 78ms/step - categorical_accuracy: 0.5381 - loss: 1.0560 - val_categorical_accuracy: 0.1860 - val_loss: 1.3850
Epoch 4/50
94/94 ━━━━━━━━━━━━━━━━━━━━ 7s 78ms/step - categorical_accuracy: 0.6314 - loss: 0.8830 - val_categorical_accuracy: 0.1860 - val_loss: 1.3854
Epoch 5/50
94/94 ━━━━━━━━━━━━━━━━━━━━ 7s 78ms/step - categorical_accuracy: 0.7281 - loss: 0.6966 - val_categorical_accuracy: 0.1860 - val_loss: 1.3870
Epoch 6/50
94/94 ━━━━━━━━━━━━━━━━━━━━ 7s 78ms/step - categorical_accuracy: 0.8022 - loss: 0.5202 - val_categorical_accuracy: 0.1860 - val_loss: 1.3900
Epoch 7/50
94/94 ━━━━━━━━━━━━━━━━━━━━ 8s 80ms/step - categorical_accuracy: 0.8784 - loss: 0.3808 - val_categorical_accuracy: 0.1860 - val_loss: 1.3940
Epoch 8/50
94/94 ━━━━━━━━━━━━━━━━━━━━ 7s 78ms/step - categorical_accuracy: 0.9171 - loss: 0.2701 - val_categorical_accuracy: 0.1860 - val_loss: 1.4014
Epoch 9/50
94/94 ━━━━━━━━━━━━━━━━━━━━ 7s 79ms/step - categorical_accuracy: 0.9382 - loss: 0.1935 - val_categorical_accuracy: 0.1860 - val_loss: 1.4121
Epoch 10/50
94/94 ━━━━━━━━━━━━━━━━━━━━ 8s 81ms/step - categorical_accuracy: 0.9537 - loss: 0.1513 - val_categorical_accuracy: 0.1860 - val_loss: 1.4218
Epoch 11/50
94/94 ━━━━━━━━━━━━━━━━━━━━ 7s 79ms/step - categorical_accuracy: 0.9578 - loss: 0.1396 - val_categorical_accuracy: 0.1860 - val_loss: 1.4291
Epoch 12/50
94/94 ━━━━━━━━━━━━━━━━━━━━ 8s 80ms/step - categorical_accuracy: 0.9724 - loss: 0.1169 - val_categorical_accuracy: 0.1860 - val_loss: 1.4509
Epoch 13/50
94/94 ━━━━━━━━━━━━━━━━━━━━ 7s 79ms/step - categorical_accuracy: 0.9730 - loss: 0.0942 - val_categorical_accuracy: 0.1860 - val_loss: 1.4747
Epoch 14/50
94/94 ━━━━━━━━━━━━━━━━━━━━ 8s 80ms/step - categorical_accuracy: 0.9915 - loss: 0.0414 - val_categorical_accuracy: 0.1860 - val_loss: 1.4959
Epoch 15/50
94/94 ━━━━━━━━━━━━━━━━━━━━ 7s 78ms/step - categorical_accuracy: 0.9958 - loss: 0.0234 - val_categorical_accuracy: 0.1860 - val_loss: 1.5192
Epoch 16/50
94/94 ━━━━━━━━━━━━━━━━━━━━ 7s 79ms/step - categorical_accuracy: 0.9949 - loss: 0.0197 - val_categorical_accuracy: 0.1860 - val_loss: 1.5578
Epoch 17/50
94/94 ━━━━━━━━━━━━━━━━━━━━ 8s 80ms/step - categorical_accuracy: 0.9956 - loss: 0.0148 - val_categorical_accuracy: 0.1860 - val_loss: 1.6030
Epoch 18/50
94/94 ━━━━━━━━━━━━━━━━━━━━ 7s 79ms/step - categorical_accuracy: 0.9989 - loss: 0.0082 - val_categorical_accuracy: 0.1860 - val_loss: 1.6624
Epoch 19/50
94/94 ━━━━━━━━━━━━━━━━━━━━ 8s 80ms/step - categorical_accuracy: 0.9998 - loss: 0.0042 - val_categorical_accuracy: 0.1860 - val_loss: 1.7080
Epoch 20/50
94/94 ━━━━━━━━━━━━━━━━━━━━ 8s 82ms/step - categorical_accuracy: 1.0000 - loss: 0.0015 - val_categorical_accuracy: 0.1860 - val_loss: 1.7699
The most strange part is after training, when i evaluate model for both training and validation model model perform very badly, like it didn’t train at all
train_loss, train_acc = model.evaluate(train_ds, verbose=0)
print(f"Train accuracy: {train_acc}")
print(f"Train loss: {train_loss}")
val_loss, val_acc = model.evaluate(test_ds, verbose=0)
print(f"Validation accuracy: {val_acc}")
print(f"Validation loss: {val_loss}")
Train accuracy 0.20267
Train loss: 5.95243
Validation accuracy: 0.18600
Validation loss: 6.137097
Please explain me:
- why validation accuracy don’t change at all, and loss even increase. It looks like the model not training at all
- why for training dataset in model evaluation accuracy is so low when in training model get 100% for the same dataset