def forward(self, inps): x = F.matmul(inps[0], inps[1], self.param["transA"], self.param["transB"]) if self.param["alpha"] != 1.0: x = F.mul(x, self.param["alpha"]) if len(inps) == 3: if self.param["beta"] != 1.0: x = F.add(x, F.mul(inps[2], self.param["beta"])) else: x = F.add(x, inps[2]) return x
def test_replace_var(): a = Tensor([1, 2]) b = Tensor([3, 4]) @trace(symbolic=True, capture_as_const=True) def fwd(a, b): return (a + b) * 2 fwd(a, b) orig_model = io.BytesIO() fwd.dump(orig_model, arg_names=["a", "b"], output_names="o", optimize_for_inference=False) orig_model.seek(0) graph = Net.load(orig_model) vara = graph.var_filter.name("a").as_unique() varb = graph.var_filter.name("b").as_unique() out = F.mul(vara, varb) out = F.relu(out) opnode = list(graph.opr_filter.has_input(vara)) repl_dict = {opnode[0].outputs[0]: out} graph.replace_vars(repl_dict) modified_model = io.BytesIO() graph.dump(modified_model) modified_model.seek(0) load_graph = GraphInference(modified_model) out = load_graph.run(a, b) np.testing.assert_equal(out["o"], [6, 16])
def test_replace_oprs(): g = mgb_graph.Graph() g.options.async_exec_level = 0b100 device = "xpux" dtype = np.float32 a = mgb_graph.InputNode(device=device, dtype=dtype, graph=g) const = g.make_const(1.25) a_plus_a = F.add(a.outputs[0], a.outputs[0]) old_opr = a_plus_a.op a_plus_a_mul_const = F.mul(a_plus_a, const) a_mul_a = F.mul(a.outputs[0], a.outputs[0]) new_opr = a_mul_a.op (new, ) = cgtools.replace_oprs([a_plus_a_mul_const._node], {old_opr._node: new_opr._node}) out = mgb_graph.OutputNode(mgb_graph.VarNode(new)) func = g.compile(out.outputs[0]) func.execute() x = make_dev_tensor(5.0, device=device) a.set_value(x) res = out.get_value().numpy() np.testing.assert_equal(res, np.array([5.0 * 5.0 * 1.25]))
def test_multiply(): np.testing.assert_allclose( F.mul(-3.0, -4.0).numpy(), np.multiply(np.float32(-3.0), np.float32(-4.0)) ) np.testing.assert_allclose( F.mul(tensor([3.0, 4.0]), 4.0).numpy(), np.multiply(np.array([3.0, 4.0], dtype=np.float32), 4.0), ) np.testing.assert_allclose( F.mul(4.0, tensor([3.0, 4.0])).numpy(), np.multiply(4.0, np.array([3.0, 4.0], dtype=np.float32)), ) np.testing.assert_allclose( F.mul(tensor([3.0, 4.0]), tensor([3.0, 4.0])).numpy(), np.multiply( np.array([3.0, 4.0], dtype=np.float32), np.array([3.0, 4.0], dtype=np.float32), ), )
def forward(self, inps): return F.mul(inps[0], inps[1])
import megengine as mge import megengine.functional as F ''' 求导器(GradManager) ''' from megengine.autodiff import GradManager w = mge.tensor([3.]) x = mge.tensor([2.]) b = mge.tensor(-1.) gm = GradManager().attach([w, b]) # 新建一个求导器,绑定需要求导的变量,实例通常习惯写成 gm with gm: # 开始记录计算图 p = F.mul(w, x) y = p + b gm.backward(y) # 计算 y 关于参数的导数,过程中不断地使用链式法则 print(w.grad) # 得到结果为 x print(b.grad) # 得到结果为 1 ''' 优化器(Optimizer) ''' w = mge.Parameter([3.]) x = mge.Tensor([2.]) b = mge.Parameter(-1.) print(type(w)) print(type(b)) gm = GradManager().attach([w, b]) # 这次 attach() 传入的是 Parameter 而不是 Tensor with gm: p = F.mul(w, x) y = p + b gm.backward(y)
import megengine as mge import megengine.functional as F A = mge.tensor([[2., 4., 2.], [2., 4., 2.]]) B = mge.tensor([[1., 2., 1.], [1., 2., 1.]]) print(A + B) print(A - B) print(A * B) print(A / B) print(F.add(A, B)) print(F.sub(A, B)) print(F.mul(A, B)) print(F.div(A, B)) A = mge.tensor([[1., 2., 3.], [4., 5., 6.]]) print(A[1, :2]) A = mge.tensor([[1., 2., 3.], [4., 5., 6.]]) print(A.shape) A = A.reshape(3, 2) print(A.shape) x = mge.tensor([[1., 3., 5.],