import matplotlib.pyplot as plt
import numpy
import pandas as pd
from keras.models import Sequential
from keras.layers import Dense
from mnist import MNIST
from sklearn.model_selection import GridSearchCV
from keras.layers import Dropout
from keras.wrappers.scikit_learn import KerasClassifier
from keras.constraints import maxnorm
from keras.models import Model
from keras.layers import *
from keras import optimizers
%matplotlib inline
Решить задачу: выбора алгоритма оптимизации (SGD, Nesterov Momentum, Adam) с использованием нейронных сетей простой структуры, со структурными параметрами: структура сети
model = Sequential()
model.add(Dense(units=785, activation='relu', input_dim=100))
model.add(Dense(units=10, activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='sgd',
metrics=['accuracy'])
train = pd.read_csv("/home/jeny/mnist_train.csv")
test = pd.read_csv("/home/jeny/mnist_test.csv")
train = train.iloc[:40000, :]
test = train.iloc[:40000, :]
train.shape
(40000, 785)
train.head()
5 | 0 | 0.1 | 0.2 | 0.3 | 0.4 | 0.5 | 0.6 | 0.7 | 0.8 | ... | 0.608 | 0.609 | 0.610 | 0.611 | 0.612 | 0.613 | 0.614 | 0.615 | 0.616 | 0.617 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
2 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
3 | 9 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
4 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
5 rows × 785 columns
x_train = train.iloc[:,1:]
y_train = train.iloc[:, 0:1]
x_test = test.iloc[:, 1:]
y_test = test.iloc[:, 0:1]
x_train.shape
(40000, 784)
def create_model(neurons=1):
model = Sequential()
model.add(Dense(30, activation='sigmoid', input_shape=(784, )))
model.add(Dense(1, activation='linear'))
sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='mean_squared_error', optimizer=sgd, metrics=['accuracy'])
return model
model = KerasClassifier(build_fn=create_model, epochs=15, batch_size=80 , verbose=1)
neurons = [5,10,15,20,50,100]
param_grid = dict(neurons=neurons)
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1)
grid_result = grid.fit(x_train, y_train)
Epoch 1/15 40000/40000 [==============================] - 8s 208us/step - loss: 6.3400 - acc: 0.1247 Epoch 2/15 40000/40000 [==============================] - 8s 199us/step - loss: 3.0765 - acc: 0.2440 Epoch 3/15 40000/40000 [==============================] - 9s 220us/step - loss: 2.4657 - acc: 0.3314 Epoch 4/15 40000/40000 [==============================] - 9s 213us/step - loss: 2.1668 - acc: 0.3524 Epoch 5/15 40000/40000 [==============================] - 9s 214us/step - loss: 1.9750 - acc: 0.3693 Epoch 6/15 40000/40000 [==============================] - 9s 236us/step - loss: 1.8766 - acc: 0.3680 Epoch 7/15 40000/40000 [==============================] - 9s 234us/step - loss: 1.7650 - acc: 0.3695 Epoch 8/15 40000/40000 [==============================] - 9s 224us/step - loss: 1.7523 - acc: 0.3675 Epoch 9/15 40000/40000 [==============================] - 9s 234us/step - loss: 1.7314 - acc: 0.3870 Epoch 10/15 40000/40000 [==============================] - 10s 239us/step - loss: 1.7128 - acc: 0.3867 Epoch 11/15 40000/40000 [==============================] - 12s 303us/step - loss: 1.6656 - acc: 0.3875 Epoch 12/15 40000/40000 [==============================] - 11s 285us/step - loss: 1.6655 - acc: 0.3934 Epoch 13/15 40000/40000 [==============================] - 11s 285us/step - loss: 1.5482 - acc: 0.4147 Epoch 14/15 40000/40000 [==============================] - 12s 291us/step - loss: 1.5239 - acc: 0.4387 Epoch 15/15 40000/40000 [==============================] - 11s 285us/step - loss: 1.5659 - acc: 0.4480
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
means = grid_result.cv_results_['mean_test_score']
stds = grid_result.cv_results_['std_test_score']
params = grid_result.cv_results_['params']
for mean, stdev, param in zip(means, stds, params):
print("%f (%f) with: %r" % (mean, stdev, param))
Best: 0.467875 using {'neurons': 100} 0.397100 (0.040261) with: {'neurons': 5} 0.438450 (0.016187) with: {'neurons': 10} 0.413425 (0.057741) with: {'neurons': 15} 0.408500 (0.023974) with: {'neurons': 20} 0.404650 (0.024113) with: {'neurons': 50} 0.467875 (0.008149) with: {'neurons': 100}
neurons = [5,10,15,20,50,100]
param_grid = dict(neurons=neurons)
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1)
grid_result = grid.fit(x_train, y_train)
Epoch 1/15 40000/40000 [==============================] - 7s 167us/step - loss: 4.6629 - acc: 0.1422 Epoch 2/15 40000/40000 [==============================] - 7s 184us/step - loss: 4.1693 - acc: 0.1953 Epoch 3/15 40000/40000 [==============================] - 6s 155us/step - loss: 3.8125 - acc: 0.2124 Epoch 4/15 40000/40000 [==============================] - 6s 161us/step - loss: 3.8286 - acc: 0.2261 Epoch 5/15 40000/40000 [==============================] - 6s 159us/step - loss: 3.6430 - acc: 0.2216 Epoch 6/15 40000/40000 [==============================] - 7s 179us/step - loss: 3.7137 - acc: 0.2265 Epoch 7/15 40000/40000 [==============================] - 6s 161us/step - loss: 3.3175 - acc: 0.2452 Epoch 8/15 40000/40000 [==============================] - 7s 177us/step - loss: 3.6765 - acc: 0.2280 Epoch 9/15 40000/40000 [==============================] - 8s 207us/step - loss: 3.9299 - acc: 0.2344 Epoch 10/15 40000/40000 [==============================] - 7s 183us/step - loss: 3.7395 - acc: 0.2350 Epoch 11/15 40000/40000 [==============================] - 8s 203us/step - loss: 3.9657 - acc: 0.1853 Epoch 12/15 40000/40000 [==============================] - 8s 190us/step - loss: 3.9659 - acc: 0.2689 Epoch 13/15 40000/40000 [==============================] - 8s 202us/step - loss: 3.1007 - acc: 0.2712 Epoch 14/15 40000/40000 [==============================] - 8s 210us/step - loss: 3.3459 - acc: 0.3252 Epoch 15/15 40000/40000 [==============================] - 9s 222us/step - loss: 3.2098 - acc: 0.2271
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
means = grid_result.cv_results_['mean_test_score']
stds = grid_result.cv_results_['std_test_score']
params = grid_result.cv_results_['params']
for mean, stdev, param in zip(means, stds, params):
print("%f (%f) with: %r" % (mean, stdev, param))
Best: 0.304075 using {'neurons': 10} 0.260050 (0.005875) with: {'neurons': 5} 0.304075 (0.048464) with: {'neurons': 10} 0.264075 (0.048997) with: {'neurons': 15} 0.269700 (0.080197) with: {'neurons': 20} 0.239000 (0.035026) with: {'neurons': 50} 0.257000 (0.019166) with: {'neurons': 100}
neurons = [5,10,15,20,50,100]
param_grid = dict(neurons=neurons)
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1)
grid_result = grid.fit(x_train, y_train)
/usr/local/lib/python3.6/dist-packages/sklearn/model_selection/_split.py:2053: FutureWarning: You should specify a value for 'cv' instead of relying on the default value. The default value will change from 3 to 5 in version 0.22. warnings.warn(CV_WARNING, FutureWarning)
Epoch 1/15 40000/40000 [==============================] - 6s 149us/step - loss: 8.3136 - acc: 0.0929 Epoch 2/15 40000/40000 [==============================] - 8s 204us/step - loss: 8.4450 - acc: 0.0941 Epoch 3/15 40000/40000 [==============================] - 10s 242us/step - loss: 8.4571 - acc: 0.0913 Epoch 4/15 40000/40000 [==============================] - 9s 235us/step - loss: 8.4487 - acc: 0.0939 Epoch 5/15 40000/40000 [==============================] - 9s 225us/step - loss: 8.4414 - acc: 0.0959 Epoch 6/15 40000/40000 [==============================] - 9s 237us/step - loss: 8.4476 - acc: 0.0953 Epoch 7/15 40000/40000 [==============================] - 9s 218us/step - loss: 8.4386 - acc: 0.0942 Epoch 8/15 40000/40000 [==============================] - 10s 259us/step - loss: 8.4513 - acc: 0.0950 Epoch 9/15 40000/40000 [==============================] - 9s 225us/step - loss: 8.4470 - acc: 0.0935 Epoch 10/15 40000/40000 [==============================] - 9s 224us/step - loss: 8.4345 - acc: 0.0946 Epoch 11/15 40000/40000 [==============================] - 10s 257us/step - loss: 8.4481 - acc: 0.0949 Epoch 12/15 40000/40000 [==============================] - 11s 263us/step - loss: 8.4718 - acc: 0.0955 Epoch 13/15 40000/40000 [==============================] - 11s 267us/step - loss: 8.4606 - acc: 0.0926 Epoch 14/15 40000/40000 [==============================] - 10s 249us/step - loss: 8.4306 - acc: 0.0960 Epoch 15/15 40000/40000 [==============================] - 10s 251us/step - loss: 8.4419 - acc: 0.0947
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
means = grid_result.cv_results_['mean_test_score']
stds = grid_result.cv_results_['std_test_score']
params = grid_result.cv_results_['params']
for mean, stdev, param in zip(means, stds, params):
print("%f (%f) with: %r" % (mean, stdev, param))
Best: 0.122800 using {'neurons': 100} 0.101550 (0.005835) with: {'neurons': 5} 0.114650 (0.023514) with: {'neurons': 10} 0.111050 (0.028868) with: {'neurons': 15} 0.107925 (0.010288) with: {'neurons': 20} 0.100300 (0.011810) with: {'neurons': 50} 0.122800 (0.028337) with: {'neurons': 100}