我正在MXNetR中实现神经网络。我试图自定义我的损失函数来计算我的输出向量和目标向量之间的相关性。以下是我的代码:
以下是我的代码:
# Generate testing data
train.x = matrix(data = rexp(200, rate = 10), nrow = 120, ncol = 6380)
test.x = matrix(data = rexp(200, rate = 10), nrow = 60, ncol = 6380)
train.y = matrix(data = rexp(200, rate = 10), nrow = 120, ncol = 319)
test.y = matrix(data = rexp(200, rate = 10), nrow = 60, ncol = 319)
# Reshape testing data
train.array <-train.x
dim(train.array) <-c(20,319,1,ncol(train.x))
test.array<-test.x
dim(test.array) <-c (20,319,1,ncol(test.x))
# Define the input data
data <- mx.symbol.Variable("data")
# Define the first fully connected layer
fc1 <- mx.symbol.FullyConnected(data, num_hidden = 100)
act.fun <- mx.symbol.Activation(fc1, act_type = "relu") # create a hidden layer with Rectified Linear Unit as its activation function.
output <<- mx.symbol.FullyConnected(act.fun, num_hidden = 319)
# Customize loss function
label <- mx.symbol.Variable("label")
output_mean <- mx.symbol.mean(output)
label_mean <- mx.symbol.mean(label)
output_delta <-mx.symbol.broadcast_sub(output, output_mean)
label_delta <- mx.symbol.broadcast_sub(label, label_mean)
output_sqr <-mx.symbol.square(output_delta)
label_sqr <- mx.symbol.square(label_delta)
output_sd <- mx.symbol.sqrt(mx.symbol.sum(output_delta))
label_sd <- mx.symbol.sqrt(mx.symbol.sum(label_delta))
numerator <- mx.symbol.sum(output_delta * label_delta)
denominator <- output_sd * label_sd
lro <- mx.symbol.MakeLoss(numerator/denominator)
# Generate a new model
model <- mx.model.FeedForward.create(symbol=lro, X=train.array, y=train.y,
num.round=5000, array.batch.size=1, optimizer = "adam",
learning.rate = 0.0003, eval.metric = mx.metric.rmse,
epoch.end.callback = mx.callback.log.train.metric(20, logger))
我收到了这个错误:
Error in mx.model.init.params(symbol, input.shape, initializer, mx.cpu()) :
Not enough information to get shapes
我尝试在MXNet中包装整个关联公式:
lro2 <- mx.symbol.MakeLoss(
mx.symbol.negative((mx.symbol.sum(output * label) -
(mx.symbol.sum(output) * mx.symbol.sum(label))) /
mx.symbol.sqrt((mx.symbol.sum(mx.symbol.square(output)) -
((mx.symbol.sum(output)) * (mx.symbol.sum(output)))) *
(mx.symbol.sum(mx.symbol.square(label)) - ((mx.symbol.sum(label)) * (mx.symbol.sum(label))))))
)
我可以使用这个版本编译,但我的模型运行速度非常慢,而且代码显然不是很易读。我想知道是否有任何方法可以实现绕过错误并实现我上面描述的第一个版本。
答案 0 :(得分:1)
MXNet执行形状推断以确定模型参数(权重和偏差)的所需形状以便分配内存,第一次完成时是初始化模型参数。
在符号的某处,你有一个无法从邻居推断的形状,我怀疑它可能是你在内联定义中删除的broadcast_sub。由于重塑中的错误,很难诊断确切的问题。您还可以尝试使用NDArray来测试逻辑,然后转换回使用Symbol。
如果您要查看批量样本,则应更改array.batch.size
的{{1}}参数,而不是将数据重新整理为批次。