是否可以設置火炬類的__index方法?我試圖實現一個簡單的dataset
類作爲tutoral深學習與火炬概述:(ipynb here)設置火炬類的__index
trainset = {
inputs = {0, 1, 1, 0},
targets = {1, 1, 1, 0}
}
index = function(t, i)
return {t.inputs[i], t.targets[i]}
end
setmetatable(trainset, {
__index = index
)
,它允許你做trainset[1]]
返回{0, 1}
。
但是,實現這個作爲火炬類不起作用。
local torch = require("torch")
do
Dataset = torch.class("Dataset")
function Dataset:__init(i, t)
self.inputs = i
self.targets = t
end
function Dataset.__index(t, v)
print("inside index")
return {
rawget(t, inputs)[v],
rawget(t, targets)[v]
}
end
end
Dataset({0, 1, 1, 0}, {1, 1, 1, 0}) -- fails
看來,在對象創建時,__index()
被稱爲和失敗,因爲index
和targets
尚未創建。如果不使用rawget
,則會導致堆棧溢出。
我對Lua的理解是有限的,但我很驚訝地看到__index()
在對象創建過程中被調用:我認爲有些事情在後臺我不完全理解。
使用'__index' metamethod只模擬數字鍵是有意義的。我想這將解決這個問題:'如果鍵入(v)=='數字'然後返回{t.inputs [v],t.targets [v]}結束' –
謝謝,這很有用。儘管這不是全部,但還是有一些特定於火炬的問題(請參閱我的回答)。 – mgperry