如何明确地使用矩阵和矩阵运算在MXNet中构建模型?

Rom*_*man 11 mxnet

我可以使用预构建的高级函数来创建模型FullyConnected.例如:

X = mx.sym.Variable('data')
P  = mx.sym.FullyConnected(data = X, name = 'fc1', num_hidden = 2)
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我得到一个P依赖于符号变量的符号变量X.换言之,我有可用于定义模型并执行这样的操作的计算如图表fitpredict.

现在,我想表达的P,通过X不同的方式.更详细地说,FullyConnected我不想使用高级功能(如),而是使用低级张量运算(如矩阵乘法)和表示模型参数的符号变量(湖权矩阵)来指定PX"明确" 之间的关系..

例如为了实现与上述相同,我尝试了以下内容:

W = mx.sym.Variable('W')
B = mx.sym.Variable('B')
P = mx.sym.broadcast_plus(mx.sym.dot(X, W), B)
Run Code Online (Sandbox Code Playgroud)

但是,P这种方式获得的不等同于P之前获得的.我不能以同样的方式使用它.特别是,据我所知,MXNet抱怨W并且B没有价值观(这是有道理的).

我也曾尝试申报W,并B以另一种方式(这样它们就具有值):

w = np.array([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
b = np.array([7.0, 8.0])

W = mx.nd.array(w)
B = mx.nd.array(b)
Run Code Online (Sandbox Code Playgroud)

它不起作用.我猜MXNet抱怨因为它需要一个符号变量,但它会得到nd-arrays.

所以,我的问题是如何使用低级张量运算(如矩阵乘法)和表示模型参数的显式对象(如权重矩阵)来构建模型.

Guy*_*Guy 5

你可能想看看Gluon API.例如,这里是从头开始构建MLP的指南,包括分配参数:

#######################
#  Allocate parameters for the first hidden layer
#######################
W1 = nd.random_normal(shape=(num_inputs, num_hidden), scale=weight_scale, ctx=model_ctx)
b1 = nd.random_normal(shape=num_hidden, scale=weight_scale, ctx=model_ctx)

params = [W1, b1, ...]
Run Code Online (Sandbox Code Playgroud)

将它们附加到自动渐变

for param in params:
    param.attach_grad()
Run Code Online (Sandbox Code Playgroud)

定义模型:

def net(X):
    #######################
    #  Compute the first hidden layer
    #######################
    h1_linear = nd.dot(X, W1) + b1
    ...
Run Code Online (Sandbox Code Playgroud)

并执行它

epochs = 10
learning_rate = .001
smoothing_constant = .01

for e in range(epochs):
    ...
    for i, (data, label) in enumerate(train_data):
        data = data.as_in_context(model_ctx).reshape((-1, 784))
        label = label.as_in_context(model_ctx)
        ...
        with autograd.record():
            output = net(data)
            loss = softmax_cross_entropy(output, label_one_hot)
        loss.backward()
        SGD(params, learning_rate)
Run Code Online (Sandbox Code Playgroud)

您可以在直涂料中看到完整的示例:

http://gluon.mxnet.io/chapter03_deep-neural-networks/mlp-scratch.html