import csv

import matplotlib.pyplot as plt
import numpy
import PIL
import PIL.ImageOps as ImageOps
import tensorflow
import tensorflow.keras.callbacks
import tensorflow.keras.layers
import tensorflow.keras.models

x_train = []
y_train = []
with open('../input/train.csv') as trainCsv:
    csvReader = csv.reader(trainCsv)
    
    for index, trainRow in enumerate(csvReader):
        if index != 0:
            y_train.append(trainRow.pop(0))
            x_train.append(list(map(float, trainRow)))

input_shape = (28, 28, 1)
x_train = numpy.asarray(x_train)
x_train = x_train.reshape(x_train.shape[0], input_shape[0], input_shape[1], input_shape[2]).astype('float32') / 255
y_train = numpy.asarray(y_train)

# Importing the required Keras modules containing model and layers
# Creating a Sequential Model and adding the layers
model = tensorflow.keras.models.Sequential()
model.add(tensorflow.keras.layers.Conv2D(16, kernel_size=(3, 3), input_shape=input_shape))
model.add(tensorflow.keras.layers.MaxPooling2D(pool_size=(2, 2)))
model.add(tensorflow.keras.layers.Conv2D(32, kernel_size=(3, 3), input_shape=input_shape))
model.add(tensorflow.keras.layers.MaxPooling2D(pool_size=(2, 2)))
model.add(tensorflow.keras.layers.Flatten())  # Flattening the 2D arrays for fully connected layers
model.add(tensorflow.keras.layers.Dense(128, activation=tensorflow.nn.relu))
model.add(tensorflow.keras.layers.Dropout(0.2))
model.add(tensorflow.keras.layers.Dense(10, activation=tensorflow.nn.softmax))

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.summary()

model.fit(x=x_train, y=y_train, epochs=10)

with open('../input/test.csv') as csvFile:
    csvReader = csv.reader(csvFile)

    with open('submission.csv', 'w+') as submissionCsvFile:
        csvWriter = csv.writer(submissionCsvFile, lineterminator='\n')
        csvWriter.writerow(['ImageId', 'Label'])

        for index, image in enumerate(csvReader):
            if index != 0:
                image = numpy.asarray(list(map(lambda pixel: int(pixel) / 255, image)))

                prediction = model.predict(image.reshape(1, 28, 28, 1))
                csvWriter.writerow([index, prediction.argmax()])
                
print('Done')
