2

我有一个训练有素的神经网络,可以预测给定图像的噪声。现在我想用它来计算我的 NN wrt 输出范数的次梯度。

我想在更大的算法中使用它,但由于我无法让它按预期工作,我创建了这个最小的例子。

model = load_model(os.path.join(nn_path, 'NN' + name +'.h5')) #trained NN
y0_tensor = np.load(os.path.join(data_path, 'fbp_val' + name +'.npy'))[0] #typical input of the NN

max_iter = 15
alpha = 0.45
s = 0.2

for iters in range(max_iter):
    with tf.GradientTape() as tape:
        tape.watch(y0_tensor)
        prediction = model(y0_tensor)
        norm = tf.norm(prediction)

    grad = tape.gradient(norm, y0_tensor)   #d norm / d y0_tensor

    y0_tensor = y0_tensor - s * alpha * grad

我预计随着迭代次数的增加,它会变得越来越类似于 NN 的输出。但它似乎只是增加了噪音。

请注意,我并不固定使用 GardientType。我也尝试使用keras.backend.gradients但没有成功。

有关更多背景信息,这是我正在尝试做的事情:

请注意,正则化项的次梯度可以通过使用反向传播算法进行网络训练的标准软件进行评估。(来源:https ://iopscience.iop.org/article/10.1088/1361-6420/ab6d57 ,第 4.2 章)

4

0 回答 0