{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-07-02T17:52:19.414792Z","iopub.execute_input":"2021-07-02T17:52:19.415413Z","iopub.status.idle":"2021-07-02T17:52:19.433728Z","shell.execute_reply.started":"2021-07-02T17:52:19.415336Z","shell.execute_reply":"2021-07-02T17:52:19.431565Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 心得\n- 滿快就寫完的，簡單測驗multimodal vs pure。","metadata":{}},{"cell_type":"code","source":"pre_dir = '/kaggle/input/Kannada-MNIST/'\n\ntrain_data = pd.read_csv(pre_dir + 'train.csv')\ntest_data = pd.read_csv(pre_dir + 'test.csv')\n\ntrain_data.head()","metadata":{"execution":{"iopub.status.busy":"2021-07-02T17:55:36.491815Z","iopub.execute_input":"2021-07-02T17:55:36.492179Z","iopub.status.idle":"2021-07-02T17:55:40.464449Z","shell.execute_reply.started":"2021-07-02T17:55:36.492148Z","shell.execute_reply":"2021-07-02T17:55:40.463295Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_data.head()","metadata":{"execution":{"iopub.status.busy":"2021-07-02T17:55:45.201682Z","iopub.execute_input":"2021-07-02T17:55:45.202039Z","iopub.status.idle":"2021-07-02T17:55:45.220392Z","shell.execute_reply.started":"2021-07-02T17:55:45.202007Z","shell.execute_reply":"2021-07-02T17:55:45.219192Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(train_data.shape)\nprint(test_data.shape)","metadata":{"execution":{"iopub.status.busy":"2021-07-02T17:56:14.842382Z","iopub.execute_input":"2021-07-02T17:56:14.842737Z","iopub.status.idle":"2021-07-02T17:56:14.851429Z","shell.execute_reply.started":"2021-07-02T17:56:14.842704Z","shell.execute_reply":"2021-07-02T17:56:14.850337Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 了解pixel\n\ntrain_data.describe()","metadata":{"execution":{"iopub.status.busy":"2021-07-02T17:56:56.730502Z","iopub.execute_input":"2021-07-02T17:56:56.730874Z","iopub.status.idle":"2021-07-02T17:56:59.459790Z","shell.execute_reply.started":"2021-07-02T17:56:56.730840Z","shell.execute_reply":"2021-07-02T17:56:59.458324Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 需要將資料標準化，但要用z-score / minmax呢?\n# minmax適合均勻分配的資料, z-score適合標準常態\n# 但對於圖片資料來說，是視為一個整體，而不是一個column之間是獨立的，故minmax較合適，\n\ntrain_data.iloc[:, 1:] = train_data.iloc[:, 1:] / 255.0\ntest_data.iloc[:, 1:] = test_data.iloc[:, 1:] / 255.0","metadata":{"execution":{"iopub.status.busy":"2021-07-02T18:02:22.308822Z","iopub.execute_input":"2021-07-02T18:02:22.309310Z","iopub.status.idle":"2021-07-02T18:03:10.938412Z","shell.execute_reply.started":"2021-07-02T18:02:22.309269Z","shell.execute_reply":"2021-07-02T18:03:10.937368Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow import keras\n\ntf.__version__","metadata":{"execution":{"iopub.status.busy":"2021-07-02T18:05:54.763325Z","iopub.execute_input":"2021-07-02T18:05:54.763679Z","iopub.status.idle":"2021-07-02T18:06:01.495149Z","shell.execute_reply.started":"2021-07-02T18:05:54.763648Z","shell.execute_reply":"2021-07-02T18:06:01.494212Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # 資料處理完畢就進入模型: 此處只要檢驗multimodal pattern\n# # 法一: 單純CNN結構(圖片輸入)\n# # 法二: CNN + tabular features\n\n\n# # 法一: 將資料轉成28, 28, 1\n\n# def get_pure_cnn_model():\n#     \"\"\"\n#         透過Functional API拼接。\n#     \"\"\"\n#     inputs = keras.Input(shape=(784, ))\n#     x = keras.layers.Reshape((28, 28, 1))(inputs)\n#     x = keras.layers.Conv2D(filters=32, kernel_size=(3, 3), padding='same', activation='relu')(x)\n#     x = keras.layers.Conv2D(filters=32, kernel_size=(3, 3), padding='same', activation='relu')(x)  \n#     x = keras.layers.Conv2D(filters=32, kernel_size=(3, 3), padding='same', activation='relu')(x)\n#     x = keras.layers.MaxPool2D(pool_size=(2, 2), strides=(2, 2))(x)\n#     x = keras.layers.Flatten()(x)\n#     outputs = keras.layers.Dense(10, activation='softmax')(x)\n    \n#     model = keras.Model(inputs, outputs)\n#     model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['acc'])\n#     return model\n\n# pure_cnn = get_pure_cnn_model()\n# pure_cnn.fit(train_data.iloc[:, 1:], train_data.iloc[:, 0], validation_split=0.2, batch_size=128, epochs=10)","metadata":{"execution":{"iopub.status.busy":"2021-07-02T18:40:05.830887Z","iopub.execute_input":"2021-07-02T18:40:05.831277Z","iopub.status.idle":"2021-07-02T18:40:32.383478Z","shell.execute_reply.started":"2021-07-02T18:40:05.831229Z","shell.execute_reply":"2021-07-02T18:40:32.382621Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # result for pure cnn\n# pred_pure_cnn = pure_cnn.predict(test_data.iloc[:, 1:])\n# pred_pure_cnn = np.argmax(pred_pure_cnn, axis=1)\n# pred_pure_cnn = np.concatenate([test_data.iloc[:, 0:1], pred_pure_cnn.reshape(-1, 1)], axis=1)\n# pred_pure_cnn = pd.DataFrame(pred_pure_cnn, columns=['id', 'label'])\n# pred_pure_cnn.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2021-07-02T18:40:32.387290Z","iopub.execute_input":"2021-07-02T18:40:32.387604Z","iopub.status.idle":"2021-07-02T18:40:32.816922Z","shell.execute_reply.started":"2021-07-02T18:40:32.387573Z","shell.execute_reply":"2021-07-02T18:40:32.815867Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# pred_pure_cnn","metadata":{"execution":{"iopub.status.busy":"2021-07-02T18:40:32.819322Z","iopub.execute_input":"2021-07-02T18:40:32.819990Z","iopub.status.idle":"2021-07-02T18:40:32.833967Z","shell.execute_reply.started":"2021-07-02T18:40:32.819944Z","shell.execute_reply":"2021-07-02T18:40:32.833085Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_multimodal_model():\n    \"\"\"\n        透過Functional API拼接。\n    \"\"\"\n    inputs = keras.Input(shape=(784, ))\n    x = keras.layers.Reshape((28, 28, 1))(inputs)\n    x = keras.layers.Conv2D(filters=32, kernel_size=(3, 3), padding='same', activation='relu')(x)\n    x = keras.layers.Conv2D(filters=32, kernel_size=(3, 3), padding='same', activation='relu')(x)  \n    x = keras.layers.Conv2D(filters=32, kernel_size=(3, 3), padding='same', activation='relu')(x)\n    x = keras.layers.MaxPool2D(pool_size=(2, 2), strides=(2, 2))(x)\n    x = keras.layers.Flatten()(x)\n    x = keras.layers.Concatenate()([inputs, x])\n    outputs = keras.layers.Dense(10, activation='softmax')(x)\n    \n    model = keras.Model(inputs, outputs)\n    model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['acc'])\n    return model\n\nultimodal_cnn = get_multimodal_model()\nultimodal_cnn.fit(train_data.iloc[:, 1:], train_data.iloc[:, 0], validation_split=0.2, batch_size=128, epochs=10)","metadata":{"execution":{"iopub.status.busy":"2021-07-02T18:39:20.320811Z","iopub.execute_input":"2021-07-02T18:39:20.321188Z","iopub.status.idle":"2021-07-02T18:39:46.926393Z","shell.execute_reply.started":"2021-07-02T18:39:20.321156Z","shell.execute_reply":"2021-07-02T18:39:46.925497Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# result for multimodal cnn\npred_ultimodal_cnn = ultimodal_cnn.predict(test_data.iloc[:, 1:])\npred_ultimodal_cnn = np.argmax(pred_ultimodal_cnn, axis=1)\npred_ultimodal_cnn = np.concatenate([test_data.iloc[:, 0:1], pred_ultimodal_cnn.reshape(-1, 1)], axis=1)\npred_ultimodal_cnn = pd.DataFrame(pred_ultimodal_cnn, columns=['id', 'label'])\npred_ultimodal_cnn.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2021-07-02T18:39:53.036840Z","iopub.execute_input":"2021-07-02T18:39:53.037204Z","iopub.status.idle":"2021-07-02T18:39:53.451515Z","shell.execute_reply.started":"2021-07-02T18:39:53.037171Z","shell.execute_reply":"2021-07-02T18:39:53.450642Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred_ultimodal_cnn","metadata":{"execution":{"iopub.status.busy":"2021-07-02T18:39:58.443500Z","iopub.execute_input":"2021-07-02T18:39:58.443879Z","iopub.status.idle":"2021-07-02T18:39:58.454693Z","shell.execute_reply.started":"2021-07-02T18:39:58.443847Z","shell.execute_reply":"2021-07-02T18:39:58.453660Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 結果\n- pure\n- multimodal","metadata":{}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}