使用keras / tf获取CNN中的梯度值

时间:2019-02-01 13:08:40

标签: python tensorflow keras neural-network backpropagation

我基本上有一个带有几层的keras CNN,我想评估一个输入,然后得到反向传播算法的梯度。模型已建立并编译。但是我只希望第一次在仅一个输入/输出集上进行反向传播,我不在乎其他任何事情。

这是我代码的相关部分:

# Build the model.
model = Sequential()
model.add(Conv2D(16, kernel_size=(3, 3), activation='relu', input_shape=input_shape))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(32, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(digits, activation='softmax'))

# Prepare the model for training.
model.compile(loss = keras.losses.categorical_crossentropy,
              optimizer = keras.optimizers.Adadelta(),
              metrics=['accuracy'])

我的一组数据输入和输出在x_train和y_train中。那么我该如何精确地运行一组数据并根据预期的输出进行反向传播,然后真正获得keras计算出的梯度呢?

编辑:本质上,这是一项学术上的努力,我要尝试的是自己计算渐变的值,然后将其与keras得到的值进行比较。那么我如何获得这些值?

1 个答案:

答案 0 :(得分:0)

您应该能够使用Keras backend中的gradients函数。

# Gradients of output wrt input
gradients = K.gradients(model.output, model.input)

# Wrap the input tensor and the gradient tensor in a callable function
f = K.function([model.input], gradients)

# Random input image
x = np.random.rand(1, 100,100,3)

f([x])
> gives an array of shape (1, 100, 100, 3)

编辑:要获取模型权重的输出梯度,可以使用以下代码:

# List all the weight tensors in the model
weights_list = model.trainable_weights

# Gradients of output wrt model weights
gradients = K.gradients(model.output, weights_list)

# Wrap the model input tensor and the gradient tensors in a callable function
f = K.function([model.input], gradients)

# Random input image
x = np.random.rand(1,100,100,3)

# Call the function to get the gradients of the model output produced by this image, wrt the model weights
f([x])

编辑:您的问题可能有答案here