2017-10-22 16 views
0

私はMLPバックプロパゲーションを実装している私自身のMLPネットワークを構築するためにKerasのドキュメントを読んでいます。私はsklearnのMLPClassifierに精通していますが、深い学習のためにKerasを学びたいと思います。以下は最初の試みです。ネットワークは、1入力(フィーチャ= 64)、1出力、および1隠れた3つの層を有する。合計は(64,64,1)です。入力1D numpyバイナリクラス125Kサンプル(64 DIM)とynumpy行列Xである(1、-1):KerasとMLPClassifier sklearnの間に一貫性のない結果があります

# Keras imports 
from keras.models import Sequential 
from sklearn.model_selection import train_test_split 
from keras.layers import Dense, Dropout, Activation 
from keras.initializers import RandomNormal, VarianceScaling, RandomUniform 
from keras.optimizers import SGD, Adam, Nadam, RMSprop 

# System imports 
import sys 
import os 
import numpy as np 
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' 


def train_model(X, y, num_streams, num_stages): 

    ''' 
    STEP1: Initialize the Model 
    ''' 

    tr_X, ts_X, tr_y, ts_y = train_test_split(X, y, train_size=.8) 
    model = initialize_model(num_streams, num_stages) 

    ''' 
    STEP2: Train the Model 
    ''' 
    model.compile(loss='binary_crossentropy', 
        optimizer=Adam(lr=1e-3), 
        metrics=['accuracy']) 
    model.fit(tr_X, tr_y, 
       validation_data=(ts_X, ts_y), 
       epochs=3, 
       batch_size=200) 


def initialize_model(num_streams, num_stages): 

    model = Sequential() 
    hidden_units = 2 ** (num_streams + 1) 
    # init = VarianceScaling(scale=5.0, mode='fan_in', distribution='normal') 
    init_bound1 = np.sqrt(3.5/((num_stages + 1) + num_stages)) 
    init_bound2 = np.sqrt(3.5/((num_stages + 1) + hidden_units)) 
    init_bound3 = np.sqrt(3.5/(hidden_units + 1)) 
    # drop_out = np.random.uniform(0, 1, 3) 

    # This is the input layer (that's why you have to state input_dim value) 
    model.add(Dense(num_stages, 
        input_dim=num_stages, 
        activation='relu', 
        kernel_initializer=RandomUniform(minval=-init_bound1, maxval=init_bound1))) 

    model.add(Dense(hidden_units, 
        activation='relu', 
        kernel_initializer=RandomUniform(minval=-init_bound2, maxval=init_bound2))) 

    # model.add(Dropout(drop_out[1])) 

    # This is the output layer 
    model.add(Dense(1, 
        activation='sigmoid', 
        kernel_initializer=RandomUniform(minval=-init_bound3, maxval=init_bound3))) 

    return model 

問題は、私は同じデータセットを有する99%の精度を得ることであるXMLPClassifier sklearnを使用する場合はyです。しかし、Kerasは以下のように精度が悪い:

Train on 100000 samples, validate on 25000 samples 
Epoch 1/3 
100000/100000 [==============================] - 1s - loss: -0.5358 - acc: 0.0022 - val_loss: -0.7322 - val_acc: 0.0000e+00 
Epoch 2/3 
100000/100000 [==============================] - 1s - loss: -0.6353 - acc: 0.0000e+00 - val_loss: -0.7385 - val_acc: 0.0000e+00 
Epoch 3/3 
100000/100000 [==============================] - 1s - loss: -0.7720 - acc: 9.0000e-05 - val_loss: -0.9474 - val_acc: 5.2000e-04 

なぜわからないのですか?私はここに何かを逃していますかどんな助けもありがとうございます。

答えて

0

の詳細は

私は問題はあなたが(にバインドされた[0,1])sigmoid出力層を使用していることだと思いますが、あなたのクラスは、(1ある-1 )、出力値を変更するか、tanhを使用する必要があります。

また、kerasレイヤーにはsklearn以外のデフォルトパラメータが設定されている可能性がありますので、ドキュメントの設定を確認してください。

最後に1つ、kernel_initializerを試してみると、glorot_uniformが良いデフォルトです。

関連する問題