【发布时间】: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