{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport pandas as pd\nimport numpy as np\nimport re\nfrom sklearn.model_selection import train_test_split\ndef convert_boardtomatrix(board):\n    matrix = np.zeros(shape=[board.shape[0], board.shape[1]])\n    for i in range(board.shape[0]):\n        for j in range(board.shape[1]):\n            # a represents the value of 8 neighbours\n            a = []\n            if i - 1 >= 0:\n                a.append(1 if board[i - 1][j] == 1 else 0)\n            if j - 1 >= 0:\n                a.append(1 if board[i][j - 1] == 1 else 0)\n            if i - 1 >= 0 and j - 1 >= 0:\n                a.append(1 if board[i - 1][j - 1] == 1 else 0)\n            if i + 1 < board.shape[0]:\n                a.append(1 if board[i + 1][j] == 1 else 0)\n            if j + 1 < board.shape[1]:\n                a.append(1 if board[i][j + 1] == 1 else 0)\n            if i + 1 < board.shape[0] and j + 1 < board.shape[1]:\n                a.append(1 if board[i + 1][j + 1] == 1 else 0)\n            if i - 1 >= 0 and j + 1 < board.shape[1]:\n                a.append(1 if board[i - 1][j + 1] == 1 else 0)\n            if i + 1 < board.shape[0] and j - 1 >= 0:\n                a.append(1 if board[i + 1][j - 1] == 1 else 0)\n\n            matrix[i][j] = np.sum(a)\n    return matrix\n\n\n\n\ndef filter_string(str_arr, regex): \n    p = re.compile(regex)\n    return [ s for s in str_arr if p.match(s) ]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df = pd.read_csv('../input/conways-reverse-game-of-life-2020/train.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"start_cols = filter_string(df.columns, 'start')\nstop_cols = filter_string(df.columns, 'stop')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X = df[start_cols][:10000].to_numpy()\nY = df[stop_cols][:10000].to_numpy()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.3)\nx_train = np.array([convert_boardtomatrix(tm.reshape([25, 25])) for tm in x_train]).reshape([-1, 25, 25, 1])\nx_test = np.array([convert_boardtomatrix(tm.reshape([25, 25])) for tm in x_test]).reshape([-1, 25, 25, 1])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras import models, layers, losses\ndef build_CNN():\n    model = models.Sequential()\n    model.add(layers.Conv2D(8, (3, 3), activation='relu', input_shape=(25, 25, 1)))\n    model.add(layers.MaxPooling2D((2, 2)))\n    model.add(layers.Conv2D(16, (2, 2), activation='relu'))\n    model.add(layers.Flatten())\n    model.add(layers.Dense(625, activation='sigmoid'))\n    model.compile(optimizer='adam',\n              loss='MSE',\n              metrics=['accuracy'])\n    return model","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = build_CNN()\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"history = model.fit(x_train, y_train, epochs=10, validation_data=(x_test, y_test))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.plot(history.history['accuracy'])","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}