pierluigiferrari / ssd_keras

A Keras port of Single Shot MultiBox Detector
Apache License 2.0
1.86k stars 934 forks source link

ValueError: An operation has `None` for gradient. Please make sure that all of your ops have a gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval. #379

Open gbinduo opened 3 years ago

gbinduo commented 3 years ago

Thank you for great work!!! I am trying to train my own data by SSD512 that modified by SSD300.py original file. Here is my code

`# -- coding: utf-8 -- """ Created on Sat Apr 17 07:57:18 2021

@author: Giap Binh Duong """ from keras import backend as K from keras.models import load_model from keras.preprocessing import image from keras.optimizers import Adam, SGD from imageio import imread import numpy as np from math import ceil from matplotlib import pyplot as plt from keras.callbacks import ModelCheckpoint, LearningRateScheduler, TerminateOnNaN, CSVLogger

from models.keras_ssd512 import ssd_512 from keras_loss_function.keras_ssd_loss import SSDLoss from keras_layers.keras_layer_AnchorBoxes import AnchorBoxes from keras_layers.keras_layer_DecodeDetections import DecodeDetections from keras_layers.keras_layer_DecodeDetectionsFast import DecodeDetectionsFast from keras_layers.keras_layer_L2Normalization import L2Normalization

from ssd_encoder_decoder.ssd_output_decoder import decode_detections, decode_detections_fast

from data_generator.object_detection_2d_data_generator import DataGenerator from data_generator.object_detection_2d_photometric_ops import ConvertTo3Channels from data_generator.object_detection_2d_geometric_ops import Resize from data_generator.object_detection_2d_misc_utils import apply_inverse_transforms from data_generator.data_augmentation_chain_original_ssd import SSDDataAugmentation from ssd_encoder_decoder.ssd_input_encoder import SSDInputEncoder import tensorflow as tf config = tf.compat.v1.ConfigProto() config.gpu_options.allow_growth = True sess = tf.compat.v1.Session(config=config) gpu_options = tf.compat.v1.GPUOptions(per_process_gpu_memory_fraction=1) sess = tf.compat.v1.Session(config=tf.compat.v1.ConfigProto(gpu_options=gpu_options)) K.clear_session() # Clear previous models from memory.

img_height = 512 img_width = 512 mean_color = [123, 117, 104] n_classes=6 normalize_coords = True clip_boxes = False offsets = [0.5, 0.5, 0.5, 0.5, 0.5, 0.5]

1: Build the Keras model

K.clear_session() # Clear previous models from memory.

model = ssd_512(image_size=(img_height, img_width, 3), n_classes=n_classes, mode='inference', l2_regularization=0.0005, scales=[0.07, 0.15, 0.3, 0.45, 0.6, 0.75, 0.9, 1.05], # The scales for MS COCO are [0.04, 0.1, 0.26, 0.42, 0.58, 0.74, 0.9, 1.06] aspect_ratios_per_layer=[[1.0, 2.0, 0.5], [1.0, 2.0, 0.5, 3.0, 1.0/3.0], [1.0, 2.0, 0.5, 3.0, 1.0/3.0], [1.0, 2.0, 0.5, 3.0, 1.0/3.0], [1.0, 2.0, 0.5, 3.0, 1.0/3.0], [1.0, 2.0, 0.5], [1.0, 2.0, 0.5]], two_boxes_for_ar1=True, steps=[8, 16, 32, 64, 128, 256, 512], offsets=[0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], clip_boxes=False, variances=[0.1, 0.1, 0.2, 0.2], normalize_coords=True, subtract_mean=[123, 117, 104], swap_channels=[2, 1, 0], confidence_thresh=0.5, iou_threshold=0.45, top_k=200, nms_max_output_size=400)

adam = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0) sgd = SGD(lr=0.001, momentum=0.9, decay=0.0, nesterov=False)

ssd_loss = SSDLoss(neg_pos_ratio=3, alpha=1.0, n_neg_min=0)

model.compile(optimizer=adam, loss=ssd_loss.compute_loss)

train_dataset = DataGenerator(load_images_into_memory=False, hdf5_dataset_path=None) val_dataset = DataGenerator(load_images_into_memory=False, hdf5_dataset_path=None)

Button_images_dir = 'Images/' Button_annotations_dir = 'Annotations/'

Button_train_image_set_filename = 'train.txt' Button_val_image_set_filename = 'val.txt' Button_trainval_image_set_filename = 'trainval.txt' Button_test_image_set_filename = 'test.txt'

classes = ['background', 'CS', 'PM', 'SR', 'WM', 'MK', 'SD']

train_dataset.parse_xml(images_dirs=[Button_images_dir], image_set_filenames=[Button_trainval_image_set_filename, Button_trainval_image_set_filename], annotations_dirs=[Button_annotations_dir], classes=classes, include_classes='all', exclude_truncated=False, exclude_difficult=False, ret=False)

val_dataset.parse_xml(images_dirs=[Button_images_dir], image_set_filenames=[Button_test_image_set_filename], annotations_dirs=[Button_annotations_dir], classes=classes, include_classes='all', exclude_truncated=False, exclude_difficult=True, ret=False)

batch_size = 4 ssd_data_augmentation = SSDDataAugmentation(img_height=img_height, img_width=img_width, background=mean_color)

convert_to_3_channels = ConvertTo3Channels() resize = Resize(height=img_height, width=img_width)

predictor_sizes = [model.get_layer('conv4_3_norm_mbox_conf').output_shape[1:3], model.get_layer('fc7_mbox_conf').output_shape[1:3], model.get_layer('conv6_2_mbox_conf').output_shape[1:3], model.get_layer('conv7_2_mbox_conf').output_shape[1:3], model.get_layer('conv8_2_mbox_conf').output_shape[1:3], model.get_layer('conv9_2_mbox_conf').output_shape[1:3], model.get_layer('conv10_2_mbox_conf').output_shape[1:3]]

ssd_input_encoder = SSDInputEncoder(img_height=img_height, img_width=img_width, n_classes=n_classes, predictor_sizes=predictor_sizes, scales=[0.07, 0.15, 0.3, 0.45, 0.6, 0.75, 0.9, 1.05], aspect_ratios_per_layer=[[1.0, 2.0, 0.5], [1.0, 2.0, 0.5, 3.0, 1.0/3.0], [1.0, 2.0, 0.5, 3.0, 1.0/3.0], [1.0, 2.0, 0.5, 3.0, 1.0/3.0], [1.0, 2.0, 0.5, 3.0, 1.0/3.0], [1.0, 2.0, 0.5], [1.0, 2.0, 0.5]], two_boxes_for_ar1=True, steps=[8, 16, 32, 64, 128, 256, 512], offsets=[0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], clip_boxes=False, variances=[0.1, 0.1, 0.2, 0.2], matching_type='multi', pos_iou_threshold=0.5, neg_iou_limit=0.5, normalize_coords=True)

train_generator = train_dataset.generate(batch_size=batch_size, shuffle=True, transformations=[ssd_data_augmentation], label_encoder=ssd_input_encoder, returns={'processed_images', 'encoded_labels'}, keep_images_without_gt=False)

val_generator = val_dataset.generate(batch_size=batch_size, shuffle=False, transformations=[convert_to_3_channels, resize], label_encoder=ssd_input_encoder, returns={'processed_images', 'encoded_labels'}, keep_images_without_gt=False) train_dataset_size = train_dataset.get_dataset_size() val_dataset_size = val_dataset.get_dataset_size()

print("Number of images in the training dataset:\t{:>6}".format(train_dataset_size)) print("Number of images in the validation dataset:\t{:>6}".format(val_dataset_size))

def lr_schedule(epoch): if epoch < 80: return 0.001 elif epoch < 100: return 0.0001 else: return 0.00001

model_checkpoint = ModelCheckpoint(filepath='ssd512_pascal_07+12_epoch-{epoch:02d}_loss-{loss:.4f}_val_loss-{val_loss:.4f}.h5', monitor='val_loss', verbose=1, save_best_only=True, save_weights_only=False, mode='auto', period=1) csv_logger = CSVLogger(filename='ssd300_pascal_07+12_training_log.csv', separator=',', append=True)

learning_rate_scheduler = LearningRateScheduler(schedule=lr_schedule, verbose=1)

terminate_on_nan = TerminateOnNaN()

callbacks = [model_checkpoint, csv_logger, learning_rate_scheduler, terminate_on_nan]

initial_epoch = 0 final_epoch = 120 steps_per_epoch = 1000

model.summary()

history = model.fit_generator(generator=train_generator, steps_per_epoch=steps_per_epoch, epochs=final_epoch, callbacks=callbacks, validation_data=val_generator, validation_steps=ceil(val_dataset_size/batch_size), initial_epoch=initial_epoch)

` But i got error as follow:

` File "C:\Users\Giap Binh Duong\Desktop\SSD512\SSD512-re.py", line 265, in initial_epoch=initial_epoch)

File "C:\Anaconda3\envs\Tensorflow\lib\site-packages\keras\legacy\interfaces.py", line 91, in wrapper return func(*args, **kwargs)

File "C:\Anaconda3\envs\Tensorflow\lib\site-packages\keras\engine\training.py", line 1732, in fit_generator initial_epoch=initial_epoch)

File "C:\Anaconda3\envs\Tensorflow\lib\site-packages\keras\engine\training_generator.py", line 42, in fit_generator model._make_train_function()

File "C:\Anaconda3\envs\Tensorflow\lib\site-packages\keras\engine\training.py", line 316, in _make_train_function loss=self.total_loss)

File "C:\Anaconda3\envs\Tensorflow\lib\site-packages\keras\legacy\interfaces.py", line 91, in wrapper return func(*args, **kwargs)

File "C:\Anaconda3\envs\Tensorflow\lib\site-packages\keras\optimizers.py", line 504, in get_updates grads = self.get_gradients(loss, params)

File "C:\Anaconda3\envs\Tensorflow\lib\site-packages\keras\optimizers.py", line 93, in get_gradients raise ValueError('An operation has None for gradient. '

ValueError: An operation has None for gradient. Please make sure that all of your ops have a gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval.`

I have tried to debug this one but there is no solution now. The SSD300 that i used to modify was run ok. Can you help me solve this problem? Thank you in advance!!!!!!!!!!!!