如果......不在'意思?

时间:2017-06-29 06:03:57

标签: python

这是我无法获得的功能:

def group_regularization(v):
    const_coeff = lambda W: tf.sqrt(tf.cast(W.get_shape().as_list()[1], tf.float32))
    return tf.reduce_sum([tf.multiply(const_coeff(W), l21_norm(W)) for W in v if 'bias' not in W.name])

最后一行是什么意思?

起初我认为它是"将功能应用于W,但名称为bias"的功能除外,但我不确定。

4 个答案:

答案 0 :(得分:3)

这是一个带有条件的list comprehension。它与Tensorflow无关,它只是基本的Python。

条件列表推导采用

形式
[<expression> for <name> in <list> if <condition>]

这会迭代<list><condition>为真的<name>中的所有元素,依次将每个元素分配给<expression>,评估new_list = [] for <name> in <list>: if <condition>: new_list.append(<expression>) ,并创建新的结果列表。它相当于

<Button x:Name="CreatNewCustomer"
                            HorizontalAlignment="Stretch"
                            Content="New Customer"
                            VerticalAlignment="Stretch"
                            Height="45"
                            Background="#FF007ACC"
                            Width="auto"
                            Foreground="#FFCDCDCD"
                            Margin="5">
                        <interactivity:Interaction.Behaviors>
                            <core:EventTriggerBehavior EventName="Click">
                                <core:ChangePropertyAction  TargetObject="NewCustomerBlade"
                                                            PropertyName="IsOpen"
                                                            Value="True" />
                            </core:EventTriggerBehavior>
                        </interactivity:Interaction.Behaviors>
                    </Button>

除了列表理解是更清晰的代码并且运行起来可能更快。

答案 1 :(得分:1)

它表示列表理解扩展如下:

out_list = []
def group_regularization(v):
    ...
    for W in v:
        if 'bias' not in W.name:
            out_list.append(tf.multiply(const_coeff(W), l21_norm(W)))
    tf.reduce_sum(out_list)

它正在遍历v

中作为列表传递的group_regularization中的每个项目

然后,检查字符串'bias'是否不在W.name

然后,为tensorflow做(无论如何)操作。

答案 2 :(得分:0)

让我们分解它,它在python中的约定:

#Step 1:
for W in v 
# Will foreach loop W for every item in v

#Step 2:
if 'bias' not in W.name #
# in loop, check if 'bias' was an element of list W.name, if yes, dont do anything with that, if not, do next

#Step 3:
const_coeff(W), l21_norm(W))
# calculate these 2

#Step 4:
tf.multiply(const_coeff(W), l21_norm(W)))
# put those calculated in step 3 into tf.multiply

#Step 5:
[tf.multiply(....)]
# put everything in a list (since you have a loop at step 1)

#Step 6:
tf.reduct_sum([...])
# calculate reduce_sum

#Step 7:
return ....
# pass that result out

答案 3 :(得分:0)

是的,列表理解带有条件。列表推导可以有多种条件。

具有if条件的列表推导的一般格式是这个,

[<expression> for <value> in <iterable> if <condition>]

你也可以在理解中拥有if..else

[<expression> if <condition> else <expression> for <value> in <iterable> ]

注意:您的iterable可以是list,tuple,set,string,...etc

为了清楚起见,请考虑这个简单的例子,

>>> v = [1,2,3,4]
>>> v
[1, 2, 3, 4]

假设这是您给定代码中的v,也是出于理解目的,我们说Wname类似于W.name

>>> Wname = [1,2]
>>> Wname
[1, 2]

现在突然你决定我想要一个列表x,其中包含来自v但不是Wname 的项目。嗯......怎么办?看看下面。

>>> x = [W for W in v if W not in Wname]
>>> x
[3, 4]

在上面提到的代码中,正是这些方面发生了什么。