如何匹配tensorflow(python)函数';s参数

如何匹配tensorflow(python)函数';s参数,python,tensorflow,convolutional-neural-network,function-parameter,Python,Tensorflow,Convolutional Neural Network,Function Parameter,请参考上面的python代码 我发现类网络函数conv的原型与它的调用部分不匹配 @layer def conv(self, inp, k_h, k_w, c_o, s_h, s_w, name, relu=True, padding='SAME', group=1, biased=True): &

请参考上面的python代码

我发现类网络函数conv的原型与它的调用部分不匹配

@layer
def conv(self,
         inp,
         k_h,
         k_w,
         c_o,
         s_h,
         s_w,
         name,
         relu=True,
         padding='SAME',
         group=1,
         biased=True):
&打电话给conv

class PNet(Network):
def setup(self):
    (self.feed('data') #pylint: disable=no-value-for-parameter, no-member
         .conv(3, 3, 10, 1, 1, padding='VALID', relu=False, name='conv1')
         .prelu(name='PReLU1')
         .max_pool(2, 2, 2, 2, name='pool1')
         .conv(3, 3, 16, 1, 1, padding='VALID', relu=False, name='conv2')
         .prelu(name='PReLU2')
         .conv(3, 3, 32, 1, 1, padding='VALID', relu=False, name='conv3')
         .prelu(name='PReLU3')
         .conv(1, 1, 2, 1, 1, relu=False, name='conv4-1')
         .softmax(3,name='prob1'))

    (self.feed('PReLU3') #pylint: disable=no-value-for-parameter
         .conv(1, 1, 4, 1, 1, relu=False, name='conv4-2'))
注意

  • 自我
  • inp-->它来自哪里?
  • 我知道自我是可以忽略的;inp, 库赫, 库威, 库奥, s_h, s_w, 可以通过匹配位置,例如:3,3,10,1,1 其他参数按名称指定

    然而,我无法理解inp的来源?

    <>与我熟悉的编程语言C+C++有很大的矛盾。

    有人能帮忙解释一下吗


    提前感谢。

    Pnet是一个执行许多卷积运算的网络。您可以将图像传递到输入层,它会对其执行许多卷积。 输入层的名称为“数据”。输入层是一个接受图像的张量

    data = tf.placeholder(tf.float32, (None,None,None,3), 'input')
    pnet = PNet({'data':data})
    
    考虑

    out = pnet(img_y)
    
    img_y位于Pnet的“数据”层上

    它被馈送到卷积层

    .conv(3, 3, 10, 1, 1, padding='VALID', relu=False, name='conv1')
    
    .conv(3, 3, 16, 1, 1, padding='VALID', relu=False, name='conv2')
    
    k_h
    (内核高度)=3

    k_w
    (内核宽度)=3

    c_o
    (过滤器数量)=10

    s_h
    (步幅高度)=1

    s_w
    (步幅)=1

    inp
    是前一层即数据层(即我们的图像)的输出

    应用prelu和max pool,然后将输出作为下一个卷积层的输入

    .conv(3, 3, 10, 1, 1, padding='VALID', relu=False, name='conv1')
    
    .conv(3, 3, 16, 1, 1, padding='VALID', relu=False, name='conv2')
    
    等等


    为了更好地理解卷积神经网络,请参考

    您确实正确地注意到,尽管函数签名将输入层
    inp
    作为其第一个参数,但在调用函数时它不会被传递

    这个技巧是通过将
    @层
    放置在函数定义的正前方来实现的。下面是
    装饰器的定义:

    def layer(op):
        """Decorator for composable network layers."""
    
        def layer_decorated(self, *args, **kwargs):
            # Automatically set a name if not provided.
            name = kwargs.setdefault('name', self.get_unique_name(op.__name__))
            # Figure out the layer inputs.
            if len(self.terminals) == 0:
                raise RuntimeError('No input variables found for layer %s.' % name)
            elif len(self.terminals) == 1:
                layer_input = self.terminals[0]
            else:
                layer_input = list(self.terminals)
            # Perform the operation and get the output.
            # [!] Here it passes the `inp` parameter, and all the other ones
            layer_output = op(self, layer_input, *args, **kwargs)
            # Add to layer LUT.
            self.layers[name] = layer_output
            # This output is now the input for the next layer.
            self.feed(layer_output)
            # Return self for chained calls.
            return self
    
    return layer_decorated
    
    它通过
    op
    参数接受一个函数/方法作为输入,并返回另一个函数/方法,
    layer\u
    ,它将替换
    op
    的原始定义。所以
    PNet.conv=layer(PNet.conv)
    。如果查看
    layer\u
    的定义,您会发现它基本上设置了
    op
    函数的第一个参数,即
    layer\u input
    (与
    [!]
    对齐)。它还进行了一些簿记,以根据其名称知道使用哪一层作为输入

    为了简化事情,这允许程序员使用链式方法调用,而无需重复它们自己。它改变了这一点:

     x = self.feed('data') #pylint: disable=no-value-for-parameter, no-member
     x = self.conv(x, 3, 3, 10, 1, 1, padding='VALID', relu=False, name='conv1')
     x = self.prelu(x, name='PReLU1')
     x = self.max_pool(x, 2, 2, 2, 2, name='pool1')
    
    为此:

    x = (self.feed('data') #pylint: disable=no-value-for-parameter, no-member
         .conv(3, 3, 10, 1, 1, padding='VALID', relu=False, name='conv1')
         .prelu(name='PReLU1')
         .max_pool(2, 2, 2, 2, name='pool1')
     )
    

    Inp是从上一层输入的。@changjc关于stackOverflow的问题如果有一个可接受的答案,则被视为已解决。这表明其他人对这个问题都很满意,并允许他们转向无动力的问题。因此,如果把它标记为一个可接受的答案,如果它解决了你的问题(勾选绿色标记)。也可以考虑你以前的问题