qqwweee / keras-yolo3

A Keras implementation of YOLOv3 (Tensorflow backend)
MIT License
7.14k stars 3.45k forks source link

"Gradients do not exist" Warning #770

Open RadFam opened 2 years ago

RadFam commented 2 years ago

I had tried to repeat the train code, just for the network with one class object detection. So I saved the structure of train.py and model.py, except the creation of Yolo network - I built it layer by layer. But, when I've tried to start yolo training, I got the warning: "WARNING:tensorflow:Gradients do not exist for variables ['Layer_Conv_81/kernel:0', 'Layer_Conv_91/kernel:0', 'Layer_Batch_81/gamma:0', 'Layer_Batch_81/beta:0', 'Layer_Batch_91/gamma:0', 'Layer_Batch_91/beta:0', 'Output_1/kernel:0', 'Output_2/kernel:0'] when minimizing the loss. If you're using model.compile(), did you forget to provide a lossargument?". I suppose, that this must be caused in definition of loss argument i.e trainModel.compile(optimizer=Adam(lr=1e-3), loss={'GetLoss': lambda y_train, y_pred: y_pred}, run_eagerly=True)

def MakeYoloMainStructure():

 

    inputImage = Input(shape=(IMAGE_SIDES[0], IMAGE_SIDES[1], 3), name='Main_Input')

 

    # Start placing layers

    layer1_1 = Conv2D(32, (3,3), strides=(1,1), use_bias=False, padding='same', name='Layer_Conv_1')(inputImage) ... layer80_3 = LeakyReLU(alpha=alp, name='Layer_Leaky_80')(layer80_2)

    layer81_1 = Conv2D(1024, (3,3), strides=(1,1), use_bias=False, padding='same', name='Layer_Conv_81')(layer80_3) # From this layer we make fork for first output (!)

    layer81_2 = BatchNormalization(epsilon=eps, name='Layer_Batch_81')(layer81_1)

    layer81_3 = LeakyReLU(alpha=alp, name='Layer_Leaky_81')(layer81_2)

    layer82_1 = Conv2D(3*6, (1,1), strides=(1,1), use_bias=False, padding='same', name='Output_1')(layer81_3) # FIRST output layer (!)

    layer84_1 = layer80_3

    layer85_1 = Conv2D(256, (1,1), strides=(1,1), use_bias=False, padding='same', name='Layer_Conv_83')(layer84_1) ... layer106_1 = Conv2D(3*6, (1,1), strides=(1,1), use_bias=False, padding='same', name='Output_3')(layer105_3)  # THIRD output layer (!)

 

    # Net structure is completed

    yoloBoneModel = Model(inputImage, [layer82_1, layer94_1, layer106_1])

 

    return yoloBoneModel

def MakeYoloTrainStructure(yoloBoneMode): gridInput_all = [Input(shape=(GRID_SIDES[1], GRID_SIDES[1], 3, 6), name='Grid_Input_1'), Input(shape=(GRID_SIDES[2], GRID_SIDES[2], 3, 6), name='Grid_Input_2'), Input(shape=(GRID_SIDES[3], GRID_SIDES[3], 3, 6), name='Grid_Input_3')]

    layer_loss = Lambda(GetLoss, output_shape=(1,), name='GetLoss', arguments={'threshold': thresh})([yoloBoneModel.output, gridInput_all])

yoloTrainModel = Model([yoloBoneModel.input, *gridInput_all], layer_loss) return yoloTrainModel

def GetLoss(args, threshold=0.5):

    modelOutputs = args[:3]

    checkInputs = args[3:]

    # ......

    # Numerous manipulations to get loss of objects detection

    # ......

    return loss

def main():

    boneModel = MakeYoloMainStructure()

    trainModel = MakeYoloTrainStructure(boneModel)

 

    trainModel.compile(optimizer=Adam(lr=1e-3), loss={'GetLoss': lambda gridInput_all, y_pred: y_pred}, run_eagerly=True)

    batchSize = 32

    trainModel.fit(GetDataGenerator(batchSize), steps_per_epoch=2000//batchSize, epochs=50, initial_epoch=0)