Skip to content

Latest commit

 

History

History
177 lines (129 loc) · 3.83 KB

README.md

File metadata and controls

177 lines (129 loc) · 3.83 KB

张量计算

计算数学表达式"Z = X * W + B".

Z, X, W, B是标量.

输入X, W, B, 输出Z.

  • 初始化计算图.

    // 构造计算图
    InstanceNode X("X", Shape(1), TENSOR_TYPE_TSR);
    InstanceNode W("W", Shape(1), TENSOR_TYPE_TSR);
    InstanceNode B("B", Shape(1), TENSOR_TYPE_TSR);
    MulNode XW("XW", &X, &W);
    AddNode Z("Z", &XW, &B);
    // 编译计算图
    DXCHECK_THROW(graph.Compile({&Z}, 0));
  • 初始化OpContext对象.

    OpContext op_context;
    op_context.Init(&graph, &param);
    DXCHECK_THROW(op_context.InitOp(std::vector<int>{0}, -1));
    // 初始化X, W, B
    auto& _X = op_context.mutable_inst()->insert<tsr_t>(X.name());
    auto& _W = op_context.mutable_inst()->insert<tsr_t>(W.name());
    auto& _B = op_context.mutable_inst()->insert<tsr_t>(B.name());
    _X.resize(X.shape());
    _W.resize(W.shape());
    _B.resize(B.shape());
    // 初始化前向计算
    op_context.InitForward();
  • 输入, 前向计算, 输出.

    // 输入
    _X.data(0) = x;
    _W.data(0) = w;
    _B.data(0) = b;
    // 前向计算
    op_context.Forward();
    // 输出
    const auto& _Z = op_context.hidden().get<tsr_t>(Z.name());
    float_t z = _Z.data(0);
    std::cout << "Z=" << z << std::endl;

计算数学表达式"Z = X * W + B".

Z, X, W, B是标量.

W, B是参数, 输入X, 输出Z.

  • 初始化计算图.

    // 构造计算图
    InstanceNode X("X", Shape(1), TENSOR_TYPE_TSR);
    VariableNode W("W", Shape(1), TENSOR_TYPE_TSR);
    VariableNode B("B", Shape(1), TENSOR_TYPE_TSR);
    MulNode XW("XW", &X, &W);
    AddNode Z("Z", &XW, &B);
    // 编译计算图
    DXCHECK_THROW(graph.Compile({&Z}, 0));
  • 初始化参数

    auto& _W = param.insert<tsr_t>(W.name());
    _W.resize(W.shape());
    // 硬编码. 生产环境中, 通常从文件或网络加载参数.
    _W.data(0) = 2;
    auto& _B = param.insert<tsr_t>(B.name());
    _B.resize(B.shape());
    _B.data(0) = 3;
  • 初始化OpContext对象.

    类似example1.

  • 输入, 前向计算, 输出.

    类似example1.

计算数学表达式"Z = X * W + B".

Z, X, W是矩阵, B是标量.

W, B是参数, 输入X, 输出Z.

  • 初始化计算图.

    // 构造计算图
    InstanceNode X("X", Shape(2, 10), TENSOR_TYPE_TSR);
    VariableNode W("W", Shape(10, 1), TENSOR_TYPE_TSR);
    VariableNode B("B", Shape(1), TENSOR_TYPE_TSR);
    MatmulNode XW("XW", &X, &W);
    BroadcastAddNode Z("Z", &XW, &B);
    // 编译计算图
    DXCHECK_THROW(graph.Compile({&Z}, 0));
  • 初始化参数

    类似example2.

  • 初始化OpContext对象.

    类似example2.

  • 输入, 前向计算, 输出.

    类似example2.

计算数学表达式"Z = X * W + B".

Z, X, W是矩阵, B是标量.

W, B是参数, 输入X, 输出Z.

  • 初始化计算图.

    // 构造计算图
    // X的形状是(-1, 10), 表示(batch, 10).
    InstanceNode X("X", Shape(-1, 10), TENSOR_TYPE_TSR);
    VariableNode W("W", Shape(10, 1), TENSOR_TYPE_TSR);
    VariableNode B("B", Shape(1), TENSOR_TYPE_TSR);
    MatmulNode XW("XW", &X, &W);
    BroadcastAddNode Z("Z", &XW, &B);
    // 编译计算图
    DXCHECK_THROW(graph.Compile({&XW, &Z}, 0));
  • 初始化参数

    类似example3.

  • 初始化OpContext对象.

    类似example3.

  • 输入, 前向计算, 输出.

    auto& _X = op_context.mutable_inst()->insert<tsr_t>(X.name());
    _X.resize(2 + i, 10);
    _X.randn(engine);
    // 只要X的行数变化, 就要重新调用OpContext::InitForward.
    op_context.InitForward();
    op_context.Forward();
    const auto& _XW = op_context.hidden().get<tsr_t>(XW.name());
    const auto& _Z = op_context.hidden().get<tsr_t>(Z.name());
    std::cout << "XW=" << _XW << std::endl;
    std::cout << "Z=" << _Z << std::endl;

使用以上所有特性, 实现self attention的前向计算.