如何匹配tensorflow(python)函数';s参数
请参考上面的python代码 我发现类网络函数conv的原型与它的调用部分不匹配如何匹配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): &
@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'))
注意
提前感谢。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的问题如果有一个可接受的答案,则被视为已解决。这表明其他人对这个问题都很满意,并允许他们转向无动力的问题。因此,如果把它标记为一个可接受的答案,如果它解决了你的问题(勾选绿色标记)。也可以考虑你以前的问题