我尝试使用matlab的神经网络工具箱(Matlab版本为R2017a)设置深层自动编码器网络体系结构。但是,matlab所需的训练数据尺寸使我感到困惑。
这是该代码的简化版本:
% X is a input matrix whose columns contain the training data
dim1 = size(X, 1);
dim2 = size(X, 2);
fprintf('Inital size of X: (%d, %d)\n', dim1, dim2);
% Reshape X to expected dimension (4D)
X = reshape(X, 1, dim1, 1, dim2);
fprintf('Size of X after reshape: (%d, %d)\n', size(X, 1), size(X, 2));
% Layer parameters
nn_input_size = dim1;
nn_code_size = 2;
nn_layer_size = 250;
% Setup layers
layers = [ ...
imageInputLayer([1, nn_input_size]) ...
fullyConnectedLayer(nn_layer_size) ...
reluLayer() ...
fullyConnectedLayer(nn_code_size) ...
reluLayer() ...
fullyConnectedLayer(nn_layer_size) ...
reluLayer() ...
fullyConnectedLayer(nn_input_size) ...
reluLayer() ...
regressionLayer];
% Training parameters
nn_epochs = 1500;
nn_mini_batch_sz = max(ceil(0.1*nn_input_size), min(5, nn_input_size));
options = trainingOptions('sgdm', ...
'ExecutionEnvironment','cpu', ...
'MaxEpochs', nn_epochs, ...
'MiniBatchSize', nn_mini_batch_sz, ...
'Shuffle','never', ...
'Verbose',0);
% Train the autoencoder network
nw = trainNetwork(X, X, layers, options);
输出:
X的初始大小:(75,1413)
重塑后的X大小:(1、75、1、1413)
使用trainNetwork时出错(第92行)
最后一层的输出大小[1 1 75]不
匹配响应大小[1 75 1]。
Matlab的文档说:
对于回归问题,Y可以是一个n×h×w×c×n的数值数组,其中n是观测数,h是w×w×c是单个响应的大小。
那我在做什么错了?
更新
通过为具有所需维度的训练数据创建单独的矩阵来修改上述程序后:
X_train = reshape(X, 1, 1, dim1, dim2);
,然后使用新数组作为训练过程的参数:
nw = trainNetwork(X, X_train, layers, options);
错误消失了,但是优化没有收敛。
即使使用以下(更正后的)最小批次大小公式,也仍然没有收敛:
nn_mini_batch_sz = max(ceil(0.1*nn_training_size), min(25, nn_training_size));
误差函数应该测量输出和输入之间的差异,以便网络学习重现输入。但是,现在我不知道网络是否满足我的要求,即计算输入向量与其复制的对应向量之间的差。