Я пытаюсь настроить модель VGG16 для обнаружения объектов. Я добавил несколько плотных слоев и заморозил сверточные слои. Есть 2 выходных данных модели (ограничивающие рамки и метки классов), а входные данные — 512*512 изображений.
Похоже, ошибка возникает во время оценки по метрике.
Я проверил форму выходных данных модели и форма «y» обучающих данных.
Метка и аннотации имеют форму: (6, 4) (6, 3)
Выходные данные модели имеют одинаковую форму:
,
< /p>
Версия tf — 2.16.0, версия Python — 3.10.11
Я вижу ошибку (путь к файлу отредактирован):
Traceback (most recent call last):
File “train.py”, line 163, in
history = model.fit(
File “\lib\site-packages\keras\src\utils\traceback_utils.py”, line 122, in error_handler
raise e.with_traceback(filtered_tb) from None
File “\lib\site-packages\tensorflow\python\eager\execute.py”, line 53, in quick_execute
tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
tensorflow.python.framework.errors_impl.InvalidArgumentError: Graph execution error:
Detected at node ScatterNd defined at (most recent call last):
File “train.py”, line 163, in
File “\lib\site-packages\keras\src\utils\traceback_utils.py”, line 117, in error_handler
File “\lib\site-packages\keras\src\backend\tensorflow\trainer.py”, line 318, in fit
File “lib\site-packages\keras\src\backend\tensorflow\trainer.py”, line 121, in one_step_on_iterator
File “\lib\site-packages\keras\src\backend\tensorflow\trainer.py”, line 108, in one_step_on_data
File “\lib\site-packages\keras\src\backend\tensorflow\trainer.py”, line 77, in train_step
File “lib\site-packages\keras\src\trainers\trainer.py”, line 444, in compute_metrics
File “lib\site-packages\keras\src\trainers\compile_utils.py”, line 330, in update_state
File “lib\site-packages\keras\src\trainers\compile_utils.py”, line 17, in update_state
File “lib\site-packages\keras\src\metrics\iou_metrics.py”, line 129, in update_state
File “lib\site-packages\keras\src\metrics\metrics_utils.py”, line 682, in confusion_matrix
File “lib\site-packages\keras\src\ops\core.py”, line 237, in scatter
File “lib\site-packages\keras\src\backend\tensorflow\core.py”, line 354, in scatter
indices[0] = [286, 0] does not index into shape [3,3]
[[{{node ScatterNd}}]] [Op:__inference_one_step_on_iterator_4213]
Я видел похожие вопросы, заданные по этому поводу, нашел 2 решения: обеспечить равное количество классов и количество модулей в выходном слое; измените функции потерь и/или метрики.
Я использую категориальную точность и среднее значение в качестве метрик, а также категориальную кроссэнтропию и MSE в качестве функций потерь для двух выходных данных. Также попробовал среднее значение средней прецессии, но это не сработало.
Пожалуйста, помогите с другими решениями этой ошибки!
изменить (фрагмент кода для обучения модели):
label_dim1, label_dim2 = labels[0].shape
bbox_dim1, bbox_dim2 = bboxes[0].shape
train_dataset = create_dataset(train_images, train_targets, batch_size=10)
test_dataset = create_dataset(test_images, test_targets, batch_size=10)
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(512, 512, 3))
for layer in base_model.layers:
layer.trainable = False
flatten = base_model.output
flatten = Flatten()(flatten)
bboxHead = Dense(128, activation="relu")(flatten)
bboxHead = Dense(64, activation="relu")(bboxHead)
bboxHead = Dense(32, activation="relu")(bboxHead)
bboxHead = Dense(bbox_dim1*bbox_dim2, activation="sigmoid")(bboxHead)
bboxHead = Reshape((bbox_dim1, bbox_dim2), name="bounding_box")(bboxHead)
softmaxHead = Dense(512, activation="relu")(flatten)
softmaxHead = Dropout(0.5)(softmaxHead)
softmaxHead = Dense(512, activation="relu")(softmaxHead)
softmaxHead = Dropout(0.5)(softmaxHead)
softmaxHead = Dense(label_dim1*label_dim2, activation="softmax")(softmaxHead)
softmaxHead = Reshape((label_dim1, label_dim2), name="class_label")(softmaxHead)
model = Model(inputs=base_model.input, outputs=[bboxHead, softmaxHead])
losses = {
"class_label": "categorical_crossentropy",
"bounding_box": "mean_squared_error",
}
metrics = {
"class_label": "categorical_accuracy",
"bounding_box": tf.keras.metrics.MeanIoU(num_classes)
}
model.compile(optimizer= Adam(learning_rate=0.001), loss=losses, metrics=metrics)
history = model.fit(
train_dataset,
validation_data=test_dataset,
epochs=1,
steps_per_epoch=len(train_images) // 10,
validation_steps=len(test_images) // 10,
verbose=1
)
Подробнее здесь: https://stackoverflow.com/questions/786 ... ction-call