Keras

2017-07-01 16 views
3
にmatconvnet CNNアーキテクチャを複製することはできません

I私は自分のデータで訓練するために使用matconvnetで畳み込みニューラルネットワークの次のアーキテクチャを持っている:Keras

function net = cnn_mnist_init(varargin) 
% CNN_MNIST_LENET Initialize a CNN similar for MNIST 
opts.batchNormalization = false ; 
opts.networkType = 'simplenn' ; 
opts = vl_argparse(opts, varargin) ; 

f= 0.0125 ; 
net.layers = {} ; 
net.layers{end+1} = struct('name','conv1',... 
          'type', 'conv', ... 
          'weights', {{f*randn(3,3,1,64, 'single'), zeros(1, 64, 'single')}}, ... 
          'stride', 1, ... 
          'pad', 0,... 
          'learningRate', [1 2]) ; 
net.layers{end+1} = struct('name','pool1',... 
          'type', 'pool', ... 
          'method', 'max', ... 
          'pool', [3 3], ... 
          'stride', 1, ... 
          'pad', 0); 
net.layers{end+1} = struct('name','conv2',... 
          'type', 'conv', ... 
          'weights', {{f*randn(5,5,64,128, 'single'),zeros(1,128,'single')}}, ... 
          'stride', 1, ... 
          'pad', 0,... 
          'learningRate', [1 2]) ; 
net.layers{end+1} = struct('name','pool2',... 
          'type', 'pool', ... 
          'method', 'max', ... 
          'pool', [2 2], ... 
          'stride', 2, ... 
          'pad', 0) ; 
net.layers{end+1} = struct('name','conv3',... 
          'type', 'conv', ... 
          'weights', {{f*randn(3,3,128,256, 'single'),zeros(1,256,'single')}}, ... 
          'stride', 1, ... 
          'pad', 0,... 
          'learningRate', [1 2]) ; 
net.layers{end+1} = struct('name','pool3',... 
          'type', 'pool', ... 
          'method', 'max', ... 
          'pool', [3 3], ... 
          'stride', 1, ... 
          'pad', 0) ; 
net.layers{end+1} = struct('name','conv4',... 
          'type', 'conv', ... 
          'weights', {{f*randn(5,5,256,512, 'single'),zeros(1,512,'single')}}, ... 
          'stride', 1, ... 
          'pad', 0,... 
          'learningRate', [1 2]) ; 
net.layers{end+1} = struct('name','pool4',... 
          'type', 'pool', ... 
          'method', 'max', ... 
          'pool', [2 2], ... 
          'stride', 1, ... 
          'pad', 0) ; 
net.layers{end+1} = struct('name','ip1',... 
          'type', 'conv', ... 
          'weights', {{f*randn(1,1,256,256, 'single'), zeros(1,256,'single')}}, ... 
          'stride', 1, ... 
          'pad', 0,... 
          'learningRate', [1 2]) ; 
net.layers{end+1} = struct('name','relu',... 
          'type', 'relu'); 
net.layers{end+1} = struct('name','classifier',... 
          'type', 'conv', ... 
          'weights', {{f*randn(1,1,256,2, 'single'), zeros(1,2,'single')}}, ... 
          'stride', 1, ... 
          'pad', 0,... 
          'learningRate', [1 2]) ; 
net.layers{end+1} = struct('name','loss',... 
          'type', 'softmaxloss') ; 

% optionally switch to batch normalization 
if opts.batchNormalization 
    net = insertBnorm(net, 1) ; 
    net = insertBnorm(net, 4) ; 
    net = insertBnorm(net, 7) ; 
    net = insertBnorm(net, 10) ; 
    net = insertBnorm(net, 13) ; 
end 

% Meta parameters 
net.meta.inputSize = [28 28 1] ; 
net.meta.trainOpts.learningRate = [0.01*ones(1,10) 0.001*ones(1,10) 0.0001*ones(1,10)]; 
disp(net.meta.trainOpts.learningRate); 
pause; 
net.meta.trainOpts.numEpochs = length(net.meta.trainOpts.learningRate) ; 
net.meta.trainOpts.batchSize = 256 ; 
net.meta.trainOpts.momentum = 0.9 ; 
net.meta.trainOpts.weightDecay = 0.0005 ; 

% -------------------------------------------------------------------- 
function net = insertBnorm(net, l) 
% -------------------------------------------------------------------- 
assert(isfield(net.layers{l}, 'weights')); 
ndim = size(net.layers{l}.weights{1}, 4); 
layer = struct('type', 'bnorm', ... 
       'weights', {{ones(ndim, 1, 'single'), zeros(ndim, 1, 'single')}}, ... 
       'learningRate', [1 1], ... 
       'weightDecay', [0 0]) ; 
net.layers{l}.biases = [] ; 
net.layers = horzcat(net.layers(1:l), layer, net.layers(l+1:end)) ; 

私が構築してやりたいですKerasで同じアーキテクチャは、それは私がこれまで試したものです:私はmatconvnetネットワークを実行すると

model = Sequential() 

model.add(Conv2D(64, (3, 3), strides=1, input_shape=input_shape)) 
model.add(MaxPooling2D(pool_size=(3, 3), strides=1)) 

model.add(Conv2D(128, (5, 5), strides=1)) 
model.add(MaxPooling2D(pool_size=(2, 2), strides=2)) 

model.add(Conv2D(256, (3, 3), strides=1)) 
model.add(MaxPooling2D(pool_size=(3, 3), strides=1)) 

model.add(Conv2D(512, (5, 5), strides=1)) 
model.add(MaxPooling2D(pool_size=(2, 2), strides=1)) 

model.add(Conv2D(256, (1, 1))) 
convout1=Activation('relu') 
model.add(convout1) 

model.add(Flatten()) 
model.add(Dense(num_classes, activation='softmax')) 

opt = keras.optimizers.rmsprop(lr=0.0001, decay=0.0005) 
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['binary_accuracy']) 

はしかし、私は87%の精度を持っていると私はkerasバージョンを実行する場合、私は77%の精度を持っています。彼らが同じネットワークであると仮定され、データが同じ場合、違いはどこですか?私のKerasアーキテクチャで何が間違っていますか?

+2

あなたの 'mathconv'ネットワークは' BatchNormalization'オプションを有効にしていますか?あなたは 'BatchNormalization'を追加していないからです。 –

+0

バッチの正規化はありません。ありがとう! – mad

+1

私は答えを形成することができます - それであなたはそれを受け入れてより目に見えるでしょうか? –

答えて

1

MatConvNetバージョンでは、勢いでSGDを使用します。 Kerasで

、あなたは別の学習速度を試してみてください別の学習則でrmsprop

を使用しています。 CNNを訓練するときにも時には勢いが役立ちます。

KerasでSGD +の勢いを試してみて、何が起こるか教えてください。

別のことは、初期設定が異なることです。例えば、MatConvNetでは標準偏差としてf = 0.0125のガウス初期化を使用します。 Kerasでは、デフォルトの初期化についてはわかりません。

通常、バッチ正規化を使用しない場合、ネットワークには多くの数値問題が発生しやすくなります。両方のネットワークでバッチの正規化を使用すると、結果は似ていると思います。バッチ正規化を使用したくない理由がありますか?

+0

私は、ありがとう! – mad

+0

私はこのsgd = keras.optimizers.SGD(lr = 0.0001、decay = 0.0005、momentum = 0.9)を試しましたが、結果はさらに悪化しました:50%。両方のネットワークのアーキテクチャは同じだと思いますか? – mad

+1

@mad編集の返信を参照 – DataHungry