{"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":"import tensorflow as tf\nimport pandas as pd\nimport numpy as np","metadata":{"id":"WfrawPLNOfMG","execution":{"iopub.status.busy":"2022-08-20T12:34:34.826571Z","iopub.execute_input":"2022-08-20T12:34:34.827005Z","iopub.status.idle":"2022-08-20T12:34:34.832735Z","shell.execute_reply.started":"2022-08-20T12:34:34.826970Z","shell.execute_reply":"2022-08-20T12:34:34.831467Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nprint(os.listdir(\"../input\"))","metadata":{"execution":{"iopub.status.busy":"2022-08-20T12:34:36.218732Z","iopub.execute_input":"2022-08-20T12:34:36.219182Z","iopub.status.idle":"2022-08-20T12:34:36.225656Z","shell.execute_reply.started":"2022-08-20T12:34:36.219143Z","shell.execute_reply":"2022-08-20T12:34:36.224401Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv(\"../input/digit-recognizer/train.csv\")\ntest = pd.read_csv(\"../input/digit-recognizer/test.csv\")","metadata":{"id":"1bWFVRjcbvlu","execution":{"iopub.status.busy":"2022-08-20T12:34:37.486591Z","iopub.execute_input":"2022-08-20T12:34:37.486995Z","iopub.status.idle":"2022-08-20T12:34:43.166848Z","shell.execute_reply.started":"2022-08-20T12:34:37.486961Z","shell.execute_reply":"2022-08-20T12:34:43.165631Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_train = train.iloc[:,0].to_numpy()\nx_train = train.iloc[:,1:].to_numpy().reshape(train.shape[0] ,28 , 28, 1) / 255\n\nx_test = test.to_numpy().reshape(test.shape[0] ,28 , 28, 1) / 255","metadata":{"id":"8Sn_v61dcCiU","execution":{"iopub.status.busy":"2022-08-20T12:34:44.444312Z","iopub.execute_input":"2022-08-20T12:34:44.444739Z","iopub.status.idle":"2022-08-20T12:34:44.677117Z","shell.execute_reply.started":"2022-08-20T12:34:44.444701Z","shell.execute_reply":"2022-08-20T12:34:44.675439Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"features_placeholder = tf.constant(x_train, dtype=tf.float32)\nlabels_placeholder = tf.constant(y_train, dtype=tf.int32)\n\nds_train = tf.data.Dataset.from_tensor_slices( (features_placeholder, labels_placeholder) )","metadata":{"id":"iF1188z818yo","execution":{"iopub.status.busy":"2022-08-20T12:34:50.872144Z","iopub.execute_input":"2022-08-20T12:34:50.872577Z","iopub.status.idle":"2022-08-20T12:34:51.187385Z","shell.execute_reply.started":"2022-08-20T12:34:50.872539Z","shell.execute_reply":"2022-08-20T12:34:51.185971Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ds_train = ds_train.cache()\nds_train = ds_train.shuffle(250)\nds_train = ds_train.batch(128)\nds_train = ds_train.prefetch(tf.data.AUTOTUNE)","metadata":{"id":"CK98-o6O5Wyt","execution":{"iopub.status.busy":"2022-08-20T12:34:55.039479Z","iopub.execute_input":"2022-08-20T12:34:55.039885Z","iopub.status.idle":"2022-08-20T12:34:55.057348Z","shell.execute_reply.started":"2022-08-20T12:34:55.039849Z","shell.execute_reply":"2022-08-20T12:34:55.056285Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def downsample(filters, size, apply_batchnorm=True):\n  initializer = tf.random_normal_initializer(0., 0.02)\n\n  result = tf.keras.Sequential()\n  result.add(\n      tf.keras.layers.Conv2D(filters, size, strides=2, padding='same',\n                             kernel_initializer=initializer, use_bias=False))\n\n  if apply_batchnorm:\n    result.add(tf.keras.layers.BatchNormalization())\n\n  result.add(tf.keras.layers.LeakyReLU())\n\n  return result","metadata":{"id":"gMqVF0bh1RJG","execution":{"iopub.status.busy":"2022-08-20T12:34:59.750699Z","iopub.execute_input":"2022-08-20T12:34:59.751114Z","iopub.status.idle":"2022-08-20T12:34:59.758704Z","shell.execute_reply.started":"2022-08-20T12:34:59.751079Z","shell.execute_reply":"2022-08-20T12:34:59.757446Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def upsample(filters, size, apply_dropout=False):\n  initializer = tf.random_normal_initializer(0., 0.02)\n\n  result = tf.keras.Sequential()\n  result.add(\n    tf.keras.layers.Conv2DTranspose(filters, size, strides=2,\n                                    padding='same',\n                                    kernel_initializer=initializer,\n                                    use_bias=False))\n\n  result.add(tf.keras.layers.BatchNormalization())\n\n  if apply_dropout:\n      result.add(tf.keras.layers.Dropout(0.5))\n\n  result.add(tf.keras.layers.ReLU())\n\n  return result","metadata":{"id":"DdpkGPMI1p-R","execution":{"iopub.status.busy":"2022-08-20T12:35:02.353052Z","iopub.execute_input":"2022-08-20T12:35:02.354026Z","iopub.status.idle":"2022-08-20T12:35:02.361202Z","shell.execute_reply.started":"2022-08-20T12:35:02.353979Z","shell.execute_reply":"2022-08-20T12:35:02.360127Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"inputs = tf.keras.layers.Input(shape=[28, 28, 1])\n\n# part find interest point and compute dist between each pixel like \ndown = downsample(64, 4, apply_batchnorm=True)(inputs)\nup = upsample(64, 4, apply_dropout=True)(down)\nmodel = tf.keras.layers.Concatenate()([up, inputs])\ndown = downsample(64, 4, apply_batchnorm=True)(model)\nup = upsample(64, 4, apply_dropout=True)(down)\nmodel = tf.keras.layers.Concatenate()([up, inputs])\ndown = downsample(64, 4, apply_batchnorm=False)(model)\nup = upsample(64, 4, apply_dropout=True)(down)\nmodel = tf.keras.layers.Concatenate()([up, inputs])\ndown = downsample(64, 4, apply_batchnorm=False)(model)\nup = upsample(64, 4, apply_dropout=True)(down)\nmodel = tf.keras.layers.Concatenate()([up, inputs])\n\n# part analising (classique: conv + relu)\ndown = downsample(64, 4, apply_batchnorm=False)(model)\ndown = downsample(128, 4, apply_batchnorm=False)(down)\ndown = downsample(256, 4, apply_batchnorm=False)(down)\ndown = downsample(256, 4, apply_batchnorm=False)(down)\nmodel = tf.keras.layers.Flatten()(down)\nmodel = tf.keras.layers.Dense(100)(model)\nmodel = tf.keras.layers.Dense(100)(model)\nout = tf.keras.layers.Dense(10)(model) #,activation=\"softmax\"\n\nmodel = tf.keras.Model(inputs=inputs, outputs=out)\ntf.keras.utils.plot_model(model, show_shapes=True, dpi=64)","metadata":{"id":"YkuwhH2w1sbi","outputId":"2a78ccce-8640-4adb-a418-c2cfa37f311d","execution":{"iopub.status.busy":"2022-08-20T12:35:04.566125Z","iopub.execute_input":"2022-08-20T12:35:04.566827Z","iopub.status.idle":"2022-08-20T12:35:07.692505Z","shell.execute_reply.started":"2022-08-20T12:35:04.566780Z","shell.execute_reply":"2022-08-20T12:35:07.690748Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)\noptimizer = tf.keras.optimizers.Adam()\n\ndef scheduler(epoch, lr):\n  if epoch < 10:\n    return lr\n  else:\n    return lr * tf.math.exp(-0.1)\n\ncallback = tf.keras.callbacks.LearningRateScheduler(scheduler)\n\nmodel.compile(\n    optimizer=optimizer,\n    loss=loss_object,\n    metrics=[tf.keras.metrics.SparseCategoricalAccuracy()],\n)\n\nmodel.fit(\n    ds_train,\n    epochs=4,\n    callbacks=[callback]\n)","metadata":{"id":"NTiIYqSQ1wBO","outputId":"cc1c42b7-80a8-4157-d7e4-5c1f63022f09","execution":{"iopub.status.busy":"2022-08-20T12:35:07.694964Z","iopub.execute_input":"2022-08-20T12:35:07.695448Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)\noptimizer = tf.keras.optimizers.SGD()\n\ndef scheduler(epoch, lr):\n  return lr * tf.math.exp(-0.1)\n\ncallback = tf.keras.callbacks.LearningRateScheduler(scheduler)\n\nmodel.compile(\n    optimizer=optimizer,\n    loss=loss_object,\n    metrics=[tf.keras.metrics.SparseCategoricalAccuracy()]\n    \n)\n\nmodel.fit(\n    ds_train,\n    epochs=4,\n    callbacks=[callback]\n)","metadata":{"id":"PAvpDuFtMFXV","outputId":"cab543fa-dcee-46de-c62b-a01f231da10b","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predict = model.predict(x_test)","metadata":{"id":"AjidFU-x1xm6","execution":{"iopub.status.busy":"2022-08-20T12:28:38.898642Z","iopub.status.idle":"2022-08-20T12:28:38.899233Z","shell.execute_reply.started":"2022-08-20T12:28:38.898932Z","shell.execute_reply":"2022-08-20T12:28:38.898960Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"result = list(tf.math.argmax(predict, axis=1).numpy())\nlist_id = list(range(1, predict.shape[0] +1, 1))\n\nsubmission = pd.DataFrame(list_id, columns=[\"ImageId\"])\nsubmission[\"Label\"] = result","metadata":{"id":"CUM1o0Su7jG0","execution":{"iopub.status.busy":"2022-08-20T12:28:38.901182Z","iopub.status.idle":"2022-08-20T12:28:38.901573Z","shell.execute_reply.started":"2022-08-20T12:28:38.901388Z","shell.execute_reply":"2022-08-20T12:28:38.901406Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv(\"submission.csv\", index=False)","metadata":{"id":"4cDDmpdN-dM-","trusted":true},"execution_count":null,"outputs":[]}]}