有可能获得中间梯度吗?(张量流)

2024-04-29 00:37:07 发布

您现在位置:Python中文网/ 问答频道 /正文

使用渐变带时,您可以在使用以下各项后计算渐变:

with tf.GradientTape() as tape:
        out = model(x, training=True)
        out = tf.reshape(out, (num_img, 1, 10)) # Resizing 
        loss = tf.keras.losses.categorical_crossentropy(y, out) 
        gradient = tape.gradient(loss, model.trainable_variables)

但是,对于cifar10输入,这将返回输入图像的梯度。 是否有一种方法可以进入中间步骤的梯度,使他们通过“一些”训练


Tags: trueimgmodeltfaswithtrainingout
1条回答
网友
1楼 · 发布于 2024-04-29 00:37:07

编辑:多亏了你的评论,我对你的问题有了更好的理解。 下面的代码远远不够理想,没有考虑批处理培训等,但它可能会为您提供一个良好的起点。 我编写了一个定制的培训步骤,它基本上替代了model.fit方法。也许有更好的方法可以做到这一点,但它应该可以让您快速比较渐变

def custom_training(model, data):
    x, y = data
    # Training 
    with tf.GradientTape() as tape:
        y_pred = model(x, training=True)  # Forward pass
        # Compute the loss value
        # (the loss function is configured in `compile()`)
        loss = tf.keras.losses.mse(y, y_pred)
        
    trainable_vars = model.trainable_variables
    gradients = tape.gradient(loss, trainable_vars)
    tf.keras.optimizers.Adam().apply_gradients(zip(gradients, trainable_vars))
    # computing the gradient without optimizing it!
    with tf.GradientTape() as tape:
        y_pred = model(x, training=False)  # Forward pass
        # Compute the loss value
        # (the loss function is configured in `compile()`)
        loss = tf.keras.losses.mse(y, y_pred)
    trainable_vars = model.trainable_variables
    gradients_plus = tape.gradient(loss, trainable_vars)
    
    return gradients, gradients_plus

让我们假设一个非常简单的模型:

import tensorflow as tf

train_data = tf.random.normal((1000, 32))
train_features = tf.random.normal((1000,))

inputs = tf.keras.layers.Input(shape=(32))
hidden_1 = tf.keras.layers.Dense(32)(inputs)
hidden_2 = tf.keras.layers.Dense(32)(hidden_1)
outputs = tf.keras.layers.Dense(1)(hidden_2)

model = tf.keras.Model(inputs, outputs)

你需要计算所有层相对于输入的梯度。 您可以使用以下选项:

with tf.GradientTape(persistent=True) as tape:
    tape.watch(inputs)
    out_intermediate = []
    inputs = train_data
    cargo = model.layers[0](inputs)
    for layer in model.layers[1:]:
        cargo = layer(cargo)
        out_intermediate.append(cargo)
        
for x in out_intermediate:
    print(tape.gradient(x, inputs))

如果要计算自定义损失,我建议Customize what happens in Model.fit

相关问题 更多 >