<p>It appears that your network is collapsing, due to a number of potentials. I would try the following modifications:</p>

<ul>
<li>Use ReLU activation instead of tanh. ReLU has proven to be a much more robust activation in Conv networks than sigmoid or tanh.</li>
<li>User batch-normalization between at the input of your convolutional layers (see paper <a href="https://arxiv.org/abs/1502.03167" rel="nofollow noreferrer">here</a>).</li>
<li>Divide your range into sections and use softmax. If you must have regression, consider a separate regression network for each range and select the correct regression net based on the output of the softmax. Cross Entropy loss has shown more success in learning highly non-linear functions.</li>
</ul>
Image Recognition with Scalar output using CNN MXnet in R
<p>So I am trying to use image recognition using the mxnet package in R using a CNN to try and predict a scalar output (in my case wait time) based on the image. </p>

<p>However, when I do this, I get the same resultant output (it predicts the same number which is probably just the average of all of the results). How do I get it to predict the scalar output correctly.</p>

<p>Also, my image has already been pre-processed by greyscaling it and converting into the pixel format below.
I am essentially using images to predict wait times which is why my train_y is the current wait times in seconds, hence why I didn't convert it into a [0,1] range. I would prefer a regression type output or some kind of scalar output that outputs the predicted wait time based on the image.</p>

<p>What other ways would you recommend to tackle this problem, not sure if my approach is correct.</p>

<p>Here is my reproducible code: </p>

<pre><code>set.seed(0)

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


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

train_set &lt;- df[training_index,]
dim(train_set)
test_set &lt;- df[-training_index,]
dim(test_set)


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


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




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


## Device used. Sadly not the GPU :-(
#device &lt;- mx.gpu
#Didn't work well, predicted same number continuously regardless of image
## Train on 1200 samples
model &lt;- 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), 
                                     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 &lt;- predict(model, test_array)
#gives the same numeric output 
</code></pre>