# This Python 3 environment comes with many helpful analytics libraries installed
# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python
# For example, here's several helpful packages to load in 

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)

import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.optimizers import RMSprop, Adam
from keras.layers.advanced_activations import LeakyReLU, PReLU
from keras import backend as K
import random
import matplotlib.pyplot as plt
# Input data files are available in the "../input/" directory.
# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory

print("Loading Data...")

batch_size = 200
train_size = 35000
num_classes = 10
epochs = 30

train = pd.read_csv("../input/train.csv")
train = train.values


random.shuffle(train)

train = train[1:]

x_train = train[:train_size, 1:]
y_train = train[:train_size, 0:1]

x_test = train[train_size:, 1:]
y_test = train[train_size:, 0:1]

x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

img_rows = 28
img_cols = 28

#x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
#x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
#input_shape = (img_rows, img_cols, 1)

x_train = np.array(list(map(lambda x : x.reshape(28,28).transpose().flatten(), x_train)))
x_test = np.array(list(map(lambda x : x.reshape(28,28).transpose().flatten(), x_test)))

y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

model = Sequential()

model.add(Dense(512,
                activation='relu',
                input_shape=(784,)))
model.add(Dropout(0.6))

model.add(Dense(512, activation='relu'))
model.add(Dropout(0.6))

model.add(Dense(256, activation='relu'))
model.add(Dropout(0.6))

model.add(Dense(num_classes, activation='softmax'))

model.summary()

model.compile(loss="categorical_crossentropy",
              optimizer=Adam(lr=0.001),
              metrics=["accuracy"])

print("Training Model...")

model.fit(x_train, y_train,
    batch_size=batch_size,
    epochs=epochs,
    verbose=2,
    validation_split=0.1)

score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])


print("loading Competition data...")
test = pd.read_csv("../input/test.csv")
test = test.values

test = np.array(list(map(lambda x : x.reshape(28,28).transpose().flatten(), test)))
#test = test.reshape(test.shape[0], img_rows, img_cols, 1)

predicted_classes = model.predict_classes(test)

my_submission = pd.DataFrame({"ImageId": range(1,28001),"Label": predicted_classes})
my_submission.to_csv('submission.csv', index=False)

print("Done!")

model.save("digitsDNN_Celien.h5")
