2015-06-22 20 views
13

Tôi thấy loại cú pháp này rất nhiều trong một số tệp nguồn Lua tôi đã đọc gần đây, có nghĩa là gì, đặc biệt là cặp ngoặc đơn thứ nhất Ví dụ, dòng 8 trong https://github.com/karpathy/char-rnn/blob/master/model/LSTM.luaCó ý nghĩa đặc biệt cho cú pháp()() trong Lua

local LSTM = {} 
function LSTM.lstm(input_size, rnn_size, n, dropout) 
    dropout = dropout or 0 

    -- there will be 2*n+1 inputs 
    local inputs = {} 
    table.insert(inputs, nn.Identity()()) -- line 8 
    -- ... 

mã nguồn của nn.Identity https://github.com/torch/nn/blob/master/Identity.lua

********** CẬP NHẬT **************

Mẫu()() được sử dụng trong ngọn đuốc thư viện 'nn' rất nhiều. Cặp khung đầu tiên tạo đối tượng của vùng chứa/nút và cặp khung thứ hai tham chiếu đến nút phụ thuộc.

Ví dụ: y = nn.Linear (2,4) (x) có nghĩa là x kết nối với y và phép chuyển đổi tuyến tính từ 1 * 2 đến 1 * 4. Tôi chỉ hiểu cách sử dụng, cách nó được kết nối có vẻ như được trả lời bằng một trong những câu trả lời dưới đây.

Dù sao, việc sử dụng giao diện cũng được ghi lại dưới đây. https://github.com/torch/nngraph/blob/master/README.md

+0

Nếu có một câu hỏi đó một cách tốt để giải quyết vấn đề đó là phải rút ra khỏi khái niệm 'nn.Identity() 'và cung cấp cho nó một cái tên có ý nghĩa. Ví dụ (nhưng với một tên gần như vô nghĩa vì tôi không biết phải gọi nó là gì): 'local identityProvider = nn.Identity()' –

Trả lời

10

Trong bổ sung cho câu trả lời Yu Hao hãy để tôi đưa ra một số độ chính xác liên quan Torch:

  • nn.Identity() tạo ra một mô-đun sắc,
  • () kêu gọi các module này gây nên nn.Module__call__ (nhờ Hệ thống lớp ngọn đuốc nối chính xác điều này vào metatable),
  • theo mặc định phương thức __call__ này thực hiện tiến/lùi,
  • nhưng ở đây torch/nngraph được sử dụng và ghi đè nngraph phương pháp này như bạn có thể thấy here.

Hậu quả là mỗi nn.Identity()() cuộc gọi có hiệu lực thi hành vào đây để trở về một nút nngraph.Node({module=self}) nơi tự đề cập đến nn.Identity() dụ hiện hành.

-

Cập nhật: một minh họa về cú pháp này trong bối cảnh LSTM-s thể được tìm thấy here:

local i2h = nn.Linear(input_size, 4 * rnn_size)(input) -- input to hidden 

Nếu bạn không quen với nngraph nó có thể có vẻ lạ mà chúng tôi đang xây dựng một mô-đun và đã gọi nó một lần nữa bằng nút đồ thị.Điều thực sự xảy ra là lệnh gọi thứ hai chuyển đổi nn.Module thành nngraph.gModule và đối số chỉ định đó là phụ huynh trong biểu đồ.

12

Không, ()() không có ý nghĩa đặc biệt trong Lua, chỉ hai nhà cung cấp cuộc gọi () cùng nhau.

Toán hạng có thể là hàm trả về hàm (hoặc bảng thực hiện call metamethod). Ví dụ:

function foo() 
    return function() print(42) end 
end 

foo()() -- 42 
2
  • đầu tiên() gọi hàm init và lần thứ hai() gọi hàm gọi
  • Nếu lớp không sở hữu một trong những chức năng thì các hàm cha mẹ được mời gọi.
  • Trong trường hợp của nn.Identity()() các nn.Identity có không hàm init cũng không phải là chức năng cuộc gọi do đó nn.Module của init và gọi chức năng nhận dạng mẹ gọi .Attaching một minh hoạ

    require 'torch' 
    
    -- define some dummy A class 
    local A = torch.class('A') 
    function A:__init(stuff) 
        self.stuff = stuff 
        print('inside __init of A') 
    end 
    
    function A:__call__(arg1) 
    print('inside __call__ of A') 
    end 
    
    -- define some dummy B class, inheriting from A 
    local B,parent = torch.class('B', 'A') 
    
    function B:__init(stuff) 
        self.stuff = stuff 
        print('inside __init of B') 
    end 
    
    function B:__call__(arg1) 
    print('inside __call__ of B') 
    end 
    a=A()() 
    b=B()() 
    

    Output

    inside __init of A 
    inside __call__ of A 
    inside __init of B 
    inside __call__ of B 
    

Một mẫu mã

require 'torch' 

    -- define some dummy A class 
    local A = torch.class('A') 
    function A:__init(stuff) 
     self.stuff = stuff 
     print('inside __init of A') 
    end 

    function A:__call__(arg1) 
    print('inside __call__ of A') 
    end 

    -- define some dummy B class, inheriting from A 
    local B,parent = torch.class('B', 'A') 

    b=B()() 

Output

inside __init of A 
    inside __call__ of A 
Các vấn đề liên quan