Tensorflow Keras模型中的权重设置

Tensorflow Keras模型中的权重设置,tensorflow,keras,convolution,Tensorflow,Keras,Convolution,我需要帮助设置自定义权重到一个二维卷积的小型自定义Keras模型。我有一个如下所示的输入: X=[[3,2,-4], [0, 5, 4], [2, -1, -7], [-7, 0, 1]], [[-8, 9, 1], [-3, 6, 0], [0, -4, 2], [5, 1, 1]]] 因此,可以想象一个只有两个通道的4x3图像。我的内核如下所示: kernel=[[2,1], [0, -1], [0, -1]], [[1, 2], [2, -1], [2, -2]]] 所以,一个二维的3

我需要帮助设置自定义权重到一个二维卷积的小型自定义Keras模型。我有一个如下所示的输入:

X=[[3,2,-4],
[0, 5, 4],
[2, -1, -7],
[-7, 0, 1]],
[[-8, 9, 1],
[-3, 6, 0],
[0, -4, 2],
[5, 1, 1]]]
因此,可以想象一个只有两个通道的4x3图像。我的内核如下所示:

kernel=[[2,1],
[0, -1],
[0, -1]],
[[1, 2],
[2, -1],
[2, -2]]]
所以,一个二维的3x2内核。手动进行2D卷积,步幅为1且无填充,产生:

[[10,14],
[27, 16]]
不幸的是,以下Keras代码:

model=Sequential()
conv2d=conv2d(过滤器=1,内核大小=(3,2),步幅=1,输入形状=(2,4,3),使用偏差=False)
model.add(conv2d)
图层=模型。图层[0]
层。设置权重([np.数组(内核)。重塑(3,2,2,1)])
打印(model.predict(np.array(X).重塑((1,)+np.shape(X)))
产出:

[[19,-6],
[-39, 16]]
我不知道Keras是如何组织它的内核进行卷积的。到目前为止,看起来很违反直觉,但我可能遗漏了一些东西


我正在使用Keras 2.0.9和Tensorflow 1.4.0作为后端。

Keras中的内核遵循以下形状:
(高度、宽度、输入通道、输出通道)
——即使您先使用
通道

您认为它使用的形状是正确的
(3,2,2,1)

但您的手动计算考虑的是一个倒置的形状。在手动计算中,您使用的是
(输入通道、高度、宽度)

当您重塑内核时,您没有正确地重新排列这些维度。仅仅重塑并不等同于“转置”阵列。重塑只需重新组合数据,无需任何重新排序

要在keras中获得正确的结果,需要正确交换轴:

#start as (input_channels, height, width) = (2,3,2)    
kernel = np.array([[[2, 1],
       [0, -1],
       [0, -1]],
      [[1, 2],
       [2, -1],
       [2, -2]]])

#change to (height, input_channels, width) = (3,2,2)   
kernel = kernel.swapaxes(0,1)

#change to (height, width, input_channels) = (3,2,2)
kernel = kernel.swapaxes(1,2)

#add output_channels
kernel = kernel.reshape((3,2,2,1))

keras中的内核遵循以下形状:
(高度、宽度、输入通道、输出通道)
——即使您首先使用
通道

您认为它使用的形状是正确的
(3,2,2,1)

但您的手动计算考虑的是一个倒置的形状。在手动计算中,您使用的是
(输入通道、高度、宽度)

当您重塑内核时,您没有正确地重新排列这些维度。仅仅重塑并不等同于“转置”阵列。重塑只需重新组合数据,无需任何重新排序

要在keras中获得正确的结果,需要正确交换轴:

#start as (input_channels, height, width) = (2,3,2)    
kernel = np.array([[[2, 1],
       [0, -1],
       [0, -1]],
      [[1, 2],
       [2, -1],
       [2, -2]]])

#change to (height, input_channels, width) = (3,2,2)   
kernel = kernel.swapaxes(0,1)

#change to (height, width, input_channels) = (3,2,2)
kernel = kernel.swapaxes(1,2)

#add output_channels
kernel = kernel.reshape((3,2,2,1))

谢谢,我正在考虑如何在TensorFlow(使用相同的约定)中实现这一点。你怎么能想象这个?我的意思是,我看不出一个简单的轴交换如何达到预期的结果。假设你有矩阵
[[1,2,3],[4,5,6]
。它具有形状
(2,3)
。现在,这是对(3,2)的重塑:
[[1,2],[3,4],[5,6]]
。这是一个轴交换:
[[1,4],[2,5],[3,6]]
。谢谢,我在考虑如何在TensorFlow中实现这一点(使用相同的约定)。你怎么能想象这个?我的意思是,我看不出一个简单的轴交换如何达到预期的结果。假设你有矩阵
[[1,2,3],[4,5,6]
。它具有形状
(2,3)
。现在,这是对(3,2)的重塑:
[[1,2],[3,4],[5,6]]
。这是一个轴交换:
[[1,4],[2,5],[3,6]