Градиенты равны нулю, кроме первой итерации в тензорном потоке

Когда я инициализирую модель и вычисляю градиент на первой итерации (я выполняю индивидуальное обучение), эти матрицы заполняются ненулевыми числами, после того, как градиенты первой итерации равны нулю, я не понимаю этого, потому что я сделал это, как предлагает официальный учебник Tensorflow. вот код:

вот как я инициализирую модель:

inp = keras.layers.Input(shape=(224, 224, 3))

vgg = tf.keras.applications.VGG16(include_top=False, weights='imagenet',
                                                     input_tensor=inp, input_shape=(224, 224, 3))
vgg.trainable = False

x1 = vgg.get_layer('block5_pool').output
x2 = tf.keras.layers.GlobalAveragePooling2D()(x1)
x3 = keras.layers.Dense(64, activation='relu')(x2)
output = keras.layers.Dense(2, activation='softmax')(x3)

model = tf.keras.models.Model(inputs=inp, outputs=output)

вот две функции для вычисления градиента:

def calculate_total_loss(model, original_img, preprocessed_image, target, alpha):
    predictions=model(preprocessed_image, training=True)
    L_cl = loss_object(y_true=target, y_pred=predictions)

    return loss_object(y_true=target, y_pred=predictions)

def calculate_gradient(model, original_img, preprocessed_image, target):

    with tf.GradientTape() as tape:
      loss_value = calculate_total_loss(model, original_img, preprocessed_image, target, alpha=1)

      
    return loss_value,tape.gradient(loss_value, model.trainable_variables)

вот цикл обучения:

optimizer = tf.keras.optimizers.Adam(learning_rate=0.01)
train_loss_results = []
train_accuracy_results = []
num_epochs = 4

for epoch in range(num_epochs):

    loss=[]
    for i in tq.tqdm(range(50)):
 
        x=train_x[i]
        y=train_y[i][0:2]
        index_of_path_of_image=train_y[i][2].astype('int32') 

        original_image=cv2.imread("/content/files/train/"+os.listdir("/content/files/train")[index_of_path_of_image])
        
        original_image=cv2.resize(original_image,(224,224))
        x=np.expand_dims(x,0)
        y=np.expand_dims(y,0)

        loss_value, grads = calculate_gradient(model, original_image, x, y)
        loss.append(loss_value)

    print(np.mean(loss))

0 ответов

Другие вопросы по тегам