有人可以阐明为什么示例2与示例1的结果不同吗?我认为$ a和$ b2应该相同。 $ b2为空!我正在编写一个脚本,其中最好使用示例2中的方法。
示例1:
-------------------------------------------------------------------------
ValueError Traceback (most recent call
last)
<ipython-input-125-c6a3c418689c> in <module>()
1 nb_epoch = 100
----> 2 model.fit(X2,L2, epochs=100)
10 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/nn_ops.py
in _get_sequence(value, n, channel_index, name)
71 else:
72 raise ValueError("{} should be of length 1, {} or {} but was
{}".format(
---> 73 name, n, n + 2, current_n))
74
75 if channel_index == 1:
ValueError: strides should be of length 1, 1 or 3 but was 2
示例2:
$a = Get-Content $some_text_file | Select-Object -Skip 1
编辑:使用此语法可使我到达需要的位置。
$b1 = Get-Content $some_text_file
$b2 = Select-Object -InputObject $b1 -Skip 1
答案 0 :(得分:3)
作为Lee_Dailey notes,这是预期的行为
有人可以阐明原因
这与cmdlet在管道中的执行方式有关。
您可能知道,cmdlet的核心功能由三种方法组成:
*(高级功能中的begin
/ process
/ end
块与此相对应。
BeginProcessing()
和EndProcessing()
总是精确地执行一次。 ProcessRecord()
执行多少次取决于它是否是管道中的第一个命令。
当cmdlet作为管道中的第一个元素出现时(即,它的左侧没有|
符号),ProcessRecord()
将执行一次。 >
但是,当cmdlet从其管道中的上游命令接收输入时,对于通过管道进入的每个输入项,ProcessRecord()
就会运行一次。
考虑到这一点,请考虑简化的Select-Object
版本:
function Select-FakeObject {
param(
[Parameter(Mandatory, ValueFromPipeline)]
[object[]]$InputObject,
[Parameter()]
[int]$Skip = 0
)
begin {
$skipped = 0
}
process {
if($skipped -lt $Skip){
$skipped++
Write-Host "Skipping $InputObject"
}
else{
Write-Host "Selecting $InputObject"
Write-Output $InputObject
}
}
}
现在,让我们使用此虚拟函数尝试两种情况:
PS C:\> $a = 1,2,3
PS C:\> $b1 = $a |Select-FakeObject -Skip 1
我们将看到PowerShell实际上确实对每个输入项调用process
块 :
Skipping 1
Selecting 2
Selecting 3
如果我们像您的第二个示例一样传递对象:
PS C:\> $a = 1,2,3
PS C:\> $b2 = Select-FakeObject -Skip 1
Skipping 1 2 3
我们现在看到process
块仅在整个$a
上执行一次,而不是在单个项目上执行。