在Tensorflow(一般深度学习)中,我可以将“本地FC层”应用于“CONV层”吗?

时间:2017-03-11 02:16:50

标签: tensorflow deep-learning

有人能确定我的推理吗?

假设我有一个(预训练的)完全连接的图层fc,它将bx20x20x10作为输入,bx64作为输出图层,其中b是批量大小。

现在,我输入了cx100x60x10。身高和体重100x60可以细分为5x3 20x20。我希望5x3层有fc本地响应(输出),即`cx5x3x64'。

现在我在想:这样做与使用fc weights的卷积层并且使用宽度20和高度20的步幅相同。这是正确的吗?可能有区别吗?

1 个答案:

答案 0 :(得分:1)

是的,如果进行了密集层权重矩阵的适当重塑,它将是相同的。

让我们先来看看密集层。您向密集层输入20 x 20 x 10矩阵。它将首先被展平以产生4000 x 1向量。您希望输出的大小为64 x 1向量。因此,所需的权重矩阵是4000 x 6464偏差参数。然后y = w^T * x + b = [4000 x 64]^T * [4000 x 1] + [64 x 1]将生成[64 x 1]向量。因此,y[i] = w[i][0]*x[0] + ... + w[i][3999]*x[3999] + b[i]i = [0, 63]。请注意,b表示偏差参数。

让我们转向卷积。要从大小为5 x 3 x 64的输入生成100 x 60 x 10输出,您需要64个过滤器,每个过滤器的大小为(20,20),并且跨步(20,20)没有零填充。然而,每个20 x 20滤波器具有沿整个深度延伸的局部连通性,即神经元沿着输入深度连接到所有10个维度。有关卷积层本地连接的更多信息,请阅读this

卷积层的感知字段为20 x 20。卷积层中的每个神经元将连接到20 x 20 x 10。因此总共4000个权重(和一个偏差参数)。你有64个这样的过滤器。因此,此图层的总可学习权重= 4000 x 64 + 64。一个20 x 20 x 10 xw64 x 20 x 20 x 10(尺寸= convResult = np.sum(np.sum(np.sum(x*w[:,:,::-1,::-1], axis=-1), axis=-1),axis=-1) )之间的卷积可以执行为:

w[:,:,::-1,::-1]

这里有一些细节。我做了64 x 1,因为theano卷积翻转了卷积内核(好吧,不是那么简单!)。如果您对谁翻转以及谁不翻页感兴趣,请阅读this

最后,密集层和卷积层(在此上下文中)基本上执行相同的操作。它们首先以元素方式相乘,然后将两组4000个元素的向量/矩阵相加。该过程重复64次以产生import theano from theano import tensor as T import numpy as np X = T.ftensor4('X') W = T.ftensor4('W') out = T.nnet.conv2d(X,W) f = theano.function([X, W], out, allow_input_downcast=True) x = np.random.random((1,10,20,20)) w = np.random.random((64,10,20,20)) # convolution using Theano c1 = np.squeeze(f(x,w)[0]) # convolution using Numpy c2 = np.sum(np.sum(np.sum(x*w[:,:,::-1,::-1],axis=-1),axis=-1),axis=-1) # check that both are almost identical print np.amax(c2 - c1) 向量。因此,通过适当地重塑密集层权重矩阵,可以通过密集和卷积层获得完全相同的结果。但是,您需要注意内核翻转以匹配结果。

下面我给出一个代码片段来手动计算卷积(使用numpy)并使用Theano。

function doGet() {
  return HtmlService.createTemplateFromFile('clock').evaluate()
  .setSandboxMode(HtmlService.SandboxMode.IFRAME);
 }