In [2]:
import numpy
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import np_utils

# Устанавливаем seed для повторяемости результатов
numpy.random.seed(42)


Using TensorFlow backend.

In [4]:
# Загружаем данные
(X_train, y_train), (X_test, y_test) = mnist.load_data()

In [5]:
# Преобразование размерности изображений
X_train = X_train.reshape(60000, 784)
X_test = X_test.reshape(10000, 784)
# Нормализация данных
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255

In [6]:
# Преобразуем метки в категории
Y_train = np_utils.to_categorical(y_train, 10)
Y_test = np_utils.to_categorical(y_test, 10)

In [ ]:


In [7]:
# Создаем последовательную модель
model = Sequential()

# Добавляем уровни сети
model.add(Dense(800, input_dim=784, activation="relu", kernel_initializer="normal"))
model.add(Dense(10, activation="softmax", kernel_initializer="normal"))

# Компилируем модель
model.compile(loss="categorical_crossentropy", optimizer="SGD", metrics=["accuracy"])
print(model.summary())


_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 800)               628000    
_________________________________________________________________
dense_2 (Dense)              (None, 10)                8010      
=================================================================
Total params: 636,010
Trainable params: 636,010
Non-trainable params: 0
_________________________________________________________________
None

In [55]:
# Обучаем сеть
model.fit(X_train, Y_train, batch_size=200, epochs=300, validation_split=0.01, verbose=2)


Train on 59400 samples, validate on 600 samples
Epoch 1/300
10s - loss: 0.0449 - acc: 0.9893 - val_loss: 0.1252 - val_acc: 0.9750
Epoch 2/300
9s - loss: 0.0447 - acc: 0.9895 - val_loss: 0.1248 - val_acc: 0.9783
Epoch 3/300
10s - loss: 0.0445 - acc: 0.9894 - val_loss: 0.1248 - val_acc: 0.9783
Epoch 4/300
10s - loss: 0.0443 - acc: 0.9895 - val_loss: 0.1244 - val_acc: 0.9783
Epoch 5/300
10s - loss: 0.0441 - acc: 0.9896 - val_loss: 0.1246 - val_acc: 0.9767
Epoch 6/300
10s - loss: 0.0439 - acc: 0.9897 - val_loss: 0.1252 - val_acc: 0.9767
Epoch 7/300
13s - loss: 0.0437 - acc: 0.9897 - val_loss: 0.1251 - val_acc: 0.9783
Epoch 8/300
11s - loss: 0.0436 - acc: 0.9899 - val_loss: 0.1251 - val_acc: 0.9767
Epoch 9/300
10s - loss: 0.0434 - acc: 0.9899 - val_loss: 0.1241 - val_acc: 0.9783
Epoch 10/300
9s - loss: 0.0432 - acc: 0.9899 - val_loss: 0.1251 - val_acc: 0.9783
Epoch 11/300
12s - loss: 0.0430 - acc: 0.9899 - val_loss: 0.1244 - val_acc: 0.9783
Epoch 12/300
13s - loss: 0.0428 - acc: 0.9900 - val_loss: 0.1246 - val_acc: 0.9767
Epoch 13/300
12s - loss: 0.0426 - acc: 0.9899 - val_loss: 0.1248 - val_acc: 0.9783
Epoch 14/300
12s - loss: 0.0424 - acc: 0.9902 - val_loss: 0.1247 - val_acc: 0.9767
Epoch 15/300
13s - loss: 0.0422 - acc: 0.9902 - val_loss: 0.1245 - val_acc: 0.9783
Epoch 16/300
12s - loss: 0.0420 - acc: 0.9904 - val_loss: 0.1245 - val_acc: 0.9783
Epoch 17/300
12s - loss: 0.0419 - acc: 0.9902 - val_loss: 0.1245 - val_acc: 0.9783
Epoch 18/300
10s - loss: 0.0417 - acc: 0.9903 - val_loss: 0.1242 - val_acc: 0.9783
Epoch 19/300
9s - loss: 0.0415 - acc: 0.9902 - val_loss: 0.1254 - val_acc: 0.9750
Epoch 20/300
11s - loss: 0.0413 - acc: 0.9905 - val_loss: 0.1246 - val_acc: 0.9783
Epoch 21/300
9s - loss: 0.0411 - acc: 0.9904 - val_loss: 0.1244 - val_acc: 0.9767
Epoch 22/300
8s - loss: 0.0410 - acc: 0.9906 - val_loss: 0.1241 - val_acc: 0.9783
Epoch 23/300
8s - loss: 0.0408 - acc: 0.9906 - val_loss: 0.1248 - val_acc: 0.9783
Epoch 24/300
8s - loss: 0.0406 - acc: 0.9906 - val_loss: 0.1246 - val_acc: 0.9767
Epoch 25/300
8s - loss: 0.0405 - acc: 0.9907 - val_loss: 0.1244 - val_acc: 0.9783
Epoch 26/300
8s - loss: 0.0403 - acc: 0.9907 - val_loss: 0.1243 - val_acc: 0.9783
Epoch 27/300
8s - loss: 0.0401 - acc: 0.9909 - val_loss: 0.1241 - val_acc: 0.9783
Epoch 28/300
8s - loss: 0.0399 - acc: 0.9908 - val_loss: 0.1241 - val_acc: 0.9783
Epoch 29/300
8s - loss: 0.0398 - acc: 0.9908 - val_loss: 0.1242 - val_acc: 0.9767
Epoch 30/300
8s - loss: 0.0396 - acc: 0.9909 - val_loss: 0.1242 - val_acc: 0.9767
Epoch 31/300
8s - loss: 0.0394 - acc: 0.9910 - val_loss: 0.1242 - val_acc: 0.9783
Epoch 32/300
12s - loss: 0.0393 - acc: 0.9911 - val_loss: 0.1245 - val_acc: 0.9767
Epoch 33/300
12s - loss: 0.0391 - acc: 0.9912 - val_loss: 0.1248 - val_acc: 0.9783
Epoch 34/300
12s - loss: 0.0390 - acc: 0.9911 - val_loss: 0.1239 - val_acc: 0.9767
Epoch 35/300
13s - loss: 0.0388 - acc: 0.9913 - val_loss: 0.1244 - val_acc: 0.9767
Epoch 36/300
12s - loss: 0.0386 - acc: 0.9912 - val_loss: 0.1245 - val_acc: 0.9767
Epoch 37/300
10s - loss: 0.0385 - acc: 0.9913 - val_loss: 0.1236 - val_acc: 0.9783
Epoch 38/300
9s - loss: 0.0383 - acc: 0.9914 - val_loss: 0.1247 - val_acc: 0.9767
Epoch 39/300
12s - loss: 0.0381 - acc: 0.9914 - val_loss: 0.1242 - val_acc: 0.9767
Epoch 40/300
12s - loss: 0.0380 - acc: 0.9916 - val_loss: 0.1241 - val_acc: 0.9783
Epoch 41/300
12s - loss: 0.0378 - acc: 0.9915 - val_loss: 0.1245 - val_acc: 0.9783
Epoch 42/300
12s - loss: 0.0377 - acc: 0.9916 - val_loss: 0.1236 - val_acc: 0.9783
Epoch 43/300
12s - loss: 0.0375 - acc: 0.9917 - val_loss: 0.1238 - val_acc: 0.9767
Epoch 44/300
12s - loss: 0.0373 - acc: 0.9917 - val_loss: 0.1236 - val_acc: 0.9783
Epoch 45/300
---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
<ipython-input-55-7a9b518179a1> in <module>()
      1 # Обучаем сеть
----> 2 model.fit(X_train, Y_train, batch_size=200, epochs=300, validation_split=0.01, verbose=2)

/home/kulikov/anaconda3/lib/python3.6/site-packages/keras/models.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, **kwargs)
    861                               class_weight=class_weight,
    862                               sample_weight=sample_weight,
--> 863                               initial_epoch=initial_epoch)
    864 
    865     def evaluate(self, x, y, batch_size=32, verbose=1,

/home/kulikov/anaconda3/lib/python3.6/site-packages/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, **kwargs)
   1428                               val_f=val_f, val_ins=val_ins, shuffle=shuffle,
   1429                               callback_metrics=callback_metrics,
-> 1430                               initial_epoch=initial_epoch)
   1431 
   1432     def evaluate(self, x, y, batch_size=32, verbose=1, sample_weight=None):

/home/kulikov/anaconda3/lib/python3.6/site-packages/keras/engine/training.py in _fit_loop(self, f, ins, out_labels, batch_size, epochs, verbose, callbacks, val_f, val_ins, shuffle, callback_metrics, initial_epoch)
   1077                 batch_logs['size'] = len(batch_ids)
   1078                 callbacks.on_batch_begin(batch_index, batch_logs)
-> 1079                 outs = f(ins_batch)
   1080                 if not isinstance(outs, list):
   1081                     outs = [outs]

/home/kulikov/anaconda3/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py in __call__(self, inputs)
   2266         updated = session.run(self.outputs + [self.updates_op],
   2267                               feed_dict=feed_dict,
-> 2268                               **self.session_kwargs)
   2269         return updated[:len(self.outputs)]
   2270 

/home/kulikov/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py in run(self, fetches, feed_dict, options, run_metadata)
    787     try:
    788       result = self._run(None, fetches, feed_dict, options_ptr,
--> 789                          run_metadata_ptr)
    790       if run_metadata:
    791         proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)

/home/kulikov/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py in _run(self, handle, fetches, feed_dict, options, run_metadata)
    995     if final_fetches or final_targets:
    996       results = self._do_run(handle, final_targets, final_fetches,
--> 997                              feed_dict_string, options, run_metadata)
    998     else:
    999       results = []

/home/kulikov/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py in _do_run(self, handle, target_list, fetch_list, feed_dict, options, run_metadata)
   1130     if handle is None:
   1131       return self._do_call(_run_fn, self._session, feed_dict, fetch_list,
-> 1132                            target_list, options, run_metadata)
   1133     else:
   1134       return self._do_call(_prun_fn, self._session, handle, feed_dict,

/home/kulikov/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py in _do_call(self, fn, *args)
   1137   def _do_call(self, fn, *args):
   1138     try:
-> 1139       return fn(*args)
   1140     except errors.OpError as e:
   1141       message = compat.as_text(e.message)

/home/kulikov/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py in _run_fn(session, feed_dict, fetch_list, target_list, options, run_metadata)
   1119         return tf_session.TF_Run(session, options,
   1120                                  feed_dict, fetch_list, target_list,
-> 1121                                  status, run_metadata)
   1122 
   1123     def _prun_fn(session, handle, feed_dict, fetch_list):

KeyboardInterrupt: 

In [56]:
# Оцениваем качество обучения сети на тестовых данных
scores = model.evaluate(X_test, Y_test, verbose=2)
print("Точность работы на тестовых данных: %.2f%%" % (scores[1]*100))


Точность работы на тестовых данных: 98.07%

In [47]:
scores


Out[47]:
[0.079689020685385914, 0.9778]

In [48]:
model.metrics_names


Out[48]:
['loss', 'acc']

In [ ]:


In [31]:
import pandas as pd
test_df = pd.read_csv("/home/kulikov/Downloads/test (2).csv")

In [ ]:


In [33]:
test_df = test_df.values.astype('float32')

In [34]:
test_df.shape


Out[34]:
(28000, 784)

In [57]:
predictions = model.predict_classes(test_df)


27904/28000 [============================>.] - ETA: 0s

In [58]:
submissions=pd.DataFrame({"ImageId": list(range(1,len(predictions)+1)),
                         "Label": predictions})
submissions.to_csv("DR.csv", index=False, header=True)

In [61]:
model.save_weights("first_w.hdf")