import%20marimo%0A%0A__generated_with%20%3D%20%220.24.0%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0Awith%20app.setup%3A%0A%20%20%20%20import%20importlib.util%0A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20pandas%20as%20pd%0A%20%20%20%20import%20tensorflow%20as%20tf%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20MNIST%20%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%20Keras%20%E7%94%BB%E5%83%8F%E5%88%86%E9%A1%9E%0A%0A%20%20%20%20%E5%85%A8%E7%B5%90%E5%90%88%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%A8%20CNN%20%E3%82%92%E5%90%8C%E3%81%98%E5%89%8D%E5%87%A6%E7%90%86%E3%81%A7%E5%AD%A6%E7%BF%92%E3%81%97%E3%80%81loss%2Faccuracy%20%E3%81%A8%E8%AA%A4%E5%88%86%E9%A1%9E%E4%BE%8B%E3%82%92%E6%AF%94%E8%BC%83%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E5%85%83%20notebook%20%E3%81%AB%E3%81%82%E3%81%A3%E3%81%9F%20PyCaret%20%E7%89%88%E3%81%AF%20%60pycaret%60%20%E3%81%8C%E3%81%82%E3%82%8B%E7%92%B0%E5%A2%83%E3%81%A0%E3%81%91%E3%81%A7%E8%BF%BD%E5%8A%A0%E6%AF%94%E8%BC%83%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20tf.keras.utils.set_random_seed(42)%0A%20%20%20%20device_name%20%3D%20%22%2FGPU%3A0%22%20if%20tf.config.list_physical_devices(%22GPU%22)%20else%20%22%2FCPU%3A0%22%0A%20%20%20%20runtime_frame%20%3D%20pd.DataFrame(%7B%22item%22%3A%20%5B%22tensorflow%22%2C%20%22keras%22%2C%20%22device%22%5D%2C%20%22value%22%3A%20%5Btf.__version__%2C%20tf.keras.__version__%2C%20device_name%5D%7D)%0A%20%20%20%20runtime_frame%0A%20%20%20%20return%20(device_name%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20(x_train_full%2C%20y_train_full)%2C%20(x_test_full%2C%20y_test_full)%20%3D%20tf.keras.datasets.mnist.load_data()%0A%20%20%20%20x_train%20%3D%20x_train_full%5B%3A15000%5D.astype(%22float32%22)%20%2F%20255.0%0A%20%20%20%20y_train%20%3D%20y_train_full%5B%3A15000%5D%0A%20%20%20%20x_test%20%3D%20x_test_full%5B%3A3000%5D.astype(%22float32%22)%20%2F%20255.0%0A%20%20%20%20y_test%20%3D%20y_test_full%5B%3A3000%5D%0A%20%20%20%20x_train_cnn%20%3D%20x_train%5B...%2C%20None%5D%0A%20%20%20%20x_test_cnn%20%3D%20x_test%5B...%2C%20None%5D%0A%20%20%20%20return%20x_test%2C%20x_test_cnn%2C%20x_train%2C%20x_train_cnn%2C%20y_test%2C%20y_train%0A%0A%0A%40app.cell%0Adef%20_(x_train%2C%20y_train)%3A%0A%20%20%20%20_fig%2C%20_axes%20%3D%20plt.subplots(2%2C%205%2C%20figsize%3D(8%2C%204))%0A%20%20%20%20for%20idx%2C%20_axis%20in%20enumerate(_axes.ravel())%3A%0A%20%20%20%20%20%20%20%20_axis.imshow(x_train%5Bidx%5D%2C%20cmap%3D%22gray%22)%0A%20%20%20%20%20%20%20%20_axis.set_title(f%22label%3D%7By_train%5Bidx%5D%7D%22)%0A%20%20%20%20%20%20%20%20_axis.axis(%22off%22)%0A%20%20%20%20_fig.tight_layout()%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(device_name%2C%20x_train%2C%20y_train)%3A%0A%20%20%20%20with%20tf.device(device_name)%3A%0A%20%20%20%20%20%20%20%20dense_model%20%3D%20tf.keras.Sequential(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20tf.keras.layers.Input(shape%3D(28%2C%2028))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tf.keras.layers.Flatten()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tf.keras.layers.Dense(64%2C%20activation%3D%22sigmoid%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tf.keras.layers.Dense(128%2C%20activation%3D%22sigmoid%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tf.keras.layers.Dense(10%2C%20activation%3D%22softmax%22)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%20name%3D%22dense_mnist%22)%0A%20%20%20%20%20%20%20%20dense_model.compile(optimizer%3D%22adam%22%2C%20loss%3D%22sparse_categorical_crossentropy%22%2C%20metrics%3D%5B%22accuracy%22%5D)%0A%20%20%20%20%20%20%20%20dense_history%20%3D%20dense_model.fit(x_train%2C%20y_train%2C%20validation_split%3D0.1%2C%20epochs%3D3%2C%20batch_size%3D128%2C%20verbose%3D0)%0A%20%20%20%20dense_history_frame%20%3D%20pd.DataFrame(dense_history.history)%0A%20%20%20%20return%20dense_history_frame%2C%20dense_model%0A%0A%0A%40app.cell%0Adef%20_(dense_model%2C%20x_test%2C%20y_test)%3A%0A%20%20%20%20dense_metrics%20%3D%20dense_model.evaluate(x_test%2C%20y_test%2C%20verbose%3D0%2C%20return_dict%3DTrue)%0A%20%20%20%20return%20(dense_metrics%2C)%0A%0A%0A%40app.cell%0Adef%20_(device_name%2C%20x_train_cnn%2C%20y_train)%3A%0A%20%20%20%20with%20tf.device(device_name)%3A%0A%20%20%20%20%20%20%20%20cnn_model%20%3D%20tf.keras.Sequential(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20tf.keras.layers.Input(shape%3D(28%2C%2028%2C%201))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tf.keras.layers.Conv2D(32%2C%20kernel_size%3D(5%2C%205)%2C%20activation%3D%22relu%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tf.keras.layers.MaxPool2D((2%2C%202))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tf.keras.layers.Conv2D(64%2C%20kernel_size%3D(3%2C%203)%2C%20activation%3D%22relu%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tf.keras.layers.MaxPool2D((2%2C%202))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tf.keras.layers.Flatten()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tf.keras.layers.Dense(128%2C%20activation%3D%22relu%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tf.keras.layers.Dropout(0.2)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tf.keras.layers.Dense(10%2C%20activation%3D%22softmax%22)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%20name%3D%22cnn_mnist%22)%0A%20%20%20%20%20%20%20%20cnn_model.compile(optimizer%3D%22adam%22%2C%20loss%3D%22sparse_categorical_crossentropy%22%2C%20metrics%3D%5B%22accuracy%22%5D)%0A%20%20%20%20%20%20%20%20cnn_history%20%3D%20cnn_model.fit(x_train_cnn%2C%20y_train%2C%20validation_split%3D0.1%2C%20epochs%3D3%2C%20batch_size%3D128%2C%20verbose%3D0)%0A%20%20%20%20cnn_history_frame%20%3D%20pd.DataFrame(cnn_history.history)%0A%20%20%20%20return%20cnn_history_frame%2C%20cnn_model%0A%0A%0A%40app.cell%0Adef%20_(cnn_model%2C%20x_test_cnn%2C%20y_test)%3A%0A%20%20%20%20cnn_metrics%20%3D%20cnn_model.evaluate(x_test_cnn%2C%20y_test%2C%20verbose%3D0%2C%20return_dict%3DTrue)%0A%20%20%20%20return%20(cnn_metrics%2C)%0A%0A%0A%40app.cell%0Adef%20_(cnn_history_frame%2C%20dense_history_frame)%3A%0A%20%20%20%20_fig%2C%20_axes%20%3D%20plt.subplots(1%2C%202%2C%20figsize%3D(10%2C%204))%0A%20%20%20%20_axes%5B0%5D.plot(dense_history_frame%5B%22accuracy%22%5D%2C%20label%3D%22dense%20train%22)%0A%20%20%20%20_axes%5B0%5D.plot(dense_history_frame%5B%22val_accuracy%22%5D%2C%20label%3D%22dense%20val%22)%0A%20%20%20%20_axes%5B0%5D.plot(cnn_history_frame%5B%22accuracy%22%5D%2C%20label%3D%22cnn%20train%22)%0A%20%20%20%20_axes%5B0%5D.plot(cnn_history_frame%5B%22val_accuracy%22%5D%2C%20label%3D%22cnn%20val%22)%0A%20%20%20%20_axes%5B0%5D.set_title(%22Accuracy%20history%22)%0A%20%20%20%20_axes%5B0%5D.legend()%0A%20%20%20%20_axes%5B1%5D.plot(dense_history_frame%5B%22loss%22%5D%2C%20label%3D%22dense%20train%22)%0A%20%20%20%20_axes%5B1%5D.plot(dense_history_frame%5B%22val_loss%22%5D%2C%20label%3D%22dense%20val%22)%0A%20%20%20%20_axes%5B1%5D.plot(cnn_history_frame%5B%22loss%22%5D%2C%20label%3D%22cnn%20train%22)%0A%20%20%20%20_axes%5B1%5D.plot(cnn_history_frame%5B%22val_loss%22%5D%2C%20label%3D%22cnn%20val%22)%0A%20%20%20%20_axes%5B1%5D.set_title(%22Loss%20history%22)%0A%20%20%20%20_axes%5B1%5D.legend()%0A%20%20%20%20_fig.tight_layout()%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(cnn_metrics%2C%20dense_metrics)%3A%0A%20%20%20%20metrics_frame%20%3D%20pd.DataFrame(%5B%7B%22model%22%3A%20%22dense%22%2C%20**dense_metrics%7D%2C%20%7B%22model%22%3A%20%22cnn%22%2C%20**cnn_metrics%7D%5D)%0A%20%20%20%20metrics_frame%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(cnn_model%2C%20x_test_cnn%2C%20y_test)%3A%0A%20%20%20%20cnn_probs%20%3D%20cnn_model.predict(x_test_cnn%2C%20verbose%3D0)%0A%20%20%20%20cnn_predictions%20%3D%20np.argmax(cnn_probs%2C%20axis%3D1)%0A%20%20%20%20mistake_indices%20%3D%20np.where(cnn_predictions%20!%3D%20y_test)%5B0%5D%5B%3A6%5D%0A%20%20%20%20return%20cnn_predictions%2C%20mistake_indices%0A%0A%0A%40app.cell%0Adef%20_(cnn_predictions%2C%20mistake_indices%2C%20x_test%2C%20y_test)%3A%0A%20%20%20%20_fig%2C%20_axes%20%3D%20plt.subplots(2%2C%203%2C%20figsize%3D(8%2C%205))%0A%20%20%20%20for%20_axis%2C%20index%20in%20zip(_axes.ravel()%2C%20mistake_indices%2C%20strict%3DFalse)%3A%0A%20%20%20%20%20%20%20%20_axis.imshow(x_test%5Bindex%5D%2C%20cmap%3D%22gray%22)%0A%20%20%20%20%20%20%20%20_axis.set_title(f%22pred%3D%7Bcnn_predictions%5Bindex%5D%7D%2C%20true%3D%7By_test%5Bindex%5D%7D%22)%0A%20%20%20%20%20%20%20%20_axis.axis(%22off%22)%0A%20%20%20%20_fig.tight_layout()%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20has_pycaret%20%3D%20importlib.util.find_spec(%22pycaret%22)%20is%20not%20None%0A%20%20%20%20if%20not%20has_pycaret%3A%0A%20%20%20%20%20%20%20%20_warning%20%3D%20mo.callout(%22PyCaret%20section%20is%20skipped%20because%20%60pycaret%60%20is%20not%20installed.%22%2C%20kind%3D%22warn%22)%0A%20%20%20%20return%20(has_pycaret%2C)%0A%0A%0A%40app.cell%0Adef%20_(has_pycaret%2C%20x_train%2C%20y_train)%3A%0A%20%20%20%20pycaret_summary%20%3D%20pd.DataFrame(%7B%22note%22%3A%20%5B%22Install%20the%20specialized%20dependency%20group%20to%20run%20the%20PyCaret%20section.%22%5D%7D)%0A%20%20%20%20if%20has_pycaret%3A%0A%20%20%20%20%20%20%20%20import%20os%0A%20%20%20%20%20%20%20%20from%20pathlib%20import%20Path%0A%0A%20%20%20%20%20%20%20%20pycaret_log%20%3D%20Path(__file__).resolve().parents%5B3%5D%20%2F%20%22build%22%20%2F%20%22pycaret%22%20%2F%20%22classification.log%22%0A%20%20%20%20%20%20%20%20pycaret_log.parent.mkdir(parents%3DTrue%2C%20exist_ok%3DTrue)%0A%20%20%20%20%20%20%20%20os.environ%5B%22PYCARET_CUSTOM_LOGGING_PATH%22%5D%20%3D%20str(pycaret_log)%0A%0A%20%20%20%20%20%20%20%20from%20pycaret.classification%20import%20ClassificationExperiment%0A%0A%20%20%20%20%20%20%20%20flat_train%20%3D%20x_train%5B%3A3000%5D.reshape(3000%2C%20-1)%0A%20%20%20%20%20%20%20%20pycaret_frame%20%3D%20pd.DataFrame(flat_train%2C%20columns%3D%5Bf%22px_%7Bidx%3A03d%7D%22%20for%20idx%20in%20range(flat_train.shape%5B1%5D)%5D)%0A%20%20%20%20%20%20%20%20pycaret_frame%5B%22label%22%5D%20%3D%20y_train%5B%3A3000%5D%0A%20%20%20%20%20%20%20%20experiment%20%3D%20ClassificationExperiment()%0A%20%20%20%20%20%20%20%20experiment.setup(%0A%20%20%20%20%20%20%20%20%20%20%20%20data%3Dpycaret_frame%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20target%3D%22label%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20session_id%3D123%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20fold%3D3%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20n_jobs%3D1%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20normalize%3DTrue%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20system_log%3DFalse%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20verbose%3DFalse%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20experiment.compare_models(include%3D%5B%22lr%22%2C%20%22rf%22%5D%2C%20n_select%3D2%2C%20verbose%3DFalse)%0A%20%20%20%20%20%20%20%20pycaret_summary%20%3D%20experiment.pull()%0A%20%20%20%20return%20(pycaret_summary%2C)%0A%0A%0A%40app.cell%0Adef%20_(pycaret_summary)%3A%0A%20%20%20%20pycaret_summary%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
520984d8a32e1935e1939c690630ffca