为什么在 Torch7 中需要实现 x=deepcopy(x)?

如果正在使用池化,则对于每个颜色代码进行以下操作:
    color_content_masks[k] = image.scale(color_content_masks[k], math.ceil(color_content_masks[k]:size(2)/2), math.ceil(color_content_masks[k]:size(1)/2))
    color_style_masks[k] = image.scale(color_style_masks[k], math.ceil(color_style_masks[k]:size(2)/2), math.ceil(color_style_masks[k]:size(1)/2))
否则如果正在使用卷积,则对于每个颜色代码进行以下操作:
    local sap = nn.SpatialAveragePooling(3,3,1,1,1,1):float()
    color_content_masks[k] = sap:forward(color_content_masks[k]:repeatTensor(1,1,1))[1]:clone()
    color_style_masks[k] = sap:forward(color_style_masks[k]:repeatTensor(1,1,1))[1]:clone()

color_content_masks = deepcopy(color_content_masks)
color_style_masks = deepcopy(color_style_masks)

上面的代码是一个 Torch7 项目,用于实现深度照片风格转移。你可以在 https://github.com/luanfujun/deep-photo-styletransfer 找到该代码。deepcopy() 函数如下所示,与 Lua 官方推荐的相同。

function deepcopy(orig)
    local orig_type = type(orig)
    local copy
    if orig_type == 'table' then
        copy = {}
        for orig_key, orig_value in next, orig, nil do
            copy[deepcopy(orig_key)] = deepcopy(orig_value)
        end
        setmetatable(copy, deepcopy(getmetatable(orig)))
    else -- number, string, boolean, etc
        copy = orig
    end
return copy
end

如你所见,在 If 语句中 color_content_masks 和 color_style_masks 直接改变,那么我们为什么需要实现一个 deepcopy?

点赞
用户4070330
用户4070330

看起来像下面这种情况:

a = createSomeTable()
...
b = a -- 现在b引用了和a相同的表,修改b也会修改a
...
b = deepcopy(b)
--[[
现在我们已经进行了深度拷贝 - b引用了表a的一个副本,
而修改b不会修改a
--]]
2018-03-28 13:24:47