Tensorflow 获取Keras ANN模型中输入的梯度 bce=tf.keras.loss.BinaryCrossentropy() ll=bce(y_检验[0],模型。预测(X_检验[0]。重塑(1,-1))) 打印(ll) 打印(模型输入) 模型输出 梯度=K.梯度(ll,模型输入)[0] 印刷(毕业生) 没有一个

Tensorflow 获取Keras ANN模型中输入的梯度 bce=tf.keras.loss.BinaryCrossentropy() ll=bce(y_检验[0],模型。预测(X_检验[0]。重塑(1,-1))) 打印(ll) 打印(模型输入) 模型输出 梯度=K.梯度(ll,模型输入)[0] 印刷(毕业生) 没有一个,tensorflow,keras,neural-network,gradient,Tensorflow,Keras,Neural Network,Gradient,所以在这里我训练了一个2层的神经网络,输入有195个特征,输出是1个大小。我想用名为X_test的验证实例一个接一个地为神经网络提供y_test中的正确标签,并为每个实例计算输出相对于输入的梯度,打印时的梯度给我一个无。非常感谢您的帮助。您可以使用。我写了下面的代码来学习一个正弦波,并得到它的导数。我认为,为了计算偏导数,应该可以扩展以下代码。 导入所需的库: bce = tf.keras.losses.BinaryCrossentropy() ll=bce(y_test[0], model.p

所以在这里我训练了一个2层的神经网络,输入有195个特征,输出是1个大小。我想用名为X_test的验证实例一个接一个地为神经网络提供y_test中的正确标签,并为每个实例计算输出相对于输入的梯度,打印时的梯度给我一个无。非常感谢您的帮助。

您可以使用。我写了下面的代码来学习一个正弦波,并得到它的导数。我认为,为了计算偏导数,应该可以扩展以下代码。
导入所需的库:

bce = tf.keras.losses.BinaryCrossentropy()
ll=bce(y_test[0], model.predict(X_test[0].reshape(1,-1)))
print(ll)
<tf.Tensor: shape=(), dtype=float32, numpy=0.04165391>
print(model.input)
<tf.Tensor 'dense_1_input:0' shape=(None, 195) dtype=float32>
model.output
<tf.Tensor 'dense_3/Sigmoid:0' shape=(None, 1) dtype=float32>
grads=K.gradients(ll, model.input)[0]
print(grads)
None
创建数据:

import numpy as np
from tensorflow.keras.layers import Dense, Input
from tensorflow.keras.models import Model, Sequential
from tensorflow.keras.optimizers import Adam
from tensorflow.keras import losses
import tensorflow as tf
定义Keras NN:

x = np.linspace(0, 6*np.pi, 2000)
y = np.sin(x)
培训模型:

def model_gen(Input_shape):
    X_input = Input(shape=Input_shape)
    X = Dense(units=64, activation='sigmoid')(X_input)
    X = Dense(units=64, activation='sigmoid')(X)
    X = Dense(units=1)(X)
    model = Model(inputs=X_input, outputs=X)
    return model
要获得网络的梯度w.r.t.输入:

model = model_gen(Input_shape=(1,))
opt = Adam(lr=0.01, beta_1=0.9, beta_2=0.999, decay=0.001)
model.compile(loss=losses.mean_squared_error, optimizer=opt)
model.fit(x,y, epochs=200)

我们可以进一步可视化dy_dx,以确保导数是多么平滑。最后,请注意,当使用平滑激活(例如,sigmoid)而不是如前所述的Relu时,可以获得更平滑的导数

这回答了你的问题吗?
x = list(x)
x = tf.constant(x)
with tf.GradientTape() as t:
  t.watch(x)
  y = model(x)

dy_dx = t.gradient(y, x)

dy_dx.numpy()