私はMLPバックプロパゲーションを実装している私自身のMLPネットワークを構築するためにKerasのドキュメントを読んでいます。私はsklearnのMLPClassifierに精通していますが、深い学習のためにKeras
を学びたいと思います。以下は最初の試みです。ネットワークは、1入力(フィーチャ= 64)、1出力、および1隠れた3つの層を有する。合計は(64,64,1)です。入力1D numpy
バイナリクラス125Kサンプル(64 DIM)とy
のnumpy
行列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%の精度を得ることであるX
とMLPClassifier 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
なぜわからないのですか?私はここに何かを逃していますかどんな助けもありがとうございます。
これは、バイナリ分類の問題です –