Нахождение оптимальных весов в сети одного слоя и двух скрытых единиц - PullRequest
0 голосов
/ 08 января 2019

Реализация нейронной сети SKlearn не может последовательно находить оптимальные веса с наилучшей посадкой при acc = 0,975, но не всегда (по-видимому, в зависимости от initailizaition) sklearn NN with two hidden units

Как гарантировать оптимальную точность при таких простых настройках? Почему версия Keras даже не приближается?

Я новичок в нейронных сетях и заинтересован в разреженных моделях, то есть высочайшей точности с наименьшими параметрами Склеарн с lbfgs solver иногда кажется, чтобы получить оптимальные веса

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_moons, make_circles, make_classification
from sklearn.neural_network import MLPClassifier

X, y =make_moons(n_samples=200, noise=0.1, random_state=0)
X = StandardScaler().fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.4, random_state=42)
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5

#sklearn

nn=MLPClassifier(hidden_layer_sizes=(2,),
                 alpha=alpha, 
                 max_iter=100000000, 
                 solver='lbfgs',
                 activation='tanh',
                 verbose=False).fit(X_train, y_train)
print(nn.score(X_test, y_test))



# Keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

model = Sequential()
model.add(Dense(2, input_dim=2, activation='tanh'))
model.add(Dense(1, activation='sigmoid'))


model.compile(loss='binary_crossentropy', optimizer='sgd', metrics=['accuracy'])

model.fit(X_train, y_train, 
          epochs=900,
          batch_size=200,
          validation_data=(X_test, y_test), 
          verbose=0)
print(model.evaluate(X_test, y_test)[1])

веса для модели Склеарна, где я приземлился с точностью 0,975

print(nn.coefs_)
array([[-0.66491063, -5.99816399],
      [ 0.13907145, -3.82369965]]), 
array([[-16.53339218],
       [  9.14208312]])]
print(nn.intercepts_)
[array([0.04063317, 0.01169239]), array([0.40667715])]
...