2017-02-03 125 views
0

我目前正在尝试使用MXNet R API设置前馈NN。我想实现一个自定义损失函数,使用我自己定义的预先固定权重作为c(7,8,9)。在Tensorflow中,可以选择将变量定义为不可训练的,这可以确保这些变量在训练过程中不会被修改。这正是我需要的重量!不幸的是,我还没有找到任何方法来实现这一点。这里是我的代码:在MXNet中定义不可训练的变量

data <- mx.symbol.Variable('data') 
label <- mx.symbol.Variable('label') 
weights <- mx.symbol.Variable(name='weights') 

... [some network layers]... 

fc2 <- mx.symbol.FullyConnected(data=tanh3, num_hidden=length(predictable_errors)) 
softmax <- mx.symbol.SoftmaxActivation(data=fc2, name="softmax_activation") 
weighted_l2 <- mx.symbol.sum(mx.symbol.square(softmax - label)*weights) 
loss <- mx.symbol.MakeLoss(data=weighted_l2) 

model <- mx.model.FeedForward.create(loss, X=train.x, y=train.y, ctx=mx.cpu(), arg.params = list(weights=mx.nd.array(array(c(7,8,9), dim=c(3,1)), mx.cpu())), num.round=1, learning.rate=0.05, momentum=0.9, array.batch.size = 1, eval.metric=mx.metric.accuracy, epoch.end.callback=mx.callback.log.train.metric(1)) 

我知道了Python API提供的功能set_lr_mult,与我可以设置学习率为零的“权重”,但是与R这似乎不是一个选项。你有什么建议吗?

非常感谢!

回答

2

您可以使用Module而不是FeedForward来做到这一点,当您使用模块时,您可以传递您不想训练的固定参数。

model <- mx.mod.Module(loss, data_names, label_names, ctx=mx.cpu(), 
          fixed_param_names=[list of parameters you do not want to train for]) 

你可以阅读更多here

+0

谢谢您的回复!我研究过模型API,它似乎只适用于Python。虽然我准备在没有其他选择的情况下切换到Python,但我首先想要探索R API的所有可能性。 –

相关问题