{"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)\nimport matplotlib.pyplot as plt\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":"2022-06-01T14:48:51.497754Z","iopub.execute_input":"2022-06-01T14:48:51.498036Z","iopub.status.idle":"2022-06-01T14:48:51.506902Z","shell.execute_reply.started":"2022-06-01T14:48:51.497985Z","shell.execute_reply":"2022-06-01T14:48:51.506053Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Current Version \n# Score : 0.97139 \n# Characterstics : \n    # Simple ANN model \n    # using simple \n\n## Use the CNN based approach \n#0.98807\n## Tried with highe batch size to check the effect - faster training \n# Used GPU - faster training \n\n# V13 \n# done regularisation \n\n# TODO for the next version \n## Hyper Parameter Optimization","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:48:51.512064Z","iopub.execute_input":"2022-06-01T14:48:51.513193Z","iopub.status.idle":"2022-06-01T14:48:51.517724Z","shell.execute_reply.started":"2022-06-01T14:48:51.513094Z","shell.execute_reply":"2022-06-01T14:48:51.516697Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"This Notebooks uses simple NN to solve the digit recognition problem. This is one of the many approaches that can be used to solve the problem. Can be a good starting point to be begin. ","metadata":{}},{"cell_type":"code","source":"import tensorflow as tf\nfrom sklearn.model_selection import train_test_split","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:48:51.519424Z","iopub.execute_input":"2022-06-01T14:48:51.519961Z","iopub.status.idle":"2022-06-01T14:48:51.527377Z","shell.execute_reply.started":"2022-06-01T14:48:51.519924Z","shell.execute_reply":"2022-06-01T14:48:51.526355Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def lib_version(lib):\n    print(\"{0} version is : {1}\".format(lib.__name__ , lib.__version__))\n\nfor lib in [np , pd , tf] :\n    lib_version(lib)","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:48:51.52926Z","iopub.execute_input":"2022-06-01T14:48:51.529636Z","iopub.status.idle":"2022-06-01T14:48:51.537121Z","shell.execute_reply.started":"2022-06-01T14:48:51.5296Z","shell.execute_reply":"2022-06-01T14:48:51.536172Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_file = '/kaggle/input/digit-recognizer/train.csv'\ntest_file = '/kaggle/input/digit-recognizer/test.csv'","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:48:51.538722Z","iopub.execute_input":"2022-06-01T14:48:51.539308Z","iopub.status.idle":"2022-06-01T14:48:51.54562Z","shell.execute_reply.started":"2022-06-01T14:48:51.539271Z","shell.execute_reply":"2022-06-01T14:48:51.544687Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"trainDF = pd.read_csv(train_file)\n","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:48:51.547752Z","iopub.execute_input":"2022-06-01T14:48:51.548299Z","iopub.status.idle":"2022-06-01T14:48:53.697815Z","shell.execute_reply.started":"2022-06-01T14:48:51.548233Z","shell.execute_reply":"2022-06-01T14:48:53.697041Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Performing the normalization and data splitting.","metadata":{}},{"cell_type":"code","source":"y = trainDF['label']\nX = trainDF.drop(['label'] , axis = 1)\n\n# This step is used to convert the 1-D array to 3-D array where 28 , 28 , 1 represent witdth , height and color channel  \nX = X.to_numpy(dtype='float32').reshape((-1, 28 , 28 , 1 ))\n\nX = ( X * 1.0 )/ 255\n\nX_train , X_Test , y_train , y_test = train_test_split( X , y , test_size = .2)","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:48:53.699349Z","iopub.execute_input":"2022-06-01T14:48:53.699605Z","iopub.status.idle":"2022-06-01T14:48:54.199924Z","shell.execute_reply.started":"2022-06-01T14:48:53.699572Z","shell.execute_reply":"2022-06-01T14:48:54.1991Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Tried with batch size 32 though can be tried with Higher Batch Size. ","metadata":{}},{"cell_type":"code","source":"BATCH_SIZE=512\nINPUT_SHAPE = ( X_train[1].shape ) ","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:48:54.201453Z","iopub.execute_input":"2022-06-01T14:48:54.201732Z","iopub.status.idle":"2022-06-01T14:48:54.206505Z","shell.execute_reply.started":"2022-06-01T14:48:54.201695Z","shell.execute_reply":"2022-06-01T14:48:54.20545Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def df_to_ds ( X  , y  , batch_size , shuffle):\n    labels = y\n    ds = tf.data.Dataset.from_tensor_slices((X , labels))\n    if  shuffle :\n        ds = ds.shuffle(buffer_size=len(X))\n    ds = ds.batch(batch_size)\n    return ds\n        ","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:48:54.208161Z","iopub.execute_input":"2022-06-01T14:48:54.208574Z","iopub.status.idle":"2022-06-01T14:48:54.217843Z","shell.execute_reply.started":"2022-06-01T14:48:54.208529Z","shell.execute_reply":"2022-06-01T14:48:54.217017Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"trainDS = df_to_ds ( X_train , y_train , BATCH_SIZE , True  )\nvalDS = df_to_ds ( X_Test, y_test , BATCH_SIZE , False  )","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:48:54.221147Z","iopub.execute_input":"2022-06-01T14:48:54.221454Z","iopub.status.idle":"2022-06-01T14:48:54.427707Z","shell.execute_reply.started":"2022-06-01T14:48:54.22138Z","shell.execute_reply":"2022-06-01T14:48:54.426975Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_scal(feature):\n    def minmax(x):\n        mini = trainDF[feature].min()\n        maxi = trainDF[feature].max()\n        return (x - mini)/(maxi-mini)\n    return(minmax)\n\ndef transform ( inputs , cols ) : \n    ldf = inputs.copy()\n\n    feature_columns =[]\n    num_feature_columns = {colname:\n            tf.feature_column.numeric_column(colname )\n            for colname in cols\n        }\n    for num_key,num_col in num_feature_columns.items() :\n        feature_columns.append(num_col)\n      \n    return ldf, feature_columns ","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:48:54.43135Z","iopub.execute_input":"2022-06-01T14:48:54.431561Z","iopub.status.idle":"2022-06-01T14:48:54.438622Z","shell.execute_reply.started":"2022-06-01T14:48:54.431536Z","shell.execute_reply":"2022-06-01T14:48:54.437938Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def build_simple_nn(optimizer , loss , metrics ):\n    \n    inputs = {\n          colname: tf.keras.layers.Input(name=colname, shape=(), dtype='float32')\n          for colname in X_train.columns\n      }\n    \n    transformed , fc = transform (inputs ,  X_train.columns)\n    dnn_inputs  = tf.keras.layers.DenseFeatures(fc)\n    h1 = tf.keras.layers.Dense(784 , activation = 'relu' , name = 'hidden_1')\n    b1 = tf.keras.layers.BatchNormalization()\n    h2 = tf.keras.layers.Dense(256 , activation = 'relu' , name = 'hidden_2')\n    b2 = tf.keras.layers.BatchNormalization()\n    h3 = tf.keras.layers.Dense(64 , activation = 'relu' , name = 'hidden_3')\n    b3 = tf.keras.layers.BatchNormalization()\n    h4 = tf.keras.layers.Dense(16 , activation = 'relu' , name = 'hidden_4')\n    output = tf.keras.layers.Dense(10 , activation = 'softmax' , name = 'output')\n    x = dnn_inputs (transformed )\n    x = h1 (x)\n    x = b1 (x)\n    x = h2 (x)\n    x = b2 (x)\n    x = h3 (x)\n    x = b3 (x)\n    x = h4 (x)\n    outputs = output(x)\n    \n    model = tf.keras.models.Model(inputs , outputs)\n    \n    model.compile(optimizer , loss , metrics)\n    #model.summary()\n    return model\n","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:48:54.439922Z","iopub.execute_input":"2022-06-01T14:48:54.44033Z","iopub.status.idle":"2022-06-01T14:48:54.453057Z","shell.execute_reply.started":"2022-06-01T14:48:54.440292Z","shell.execute_reply":"2022-06-01T14:48:54.452306Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def build_covnet(optimizer , loss , metrics):\n    inputs = tf.keras.layers.Input(shape = INPUT_SHAPE)\n    \n    conv1_a = tf.keras.layers.Conv2D(filters = 32, kernel_size = (3,3) , padding ='same', activation = 'relu')\n    conv1_b = tf.keras.layers.Conv2D(filters = 32, kernel_size = (3,3) , padding ='same', activation = 'relu')\n    b1 = tf.keras.layers.BatchNormalization()\n    max_1_a = tf.keras.layers.MaxPool2D(pool_size=(2,2), strides=(2, 2))\n\n    conv2_a = tf.keras.layers.Conv2D(filters = 64, kernel_size = (3,3) , padding ='same', activation = 'relu')\n    conv2_b = tf.keras.layers.Conv2D(filters = 64, kernel_size = (3,3) , padding ='same', activation = 'relu')\n    b2 = tf.keras.layers.BatchNormalization()\n    max_2_a = tf.keras.layers.MaxPool2D(pool_size=(2,2), strides=(2, 2))\n\n    conv3_a = tf.keras.layers.Conv2D(filters = 128, kernel_size = (3,3) , padding ='same', activation = 'relu')\n    conv3_b = tf.keras.layers.Conv2D(filters = 128, kernel_size = (3,3) , padding ='same', activation = 'relu')\n    b3 = tf.keras.layers.BatchNormalization()\n    max_3_a = tf.keras.layers.MaxPool2D(pool_size=(2,2), strides=(2, 2))\n\n    conv4_a = tf.keras.layers.Conv2D(filters = 256, kernel_size = (3,3) , padding ='same', activation = 'relu')\n    conv4_b = tf.keras.layers.Conv2D(filters = 256, kernel_size = (3,3) , padding ='same', activation = 'relu')\n    b4 = tf.keras.layers.BatchNormalization()\n    max_4_a = tf.keras.layers.MaxPool2D(pool_size=(2,2), strides=(2, 2))\n    \n    dropout = tf.keras.layers.Dropout(.3)\n    flatten = tf.keras.layers.Flatten()\n    \n    d1 = tf.keras.layers.Dense(units=128 , kernel_regularizer=tf.keras.regularizers.L2(1e-4) , activation = 'relu')\n    b5 = tf.keras.layers.BatchNormalization()\n    d2 = tf.keras.layers.Dense(units=64 ,kernel_regularizer=tf.keras.regularizers.L2(1e-4), activation = 'relu')\n    b6 = tf.keras.layers.BatchNormalization()\n    final = tf.keras.layers.Dense(units=10 , activation = 'softmax')\n\n    x = conv1_a (inputs)\n    x = conv1_b (x)\n    x = b1(x)\n    x = max_1_a (x)\n    x = dropout(x)\n    \n    x = conv2_a (x)\n    x = conv2_b (x)\n    x = b2(x)\n    x = max_2_a (x)\n    x = dropout(x)\n    \n    x = conv3_a (x)\n    x = conv3_b (x)\n    x = b3(x)\n    x = max_3_a (x)\n    x = dropout(x)\n    \n    x = conv4_a (x)\n    x = conv4_b (x)\n    x = b4(x)\n    x = max_4_a (x)\n    x = dropout(x)\n    \n    x = flatten (x)\n    \n    x = d1(x)\n    x = b5(x)\n    x = d2(x)\n    x = b6(x)\n    outputs = final(x)\n\n    model = tf.keras.models.Model(inputs , outputs)\n    model.compile(optimizer , loss , metrics)\n    #model.summary()\n    return model\n    \n    ","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:48:54.454369Z","iopub.execute_input":"2022-06-01T14:48:54.454971Z","iopub.status.idle":"2022-06-01T14:48:54.477284Z","shell.execute_reply.started":"2022-06-01T14:48:54.454933Z","shell.execute_reply":"2022-06-01T14:48:54.476302Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"optimizer = tf.keras.optimizers.RMSprop(learning_rate=.01) #tf.keras.optimizers.Adam(learning_rate=.1 )\nloss = 'sparse_categorical_crossentropy'\nmetrics = ['accuracy']\nnn_model = build_covnet ( optimizer , loss , metrics )","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:48:54.480181Z","iopub.execute_input":"2022-06-01T14:48:54.480568Z","iopub.status.idle":"2022-06-01T14:48:54.630705Z","shell.execute_reply.started":"2022-06-01T14:48:54.480532Z","shell.execute_reply":"2022-06-01T14:48:54.630025Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"epochs = 100","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:48:54.631837Z","iopub.execute_input":"2022-06-01T14:48:54.632098Z","iopub.status.idle":"2022-06-01T14:48:54.637401Z","shell.execute_reply.started":"2022-06-01T14:48:54.632063Z","shell.execute_reply":"2022-06-01T14:48:54.636318Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ncallbacks = [\n    tf.keras.callbacks.EarlyStopping(monitor='val_accuracy', patience = 5 , restore_best_weights = True) , \n    tf.keras.callbacks.ReduceLROnPlateau(monitor='val_accuracy' , patience= 3 , factor=0.5 , verbose = 1 )\n]\n\nresults = nn_model.fit(  trainDS , validation_data = valDS , epochs = epochs , callbacks = callbacks) ","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:48:54.638927Z","iopub.execute_input":"2022-06-01T14:48:54.639199Z","iopub.status.idle":"2022-06-01T14:50:15.064703Z","shell.execute_reply.started":"2022-06-01T14:48:54.639164Z","shell.execute_reply":"2022-06-01T14:50:15.063973Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tf.keras.utils.plot_model(nn_model , show_shapes = True , rankdir=\"TB\")","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:53:04.658769Z","iopub.execute_input":"2022-06-01T14:53:04.659072Z","iopub.status.idle":"2022-06-01T14:53:05.095362Z","shell.execute_reply.started":"2022-06-01T14:53:04.659037Z","shell.execute_reply":"2022-06-01T14:53:05.094553Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"hist = pd.DataFrame(results.history )\nhist[['accuracy' , 'val_accuracy']].plot()","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:50:15.09101Z","iopub.status.idle":"2022-06-01T14:50:15.091738Z","shell.execute_reply.started":"2022-06-01T14:50:15.091496Z","shell.execute_reply":"2022-06-01T14:50:15.091521Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_losses = hist['loss']\nvalid_losses = hist['val_loss']\nlearning_rates = hist['lr']","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:50:15.093362Z","iopub.status.idle":"2022-06-01T14:50:15.093773Z","shell.execute_reply.started":"2022-06-01T14:50:15.093553Z","shell.execute_reply":"2022-06-01T14:50:15.093575Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(20 , 20 ))\nfig, ax1 = plt.subplots()\nax1.plot(range(len(hist)), train_losses, label='Train Loss')\nax1.plot(range(len(hist)), valid_losses, label='Valid Loss')\nax1.set_title('Learning Curve')\nax1.set_xlabel(\"Number of Epochs\")\nax1.set_ylabel(\"Loss\")\nax2 = ax1.twinx()\nax2.set_ylabel(\"Learning Rate\")\nax2.plot(range(len(hist)), learning_rates, label='Learning Rate', color='g')\nfig.legend(loc=\"upper right\", bbox_to_anchor=(1,1), bbox_transform=ax1.transAxes)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:50:15.09576Z","iopub.status.idle":"2022-06-01T14:50:15.101704Z","shell.execute_reply.started":"2022-06-01T14:50:15.101457Z","shell.execute_reply":"2022-06-01T14:50:15.101481Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"testDF = pd.read_csv(test_file)","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:50:15.10281Z","iopub.status.idle":"2022-06-01T14:50:15.103704Z","shell.execute_reply.started":"2022-06-01T14:50:15.103471Z","shell.execute_reply":"2022-06-01T14:50:15.103496Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# This step is used to convert the 1-D array to 3-D array where 28 , 28 , 1 represent witdth , height and color channel  \ntestDF = testDF.to_numpy(dtype='float32').reshape((-1, 28 , 28 , 1 ))\n\ntestDF = ( testDF * 1.0 )/ 255\n","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:50:15.104796Z","iopub.status.idle":"2022-06-01T14:50:15.105761Z","shell.execute_reply.started":"2022-06-01T14:50:15.105535Z","shell.execute_reply":"2022-06-01T14:50:15.105558Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def sub_df_to_ds ( X  , batch_size , shuffle):\n    \n    ds = tf.data.Dataset.from_tensor_slices((X ))\n    if  shuffle :\n        ds = ds.shuffle(buffer_size=len(X))\n    ds = ds.batch(batch_size)\n    return ds","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:50:15.106825Z","iopub.status.idle":"2022-06-01T14:50:15.1077Z","shell.execute_reply.started":"2022-06-01T14:50:15.107472Z","shell.execute_reply":"2022-06-01T14:50:15.107495Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ntestDS =  sub_df_to_ds ( testDF , BATCH_SIZE , False  )","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:50:15.108766Z","iopub.status.idle":"2022-06-01T14:50:15.109631Z","shell.execute_reply.started":"2022-06-01T14:50:15.109408Z","shell.execute_reply":"2022-06-01T14:50:15.109432Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub_arr = nn_model.predict(testDS)","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:50:15.110719Z","iopub.status.idle":"2022-06-01T14:50:15.111711Z","shell.execute_reply.started":"2022-06-01T14:50:15.111371Z","shell.execute_reply":"2022-06-01T14:50:15.111395Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ny_classes = sub_arr.argmax(axis=-1)\ny_classes","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:50:15.113034Z","iopub.status.idle":"2022-06-01T14:50:15.113426Z","shell.execute_reply.started":"2022-06-01T14:50:15.11321Z","shell.execute_reply":"2022-06-01T14:50:15.113231Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"np.arange(1 , 28001 )","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:50:15.114645Z","iopub.status.idle":"2022-06-01T14:50:15.115469Z","shell.execute_reply.started":"2022-06-01T14:50:15.115246Z","shell.execute_reply":"2022-06-01T14:50:15.115269Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"iarr = np.array(np.arange(1 , 28001 ), dtype=np.int64)\nser1 = pd.Series(iarr, dtype='int64')\nser2 = pd.Series(y_classes.reshape(28000 ,), dtype=np.int64)\nframe = { 'ImageId': ser1, 'Label': ser2 }\nsubmission=pd.DataFrame(frame)","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:50:15.1167Z","iopub.status.idle":"2022-06-01T14:50:15.117637Z","shell.execute_reply.started":"2022-06-01T14:50:15.117411Z","shell.execute_reply":"2022-06-01T14:50:15.117434Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:50:15.118718Z","iopub.status.idle":"2022-06-01T14:50:15.119558Z","shell.execute_reply.started":"2022-06-01T14:50:15.119337Z","shell.execute_reply":"2022-06-01T14:50:15.119358Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv('submission.csv',index=False)","metadata":{"execution":{"iopub.status.busy":"2022-06-01T14:50:15.120638Z","iopub.status.idle":"2022-06-01T14:50:15.121519Z","shell.execute_reply.started":"2022-06-01T14:50:15.121295Z","shell.execute_reply":"2022-06-01T14:50:15.121318Z"},"trusted":true},"execution_count":null,"outputs":[]}]}