Is it possible to create a CNN with real output?

1 Ansicht (letzte 30 Tage)
Benedek Racz
Benedek Racz am 18 Apr. 2017
Beantwortet: Greg Heath am 8 Jul. 2017
The output type of the trainNetwork() must be categorical(). How can I create a CNN with float/real output(s)?
I mean the following command gives the following error:
>> convnet = trainNetwork(input_datas, [0.0, 0.1, 0.2, 0.3], networkLayers, opts);
Error using trainNetwork>iAssertCategoricalResponseVector (line 269)
Y must be a vector of categorical responses.
(The error message corresponds the [0.0, 0.1, 0.2, 0.3] vector), But I need real outputs, not categories.
The networkLayers is the following:
>> networkLayers=
5x1 Layer array with layers:
1 '' Image Input 1x6000x1 images with 'zerocenter' normalization
2 '' Convolution 10 1x100 convolutions with stride [1 1] and padding [0 0]
3 '' Max Pooling 1x20 max pooling with stride [10 10] and padding [0 0]
4 '' Fully Connected 200 fully connected layer
5 '' Fully Connected 1 fully connected layer

Akzeptierte Antwort

Sean de Wolski
Sean de Wolski am 7 Jul. 2017
Use a regressionLayer at the end:
Note this requires 17a, regression was added in that release.

Weitere Antworten (2)

Mark Fajet
Mark Fajet am 7 Jul. 2017
Yes it is possible, however the documentation for TrainNetwork specifies that, for classification problems, that second parameter,"Y", must be "a categorical vector containing the image labels." A simple solution would be to write:
convnet = trainNetwork(input_datas, categorical([0.0, 0.1, 0.2, 0.3]), networkLayers, opts);
Later on, when using your neural network, if you really need the responses as an array of floats instead of a categorical array, you can convert a categorical array to an array of floats like this:
d = str2double(cellstr(c)); % Where c is a categorical array

Greg Heath
Greg Heath am 8 Jul. 2017
The simplest way is to represent the categories with integers
>> categories = [ 1 3 5 4 2]
>> target = full(ind2vec(categories))
target = 1 0 0 0 0
0 0 0 0 1
0 1 0 0 0
0 0 0 1 0
0 0 1 0 0
>> output = target + 0.1*randn(5,5)
output = 0.8902 -0.1361 -0.0874 0.0327 -0.0846
-0.1416 0.0780 0.0415 -0.0515 0.9827
0.0060 1.0439 0.0348 -0.0896 -0.1209
-0.0411 -0.0090 0.0349 0.8797 -0.0297
-0.0368 0.1021 0.9271 0.1038 -0.3232
>> answer = vec2ind(output)
answer = 1 3 5 4 2
Hope this helps.
* Thank you for formally accepting my answer*
Greg

Kategorien

Mehr zu Image Data Workflows finden Sie in Help Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by