torch7中的意外行为

我正在使用torch7生成一个XOR门数据集。但是当我打印数据集时,我发现数据有误,但我找不到错误。代码似乎没有问题。但我是torch的新手,所以可能会犯错误。

所以,这是我的代码

input = torch.Tensor (4,2)
input:random(0,1)

output = torch.Tensor(1)
dataset={};
function dataset:size() return 4 end
for i=1,dataset:size() do
  if input[i][1]==input[i][2] then
    output[1] = 0
  else
    output[1] = 1
  end
  print("original")
  print(input[i][1].." "..input[i][2].." "..output[1]) --正在插入到数据集的值
  dataset[i] = {input[i], output}
  print("dataset")
  print(dataset[i][1][1].." "..dataset[i][1][2].." "..dataset[i][2][1])  --再次从数据集读取以进行双重检查
end

print("为什么数据集现在不同?")
for i=1,4 do
    print(dataset[i][1][1].." "..dataset[i][1][2].." "..dataset[i][2][1]) --所以,为什么不同呢?
    end

正如您所看到的,我打印了被插入到dataset列表中的值,并为了进行双重检查再次从dataset中读取。

最后我检查了完全插入后的dataset。数据集以某种方式不同。我多次运行。每次都不一样。就像它被卡在1或0上一样。

所以这是我的输出

original
1 0 1
dataset
1 0 1
original
0 0 0
dataset
0 0 0
original
1 1 0
dataset
1 1 0
original
0 0 0
dataset
0 0 0
为什么数据集现在不同?
1 0 0
0 0 0
1 1 0
0 0 0

正如您所看到的那样,格式如下

input input output

当我从input[i]和输出中读取时,我打印了原始数据。

当我从数据集中读取时,我打印了数据集。

您还可以看到,当我打印第一组值时,它们和应该是的值不同。但它是1 0 0,而不是1 0 1。

我无法找到错误。有谁能帮忙吗?如果问题不清楚,请告诉我。

点赞
用户5675002
用户5675002

问题出在这里:dataset[i] = {input[i], output}

你没有保存计算出的结果,而是保存了一个引用,这个引用是随着“异或”函数的后续计算而改变的。

当你读取结果时,你总是得到相同的数字——最后一个写入output[1]的结果。

为了修复它,要么改变output变量来存储实际的临时值(而不是表格),要么在保存到dataset [i]时读取实际的值,不要只是保存表格的链接,这样你不会得到深度复制。

2016-02-01 17:53:23