我可以使用预构建的高级函数来创建模型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.换言之,我有可用于定义模型并执行这样的操作的计算如图表fit和predict.
现在,我想表达的P,通过X不同的方式.更详细地说,FullyConnected我不想使用高级功能(如),而是使用低级张量运算(如矩阵乘法)和表示模型参数的符号变量(湖权矩阵)来指定P和X"明确" 之间的关系..
例如为了实现与上述相同,我尝试了以下内容:
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.
所以,我的问题是如何使用低级张量运算(如矩阵乘法)和表示模型参数的显式对象(如权重矩阵)来构建模型.
你可能想看看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
| 归档时间: |
|
| 查看次数: |
259 次 |
| 最近记录: |