我基本上有一个带有几层的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得到的值进行比较。那么我如何获得这些值?
答案 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。