def __init__(self, func): self.func = func src = clip_head(inspect.getsource(func)) dprint(src) self.ast = gast.ast_to_gast(ast.parse(src)).body[0] assert (isinstance(self.ast, gast.gast.FunctionDef))
def __init__(self, num_hidden): super(LinkInFor, self).__init__() with self.init_scope(): self.l = L.Linear(num_hidden, num_hidden) def forward(self, x, h, indices): for i in indices: h = h + self.l(x[:, i]) return h import ch2o if __name__ == '__main__': import numpy as np np.random.seed(314) batch_size = 3 num_hidden = 5 sequence_length = 4 model = LinkInFor(num_hidden) x = np.random.rand( batch_size, sequence_length, num_hidden).astype(np.float32) h = np.random.rand(batch_size, num_hidden).astype(np.float32) args = [x, h, np.arange(sequence_length)] dprint(model(*args)) ch2o.generate_testcase(model, args)
def compile_model(model, inputs): # return helper.make_graph([],'dummy',[],[]) init_id2name(model) # code.InteractiveConsole({'mo': model}).interact() env = Env(sys.modules[model.__module__]) molk = User_Defined_Link(model, env) input_tensors = [] for i in inputs: # TODO(hamaji): Set valid type info. if isinstance(i, (list, tuple)): x = new_sequence() elif i is None: x = new_tensor() else: if isinstance(i, int): i = np.array(i) else: # TODO(durswd): This code requires chainer6.x i = chainer.cuda.to_cpu(i) x = new_tensor(dims=i.shape, dtype=i.dtype) input_tensors.append(x) input_values = [Value(i) for i in input_tensors] v = molk.call(input_values, [], env) dprint('output_tensors', v) if isinstance(v.value, tuple): output_tensors = list(v.value) # ばらしてみる else: output_tensors = [v] # とりあえず1tensor # print('env.init_tensors ',env.init_tensors) input_tensors += list(env.init_tensors.values()) for f in env.restore_funcs: f() # for no in env.nodes: # print(no.op_type) # print(env.nodes) # print(input_tensors) # print(output_tensors) # for ch in model.namedparams(): # print(ch) outputs_vi = [o.to_value_info(env) for o in output_tensors] graph = make_graph(env.nodes, 'name_is_unknown_now', input_tensors, outputs_vi) # inputのうち、重みであるものにはinitializerをつける # batch_sizeやinput_sizeなどの可変なものはできる限りのそのままで # Chainer compiler 独自のノードを使うとcheckできなくなる... # checker.check_graph(graph) mo = helper.make_model(graph) # print(mo) return mo