Градиенты равны нулю, кроме первой итерации в тензорном потоке
Когда я инициализирую модель и вычисляю градиент на первой итерации (я выполняю индивидуальное обучение), эти матрицы заполняются ненулевыми числами, после того, как градиенты первой итерации равны нулю, я не понимаю этого, потому что я сделал это, как предлагает официальный учебник 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))