Math Keras中Conv2D函数背后的数学

Math Keras中Conv2D函数背后的数学,math,deep-learning,keras,conv-neural-network,convolution,Math,Deep Learning,Keras,Conv Neural Network,Convolution,我正在使用Conv2D模型的keras2.0。但是,我不能完全理解函数在数学上的作用。我尝试使用随机生成的数据和一个非常简单的网络来理解数学: import numpy as np import keras from keras.layers import Input, Conv2D from keras.models import Model from keras import backend as K # create the model inputs = Input(shape=(10,

我正在使用
Conv2D
模型的
keras2.0
。但是,我不能完全理解函数在数学上的作用。我尝试使用随机生成的数据和一个非常简单的网络来理解数学:

import numpy as np
import keras
from keras.layers import Input, Conv2D
from keras.models import Model
from keras import backend as K

# create the model
inputs = Input(shape=(10,10,1)) # 1 channel, 10x10 image
outputs = Conv2D(32, (3, 3), activation='relu', name='block1_conv1')(inputs)
model = Model(outputs=outputs, inputs=inputs)

# input
x = np.random.random(100).reshape((10,10))

# predicted output for x
y_pred = model.predict(x.reshape((1,10,10,1))) # y_pred.shape = (1,8,8,32)
例如,在中的演示之后,我尝试计算第一个要素图中第一行、第一列的值

但是
relu(y_pred_000)
不等于
y_pred[0][0][0]


有人能指出我的理解有什么问题吗?谢谢。

这很简单,它来自于
Theano
dim订购。应用过滤器的结果存储在所谓的
通道
维度中。对于
TensorFlow
而言,这是最后一个维度,这就是结果良好的原因。如果是
Theano
它是第二维度(卷积结果具有形状
(案例、通道、宽度、高度)
,因此为了解决您的问题,您需要将预测行更改为:

y_pred = model.predict(x.reshape((1,1,10,10))) 
此外,您还需要更改在
中获取权重作为权重的方式。No
具有形状
(输出通道、输入通道、宽度、高度)
您需要将权重获取器更改为:

w = model.layers[1].get_weights()[0] # w.shape = (32,1,3,3)
w0 = w[0,0,:,:]

你得到了什么结果?当我运行你的代码时,我得到了
y_pred_000=0.14973172296210166
y_pred[0][0][0]=0.14973173
这似乎足够接近了。谢谢你的评论。我得到的结果(在Windows 10上,python 2.7,K.backend()=theano)是
y_pred_000=0.09696168095799
y_pred[0][0][0][0]=0.033766586
。但是在将后端更改为tensorflow(python 3.5,K.backend()==tensorflow)之后,两个结果是相同的!(
y_pred_000=0.025001197995700348
y_pred[0][0][0]=0.02500198
)我想这是一个theano或python2特定的问题。谢谢你的评论。我按照你说的修改了代码,但是我得到了错误:
ValueError:check时出错:预期输入_8有形状(None,10,10,1),但有形状(1L,1L,10L,10L)的数组
我猜
输入的
形状
与重塑输入的形状不匹配。我应该如何修改代码?(在my.keras.keras.json中,
“image\u data\u format”:“channels\u last”
)好的-所以保持预测行不变,只尝试第二次更改。它是如何工作的?我再次得到错误:
ValueError:操作数不能与形状(3,3)(1,32)
一起广播。
w[0,0,:,:,:]
的形状是
(1,32)
,所以它不是内核。什么是
y\u pred
y\u pred0000
形状?
y\u pred
(1,8,8,32)
y\u pred\u 000
:标量
w = model.layers[1].get_weights()[0] # w.shape = (32,1,3,3)
w0 = w[0,0,:,:]