2017-07-02 21 views
-1

私は線形モデルをMNISTデータセットに適用しようとしていますが、動作しますが、「不安定」です。つまり、コードの再実行ごとに精度が大幅に異なります。 NNは「確率的」な方法で重みを学習し、解は異なる局所最小値に収束することを理解していますが、それをより安定させるための方法があるかもしれません。ここでKeras:線形モデルが不安定な結果

は私のモデル定義です:

def get_model(): 
    w=28 
    h=28 
    input_shape = (w*h,) 
    model = Sequential() 
    model.add(Dense(n_classes, activation='linear', input_shape=input_shape)) 
    model.add(Activation('softmax')) 

    model.compile(loss=keras.losses.categorical_crossentropy, 
       optimizer=keras.optimizers.Adadelta(), 
       metrics=['accuracy']) 

    print(model.summary()) 

    return model 

更新:正則を追加すると、精度の面での溶液の不安定性の最初の質問に対する有効な回答であると思われます。

def get_model(): 
    w=28 
    h=28 
    input_shape = (w*h,) 
    model = Sequential() 

    #v1 - Not valid, because applying softmax to one layer network is meaningless 
    #model.add(Dense(n_classes, init='uniform', activation='linear', 
    # kernel_regularizer=regularizers.l2(0.01), 
    # activity_regularizer=regularizers.l1(0.01), 
    # input_shape=input_shape)) 
    #model.add(Dropout(0.2)) 
    #model.add(Activation('softmax')) 

    #v2 
    model.add(Dense(n_classes, init='uniform', activation='softmax', 
    kernel_regularizer=regularizers.l2(0.01), 
    activity_regularizer=regularizers.l1(0.01), 
    input_shape=input_shape)) 

    model.compile(loss=keras.losses.categorical_crossentropy, 
       optimizer=keras.optimizers.Adadelta(), 
       metrics=['accuracy']) 

    #print(model.summary()) 

    return model 
+0

アクティベーションが線形であるのはなぜですか? –

+0

あなたのモデルに正規化がありません –

+0

@ColdspeedはSoftmaxの前に 'Relu'を 'Relu'で置き換えることができないのかどうかわかりません、とにかく 'model.add(密度(n_classes、activation = 'softmax'、input_shape = input_shape)類似。 – mrgloom

答えて

2

L1/L2の正則化またはドロップアウトは、ここで学習を安定させるのに役立ちます。

+0

しかし、ドロップアウトは入力画像にのみ適用でき、単層の出力には適用できません。 – mrgloom

+0

@mrgloomドロップアウトは、入力と出力の間に置くことのできる別の「レイヤー」です。 –

+0

softmaxへの直接入力として使用する前に出力の一部をゼロにすることは意味がありません。 – mrgloom