Я использую набор данных Open-Images-v7 (доступ через Fiftyone lib) и keras_cv lib to fine deeplabv3plus с Mobilenet_v3_small backbone, но точность не улучшается с эпохи вообще, и я получаю Shame Deving. Код:
import tensorflow as tf
import numpy as np
def preprocess_sample(sample):
img = tf.io.read_file(sample["filepath"])
img = tf.image.decode_jpeg(img, channels=3)
img.set_shape([None, None, 3])
img = tf.image.resize(img, (512, 512))
# img = img / 255.0 # Normalize
for detection in sample.ground_truth.detections:
if detection.label == 'Vehicle registration plate':
mask = detection.mask.astype(np.float32)
break
mask = tf.expand_dims(mask, axis=-1)
mask.set_shape([None, None, 1])
mask = tf.image.resize(mask, (512, 512), method="nearest")
return img, mask
# Convert FiftyOne samples to TF Dataset
tf_train_dataset = tf.data.Dataset.from_generator(
lambda: (preprocess_sample(s) for s in train_dataset),
output_signature=(
tf.TensorSpec(shape=(512, 512, 3), dtype=tf.float32), # Image
tf.TensorSpec(shape=(512, 512, 1), dtype=tf.float32), # Mask
)
)
tf_val_dataset = tf.data.Dataset.from_generator(
lambda: (preprocess_sample(s) for s in val_dataset),
output_signature=(
tf.TensorSpec(shape=(512, 512, 3), dtype=tf.float32), # Image
tf.TensorSpec(shape=(512, 512, 1), dtype=tf.float32), # Mask
)
)
# Batch and shuffle
tf_train_dataset = tf_train_dataset.batch(8).prefetch(tf.data.AUTOTUNE)
tf_val_dataset = tf_val_dataset.batch(8).prefetch(tf.data.AUTOTUNE)
Код тонкой настройки
model = keras_cv.models.DeepLabV3Plus.from_preset(
"mobilenet_v3_small",
input_shape=(512, 512, 3),
num_classes=1,
# activation=None # Remove final activation
)
# outputs = tf.keras.layers.Activation("sigmoid")(model.output)
# model = tf.keras.Model(inputs=model.input, outputs=outputs)
model.compile(
optimizer=keras.optimizers.Adam(learning_rate=1e-4), # 'adam'
loss="binary_crossentropy",
metrics=["binary_accuracy"] # accuracy
)
# Train
model.fit(
tf_train_dataset,
validation_data=tf_val_dataset,
epochs=5,
callbacks=[
keras.callbacks.EarlyStopping(patience=3, restore_best_weights=True),
],
)
error/output
Epoch 1/5
/usr/local/lib/python3.11/dist-packages/keras/src/models/functional.py:237: UserWarning: The structure of `inputs` doesn't match the expected structure.
Expected: ['keras_tensor']
Received: inputs=Tensor(shape=(None, 512, 512, 3))
warnings.warn(msg)
/usr/local/lib/python3.11/dist-packages/keras/src/ops/nn.py:907: UserWarning: You are using a softmax over axis -1 of a tensor of shape (None, 512, 512, 1). This axis has size 1. The softmax operation will always return the value 1, which is likely not what you intended. Did you mean to use a sigmoid instead?
warnings.warn(
13/Unknown 200s 12s/step - binary_accuracy: 0.7506 - loss: 0.6739
/usr/local/lib/python3.11/dist-packages/keras/src/trainers/epoch_iterator.py:151: UserWarning: Your input ran out of data; interrupting training. Make sure that your dataset or generator can generate at least `steps_per_epoch * epochs` batches. You may need to use the `.repeat()` function when building your dataset.
self._interrupted_warning()
13/13 ━━━━━━━━━━━━━━━━━━━━ 211s 13s/step - binary_accuracy: 0.7506 - loss: 0.6725 - val_binary_accuracy: 0.6972 - val_loss: 0.6890
Epoch 2/5
13/13 ━━━━━━━━━━━━━━━━━━━━ 202s 13s/step - binary_accuracy: 0.7506 - loss: 0.5131 - val_binary_accuracy: 0.6972 - val_loss: 0.6835
Epoch 3/5
13/13 ━━━━━━━━━━━━━━━━━━━━ 182s 14s/step - binary_accuracy: 0.7506 - loss: 0.4288 - val_binary_accuracy: 0.6972 - val_loss: 0.6792
Epoch 4/5
13/13 ━━━━━━━━━━━━━━━━━━━━ 166s 13s/step - binary_accuracy: 0.7506 - loss: 0.3606 - val_binary_accuracy: 0.6972 - val_loss: 0.6756
Epoch 5/5
13/13 ━━━━━━━━━━━━━━━━━━━━ 166s 13s/step - binary_accuracy: 0.7506 - loss: 0.3141 - val_binary_accuracy: 0.6972 - val_loss: 0.6723
Подробнее здесь: https://stackoverflow.com/questions/796 ... gmentation
Проблема в тонкой настройке DeepLabv3plus с использованием keras_cv для семантической сегментации ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение