【问题标题】:MXNetR Not enough information to get shapeMXNetR 没有足够的信息来塑造形状
【发布时间】:2017-11-11 10:48:31
【问题描述】:

我正在 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))))))
)

我可以用这个版本编译,但是我的模型运行很慢,代码显然不是很可读。我想知道是否有任何方法可以实现绕过错误并实现我上面描述的第一个版本。

【问题讨论】:

  • 很抱歉,我在整形步骤中遇到了错误。可以更新代码吗?

标签: r neural-network deep-learning mxnet


【解决方案1】:

MXNet 执行形状推断以确定模型参数(权重和偏差)所需的形状,以便分配内存,第一次这样做是在初始化模型参数时。

在您的符号中的某个地方,您有一个无法从邻居推断出的形状,我怀疑它可能是您在内联定义中删除的 broadcast_sub。由于重塑中的错误,很难诊断出确切的问题。您也可以尝试使用 NDArray 来测试逻辑,然后转换回使用 Symbol。

如果您要批量处理样本,您应该更改mx.model.FeedForward.createarray.batch.size 参数,而不是将数据重新整形为批次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 2021-09-09
    相关资源
    最近更新 更多