gpt4 book ai didi

python - 如何匹配tensorflow(python)函数的参数

转载 作者:行者123 更新时间:2023-12-01 01:47:54 25 4
gpt4 key购买 nike

https://github.com/davidsandberg/facenet/blob/master/src/align/detect_face.py

请引用上面的Python代码。

我发现类 Network 函数 conv 的原型(prototype)与其调用部分不匹配

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

&调用转化

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'))

请注意

  1. 自己
  2. inp --> 它从哪里来?
  3. ...

我知道 self 可以被忽略;输入, k_h, 千瓦, c_o, s_h, s_w,可以与位置匹配,例如:3, 3, 10, 1, 1其他参数按名称分配。

但是我不知道inp是怎么来的?

它与我熟悉的编程语言 C 和 C++ 很矛盾..

谁能帮忙解释一下吗?

提前致谢。

最佳答案

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

这个技巧是通过 function decorator 实现的@layer 位于函数定义之前。这是layer装饰器的定义:

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_decorated ,它将替换 op 的原始定义>。所以PNet.conv = 层(Pnet.conv)。如果您查看layer_decorated的定义,您会发现它本质上设置了op函数的第一个参数,即layer_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')
)

关于python - 如何匹配tensorflow(python)函数的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51061685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com