【问题标题】:CNN Image Recognition in MXNET in R to output Scalar number instead of ClassR中MXNET中的CNN图像识别以输出标量而不是类
【发布时间】:2018-01-15 06:28:02
【问题描述】:

我正在尝试使用 R 中的 mxnet 包,使用 CNN 来尝试根据图像预测标量输出(在我的情况下为等待时间)。

但是,当我这样做时,我得到了相同的结果输出(它预测了相同的数字,这可能只是所有结果的平均值)。如何让它正确预测标量输出。

我的图像已经通过灰度化并转换为下面的像素格式并将其缩放为 28 x 28 进行了预处理(我也尝试了不同的尺寸但没有效果)。

我本质上是使用图像来预测等待时间,这就是为什么我的 train_y 是以秒为单位的当前等待时间。使用这种方法时,虽然我的 train_y 作为当前等待时间(以秒为单位),但算法只是预测相同的数字。

但是,当我通过猜测最大值 (20000) 将 train_y 转换为 [0,1] 时,CNN 确实输出了不同的数字,但是当通过乘以 20000 再次缩放这些数字时,我似乎得到了预测负数和过于偏斜的数字会给模型带来糟糕的结果。负数尤其没有意义,因为我所有的 train_y 都是正数,而且因为我正在处理时间,所以没有负数之类的东西

我也玩弄了学习率,从 0.05、0.01、0.001、0.0001、0.00001 等,直到 2e-8 对模型没有影响。我也玩过初始化器

我还通过将动量从 0.9 更改为 0.95 来调整动量,而对模型没有影响。

这是我的可重现代码:

set.seed(0)

df <- data.frame(replicate(784,runif(7538)))
df$waittime <- 1000*runif(7538)


training_index <- createDataPartition(df$waittime, p = .9, times = 1)
training_index <- unlist(training_index)

train_set <- df[training_index,]
dim(train_set)
test_set <- df[-training_index,]
dim(test_set)


## Fix train and test datasets
train_data <- data.matrix(train_set)
train_x <- t(train_data[, -785])
train_y <- train_data[,785]
train_array <- train_x
dim(train_array) <- c(28, 28, 1, ncol(train_array))


test_data <- data.matrix(test_set)
test_x <- t(test_set[,-785])
test_y <- test_set[,785]
test_array <- test_x
dim(test_array) <- c(28, 28, 1, ncol(test_x))




library(mxnet)
## Model
mx_data <- mx.symbol.Variable('data')
## 1st convolutional layer 5x5 kernel and 20 filters.
conv_1 <- mx.symbol.Convolution(data = mx_data, kernel = c(5, 5), num_filter = 20)
tanh_1 <- mx.symbol.Activation(data = conv_1, act_type = "tanh")
pool_1 <- mx.symbol.Pooling(data = tanh_1, pool_type = "max", kernel = c(2, 2), stride = c(2,2 ))
## 2nd convolutional layer 5x5 kernel and 50 filters.
conv_2 <- mx.symbol.Convolution(data = pool_1, kernel = c(5,5), num_filter = 50)
tanh_2 <- mx.symbol.Activation(data = conv_2, act_type = "tanh")
pool_2 <- mx.symbol.Pooling(data = tanh_2, pool_type = "max", kernel = c(2, 2), stride = c(2, 2))
## 1st fully connected layer
flat <- mx.symbol.Flatten(data = pool_2)
fcl_1 <- mx.symbol.FullyConnected(data = flat, num_hidden = 500)
tanh_3 <- mx.symbol.Activation(data = fcl_1, act_type = "tanh")
## 2nd fully connected layer
fcl_2 <- mx.symbol.FullyConnected(data = tanh_3, num_hidden = 1)
## Output
#NN_model <- mx.symbol.SoftmaxOutput(data = fcl_2)
label <- mx.symbol.Variable("label")
#NN_model <- mx.symbol.MakeLoss(mx.symbol.square(mx.symbol.Reshape(fcl_2, shape = 0) - label))
NN_model <- mx.symbol.LinearRegressionOutput(fcl_2)




#Didn't work well, predicted same number continuously regardless of image
## Train on samples
model <- mx.model.FeedForward.create(NN_model, X = train_array, y = train_y,
                                     #                                     ctx = device,
                                     num.round = 30,
                                     array.batch.size = 100,
                                    # initializer=mx.init.uniform(0.002),
initializer = mx.init.Xavier(factor_type = "in", magnitude = 2.34), 
                                     learning.rate = 0.00001,
                                     momentum = 0.9,
                                     wd = 0.00001,
                                     eval.metric = mx.metric.rmse)
                                     #epoch.end.callback = #mx.callback.log.train.metric(100))



pred <- predict(model, test_array)
#gives the same numeric output 
#or when train_y is scaled to [0,1] gives very poor responses and negative numbers

【问题讨论】:

  • 当数据以均值为中心时(即 shift so mean=0),深度学习模型往往效果更好。尝试将您的训练数据预处理为图像输入和回归输出的标准/分数 Z 值。
  • 这不起作用,但感谢您的建议。我认为我的语法或准备工作有问题,所以如果有人发现它,请告诉我。仍然不确定为什么它不起作用。

标签: r conv-neural-network image-recognition mxnet


【解决方案1】:

我运行了您的示例,我认为模型本身很好。我通过用取自the official Kaggle tutorial 的 MNIST 输入替换您的输入来检查这一点。

在 MNIST train.array 上使用您的训练参数训练您的模型后,我在 MNIST test.array 上运行预测并收到良好的结果分布。

如果我使用 MNIST 训练的模型和您的 test_array 数据,我仍然会收到很好的预测分布。

但是,当我在随机生成的 train_array 上训练您的模型并尝试从您的 test_array 或 MNIST test.array 中预测结果时,我会得到所有项目的非常相似的预测 - 差异仅在点后的第三个数字之后开始.

我只能假设网络在白噪声(随机生成的数据)中找不到任何模式。我可以通过将权重衰减参数 (wd) 设置得更大(例如 wd=10)来使差异更大,但这肯定是个坏主意。

如果您的输入数据与示例中的不同,请仔细查看其预处理 - 可能存在错误。

【讨论】:

    猜你喜欢
    • 2018-01-05
    • 1970-01-01
    • 2018-01-13
    • 2018-01-01
    • 1970-01-01
    • 2018-06-09
    • 2021-02-01
    • 2021-04-17
    • 1970-01-01
    相关资源
    最近更新 更多