{"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":"markdown","source":"Imports:","metadata":{"pycharm":{"name":"#%% md\n"}}},{"cell_type":"code","source":"#basic imports:\n\n#data exploration/display\nimport numpy as np #math\nimport pandas as pd #data\nimport plotly.express as px #graphing\n#import sklearn\n#from sklearn.model_selection import train_test_split\n\n#ml modeling\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom keras import layers\n#from keras.models import Sequential","metadata":{"pycharm":{"name":"#%%\n"},"execution":{"iopub.status.busy":"2022-07-14T01:48:07.684504Z","iopub.execute_input":"2022-07-14T01:48:07.684929Z","iopub.status.idle":"2022-07-14T01:48:20.356081Z","shell.execute_reply.started":"2022-07-14T01:48:07.684895Z","shell.execute_reply":"2022-07-14T01:48:20.354852Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Reading Datasets","metadata":{"pycharm":{"name":"#%% md\n"}}},{"cell_type":"code","source":"train = pd.read_csv('../input/digit-recognizer/train.csv')\ntrain.shape","metadata":{"collapsed":false,"pycharm":{"name":"#%%\n"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-07-14T01:48:20.358218Z","iopub.execute_input":"2022-07-14T01:48:20.359123Z","iopub.status.idle":"2022-07-14T01:48:24.234208Z","shell.execute_reply.started":"2022-07-14T01:48:20.359087Z","shell.execute_reply":"2022-07-14T01:48:24.232518Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test = pd.read_csv('../input/digit-recognizer/test.csv')\ntest.shape","metadata":{"collapsed":false,"pycharm":{"name":"#%%\n"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-07-14T01:48:24.236166Z","iopub.execute_input":"2022-07-14T01:48:24.236642Z","iopub.status.idle":"2022-07-14T01:48:26.371287Z","shell.execute_reply.started":"2022-07-14T01:48:24.236592Z","shell.execute_reply":"2022-07-14T01:48:26.369789Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Visualizing Data:","metadata":{"pycharm":{"name":"#%% md\n"}}},{"cell_type":"code","source":"fig_pie= px.pie(train, 'label')\nfig_pie.show()","metadata":{"collapsed":false,"pycharm":{"name":"#%%\n"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-07-14T01:48:26.374639Z","iopub.execute_input":"2022-07-14T01:48:26.375871Z","iopub.status.idle":"2022-07-14T01:48:27.494546Z","shell.execute_reply.started":"2022-07-14T01:48:26.375796Z","shell.execute_reply":"2022-07-14T01:48:27.492751Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Data Reformatting & Normalization","metadata":{"pycharm":{"name":"#%% md\n"}}},{"cell_type":"code","source":"train_imgs = train.iloc[:,1:].values.astype('float32')\nprint (type(train_imgs))\n\ntrain_labels = train.iloc[:,0].values.astype('int32')\nprint (type(train_labels))\n\ntest_imgs = test.values.astype('float32')\nprint (type(test_imgs))","metadata":{"collapsed":false,"pycharm":{"name":"#%%\n"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-07-14T01:48:27.496357Z","iopub.execute_input":"2022-07-14T01:48:27.496734Z","iopub.status.idle":"2022-07-14T01:48:27.689621Z","shell.execute_reply.started":"2022-07-14T01:48:27.496701Z","shell.execute_reply":"2022-07-14T01:48:27.687952Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_imgs.shape","metadata":{"collapsed":false,"pycharm":{"name":"#%%\n"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-07-14T01:48:27.691743Z","iopub.execute_input":"2022-07-14T01:48:27.692215Z","iopub.status.idle":"2022-07-14T01:48:27.700922Z","shell.execute_reply.started":"2022-07-14T01:48:27.692176Z","shell.execute_reply":"2022-07-14T01:48:27.699570Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_imgs.shape","metadata":{"collapsed":false,"pycharm":{"name":"#%%\n"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-07-14T01:48:27.704043Z","iopub.execute_input":"2022-07-14T01:48:27.704637Z","iopub.status.idle":"2022-07-14T01:48:27.714459Z","shell.execute_reply.started":"2022-07-14T01:48:27.704583Z","shell.execute_reply":"2022-07-14T01:48:27.713130Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_imgs = train_imgs.reshape(-1, 28, 28, 1)\ntest_imgs = test_imgs.reshape(-1, 28, 28, 1)","metadata":{"collapsed":false,"pycharm":{"name":"#%%\n"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-07-14T01:48:27.716304Z","iopub.execute_input":"2022-07-14T01:48:27.716911Z","iopub.status.idle":"2022-07-14T01:48:27.724353Z","shell.execute_reply.started":"2022-07-14T01:48:27.716874Z","shell.execute_reply":"2022-07-14T01:48:27.723386Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_imgs = train_imgs / 255\ntest_imgs = test_imgs / 255","metadata":{"collapsed":false,"pycharm":{"name":"#%%\n"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-07-14T01:48:27.726017Z","iopub.execute_input":"2022-07-14T01:48:27.726948Z","iopub.status.idle":"2022-07-14T01:48:27.819495Z","shell.execute_reply.started":"2022-07-14T01:48:27.726912Z","shell.execute_reply":"2022-07-14T01:48:27.818322Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_imgs.shape","metadata":{"collapsed":false,"pycharm":{"name":"#%%\n"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-07-14T01:48:27.825772Z","iopub.execute_input":"2022-07-14T01:48:27.826439Z","iopub.status.idle":"2022-07-14T01:48:27.833655Z","shell.execute_reply.started":"2022-07-14T01:48:27.826402Z","shell.execute_reply":"2022-07-14T01:48:27.832679Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_imgs.shape","metadata":{"collapsed":false,"pycharm":{"name":"#%%\n"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-07-14T01:48:27.835693Z","iopub.execute_input":"2022-07-14T01:48:27.836120Z","iopub.status.idle":"2022-07-14T01:48:27.846236Z","shell.execute_reply.started":"2022-07-14T01:48:27.836067Z","shell.execute_reply":"2022-07-14T01:48:27.844465Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_labels","metadata":{"collapsed":false,"pycharm":{"name":"#%%\n"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-07-14T01:48:27.848172Z","iopub.execute_input":"2022-07-14T01:48:27.848905Z","iopub.status.idle":"2022-07-14T01:48:27.861338Z","shell.execute_reply.started":"2022-07-14T01:48:27.848855Z","shell.execute_reply":"2022-07-14T01:48:27.859865Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Visualizing Digits","metadata":{}},{"cell_type":"code","source":"#any index number from 0-41999\nsamp_num=41999\nfig_example_num = px.imshow(train_imgs[samp_num,:, :, 0], title=str(train_labels[samp_num]))\nfig_example_num.show()","metadata":{"collapsed":false,"pycharm":{"name":"#%%\n"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-07-14T02:08:01.164759Z","iopub.execute_input":"2022-07-14T02:08:01.165293Z","iopub.status.idle":"2022-07-14T02:08:01.227294Z","shell.execute_reply.started":"2022-07-14T02:08:01.165255Z","shell.execute_reply":"2022-07-14T02:08:01.225990Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Create Model","metadata":{"pycharm":{"name":"#%% md\n"}}},{"cell_type":"code","source":"def create_custom_base(): #definition of custom base\n    base=keras.Sequential([\n        layers.Conv2D(filters=32, kernel_size=(2,2), activation='relu',input_shape=(28,28,1)),\n        layers.MaxPool2D(),\n        layers.Conv2D(filters=64, kernel_size=(2,2), activation='relu'),\n        layers.MaxPool2D(),\n        layers.Conv2D(filters=256, kernel_size=(2,2), activation='relu'),\n    ])\n    return base","metadata":{"collapsed":false,"pycharm":{"name":"#%%\n"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-07-14T01:48:27.945147Z","iopub.execute_input":"2022-07-14T01:48:27.945496Z","iopub.status.idle":"2022-07-14T01:48:27.952746Z","shell.execute_reply.started":"2022-07-14T01:48:27.945468Z","shell.execute_reply":"2022-07-14T01:48:27.951874Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def create_model():\n    #choice of base (pretrained or custom)\n    my_base=create_custom_base()\n\n    #head\n    model=keras.Sequential([\n        my_base,#base interchangeable\n\n        layers.Flatten(),\n        layers.Dense(units=128,activation='relu'),\n        layers.Dense(units=64,activation='relu'),\n        layers.Dropout(0.2),\n        layers.Dense(units=8,activation='relu'),\n        layers.Dense(units=10, activation='sigmoid'),\n    ])\n\n    #complie the model\n    model.compile(\n        optimizer = 'adam',\n        loss = 'sparse_categorical_crossentropy',\n        metrics = ['accuracy']\n    )\n\n    return model","metadata":{"collapsed":false,"pycharm":{"name":"#%%\n"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-07-14T01:48:27.954264Z","iopub.execute_input":"2022-07-14T01:48:27.954649Z","iopub.status.idle":"2022-07-14T01:48:27.967762Z","shell.execute_reply.started":"2022-07-14T01:48:27.954615Z","shell.execute_reply":"2022-07-14T01:48:27.966220Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cnn_model = create_model()","metadata":{"collapsed":false,"pycharm":{"name":"#%%\n"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-07-14T01:48:27.970266Z","iopub.execute_input":"2022-07-14T01:48:27.971471Z","iopub.status.idle":"2022-07-14T01:48:28.687646Z","shell.execute_reply.started":"2022-07-14T01:48:27.971419Z","shell.execute_reply":"2022-07-14T01:48:28.686000Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Train Model","metadata":{"pycharm":{"name":"#%% md\n"}}},{"cell_type":"code","source":"#Callbacks/Model Setup\nearly_stopping = keras.callbacks.EarlyStopping(\n    min_delta=0.001,\n    patience=5,\n    restore_best_weights=True,\n)\nepochs=25","metadata":{"collapsed":false,"pycharm":{"name":"#%%\n"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-07-14T01:48:28.689432Z","iopub.execute_input":"2022-07-14T01:48:28.689877Z","iopub.status.idle":"2022-07-14T01:48:28.697200Z","shell.execute_reply.started":"2022-07-14T01:48:28.689819Z","shell.execute_reply":"2022-07-14T01:48:28.695165Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Train Model\nhistory = cnn_model.fit(\n    x=train_imgs,\n    y=train_labels,\n    epochs=epochs,\n    validation_split=.2,\n    #batch_size=4000,\n    #callbacks=early_stopping,\n)","metadata":{"collapsed":false,"pycharm":{"name":"#%%\n"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-07-14T01:48:28.700753Z","iopub.execute_input":"2022-07-14T01:48:28.701656Z","iopub.status.idle":"2022-07-14T01:59:54.261109Z","shell.execute_reply.started":"2022-07-14T01:48:28.701615Z","shell.execute_reply":"2022-07-14T01:59:54.259131Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Graphing Data","metadata":{"pycharm":{"name":"#%% md\n"}}},{"cell_type":"code","source":"#Gather loss and accuracy\ntraining_stats = pd.DataFrame(history.history)\n\n#convert to a np.array so plotly wont freakout\nepochs_X_axis = np.array(history.epoch)","metadata":{"collapsed":false,"pycharm":{"name":"#%%\n"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-07-14T01:59:54.264111Z","iopub.execute_input":"2022-07-14T01:59:54.265231Z","iopub.status.idle":"2022-07-14T01:59:54.273621Z","shell.execute_reply.started":"2022-07-14T01:59:54.265173Z","shell.execute_reply":"2022-07-14T01:59:54.272125Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#display loss graph\nfig_loss_stats = px.line(data_frame=training_stats,x=epochs_X_axis ,y=['loss', 'val_loss'])\nfig_loss_stats.show()","metadata":{"collapsed":false,"pycharm":{"name":"#%%\n"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-07-14T01:59:54.275565Z","iopub.execute_input":"2022-07-14T01:59:54.277211Z","iopub.status.idle":"2022-07-14T01:59:54.426931Z","shell.execute_reply.started":"2022-07-14T01:59:54.277067Z","shell.execute_reply":"2022-07-14T01:59:54.425381Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#display accuracy graph\nfig_acc_stats = px.line(data_frame=training_stats,x=epochs_X_axis ,y=['accuracy', 'val_accuracy'])\nfig_acc_stats.show()","metadata":{"collapsed":false,"pycharm":{"name":"#%%\n"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-07-14T01:59:54.429035Z","iopub.execute_input":"2022-07-14T01:59:54.429403Z","iopub.status.idle":"2022-07-14T01:59:54.512167Z","shell.execute_reply.started":"2022-07-14T01:59:54.429371Z","shell.execute_reply":"2022-07-14T01:59:54.510491Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Prepare Submission","metadata":{"pycharm":{"name":"#%% md\n"}}},{"cell_type":"code","source":"#unfiltered data containing the probablities of an img being a digit\ntest_preds = cnn_model.predict(test_imgs)\ntest_preds","metadata":{"collapsed":false,"pycharm":{"name":"#%%\n"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-07-14T01:59:54.514357Z","iopub.execute_input":"2022-07-14T01:59:54.515107Z","iopub.status.idle":"2022-07-14T02:00:02.227297Z","shell.execute_reply.started":"2022-07-14T01:59:54.515046Z","shell.execute_reply":"2022-07-14T02:00:02.225650Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#take the highest probability guess of the model and assign that guess to ImageID\ntest_preds = test_preds.argmax(axis=1)\ntest_preds","metadata":{"collapsed":false,"pycharm":{"name":"#%%\n"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-07-14T02:00:02.230130Z","iopub.execute_input":"2022-07-14T02:00:02.230998Z","iopub.status.idle":"2022-07-14T02:00:02.242634Z","shell.execute_reply.started":"2022-07-14T02:00:02.230938Z","shell.execute_reply":"2022-07-14T02:00:02.240772Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#prepare submission\nsubmission = pd.read_csv('../input/digit-recognizer-submission/sample_submission.csv')\nsubmission['Label'] = test_preds\nsubmission.to_csv('sample_submission.csv', index=False)","metadata":{"collapsed":false,"pycharm":{"name":"#%%\n"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-07-14T02:01:56.425372Z","iopub.execute_input":"2022-07-14T02:01:56.425902Z","iopub.status.idle":"2022-07-14T02:01:56.508246Z","shell.execute_reply.started":"2022-07-14T02:01:56.425861Z","shell.execute_reply":"2022-07-14T02:01:56.506712Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#view composition of digit guesses as a pie chart of percentages\nfig_pie = px.pie(submission, 'Label')\nfig_pie.show()","metadata":{"collapsed":false,"pycharm":{"name":"#%%\n"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-07-14T02:02:01.246382Z","iopub.execute_input":"2022-07-14T02:02:01.246848Z","iopub.status.idle":"2022-07-14T02:02:01.318745Z","shell.execute_reply.started":"2022-07-14T02:02:01.246797Z","shell.execute_reply":"2022-07-14T02:02:01.317759Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Extra Code Not Used Earlier:","metadata":{"pycharm":{"name":"#%% md\n"}}},{"cell_type":"code","source":"#fig_pie.show()\n#missing_values = submission.isnull().sum()\n#missing_values[0:10]\n#train_imgs, val_imgs, train_labels, val_labels = train_test_split(train_imgs, train_labels,test_size=.20, random_state=1337, shuffle=True)\n#submission = submission.drop(columns=['label'])","metadata":{"collapsed":false,"pycharm":{"name":"#%%\n"},"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2022-07-14T02:00:02.785092Z","iopub.status.idle":"2022-07-14T02:00:02.786778Z","shell.execute_reply.started":"2022-07-14T02:00:02.785791Z","shell.execute_reply":"2022-07-14T02:00:02.785860Z"},"trusted":true},"execution_count":null,"outputs":[]}]}