From 82e0ec6d51029c6e0da0eb0c14e1d8a5c2132256 Mon Sep 17 00:00:00 2001 From: ilyaspiridonov Date: Sat, 4 Nov 2023 21:47:53 +0300 Subject: [PATCH 1/5] [KO] Translations --- .../average_optimizers_callback.ipynb | 56 +- site/ko/addons/tutorials/image_ops.ipynb | 56 +- .../tutorials/networks_seq2seq_nmt.ipynb | 72 +- site/ko/datasets/dataset_collections.ipynb | 60 +- site/ko/datasets/overview.ipynb | 92 +- site/ko/datasets/tfless_tfds.ipynb | 64 +- ...our_own_federated_learning_algorithm.ipynb | 177 ++- site/ko/guide/core/matrix_core.ipynb | 108 +- site/ko/guide/core/optimizers_core.ipynb | 72 +- site/ko/guide/core/quickstart_core.ipynb | 68 +- site/ko/guide/dtensor_overview.ipynb | 141 +- site/ko/guide/migrate/tf1_vs_tf2.ipynb | 68 +- .../guide/migrate/validate_correctness.ipynb | 172 ++- site/ko/guide/profiler.md | 26 +- site/ko/guide/ragged_tensor.ipynb | 344 +++-- site/ko/io/tutorials/azure.ipynb | 8 +- site/ko/io/tutorials/dicom.ipynb | 36 +- site/ko/io/tutorials/postgresql.ipynb | 28 +- site/ko/io/tutorials/prometheus.ipynb | 32 +- .../lattice/tutorials/shape_constraints.ipynb | 88 +- .../lite/examples/auto_complete/overview.md | 1 + .../on_device_training/overview.ipynb | 71 +- .../lite/examples/pose_estimation/overview.md | 1 + .../ko/lite/examples/segmentation/overview.md | 5 +- .../examples/text_classification/overview.md | 2 +- site/ko/lite/guide/model_analyzer.ipynb | 24 +- site/ko/lite/guide/signatures.ipynb | 32 +- site/ko/lite/models/bert_qa/overview.md | 2 +- .../model_maker/image_classification.ipynb | 110 +- .../modify/model_maker/object_detection.ipynb | 58 +- .../modify/model_maker/question_answer.ipynb | 56 +- .../model_maker/text_classification.ipynb | 124 +- .../modify/model_maker/text_searcher.ipynb | 44 +- .../lite/models/style_transfer/overview.ipynb | 525 +++++++ .../post_training_float16_quant.ipynb | 76 +- .../lite/tutorials/pose_classification.ipynb | 124 +- .../clustering_comprehensive_guide.ipynb | 32 +- .../guide/clustering/clustering_example.ipynb | 67 +- .../guide/combine/cqat_example.ipynb | 76 +- .../guide/combine/pcqat_example.ipynb | 78 +- .../guide/combine/pqat_example.ipynb | 82 +- .../combine/sparse_clustering_example.ipynb | 74 +- .../guide/pruning/comprehensive_guide.ipynb | 56 +- .../pruning_for_on_device_inference.ipynb | 54 +- .../pruning_with_sparsity_2_by_4.ipynb | 86 +- .../adversarial_keras_cnn_mnist.ipynb | 76 +- .../A_Tour_of_TensorFlow_Probability.ipynb | 114 +- .../Bayesian_Gaussian_Mixture_Model.ipynb | 56 +- .../Distributed_Inference_with_JAX.ipynb | 127 +- .../Gaussian_Process_Regression_In_TFP.ipynb | 104 +- .../probability/examples/HLM_TFP_R_Stan.ipynb | 178 ++- ...ibutionAutoBatched_A_Gentle_Tutorial.ipynb | 128 +- ..._Effects_Model_Variational_Inference.ipynb | 128 +- .../Linear_Mixed_Effects_Models.ipynb | 60 +- .../Modeling_with_JointDistribution.ipynb | 340 +++-- .../examples/Multilevel_Modeling_Primer.ipynb | 229 ++- ...tection_and_Bayesian_model_selection.ipynb | 80 +- ...Optimizers_in_TensorFlow_Probability.ipynb | 47 +- .../examples/Probabilistic_Layers_VAE.ipynb | 72 +- ...odels_with_non_Gaussian_observations.ipynb | 104 +- .../TFP_Release_Notebook_0_11_0.ipynb | 132 +- .../TFP_Release_Notebook_0_12_1.ipynb | 131 +- .../TFP_Release_Notebook_0_13_0.ipynb | 79 +- .../TensorFlow_Distributions_Tutorial.ipynb | 168 ++- ...ity_Case_Study_Covariance_Estimation.ipynb | 162 ++- .../TensorFlow_Probability_on_JAX.ipynb | 112 +- ...ding_TensorFlow_Distributions_Shapes.ipynb | 112 +- ...l_Inference_with_Multipart_Bijectors.ipynb | 1260 +++++++++++++++++ .../quantum/tutorials/hello_many_worlds.ipynb | 152 +- site/ko/quantum/tutorials/mnist.ipynb | 148 +- .../quantum_reinforcement_learning.ipynb | 132 +- site/ko/tensorboard/get_started.ipynb | 56 +- site/ko/tensorboard/graphs.ipynb | 42 +- .../hyperparameter_tuning_with_hparams.ipynb | 44 +- site/ko/tensorboard/image_summaries.ipynb | 107 +- site/ko/tensorboard/migrate.ipynb | 46 +- site/ko/tensorboard/scalars_and_keras.ipynb | 66 +- .../tensorboard/tbdev_getting_started.ipynb | 32 +- .../tensorboard_profiling_keras.ipynb | 64 +- site/ko/tensorboard/text_summaries.ipynb | 46 +- .../data_validation/tfdv_basic.ipynb | 78 +- .../tfx/tutorials/serving/rest_simple.ipynb | 72 +- .../tfx/cloud-ai-platform-pipelines.md | 20 +- site/ko/tfx/tutorials/tfx/components.ipynb | 164 ++- .../tfx/tutorials/tfx/components_keras.ipynb | 168 ++- .../tfx/gcp/vertex_pipelines_bq.ipynb | 72 +- .../tfx/gcp/vertex_pipelines_simple.ipynb | 68 +- .../vertex_pipelines_vertex_training.ipynb | 80 +- .../tfx/neural_structured_learning.ipynb | 156 +- .../ko/tfx/tutorials/tfx/penguin_simple.ipynb | 58 +- site/ko/tfx/tutorials/tfx/penguin_tfdv.ipynb | 88 +- site/ko/tfx/tutorials/tfx/penguin_tfma.ipynb | 74 +- .../tfx/tutorials/tfx/penguin_transform.ipynb | 890 ++++++++++++ .../tfx/python_function_component.ipynb | 64 +- site/ko/tfx/tutorials/tfx/recommenders.ipynb | 132 +- site/ko/tfx/tutorials/tfx/template_beam.ipynb | 72 +- site/ko/tfx/tutorials/transform/census.ipynb | 264 +++- .../data_preprocessing_with_cloud.md | 7 +- site/ko/tfx/tutorials/transform/simple.ipynb | 100 +- .../ko/tutorials/audio/music_generation.ipynb | 196 ++- .../audio/transfer_learning_audio.ipynb | 120 +- .../customization/custom_layers.ipynb | 72 +- .../distribute/dtensor_keras_tutorial.ipynb | 104 +- .../distribute/dtensor_ml_tutorial.ipynb | 125 +- .../multi_worker_with_estimator.ipynb | 28 +- .../distribute/multi_worker_with_keras.ipynb | 148 +- .../tutorials/distribute/save_and_load.ipynb | 76 +- .../estimator/keras_model_to_estimator.ipynb | 40 +- site/ko/tutorials/generative/cvae.ipynb | 80 +- site/ko/tutorials/generative/cyclegan.ipynb | 132 +- site/ko/tutorials/generative/dcgan.ipynb | 116 +- site/ko/tutorials/generative/deepdream.ipynb | 83 +- .../tutorials/generative/style_transfer.ipynb | 158 ++- site/ko/tutorials/images/classification.ipynb | 152 +- site/ko/tutorials/images/cnn.ipynb | 48 +- .../tutorials/images/data_augmentation.ipynb | 198 ++- site/ko/tutorials/images/segmentation.ipynb | 128 +- .../images/transfer_learning_with_hub.ipynb | 144 +- site/ko/tutorials/keras/keras_tuner.ipynb | 52 +- .../keras/overfit_and_underfit.ipynb | 168 ++- site/ko/tutorials/keras/regression.ipynb | 232 ++- site/ko/tutorials/keras/save_and_load.ipynb | 104 +- .../tutorials/keras/text_classification.ipynb | 132 +- .../keras/text_classification_with_hub.ipynb | 52 +- site/ko/tutorials/load_data/images.ipynb | 151 +- site/ko/tutorials/load_data/text.ipynb | 292 +++- site/ko/tutorials/load_data/tfrecord.ipynb | 152 +- site/ko/tutorials/quickstart/beginner.ipynb | 52 +- .../reinforcement_learning/actor_critic.ipynb | 56 +- .../preprocessing_layers.ipynb | 112 +- .../ko/xla/tutorials/autoclustering_xla.ipynb | 38 +- 131 files changed, 11693 insertions(+), 3237 deletions(-) create mode 100644 site/ko/lite/models/style_transfer/overview.ipynb create mode 100644 site/ko/probability/examples/Variational_Inference_with_Multipart_Bijectors.ipynb create mode 100644 site/ko/tfx/tutorials/tfx/penguin_transform.ipynb diff --git a/site/ko/addons/tutorials/average_optimizers_callback.ipynb b/site/ko/addons/tutorials/average_optimizers_callback.ipynb index d5e99bc117..86ad71cce9 100644 --- a/site/ko/addons/tutorials/average_optimizers_callback.ipynb +++ b/site/ko/addons/tutorials/average_optimizers_callback.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "tuOe1ymfHZPu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -95,7 +97,9 @@ "metadata": { "id": "sXEOqj5cIgyW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install -U tensorflow-addons" ] @@ -106,7 +110,9 @@ "metadata": { "id": "IqR2PQG4ZaZ0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "import tensorflow_addons as tfa" @@ -118,7 +124,9 @@ "metadata": { "id": "4hnJ2rDpI38-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import numpy as np\n", "import os" @@ -139,7 +147,9 @@ "metadata": { "id": "KtylpxOmceaC" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def create_model(opt):\n", " model = tf.keras.models.Sequential([\n", @@ -171,7 +181,9 @@ "metadata": { "id": "mMOeXVmbdilM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#Load Fashion MNIST dataset\n", "train, test = tf.keras.datasets.fashion_mnist.load_data()\n", @@ -207,7 +219,9 @@ "metadata": { "id": "_Q76K1fNk7Va" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#Optimizers \n", "sgd = tf.keras.optimizers.SGD(0.01)\n", @@ -230,7 +244,9 @@ "metadata": { "id": "SnvZjt34qEHY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#Callback \n", "checkpoint_path = \"./training/cp-{epoch:04d}.ckpt\"\n", @@ -267,7 +283,9 @@ "metadata": { "id": "Xy8W4LYppadJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#Build Model\n", "model = create_model(sgd)\n", @@ -282,7 +300,9 @@ "metadata": { "id": "uU2iQ6HAZ6-E" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#Evalute results\n", "model.load_weights(checkpoint_dir)\n", @@ -306,7 +326,9 @@ "metadata": { "id": "--NIjBp-mhVb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#Build Model\n", "model = create_model(moving_avg_sgd)\n", @@ -321,7 +343,9 @@ "metadata": { "id": "zRAym9EBmnW9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#Evalute results\n", "model.load_weights(checkpoint_dir)\n", @@ -345,7 +369,9 @@ "metadata": { "id": "Ia7ALKefnXWQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#Build Model\n", "model = create_model(stocastic_avg_sgd)\n", @@ -360,7 +386,9 @@ "metadata": { "id": "EOT2E9NBoeHI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#Evalute results\n", "model.load_weights(checkpoint_dir)\n", diff --git a/site/ko/addons/tutorials/image_ops.ipynb b/site/ko/addons/tutorials/image_ops.ipynb index eb75c749eb..a0cf15f074 100644 --- a/site/ko/addons/tutorials/image_ops.ipynb +++ b/site/ko/addons/tutorials/image_ops.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "l-m8KQ-nxK5l" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -89,7 +91,9 @@ "metadata": { "id": "o_QTX_vHGbj7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install -U tensorflow-addons" ] @@ -100,7 +104,9 @@ "metadata": { "id": "5hVIKCrhWh4a" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "import numpy as np\n", @@ -132,7 +138,9 @@ "metadata": { "id": "IgUsVhBQ6dSg" }, - "outputs": [], + "outputs": [ + + ], "source": [ "img_path = tf.keras.utils.get_file('tensorflow.png','https://tensorflow.org/images/tf_logo.png')" ] @@ -161,7 +169,9 @@ "metadata": { "id": "NRlvNQdm1YI8" }, - "outputs": [], + "outputs": [ + + ], "source": [ "img_raw = tf.io.read_file(img_path)\n", "img = tf.io.decode_image(img_raw)\n", @@ -187,7 +197,9 @@ "metadata": { "id": "tbaIkUCS2eNv" }, - "outputs": [], + "outputs": [ + + ], "source": [ "bw_img = 1.0 - tf.image.rgb_to_grayscale(img)\n", "\n", @@ -221,7 +233,9 @@ "metadata": { "id": "SutWnbRoHl6i" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mean = tfa.image.mean_filter2d(img, filter_shape=11)\n", "_ = plt.imshow(mean)" @@ -244,7 +258,9 @@ "metadata": { "id": "9kxUES9sM8Jl" }, - "outputs": [], + "outputs": [ + + ], "source": [ "rotate = tfa.image.rotate(img, tf.constant(np.pi/8))\n", "_ = plt.imshow(rotate)" @@ -267,7 +283,9 @@ "metadata": { "id": "HTh1Qpps8Rg5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "transform = tfa.image.transform(img, [1.0, 1.0, -250, 0.0, 1.0, 0.0, 0.0, 0.0])\n", "_ = plt.imshow(transform)" @@ -290,7 +308,9 @@ "metadata": { "id": "zZBI-9XvBSuh" }, - "outputs": [], + "outputs": [ + + ], "source": [ "delta = 0.5\n", "lower_saturation = 0.1\n", @@ -318,7 +338,9 @@ "metadata": { "id": "vbCdwGtYChnQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "delta = 0.5\n", "saturation = 0.3\n", @@ -344,7 +366,9 @@ "metadata": { "id": "dG557eQDDtSK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "input_img = tf.image.convert_image_dtype(tf.expand_dims(img, 0), tf.dtypes.float32)\n", "\n", @@ -374,7 +398,9 @@ "metadata": { "id": "-OMh6oeRQaYQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "gray = tf.image.convert_image_dtype(bw_img,tf.uint8)\n", "# The op expects a batch of images, so add a batch dimension\n", @@ -388,7 +414,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "image_ops.ipynb", "toc_visible": true }, diff --git a/site/ko/addons/tutorials/networks_seq2seq_nmt.ipynb b/site/ko/addons/tutorials/networks_seq2seq_nmt.ipynb index cf3ec3158e..54b605df75 100644 --- a/site/ko/addons/tutorials/networks_seq2seq_nmt.ipynb +++ b/site/ko/addons/tutorials/networks_seq2seq_nmt.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "wmYJlt6LWVOU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -107,7 +109,9 @@ "metadata": { "id": "tnxXKDjq3jEL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "import tensorflow_addons as tfa\n", @@ -156,7 +160,9 @@ "metadata": { "id": "PvRnGWnvXm6l" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def download_nmt():\n", " path_to_zip = tf.keras.utils.get_file(\n", @@ -187,7 +193,9 @@ "metadata": { "id": "JMAHz7kJXc5N" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class NMTDataset:\n", " def __init__(self, problem_type='en-spa'):\n", @@ -275,7 +283,9 @@ "metadata": { "id": "EIW4NVBmJ25k" }, - "outputs": [], + "outputs": [ + + ], "source": [ "BUFFER_SIZE = 32000\n", "BATCH_SIZE = 64\n", @@ -301,7 +311,9 @@ }, "execution_count": 7, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -326,7 +338,9 @@ "metadata": { "id": "TqHsArVZ3jFS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "vocab_inp_size = len(inp_lang.word_index)+1\n", "vocab_tar_size = len(targ_lang.word_index)+1\n", @@ -360,7 +374,9 @@ }, "execution_count": 9, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -376,7 +392,9 @@ "metadata": { "id": "nZ2rI24i3jFg" }, - "outputs": [], + "outputs": [ + + ], "source": [ "##### \n", "\n", @@ -441,7 +459,9 @@ "metadata": { "id": "yJ_B3mhW3jFk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class Decoder(tf.keras.Model):\n", " def __init__(self, vocab_size, embedding_dim, dec_units, batch_sz, attention_type='luong'):\n", @@ -548,7 +568,9 @@ "metadata": { "id": "WmTHr5iV3jFr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "optimizer = tf.keras.optimizers.Adam()\n", "\n", @@ -580,7 +602,9 @@ "metadata": { "id": "Zj8bXQTgNwrF" }, - "outputs": [], + "outputs": [ + + ], "source": [ "checkpoint_dir = './training_checkpoints'\n", "checkpoint_prefix = os.path.join(checkpoint_dir, \"ckpt\")\n", @@ -604,7 +628,9 @@ "metadata": { "id": "sC9ArXSsVfqn" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function\n", "def train_step(inp, targ, enc_hidden):\n", @@ -768,7 +794,9 @@ "metadata": { "id": "EbQpyYs13jF_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def evaluate_sentence(sentence):\n", " sentence = dataset_creator.preprocess_sentence(sentence)\n", @@ -842,7 +870,9 @@ }, "execution_count": 20, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -952,7 +982,9 @@ "metadata": { "id": "AJ-RTQ0hsJNL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def beam_evaluate_sentence(sentence, beam_width=3):\n", " sentence = dataset_creator.preprocess_sentence(sentence)\n", @@ -1017,7 +1049,9 @@ "metadata": { "id": "g_LvXGvX8X-O" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def beam_translate(sentence):\n", " result, beam_scores = beam_evaluate_sentence(sentence)\n", @@ -1086,7 +1120,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "networks_seq2seq_nmt.ipynb", "toc_visible": true }, diff --git a/site/ko/datasets/dataset_collections.ipynb b/site/ko/datasets/dataset_collections.ipynb index a087c182e3..da93a4ea9a 100644 --- a/site/ko/datasets/dataset_collections.ipynb +++ b/site/ko/datasets/dataset_collections.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "n25wrPRbfCGc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -84,7 +86,9 @@ "metadata": { "id": "1AnxnW65I_FC" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Use tfds-nightly to ensure access to the latest features.\n", "!pip install -q tfds-nightly tensorflow\n", @@ -106,7 +110,9 @@ "metadata": { "id": "-hxMPT0wIu3f" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import pprint\n", "\n", @@ -144,7 +150,9 @@ "metadata": { "id": "R14uGGzKItDz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tfds.list_dataset_collections()" ] @@ -166,7 +174,9 @@ "metadata": { "id": "leIwyl9aI3WA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "collection_loader = tfds.dataset_collection('xtreme')" ] @@ -186,7 +196,9 @@ "metadata": { "id": "pyILkuYJY6ts" }, - "outputs": [], + "outputs": [ + + ], "source": [ "collection_loader = tfds.dataset_collection('xtreme:1.0.0')" ] @@ -206,7 +218,9 @@ "metadata": { "id": "kwk4PVDoKEAC" }, - "outputs": [], + "outputs": [ + + ], "source": [ "collection_loader.print_info()" ] @@ -226,7 +240,9 @@ "metadata": { "id": "IxNJEie6K55T" }, - "outputs": [], + "outputs": [ + + ], "source": [ "collection_loader.print_datasets()" ] @@ -250,7 +266,9 @@ "metadata": { "id": "UP1nRj4ILwb6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "splits = collection_loader.load_dataset(\"ner\")\n", "\n", @@ -288,7 +306,9 @@ "metadata": { "id": "sEG5744Oh2vQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "datasets = collection_loader.load_datasets(['xnli', 'bucc'])\n", "\n", @@ -310,7 +330,9 @@ "metadata": { "id": "QX-M3xcjiM35" }, - "outputs": [], + "outputs": [ + + ], "source": [ "all_datasets = collection_loader.load_all_datasets()\n", "\n", @@ -348,7 +370,9 @@ "metadata": { "id": "TjgZSIlvfcSP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "collection_loader = tfds.dataset_collection('xtreme', loader_kwargs=dict(split='train', batch_size=10, try_gcs=False))" ] @@ -368,7 +392,9 @@ "metadata": { "id": "zrysflp-k1d3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "collection_loader.set_loader_kwargs(dict(split='train', batch_size=10, try_gcs=False))" ] @@ -388,7 +414,9 @@ "metadata": { "id": "rHSu-8GnlGTk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "dataset = collection_loader.load_dataset('ner', loader_kwargs=dict(split='train', batch_size=10, try_gcs=False))" ] @@ -407,7 +435,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "dataset_collections.ipynb", "toc_visible": true }, diff --git a/site/ko/datasets/overview.ipynb b/site/ko/datasets/overview.ipynb index 310fa63738..67c67921ed 100644 --- a/site/ko/datasets/overview.ipynb +++ b/site/ko/datasets/overview.ipynb @@ -61,7 +61,9 @@ "cellView": "both", "id": "boeZp0sYbO41" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install -q tfds-nightly tensorflow matplotlib" ] @@ -72,7 +74,9 @@ "metadata": { "id": "TTBSvHcSLBzc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", @@ -98,7 +102,9 @@ "metadata": { "id": "FAvbSVzjLCIb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tfds.list_builders()" ] @@ -125,7 +131,9 @@ "metadata": { "id": "dCou80mnLLPV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ds = tfds.load('mnist', split='train', shuffle_files=True)\n", "assert isinstance(ds, tf.data.Dataset)\n", @@ -164,7 +172,9 @@ "metadata": { "id": "2zN_jQ2ER40W" }, - "outputs": [], + "outputs": [ + + ], "source": [ "builder = tfds.builder('mnist')\n", "# 1. Create the tfrecord files (no-op if already exists)\n", @@ -210,7 +220,9 @@ "metadata": { "id": "JAGjXdk_bIYQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ds = tfds.load('mnist', split='train')\n", "ds = ds.take(1) # Only take a single example\n", @@ -248,7 +260,9 @@ "metadata": { "id": "nJ4O0xy3djfV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ds = tfds.load('mnist', split='train', as_supervised=True)\n", "ds = ds.take(1)\n", @@ -277,7 +291,9 @@ "metadata": { "id": "tzQTCUkAfe9R" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ds = tfds.load('mnist', split='train', as_supervised=True)\n", "ds = ds.take(1)\n", @@ -305,7 +321,9 @@ "metadata": { "id": "Gg8BNsv-UzFl" }, - "outputs": [], + "outputs": [ + + ], "source": [ "image, label = tfds.as_numpy(tfds.load(\n", " 'mnist',\n", @@ -343,7 +361,9 @@ "metadata": { "id": "ZyQzZ98bX3dM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ds = tfds.load('mnist', split='train')\n", "ds = ds.batch(32).prefetch(1)\n", @@ -400,7 +420,9 @@ "metadata": { "id": "FKouwN_yVSGQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ds, info = tfds.load('mnist', split='train', with_info=True)\n", "\n", @@ -424,7 +446,9 @@ "metadata": { "id": "DpE2FD56cSQR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ds, info = tfds.load('mnist', split='train', with_info=True)\n", "\n", @@ -452,7 +476,9 @@ "metadata": { "id": "UgLgtcd1ljzt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ds, info = tfds.load('mnist', with_info=True)" ] @@ -472,7 +498,9 @@ "metadata": { "id": "nmq97QkilxeL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "builder = tfds.builder('mnist')\n", "info = builder.info" @@ -493,7 +521,9 @@ "metadata": { "id": "O-wLIKD-mZQT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(info)" ] @@ -515,7 +545,9 @@ "metadata": { "id": "RcyZXncqoFab" }, - "outputs": [], + "outputs": [ + + ], "source": [ "info.features" ] @@ -535,7 +567,9 @@ "metadata": { "id": "HhfzBH6qowpz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(info.features[\"label\"].num_classes)\n", "print(info.features[\"label\"].names)\n", @@ -558,7 +592,9 @@ "metadata": { "id": "SergV_wQowLY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(info.features.shape)\n", "print(info.features.dtype)\n", @@ -583,7 +619,9 @@ "metadata": { "id": "FBbfwA8Sp4ax" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(info.splits)" ] @@ -603,7 +641,9 @@ "metadata": { "id": "fRBieOOquDzX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(list(info.splits.keys()))" ] @@ -623,7 +663,9 @@ "metadata": { "id": "-h_OSpRsqKpP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(info.splits['train'].num_examples)\n", "print(info.splits['train'].filenames)\n", @@ -645,7 +687,9 @@ "metadata": { "id": "HO5irBZ3uIzQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(info.splits['train[15%:75%]'].num_examples)\n", "print(info.splits['train[15%:75%]'].file_instructions)" @@ -709,7 +753,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "overview.ipynb", "toc_visible": true }, diff --git a/site/ko/datasets/tfless_tfds.ipynb b/site/ko/datasets/tfless_tfds.ipynb index 5d2a1d044d..7d5661ea48 100644 --- a/site/ko/datasets/tfless_tfds.ipynb +++ b/site/ko/datasets/tfless_tfds.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "2pHVBk_seED1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -128,7 +130,9 @@ "metadata": { "id": "c4COEsqIdvYH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install array_record\n", "!pip install tfds-nightly\n", @@ -175,7 +179,9 @@ "metadata": { "id": "9Tslzx0_eEWx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ds = tfds.data_source('fashion_mnist')" ] @@ -195,7 +201,9 @@ "metadata": { "id": "duHDKzXReIKB" }, - "outputs": [], + "outputs": [ + + ], "source": [ "builder = tfds.builder('fashion_mnist', file_format='array_record')\n", "builder.download_and_prepare()\n", @@ -228,7 +236,9 @@ "metadata": { "id": "mTfSzvaQkSd9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip uninstall -y tensorflow" ] @@ -239,7 +249,9 @@ "metadata": { "id": "3sT5AN7neNT9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%writefile no_tensorflow.py\n", "import os\n", @@ -264,7 +276,9 @@ "metadata": { "id": "FxohFdb3kSxh" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!python no_tensorflow.py" ] @@ -286,7 +300,9 @@ "metadata": { "id": "qtfl17SQeQ7F" }, - "outputs": [], + "outputs": [ + + ], "source": [ "len(ds['train'])" ] @@ -306,7 +322,9 @@ "metadata": { "id": "tFvT2Sx2eToh" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%timeit\n", "ds['train'][0]" @@ -327,7 +345,9 @@ "metadata": { "id": "cPJFa6aIeWcY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%timeit\n", "ds['train'][1000]" @@ -348,7 +368,9 @@ "metadata": { "id": "q7x5AEEaeZja" }, - "outputs": [], + "outputs": [ + + ], "source": [ "features = tfds.builder('fashion_mnist').info.features" ] @@ -368,7 +390,9 @@ "metadata": { "id": "Xk8Vc-y0edlb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "shape = features['image'].shape\n", "num_classes = features['label'].num_classes" @@ -391,7 +415,9 @@ "metadata": { "id": "ULjO-JDVefNf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for example in ds['train']:\n", " print(example)\n", @@ -438,7 +464,9 @@ "metadata": { "id": "3aKol1fDeyoK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install torch\n", "\n", @@ -461,7 +489,9 @@ "metadata": { "id": "_4P2JIrie23f" }, - "outputs": [], + "outputs": [ + + ], "source": [ "batch_size = 128\n", "train_sampler = torch.utils.data.RandomSampler(ds['train'], num_samples=5_000)\n", @@ -492,7 +522,9 @@ "metadata": { "id": "HcAmvMa-e42p" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class LinearClassifier(torch.nn.Module):\n", " def __init__(self, shape, num_classes):\n", diff --git a/site/ko/federated/tutorials/building_your_own_federated_learning_algorithm.ipynb b/site/ko/federated/tutorials/building_your_own_federated_learning_algorithm.ipynb index 88ea437e4d..e031aa7bf2 100644 --- a/site/ko/federated/tutorials/building_your_own_federated_learning_algorithm.ipynb +++ b/site/ko/federated/tutorials/building_your_own_federated_learning_algorithm.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "0asMuNro71hA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -39,9 +41,10 @@ "source": [ "\n", " \n", - " \n", + " \n", - " \n", " \n", "
TensorFlow.org에서 보기 Google Colab에서 실행하기\n", + " Google Colab에서 실행\n", + " GitHub에서 소스 보기\n", "GitHub에서 소그 보기노트북 다운로드
" ] @@ -63,14 +66,12 @@ "metadata": { "id": "ZrGitA_KnRO0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@test {\"skip\": true}\n", - "!pip install --quiet --upgrade tensorflow-federated\n", - "!pip install --quiet --upgrade nest-asyncio\n", - "\n", - "import nest_asyncio\n", - "nest_asyncio.apply()" + "!pip install --quiet --upgrade tensorflow-federated" ] }, { @@ -79,7 +80,9 @@ "metadata": { "id": "HGTM6tWOLo8M" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "import tensorflow_federated as tff" @@ -132,7 +135,9 @@ "metadata": { "id": "-WdnFluLLo8P" }, - "outputs": [], + "outputs": [ + + ], "source": [ "emnist_train, emnist_test = tff.simulation.datasets.emnist.load_data()" ] @@ -152,7 +157,9 @@ "metadata": { "id": "Blrh8zJgLo8R" }, - "outputs": [], + "outputs": [ + + ], "source": [ "NUM_CLIENTS = 10\n", "BATCH_SIZE = 20\n", @@ -182,7 +189,9 @@ "metadata": { "id": "-vYM_IT7Lo8W" }, - "outputs": [], + "outputs": [ + + ], "source": [ "client_ids = sorted(emnist_train.client_ids)[:NUM_CLIENTS]\n", "federated_train_data = [preprocess(emnist_train.create_tf_dataset_for_client(x))\n", @@ -214,7 +223,9 @@ "metadata": { "id": "Yfld4oFNLo8Y" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def create_keras_model():\n", " initializer = tf.keras.initializers.GlorotNormal(seed=0)\n", @@ -231,7 +242,7 @@ "id": "vLln0Q8G0Bky" }, "source": [ - "TFF에서 이 모델을 사용하기 위해 Keras 모델을 [`tff.learning.Model`](https://www.tensorflow.org/federated/api_docs/python/tff/learning/Model)로 래핑합니다. 이를 통해 TFF 내에서 모델의 [정방향 전달](https://www.tensorflow.org/federated/api_docs/python/tff/learning/Model#forward_pass)을 수행하고 [모델 출력을 추출](https://www.tensorflow.org/federated/api_docs/python/tff/learning/Model#report_local_unfinalized_metrics)할 수 있습니다. 자세한 내용은 [이미지 분류](federated_learning_for_image_classification.ipynb) 튜토리얼을 참조하세요." + "TFF에서 이 모델을 사용하려면 Keras 모델을 [`tff.learning.models.VariableModel`](https://www.tensorflow.org/federated/api_docs/python/tff/learning/Model)로 래핑하세요. 이렇게 하면 TFF 내에서 모델의 [순방향 전달](https://www.tensorflow.org/federated/api_docs/python/tff/learning/Model#forward_pass)을 수행하고 [모델 출력 추출](https://www.tensorflow.org/federated/api_docs/python/tff/learning/Model#report_local_unfinalized_metrics)을 수행할 수 있습니다. 자세한 내용은 [이미지 분류](federated_learning_for_image_classification.ipynb) 튜토리얼을 참조하세요." ] }, { @@ -240,11 +251,13 @@ "metadata": { "id": "SPwbipTNLo8a" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def model_fn():\n", " keras_model = create_keras_model()\n", - " return tff.learning.from_keras_model(\n", + " return tff.learning.models.from_keras_model(\n", " keras_model,\n", " input_spec=federated_train_data[0].element_spec,\n", " loss=tf.keras.losses.SparseCategoricalCrossentropy(),\n", @@ -257,7 +270,7 @@ "id": "pCxa44rFiere" }, "source": [ - "여기서는 `tf.keras`를 사용하여 `tff.learning.Model`을 생성하지만 TFF는 훨씬 더 많은 일반 모델을 지원합니다. 이러한 모델에는 모델 가중치를 캡처하는 다음과 같은 관련 속성이 있습니다.\n", + "위에서는 `tf.keras`를 사용해 `tff.learning.models.VariableModel`을 생성했지만, TFF는 훨씬 더 일반적인 모델을 지원합니다. 이러한 모델에는 모델 가중치를 캡처하는 다음과 같은 관련 속성이 있습니다.\n", "\n", "- `trainable_variables`: 학습 가능한 레이어에 해당하는 텐서의 이터러블입니다.\n", "- `non_trainable_variables`: 학습할 수 없는 레이어에 해당하는 텐서의 이터러블입니다.\n", @@ -273,7 +286,7 @@ "source": [ "# 고유한 페더레이션 학습 알고리즘 구축하기\n", "\n", - "`tff.learning` API를 사용하면 Federated Averaging의 많은 변형을 생성할 수 있지만 이 프레임워크에 깔끔하게 맞지 않는 다른 페더레이션 알고리즘이 있습니다. 예를 들어 정규화, 클리핑 또는 [페더레이션 GAN 학습](https://github.com/tensorflow/federated/tree/main/tensorflow_federated/python/research/gans)과 같은 더 복잡한 알고리즘을 추가할 수도 있습니다. 아니면 [페더레이션 분석](https://ai.googleblog.com/2020/05/federated-analytics-collaborative-data.html)에 관심이 있을 수도 있습니다." + "`tff.learning` API를 사용하면 Federated Averaging의 많은 변형을 생성할 수 있지만, 이 프레임워크에 완전히 맞지 않는 다른 페더레이션 알고리즘도 있습니다. 예를 들어 정규화, 클리핑 또는 [페더레이션 GAN 학습](https://github.com/tensorflow/federated/tree/main/tensorflow_federated/python/research/gans)과 같은 더 복잡한 알고리즘을 추가하고 싶을 수도 있습니다. 아니면 [페더레이션 분석](https://ai.googleblog.com/2020/05/federated-analytics-collaborative-data.html)에 관심이 있을 수도 있습니다." ] }, { @@ -298,7 +311,7 @@ "source": [ "TFF에서는 일반적으로 페더레이션 알고리즘이 [`tff.templates.IterativeProcess`](https://www.tensorflow.org/federated/api_docs/python/tff/templates/IterativeProcess)(나머지 부분에서 `IterativeProcess`라고 함)로 나타내어집니다. 이것은 `initialize` 및 `next` 함수를 포함하는 클래스입니다. 여기서 `initialize`는 서버를 초기화하는 데 사용되며 `next`는 페더레이션 알고리즘의 한 통신 라운드를 수행합니다. FedAvg에 대한 반복 프로세스가 어떤 모습인지 그 골격을 작성해 보겠습니다.\n", "\n", - "먼저 `tff.learning.Model` 생성하고 훈련 가능한 가중치를 반환하는 초기화 함수가 있습니다." + "먼저 `tff.learning.models.VariableModel`을 간단히 생성하고 훈련 가능한 가중치를 반환하는 초기화 함수가 있습니다." ] }, { @@ -307,7 +320,9 @@ "metadata": { "id": "ylLpRa7T5DDh" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def initialize_fn():\n", " model = model_fn()\n", @@ -331,7 +346,9 @@ "metadata": { "id": "IeHN-XLZfMso" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def next_fn(server_weights, federated_dataset):\n", " # Broadcast the server weights to the clients.\n", @@ -375,7 +392,7 @@ "source": [ "### 클라이언트 업데이트\n", "\n", - "`tff.learning.Model`을 사용하여 기본적으로 TensorFlow 모델을 훈련하는 것과 동일한 방식으로 클라이언트 훈련을 수행할 수 있습니다. 특히, `tf.GradientTape`를 사용하여 데이터 배치에 대한 그레디언트를 계산한 다음 `client_optimizer`를 사용하여 이러한 그레디언트를 적용할 수 있습니다. 여기에는 훈련 가능한 가중치만 관련됩니다.\n" + "`tff.learning.Model`을 사용해 TensorFlow 모델을 훈련할 때와 동일한 방식으로 클라이언트를 훈련할 수 있습니다. 특히 `tf.GradientTape`를 사용해 데이터 배치에 대한 그래디언트를 계산한 다음 `client_optimizer`를 사용해 이 그래디언트를 적용할 수 있습니다. 여기에서는 훈련 가능한 가중치만 사용합니다.\n" ] }, { @@ -384,7 +401,9 @@ "metadata": { "id": "c5rHPKreLo8g" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function\n", "def client_update(model, dataset, server_weights, client_optimizer):\n", @@ -428,7 +447,9 @@ "metadata": { "id": "rYxErLvHLo8i" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function\n", "def server_update(model, mean_client_weights):\n", @@ -472,7 +493,7 @@ "\n", "페더레이션 코어(FC)는 `tff.learning` API의 기반 역할을 하는 하위 수준 인터페이스 집합입니다. 그러나 이러한 인터페이스는 학습에만 국한되지 않습니다. 실제로 분산 데이터에 대한 분석 및 기타 많은 계산에 사용할 수 있습니다.\n", "\n", - "상위 수준에서 페더레이션 코어는 간결하게 표현된 프로그램 로직을 사용하여 TensorFlow 코드를 분산 통신 연산자(예: 분산 합계 및 브로드캐스트)와 결합할 수 있는 개발 환경입니다. 목표는 시스템 구현 세부 사항(예: 지점 간 네트워크 메시지 교환 지정)을 요구하지 않고 연구자와 실무자에게 시스템의 분산 통신을 신속하게 제어할 수 있도록 하는 것입니다.\n", + "간단히 설명하자면, 연합 코어는 간결하게 표현된 프로그램 로직을 사용해 TensorFlow 코드와 분산 통신 연산자(예: 분산 합계 및 브로드캐스트)와 결합할 수 있는 개발 환경입니다. 연구자와 실무자가 시스템 구현 세부 사항(예: 지점 간 네트워크 메시지 교환 지정)이 없어도 시스템에서 분산 통신을 명시적으로 제어할 수 있도록 하는 것이 목표입니다.\n", "\n", "한 가지 요점은 TFF가 개인 정보 보호를 위해 설계되었다는 것입니다. 따라서 중앙 집중식 서버 위치에서 원치 않는 데이터 축적을 방지하기 위해 데이터가 있는 위치를 명시적으로 제어할 수 있습니다." ] @@ -496,7 +517,9 @@ "metadata": { "id": "7EJY0MHpLo8l" }, - "outputs": [], + "outputs": [ + + ], "source": [ "federated_float_on_clients = tff.FederatedType(tf.float32, tff.CLIENTS)" ] @@ -528,7 +551,9 @@ }, "execution_count": 12, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -574,7 +599,9 @@ "metadata": { "id": "IfwXDNR1Lo8p" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tff.federated_computation(tff.FederatedType(tf.float32, tff.CLIENTS))\n", "def get_average_temperature(client_temperatures):\n", @@ -610,7 +637,9 @@ }, "execution_count": 14, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -645,7 +674,9 @@ }, "execution_count": 15, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -680,7 +711,9 @@ "metadata": { "id": "huz3mNmMLo8w" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tff.tf_computation(tf.float32)\n", "def add_half(x):\n", @@ -714,7 +747,9 @@ }, "execution_count": 17, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -740,7 +775,9 @@ "metadata": { "id": "pG6nw3wiLo80" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tff.federated_computation(tff.FederatedType(tf.float32, tff.CLIENTS))\n", "def add_half_on_clients(x):\n", @@ -774,7 +811,9 @@ }, "execution_count": 19, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -837,7 +876,9 @@ "metadata": { "id": "jJY9xUBZLo84" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tff.tf_computation\n", "def server_init():\n", @@ -860,7 +901,9 @@ "metadata": { "id": "m2hinzuRLo86" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tff.federated_computation\n", "def initialize_fn():\n", @@ -886,7 +929,9 @@ "metadata": { "id": "ph_noHN2Lo88" }, - "outputs": [], + "outputs": [ + + ], "source": [ "whimsy_model = model_fn()\n", "tf_dataset_type = tff.SequenceType(whimsy_model.input_spec)" @@ -919,7 +964,9 @@ }, "execution_count": 23, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -943,7 +990,9 @@ "metadata": { "id": "4yx6CExMLo8-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model_weights_type = server_init.type_signature.result" ] @@ -975,7 +1024,9 @@ }, "execution_count": 25, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -999,7 +1050,9 @@ "metadata": { "id": "Q0W05pMWLo9A" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tff.tf_computation(tf_dataset_type, model_weights_type)\n", "def client_update_fn(tf_dataset, server_weights):\n", @@ -1023,7 +1076,9 @@ "metadata": { "id": "F4WvQtVzLo9B" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tff.tf_computation(model_weights_type)\n", "def server_update_fn(mean_client_weights):\n", @@ -1048,7 +1103,9 @@ "metadata": { "id": "ekPsA8AsLo9D" }, - "outputs": [], + "outputs": [ + + ], "source": [ "federated_server_type = tff.FederatedType(model_weights_type, tff.SERVER)\n", "federated_dataset_type = tff.FederatedType(tf_dataset_type, tff.CLIENTS)" @@ -1076,7 +1133,9 @@ "metadata": { "id": "Epc7MwfELo9G" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tff.federated_computation(federated_server_type, federated_dataset_type)\n", "def next_fn(server_weights, federated_dataset):\n", @@ -1111,7 +1170,9 @@ "metadata": { "id": "GxdWgEddLo9I" }, - "outputs": [], + "outputs": [ + + ], "source": [ "federated_algorithm = tff.templates.IterativeProcess(\n", " initialize_fn=initialize_fn,\n", @@ -1146,7 +1207,9 @@ }, "execution_count": 31, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1182,7 +1245,9 @@ }, "execution_count": 32, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1226,7 +1291,9 @@ "metadata": { "id": "EdNgYoIwLo9P" }, - "outputs": [], + "outputs": [ + + ], "source": [ "central_emnist_test = emnist_test.create_tf_dataset_from_all_clients()\n", "central_emnist_test = preprocess(central_emnist_test)" @@ -1247,7 +1314,9 @@ "metadata": { "id": "I5UEX4EWLo9Q" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def evaluate(server_state):\n", " keras_model = create_keras_model()\n", @@ -1303,7 +1372,9 @@ "metadata": { "id": "v1zBlzFILo9U" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for round in range(15):\n", " server_state = federated_algorithm.next(server_state, federated_train_data)" @@ -1375,7 +1446,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "building_your_own_federated_learning_algorithm.ipynb", "toc_visible": true }, diff --git a/site/ko/guide/core/matrix_core.ipynb b/site/ko/guide/core/matrix_core.ipynb index b766352012..a6455e104b 100644 --- a/site/ko/guide/core/matrix_core.ipynb +++ b/site/ko/guide/core/matrix_core.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "AwOEIRJC6Une" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -91,7 +93,9 @@ "metadata": { "id": "1rRo8oNqZ-Rj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import matplotlib\n", "from matplotlib.image import imread\n", @@ -107,7 +111,9 @@ "metadata": { "id": "9xQKvCJ85kCQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "print(tf.__version__)" @@ -159,7 +165,9 @@ "metadata": { "id": "C3QAcgyoeIpv" }, - "outputs": [], + "outputs": [ + + ], "source": [ "A = tf.random.uniform(shape=[40,30])\n", "# Compute the SVD factorization\n", @@ -191,7 +199,9 @@ "metadata": { "id": "TPE6QeMtADUn" }, - "outputs": [], + "outputs": [ + + ], "source": [ "A_svd = tf.einsum('s,us,vs -> uv',s,U,V)\n", "print('\\nReconstructed Matrix, A_svd', A_svd)" @@ -209,7 +219,7 @@ "\n", "SVD의 관점에서 ${\\mathrm{A}}$의 rank-r 근삿값은 다음 공식으로 정의합니다.\n", "\n", - "$${\\mathrm{A_r}} = {\\mathrm{U_r}} \\Sigma_r {\\mathrm{V_r}}^T$$\n", + "어디\n", "\n", "어디\n", "\n", @@ -242,7 +252,9 @@ "metadata": { "id": "2oY3pMPagJrO" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def rank_r_approx(s, U, V, r, verbose=False):\n", " # Compute the matrices necessary for a rank-r approximation\n", @@ -272,7 +284,9 @@ "metadata": { "id": "O3ZRkYCkX2FQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(f\"Original Size of A: {tf.size(A)}\")\n", "s, U, V = tf.linalg.svd(A)" @@ -284,7 +298,9 @@ "metadata": { "id": "S1DR83VMX4cM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Rank-15 approximation\n", "A_15, A_15_size = rank_r_approx(s, U, V, 15, verbose = True)\n", @@ -297,7 +313,9 @@ "metadata": { "id": "KgFT70XFX57E" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Rank-3 approximation\n", "A_3, A_3_size = rank_r_approx(s, U, V, 3, verbose = True)\n", @@ -332,7 +350,9 @@ "metadata": { "id": "OVsZOQUAZ2C7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "img_link = \"https://imagen.research.google/main_gallery_images/a-photo-of-a-corgi-dog-riding-a-bike-in-times-square.jpg\"\n", "img_path = requests.get(img_link, stream=True).raw\n", @@ -346,7 +366,9 @@ "metadata": { "id": "Qvs7uftcZ54x" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def show_img(I):\n", " # Display the image in matplotlib\n", @@ -361,7 +383,9 @@ "metadata": { "id": "ZbesXO3HZ6Qs" }, - "outputs": [], + "outputs": [ + + ], "source": [ "show_img(I)" ] @@ -383,7 +407,9 @@ "metadata": { "id": "i7DDp0h7oSIk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def compress_image(I, r, verbose=False):\n", " # Compress an image with the SVD given a rank \n", @@ -426,7 +452,9 @@ "metadata": { "id": "7GlKkVLGDjre" }, - "outputs": [], + "outputs": [ + + ], "source": [ "I_100, I_100_prop = compress_image(I, 100, verbose=True)" ] @@ -437,7 +465,9 @@ "metadata": { "id": "XdvUkF5_E75D" }, - "outputs": [], + "outputs": [ + + ], "source": [ "I_50, I_50_prop = compress_image(I, 50, verbose=True)" ] @@ -448,7 +478,9 @@ "metadata": { "id": "MsCNZ8416Sbk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "I_10, I_10_prop = compress_image(I, 10, verbose=True)" ] @@ -481,7 +513,9 @@ "metadata": { "id": "O1ariNQe6Wbl" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plt.figure(figsize=(11,6))\n", "plt.plot([100, 50, 10], [I_100_prop, I_50_prop, I_10_prop])\n", @@ -500,17 +534,17 @@ "\n", "여기서\n", "\n", - "$$c = \\large \\frac{x}{y} = \\frac{r \\times (m + n + 1)}{m \\times n}$$\n", - "\n", "각 RGB 근삿값은 서로 영향을 미치지 않으므로 이 수식은 색상 채널 차원과 무관합니다. 이제 원하는 압축 인자가 주어질 경우 입력 이미지를 압축하는 함수를 작성합니다.\n", "\n", + "어디\n", + "\n", "- $x$: ${\\mathrm{A_r}}$의 크기\n", "- $y$: ${\\mathrm{A}}$의 크기\n", "- $c = \\frac{x}{y}$: 압축 인자\n", "- $r$: 근삿값의 순위\n", "- $m$ 와 $n$: ${\\mathrm{A}}$의 행과 열 차원\n", "\n", - "이미지를 원하는 인자 $c$로 압축하는 데 필요한 순위 $r$를 찾기 위해 위의 수식을 다시 정렬하여 $r$를 풀이할 수 있습니다.\n", + "각 RGB 근삿값은 서로 영향을 미치지 않으므로 이 수식은 색상 채널 차원과 무관합니다. 이제 원하는 압축 인자가 주어질 경우 입력 이미지를 압축하는 함수를 작성합니다.\n", "\n", "$$r = ⌊{\\large\\frac{c \\times m \\times n}{m + n + 1}}⌋$$\n", "\n", @@ -523,7 +557,9 @@ "metadata": { "id": "viVO-I60QynI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def compress_image_with_factor(I, compression_factor, verbose=False):\n", " # Returns a compressed image based on a desired compression factor\n", @@ -548,7 +584,9 @@ "metadata": { "id": "HVeeloIwQ1b6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "compression_factor = 0.15\n", "I_r_img = compress_image_with_factor(I, compression_factor, verbose=True)" @@ -571,7 +609,9 @@ "metadata": { "id": "CteJ6VbKlndu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def viz_energy(I):\n", " # Visualize the energy captured based on rank\n", @@ -595,7 +635,9 @@ "metadata": { "id": "Vl9PKow-GgCp" }, - "outputs": [], + "outputs": [ + + ], "source": [ "viz_energy(I)" ] @@ -615,7 +657,9 @@ "metadata": { "id": "fum5Cvm7R5vH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def compress_image_with_energy(I, energy_factor, verbose=False):\n", " # Returns a compressed image based on a desired energy factor\n", @@ -649,7 +693,9 @@ "metadata": { "id": "xDXBaZQ4c5jF" }, - "outputs": [], + "outputs": [ + + ], "source": [ "energy_factor = 0.75\n", "I_r_img = compress_image_with_energy(I, energy_factor, verbose=True)" @@ -676,7 +722,9 @@ "metadata": { "id": "hctOvN8BckiS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "s, U, V = tf.linalg.svd(A)\n", "A_10, A_10_size = rank_r_approx(s, U, V, 10)\n", @@ -706,7 +754,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "matrix_core.ipynb", "toc_visible": true }, diff --git a/site/ko/guide/core/optimizers_core.ipynb b/site/ko/guide/core/optimizers_core.ipynb index 22e11899b1..db879c1225 100644 --- a/site/ko/guide/core/optimizers_core.ipynb +++ b/site/ko/guide/core/optimizers_core.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "AwOEIRJC6Une" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -93,7 +95,9 @@ "metadata": { "id": "d9idwpXCltUl" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import matplotlib\n", "from matplotlib import pyplot as plt\n", @@ -107,7 +111,9 @@ "metadata": { "id": "9xQKvCJ85kCQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "print(tf.__version__)\n", @@ -132,7 +138,9 @@ "metadata": { "id": "MWjmUmeOQFFN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class GradientDescent(tf.Module):\n", "\n", @@ -157,9 +165,9 @@ "\n", "$\\frac{dL}{dx}$는 안장점이 $x = 0$이고 전역 최솟값이 $x = - \\frac{9}{8}$일 때 0 입니다. 따라서 손실 함수는 $x^\\star = - \\frac{9}{8}$일 때 최적화됩니다.\n", "\n", - "$$\\frac{dL}{dx} = 8x^3 + 9x^2$$\n", + "$\\frac{dL}{dx}$는 안장점인 $x = 0$와 전역 최소값인 $x = - \\frac{9}{8}$에서 0입니다. 따라서 손실 함수는 $x^\\star = - \\frac{9}{8}$에서 최적화됩니다.\n", "\n", - "$\\frac{dL}{dx}$는 안장점인 $x = 0$와 전역 최소값인 $x = - \\frac{9}{8}$에서 0입니다. 따라서 손실 함수는 $x^\\star = - \\frac{9}{8}$에서 최적화됩니다." + "$\\frac{dL}{dx}$ is 0 at $x = 0$, which is a saddle point and at $x = - \\frac{9}{8}$, which is the global minimum. Therefore, the loss function is optimized at $x^\\star = - \\frac{9}{8}$." ] }, { @@ -168,7 +176,9 @@ "metadata": { "id": "VCtJaUo6Ry8V" }, - "outputs": [], + "outputs": [ + + ], "source": [ "x_vals = tf.linspace(-2, 2, 201)\n", "x_vals = tf.cast(x_vals, tf.float32)\n", @@ -208,7 +218,9 @@ "metadata": { "id": "SLQTc41ouv0F" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def convergence_test(optimizer, loss_fn, grad_fn=grad, init_val=2., max_iters=2000):\n", " # Function for optimizer convergence test\n", @@ -259,7 +271,9 @@ "metadata": { "id": "lWRn8c91mqB0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "param_map_gd = {}\n", "learning_rates = [1e-3, 1e-2, 1e-1]\n", @@ -283,7 +297,9 @@ "metadata": { "id": "piffzGHI_u5G" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def viz_paths(param_map, x_vals, loss_fn, title, max_iters=2000):\n", " # Creating a controur plot of the loss function\n", @@ -312,7 +328,9 @@ "metadata": { "id": "Ssyj2sO4BcNY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "viz_paths(param_map_gd, x_vals, loss, \"Gradient descent\")" ] @@ -338,10 +356,10 @@ "\n", "여기서,\n", "\n", - "$$x^{[t]} = x^{[t-1]} - \\Delta_x^{[t]}$$\n", - "\n", "여기서\n", "\n", + "어디\n", + "\n", "- $x$: 최적화하는 변수\n", "- $\\Delta_x$: $x$에서 변경\n", "- $lr$: 학습률\n", @@ -355,7 +373,9 @@ "metadata": { "id": "rOBY8Tz4S0dX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class Momentum(tf.Module):\n", "\n", @@ -389,7 +409,9 @@ "metadata": { "id": "tA6oQL-sW2xg" }, - "outputs": [], + "outputs": [ + + ], "source": [ "param_map_mtm = {}\n", "learning_rates = [1e-3, 1e-2, 1e-1]\n", @@ -414,7 +436,9 @@ "metadata": { "id": "qbW1eEKaX3T9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "viz_paths(param_map_mtm, x_vals, loss, \"Momentum\")" ] @@ -481,7 +505,9 @@ "metadata": { "id": "hm5vffRJRsEc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class Adam(tf.Module):\n", " \n", @@ -535,7 +561,9 @@ "metadata": { "id": "GXHCxtemFBpR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "param_map_adam = {}\n", "learning_rates = [1e-3, 1e-2, 1e-1]\n", @@ -559,7 +587,9 @@ "metadata": { "id": "ctvOUmlzFK8s" }, - "outputs": [], + "outputs": [ + + ], "source": [ "viz_paths(param_map_adam, x_vals, loss, \"Adam\")" ] @@ -590,7 +620,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "optimizers_core.ipynb", "toc_visible": true }, diff --git a/site/ko/guide/core/quickstart_core.ipynb b/site/ko/guide/core/quickstart_core.ipynb index 3d06d62e8a..04ac4359d8 100644 --- a/site/ko/guide/core/quickstart_core.ipynb +++ b/site/ko/guide/core/quickstart_core.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "BZSlp3DAjdYf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -87,7 +89,9 @@ "metadata": { "id": "0trJmd6DjqBZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "import pandas as pd\n", @@ -117,7 +121,9 @@ "metadata": { "id": "HglhDsUfrJ98" }, - "outputs": [], + "outputs": [ + + ], "source": [ "url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data'\n", "column_names = ['MPG', 'Cylinders', 'Displacement', 'Horsepower', 'Weight',\n", @@ -146,7 +152,9 @@ "metadata": { "id": "0mJU4kt6YiAp" }, - "outputs": [], + "outputs": [ + + ], "source": [ "dataset_shuffled = tf.random.shuffle(dataset_tf, seed=22)\n", "train_data, test_data = dataset_shuffled[100:], dataset_shuffled[:100]\n", @@ -169,7 +177,9 @@ "metadata": { "id": "_B8N9IV1i6IV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def onehot_origin(x):\n", " origin = tf.cast(x[:, -1], tf.int32)\n", @@ -197,7 +207,9 @@ "metadata": { "id": "dJJFdvqydhyp" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class Normalize(tf.Module):\n", " def __init__(self, x):\n", @@ -220,7 +232,9 @@ "metadata": { "id": "5BONV6fYYwZb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "norm_x = Normalize(x_train_ohe)\n", "norm_y = Normalize(y_train)\n", @@ -256,7 +270,9 @@ "metadata": { "id": "h3IKyzTCDNGo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class LinearRegression(tf.Module):\n", "\n", @@ -292,7 +308,9 @@ "metadata": { "id": "OeOrNdnkEEcR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "lin_reg = LinearRegression()\n", "prediction = lin_reg(x_train_norm[:1])\n", @@ -328,7 +346,9 @@ "metadata": { "id": "8tYNVUkmw35s" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def mse_loss(y_pred, y):\n", " return tf.reduce_mean(tf.square(y_pred - y))" @@ -351,7 +371,9 @@ "metadata": { "id": "kxST2w_Nq0C5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "batch_size = 64\n", "train_dataset = tf.data.Dataset.from_tensor_slices((x_train_norm, y_train_norm))\n", @@ -377,7 +399,9 @@ "metadata": { "id": "y7suUbJXVLqP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Set training parameters\n", "epochs = 100\n", @@ -435,7 +459,9 @@ "metadata": { "id": "F7dTAzgHDUh7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "matplotlib.rcParams['figure.figsize'] = [9, 6]\n", "\n", @@ -478,7 +504,9 @@ "metadata": { "id": "g-uOrGa9ZehG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class ExportModule(tf.Module):\n", " def __init__(self, model, extract_features, norm_x, norm_y):\n", @@ -504,7 +532,9 @@ "metadata": { "id": "YPYYLQ8EZiU8" }, - "outputs": [], + "outputs": [ + + ], "source": [ "lin_reg_export = ExportModule(model=lin_reg,\n", " extract_features=onehot_origin,\n", @@ -527,7 +557,9 @@ "metadata": { "id": "K1IvMoHbptht" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tempfile\n", "import os\n", @@ -543,7 +575,9 @@ "metadata": { "id": "rYb6DrEH0GMv" }, - "outputs": [], + "outputs": [ + + ], "source": [ "lin_reg_loaded = tf.saved_model.load(save_path)\n", "test_preds = lin_reg_loaded(x_test)\n", diff --git a/site/ko/guide/dtensor_overview.ipynb b/site/ko/guide/dtensor_overview.ipynb index c180fcb17d..61374bb6b0 100644 --- a/site/ko/guide/dtensor_overview.ipynb +++ b/site/ko/guide/dtensor_overview.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "tuOe1ymfHZPu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -88,7 +90,9 @@ "metadata": { "id": "OKaPw8vwwZAC" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install --quiet --upgrade --pre tensorflow" ] @@ -110,7 +114,9 @@ "metadata": { "id": "Q92lo0zjwej8" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "from tensorflow.experimental import dtensor\n", @@ -167,7 +173,7 @@ "1차원 `Mesh`에서는 모든 장치가 단일 메시 차원으로 목록을 형성합니다. 다음 예제에서는 6개 장치를 사용하는 `'x'` 메시 차원에 따라 `dtensor.create_mesh`를 사용하여 메시를 생성합니다.\n", "\n", "\n", - "\"6개의 \n" + "\"6개의 \n" ] }, { @@ -176,7 +182,9 @@ "metadata": { "id": "QLH5fgdBmA58" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mesh_1d = dtensor.create_mesh([('x', 6)], devices=DEVICES)\n", "print(mesh_1d)" @@ -199,7 +207,9 @@ "metadata": { "id": "op6TmKUQE-sZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mesh_2d = dtensor.create_mesh([('x', 3), ('y', 2)], devices=DEVICES)\n", "print(mesh_2d)" @@ -248,7 +258,9 @@ "metadata": { "id": "-a3EnmZag6x1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "layout = dtensor.Layout([dtensor.UNSHARDED, dtensor.UNSHARDED], mesh_1d)" ] @@ -262,7 +274,7 @@ "동일한 텐서를 사용하고 `Layout(['unsharded', 'x'])` 레이아웃을 메시하면 6개의 장치에서 텐서의 두 번째 축이 분할될 수 있습니다.\n", "\n", "\n", - "\"1순위 " + "\"1순위 " ] }, { @@ -271,7 +283,9 @@ "metadata": { "id": "7BgqL0jUvV5a" }, - "outputs": [], + "outputs": [ + + ], "source": [ "layout = dtensor.Layout([dtensor.UNSHARDED, 'x'], mesh_1d)" ] @@ -291,7 +305,8 @@ "id": "Eyp_qOSyvieo" }, "source": [ - "\"메시 \n" + "\n", + "\"메시 \n" ] }, { @@ -300,7 +315,9 @@ "metadata": { "id": "p8OrehEuhPbS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "layout = dtensor.Layout(['y', 'x'], mesh_2d)" ] @@ -314,7 +331,7 @@ "동일한 `mesh_2d`의 경우 레이아웃 `Layout([\"x\", dtensor.UNSHARDED], mesh_2d)`은 2순위 `Tensor`이며, 이는 `\"y\"`에 복제되고 첫 번째 축이 메시 차원 `x`에서 분할됩니다.\n", "\n", "\n", - "\"메시 \n" + "\"메시 \n" ] }, { @@ -323,7 +340,9 @@ "metadata": { "id": "IkWe6mVl7uRb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "layout = dtensor.Layout([\"x\", dtensor.UNSHARDED], mesh_2d)" ] @@ -367,7 +386,9 @@ "metadata": { "id": "s6aws-b8dN9L" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def dtensor_from_array(arr, layout, shape=None, dtype=None):\n", " \"\"\"Convert a DTensor from something that looks like an array or Tensor.\n", @@ -410,7 +431,9 @@ "metadata": { "id": "mQu_nScGUvYH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mesh = dtensor.create_mesh([(\"x\", 6)], devices=DEVICES)\n", "layout = dtensor.Layout([dtensor.UNSHARDED], mesh)\n", @@ -440,7 +463,9 @@ "metadata": { "id": "dCSFyaAjmzGu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(dtensor.fetch_layout(my_first_dtensor))\n", "assert layout == dtensor.fetch_layout(my_first_dtensor)" @@ -467,7 +492,9 @@ "metadata": { "id": "BGbjqVAOnXMk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for component_tensor in dtensor.unpack(my_first_dtensor):\n", " print(\"Device:\", component_tensor.device, \",\", component_tensor)" @@ -499,7 +526,9 @@ "metadata": { "id": "9lT-6qQwxOgf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "packed_dtensor = dtensor.pack(\n", " [[0, 1], [0, 1], [0, 1],\n", @@ -528,7 +557,9 @@ "metadata": { "id": "KWb9Ae0VJ-Rc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mesh = dtensor.create_mesh([(\"x\", 3), (\"y\", 2)], devices=DEVICES)" ] @@ -553,7 +584,9 @@ "metadata": { "id": "ax_ZHouJp1MX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "fully_sharded_dtensor = dtensor_from_array(\n", " tf.reshape(tf.range(6), (3, 2)),\n", @@ -583,7 +616,9 @@ "metadata": { "id": "xmyC6H6Ec90P" }, - "outputs": [], + "outputs": [ + + ], "source": [ "fully_replicated_dtensor = dtensor_from_array(\n", " tf.reshape(tf.range(6), (3, 2)),\n", @@ -620,7 +655,9 @@ "metadata": { "id": "DygnbkQ1Lu42" }, - "outputs": [], + "outputs": [ + + ], "source": [ "hybrid_sharded_dtensor = dtensor_from_array(\n", " tf.reshape(tf.range(6), (3, 2)),\n", @@ -658,7 +695,9 @@ "metadata": { "id": "hNdwmnL0jAXS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(fully_replicated_dtensor.numpy())\n", "\n", @@ -734,7 +773,9 @@ "metadata": { "id": "TiZf2J9JNd2D" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mesh = dtensor.create_mesh([(\"x\", 6)], devices=DEVICES)\n", "layout = dtensor.Layout([dtensor.UNSHARDED, dtensor.UNSHARDED], mesh)\n", @@ -773,7 +814,9 @@ "metadata": { "id": "EyVAUvMePbms" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mesh = dtensor.create_mesh([(\"x\", 3), (\"y\", 2)], devices=DEVICES)\n", "a_layout = dtensor.Layout([dtensor.UNSHARDED, 'x'], mesh)\n", @@ -805,7 +848,9 @@ "metadata": { "id": "0PYqe0neiOpR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mesh = dtensor.create_mesh([(\"x\", 3), (\"y\", 2)], devices=DEVICES)\n", "\n", @@ -843,7 +888,9 @@ "metadata": { "id": "J0jo_8NPtJiO" }, - "outputs": [], + "outputs": [ + + ], "source": [ "help(dtensor.call_with_layout)" ] @@ -876,7 +923,9 @@ "metadata": { "id": "G1CuKYSFtFeM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "help(tf.ones)" ] @@ -887,7 +936,9 @@ "metadata": { "id": "2m_EAwy-ozOh" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mesh = dtensor.create_mesh([(\"x\", 3), (\"y\", 2)], devices=DEVICES)\n", "ones = dtensor.call_with_layout(tf.ones, dtensor.Layout(['x', 'y'], mesh), shape=(6, 4))\n", @@ -911,7 +962,9 @@ "metadata": { "id": "H8BQSTRFtCih" }, - "outputs": [], + "outputs": [ + + ], "source": [ "help(tf.random.stateless_normal)" ] @@ -922,7 +975,9 @@ "metadata": { "id": "TvP81eYopSPm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ones = dtensor.call_with_layout(\n", " tf.function(tf.random.stateless_normal),\n", @@ -947,7 +1002,9 @@ "metadata": { "id": "LbAtKrSkpOaq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ones = dtensor.call_with_layout(\n", " tf.function(tf.ones),\n", @@ -975,7 +1032,9 @@ "metadata": { "id": "awRPuR26P0Sc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mesh = dtensor.create_mesh([(\"x\", 6)], devices=DEVICES)\n", "layout = dtensor.Layout([dtensor.UNSHARDED, dtensor.UNSHARDED], mesh)\n", @@ -1007,7 +1066,9 @@ "metadata": { "id": "adxFw9wJpqQQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "a = dtensor.call_with_layout(tf.ones, layout=layout, shape=(64, 32))\n", "b = v + a # add DVariable and DTensor\n", @@ -1029,7 +1090,9 @@ "metadata": { "id": "oYwfiyw5P94U" }, - "outputs": [], + "outputs": [ + + ], "source": [ "v.assign(a) # assign a DTensor to a DVariable\n", "print(a)" @@ -1050,7 +1113,9 @@ "metadata": { "id": "3pckUugYP_r-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# variable's layout is immutable.\n", "another_mesh = dtensor.create_mesh([(\"x\", 3), (\"y\", 2)], devices=DEVICES)\n", @@ -1077,7 +1142,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "dtensor_overview.ipynb", "toc_visible": true }, diff --git a/site/ko/guide/migrate/tf1_vs_tf2.ipynb b/site/ko/guide/migrate/tf1_vs_tf2.ipynb index 27659dbf55..9a276ea682 100644 --- a/site/ko/guide/migrate/tf1_vs_tf2.ipynb +++ b/site/ko/guide/migrate/tf1_vs_tf2.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "tuOe1ymfHZPu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -719,7 +721,9 @@ "metadata": { "id": "QF4un9UpVTRA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf" ] @@ -730,7 +734,9 @@ "metadata": { "id": "PbpD-kHOZR4A" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Create a shape and choose an index\n", "i = 0\n", @@ -759,7 +765,9 @@ "metadata": { "id": "KuR73QGEeNdH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "value = shape[i]\n", "value" @@ -788,7 +796,9 @@ "metadata": { "id": "y6s0vuuprJfc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for value in shape:\n", " print(value)" @@ -816,7 +826,9 @@ "metadata": { "id": "LpViGEcUZDGX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "other_dim = 16\n", "Dimension = tf.compat.v1.Dimension\n", @@ -834,7 +846,9 @@ "metadata": { "id": "GaiGe36dOdZ_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "shape = tf.TensorShape(None)\n", "\n", @@ -858,7 +872,9 @@ "metadata": { "id": "-Ow1ndKpOnJd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(bool(tf.TensorShape([]))) # Scalar\n", "print(bool(tf.TensorShape([0]))) # 0-length vector\n", @@ -887,7 +903,9 @@ "metadata": { "id": "r18f8JAGsQi6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "try:\n", " # Create a shape and choose an index\n", @@ -904,7 +922,9 @@ "metadata": { "id": "t9flHru1uIdT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "try:\n", " # Create a shape and choose an index\n", @@ -945,7 +965,9 @@ "metadata": { "id": "dkGPGpEZ5DI-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf.compat.v1.disable_tensor_equality()\n", "x = tf.Variable(0.0)\n", @@ -969,7 +991,9 @@ "metadata": { "id": "V5P_Rwy-zxVE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf.compat.v1.enable_tensor_equality()\n", "x = tf.Variable(0.0)\n", @@ -993,7 +1017,9 @@ "metadata": { "id": "iEjXVxlu4uxo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf.compat.v1.enable_tensor_equality()\n", "x = tf.Variable(0.0)\n", @@ -1026,7 +1052,9 @@ "metadata": { "id": "-TR1KfJu462w" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf.compat.v1.enable_tensor_equality()\n", "x = tf.Variable(0.0)\n", @@ -1053,7 +1081,9 @@ "metadata": { "id": "p-1kVPs01ZuU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf.compat.v1.enable_tensor_equality()\n", "x = tf.Variable(0.0)\n", @@ -1079,7 +1109,9 @@ "metadata": { "id": "DwRZMYV06M7q" }, - "outputs": [], + "outputs": [ + + ], "source": [ "referenced_var = x.ref().deref()\n", "assert referenced_var is x\n", @@ -1101,7 +1133,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "tf1_vs_tf2.ipynb", "toc_visible": true }, diff --git a/site/ko/guide/migrate/validate_correctness.ipynb b/site/ko/guide/migrate/validate_correctness.ipynb index 054607d943..6c96e60ce9 100644 --- a/site/ko/guide/migrate/validate_correctness.ipynb +++ b/site/ko/guide/migrate/validate_correctness.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "FlUw7tSKbtg4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -85,7 +87,9 @@ "metadata": { "id": "FkHX044DzVsd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip uninstall -y -q tensorflow" ] @@ -96,7 +100,9 @@ "metadata": { "id": "M1ZgieHtyzKI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Install tf-nightly as the DeterministicRandomTestTool is available only in\n", "# Tensorflow 2.8\n", @@ -109,7 +115,9 @@ "metadata": { "id": "ohYETq4NCX4J" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install -q tf_slim" ] @@ -120,7 +128,9 @@ "metadata": { "id": "MFey2HxcktP6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "import tensorflow.compat.v1 as v1\n", @@ -139,7 +149,9 @@ "metadata": { "id": "OriidSSAmRtW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!git clone --depth=1 https://github.com/tensorflow/models.git\n", "import models.research.slim.nets.inception_resnet_v2 as inception" @@ -160,7 +172,9 @@ "metadata": { "id": "IijQZtxeaErg" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# TF1 Inception resnet v2 forward pass based on slim layers\n", "def inception_resnet_v2(inputs, num_classes, is_training):\n", @@ -175,7 +189,9 @@ "metadata": { "id": "Z_-Oxg9OlSd4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class InceptionResnetV2(tf.keras.layers.Layer):\n", " \"\"\"Slim InceptionResnetV2 forward pass as a Keras layer\"\"\"\n", @@ -229,7 +245,9 @@ "metadata": { "id": "VMTfTXC0zW97" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@contextmanager\n", "def assert_no_variable_creations():\n", @@ -274,7 +292,9 @@ "metadata": { "id": "O9FAGotiuLbK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = InceptionResnetV2(1000)\n", "height, width = 299, 299\n", @@ -306,7 +326,9 @@ "metadata": { "id": "gXqhPQWWtMAw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class BrokenScalingLayer(tf.keras.layers.Layer):\n", " \"\"\"Scaling layer that incorrectly creates new weights each time:\"\"\"\n", @@ -324,7 +346,9 @@ "metadata": { "id": "ztUKlMdGvHSq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = BrokenScalingLayer()\n", "inputs = tf.ones( (1, height, width, 3))\n", @@ -344,7 +368,9 @@ "metadata": { "id": "6VyfMJ50vZqZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = BrokenScalingLayer()\n", "inputs = tf.ones( (1, height, width, 3))\n", @@ -372,7 +398,9 @@ "metadata": { "id": "FN1Oa10iviv8" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class FixedScalingLayer(tf.keras.layers.Layer):\n", " \"\"\"Scaling layer that incorrectly creates new weights each time:\"\"\"\n", @@ -432,7 +460,9 @@ "metadata": { "id": "m_aqag5fpun5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Build the forward pass inside a TF1.x graph, and \n", "# get the counts, shapes, and names of the variables\n", @@ -464,7 +494,9 @@ "metadata": { "id": "S7ND-lBSqmnE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "height, width = 299, 299\n", "num_classes = 1000\n", @@ -491,7 +523,9 @@ "metadata": { "id": "pY2P_4wqsOYw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Verify that the variable counts, names, and shapes all match:\n", "assert num_tf1_variables == num_tf2_variables\n", @@ -546,7 +580,9 @@ "metadata": { "id": "kL4PzD2Cxzmp" }, - "outputs": [], + "outputs": [ + + ], "source": [ "graph = tf.Graph()\n", "with graph.as_default(), tf.compat.v1.Session(graph=graph) as sess:\n", @@ -585,7 +621,9 @@ "metadata": { "id": "kb086gJwzsNo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "height, width = 299, 299\n", "num_classes = 1000\n", @@ -614,7 +652,9 @@ "metadata": { "id": "CUfWqlgIK6ej" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Create a dict of tolerance values\n", "tol_dict={'rtol':1e-06, 'atol':1e-05}" @@ -626,7 +666,9 @@ "metadata": { "id": "R-C07eTo0WTr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Verify that the regularization loss and output both match\n", "# when we fix the weights and avoid randomness by running inference:\n", @@ -702,7 +744,9 @@ "metadata": { "id": "DDFfjrbXEWED" }, - "outputs": [], + "outputs": [ + + ], "source": [ "random_tool = v1.keras.utils.DeterministicRandomTestTool()\n", "with random_tool.scope():\n", @@ -725,7 +769,9 @@ "metadata": { "id": "o9bkdPuTFpYr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "random_tool = v1.keras.utils.DeterministicRandomTestTool()\n", "with random_tool.scope():\n", @@ -745,7 +791,9 @@ "metadata": { "id": "qRJYFydsGIbF" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Demonstrate that the generated random numbers match\n", "np.testing.assert_allclose(graph_a, a.numpy(), **tol_dict)\n", @@ -768,7 +816,9 @@ "metadata": { "id": "IdxV89q2WPid" }, - "outputs": [], + "outputs": [ + + ], "source": [ "np.testing.assert_allclose(b.numpy(), c.numpy(), **tol_dict)" ] @@ -790,7 +840,9 @@ "metadata": { "id": "L-AeD148VygJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "random_tool = v1.keras.utils.DeterministicRandomTestTool(mode='num_random_ops')\n", "with random_tool.scope():\n", @@ -813,7 +865,9 @@ "metadata": { "id": "CedD41NuVygK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "random_tool = v1.keras.utils.DeterministicRandomTestTool(mode='num_random_ops')\n", "with random_tool.scope():\n", @@ -833,7 +887,9 @@ "metadata": { "id": "5We2xSnLVygL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Demonstrate that the generated random numbers match\n", "np.testing.assert_allclose(graph_a, a.numpy(), **tol_dict)\n", @@ -847,7 +903,9 @@ "metadata": { "id": "BBFG1xehWneM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Demonstrate that with the 'num_random_ops' mode,\n", "# b & c took on different values even though\n", @@ -870,7 +928,9 @@ "metadata": { "id": "cZt__ElEIDl_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "random_tool = v1.keras.utils.DeterministicRandomTestTool(mode='num_random_ops')\n", "with random_tool.scope():\n", @@ -905,7 +965,9 @@ "metadata": { "id": "33RCSICuJEyV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "random_tool = v1.keras.utils.DeterministicRandomTestTool(mode='num_random_ops')\n", "with random_tool.scope():\n", @@ -933,7 +995,9 @@ "metadata": { "id": "6W4sS_wOM8CH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "random_tool = v1.keras.utils.DeterministicRandomTestTool(mode='num_random_ops')\n", "with random_tool.scope():\n", @@ -972,7 +1036,9 @@ "metadata": { "id": "GmBgg5hzNa5H" }, - "outputs": [], + "outputs": [ + + ], "source": [ "random_tool = v1.keras.utils.DeterministicRandomTestTool(mode='num_random_ops')\n", "with random_tool.scope():\n", @@ -1008,7 +1074,9 @@ "metadata": { "id": "8TWOrflkPa7T" }, - "outputs": [], + "outputs": [ + + ], "source": [ "random_tool = v1.keras.utils.DeterministicRandomTestTool(mode='num_random_ops')\n", "with random_tool.scope():\n", @@ -1037,7 +1105,9 @@ "metadata": { "id": "Qcx6ur4KPMI1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "height, width = 299, 299\n", "num_classes = 1000\n", @@ -1061,7 +1131,9 @@ "metadata": { "id": "m_SS2b6qPFl1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Verify that the regularization loss and output both match\n", "# when using the DeterministicRandomTestTool:\n", @@ -1086,7 +1158,9 @@ "metadata": { "id": "nMBFVa1kQTJH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "random_tool = v1.keras.utils.DeterministicRandomTestTool(mode='num_random_ops')\n", "with random_tool.scope():\n", @@ -1115,7 +1189,9 @@ "metadata": { "id": "-jlBkwI5QTJI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "height, width = 299, 299\n", "num_classes = 1000\n", @@ -1139,7 +1215,9 @@ "metadata": { "id": "IL9mjTLnQTJJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Verify that the regularization loss and output both match\n", "# when using the DeterministicRandomTestTool\n", @@ -1177,7 +1255,9 @@ "metadata": { "id": "0dSR4ZNvYNYm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "random_tool = v1.keras.utils.DeterministicRandomTestTool()\n", "with random_tool.scope():\n", @@ -1206,7 +1286,9 @@ "metadata": { "id": "iMPMMnPtYUY7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "height, width = 299, 299\n", "num_classes = 1000\n", @@ -1232,7 +1314,9 @@ "metadata": { "id": "jf46KUVyYUY8" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Verify that the regularization loss and output both match\n", "# when using the DeterministicRandomTestTool\n", @@ -1271,7 +1355,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "validate_correctness.ipynb", "toc_visible": true }, diff --git a/site/ko/guide/profiler.md b/site/ko/guide/profiler.md index 3084801013..2773c828fc 100644 --- a/site/ko/guide/profiler.md +++ b/site/ko/guide/profiler.md @@ -84,8 +84,8 @@ Profiler에는 성능 분석에 도움이 되는 다양한 도구가 있습니 - 출력: 출력 데이터를 읽는 데 소요된 시간 - 커널 시작: 호스트가 커널을 시작하는 데 소요된 시간 - 호스트 컴퓨팅 시간 - - 기기 간 통신 시간 - - 기기 내 컴퓨팅 시간 + - 장치 간 통신 시간 + - 장치 내 컴퓨팅 시간 - 모든 기타 시간(Python 오버헤드 포함) 2. 기기 컴퓨팅 정밀도 - 16bit 및 32bit 계산을 사용하는 기기 컴퓨팅 시간의 백분율을 보고합니다. @@ -99,8 +99,8 @@ Profiler에는 성능 분석에 도움이 되는 다양한 도구가 있습니 - **실행 환경**: 다음을 포함하여 모델 실행 환경에 대한 높은 수준의 요약을 표시합니다. - 사용된 호스트 수 - - 기기 유형(GPU/TPU) - - 기기 코어 수 + - 장치 유형(GPU/TPU) + - 장치 코어 수 - **다음 단계를 위한 권장 사항**: 모델이 입력 바운드될 때 보고하고, 모델의 성능 병목 현상을 찾아 해결하는 데 사용할 수 있는 도구를 권장합니다. @@ -221,7 +221,7 @@ TensorFlow 통계 도구는 프로파일링 세션 동안 호스트 또는 기 추적 뷰어를 열면 가장 최근에 실행된 내용이 표시됩니다. -![image](./images/tf_profiler/trace_viewer.png) +![image](./images/tf_profiler/tf_stats.png) 이 화면에는 다음과 같은 주요 요소가 포함되어 있습니다. @@ -260,7 +260,7 @@ TensorFlow 통계 도구는 프로파일링 세션 동안 호스트 또는 기 이 도구는 모든 GPU 가속 커널에 대한 성능 통계 및 원래 op를 보여줍니다. -![image](./images/tf_profiler/tf_data_all_hosts.png) +![image](./images/tf_profiler/gpu_kernel_stats.png) 이 도구는 두 개의 창에서 정보를 표시합니다. @@ -322,7 +322,7 @@ TensorFlow 통계 도구는 프로파일링 세션 동안 호스트 또는 기 이 섹션에는 메모리 사용량(GiB) 플롯 및 시간에 따른 조각화 비율(ms)이 표시됩니다. -![image](./images/tf_profiler/pod_viewer.png) +![image](./images/tf_profiler/memory_timeline_graph.png) X축은 프로파일링 기간의 타임라인(ms)을 나타냅니다. 왼쪽의 Y축은 메모리 사용량(GiB)을 나타내고 오른쪽의 Y축은 조각화 비율을 나타냅니다. X축의 각 시점에서 총 메모리는 스택(빨간색), 힙(주황색) 및 여유(녹색)의 세 가지 범주로 분류됩니다. 특정 타임스탬프 위로 마우스를 가져가면 아래와 같이 해당 시점의 메모리 할당/할당 해제 이벤트에 대한 세부 정보를 볼 수 있습니다. @@ -345,7 +345,7 @@ X축은 프로파일링 기간의 타임라인(ms)을 나타냅니다. 왼쪽의 이 표에는 프로파일링 기간 동안 최대 메모리 사용량 시점에서 활성 메모리 할당량이 표시됩니다. -![image](./images/tf_profiler/gpu_kernel_stats.png) +![image](./images/tf_profiler/memory_breakdown_table.png) TensorFlow 연산마다 하나의 행이 있으며 각 행에는 다음 열이 있습니다. @@ -365,7 +365,7 @@ TensorFlow 연산마다 하나의 행이 있으며 각 행에는 다음 열이 Pod 뷰어 도구는 모든 작업자의 학습 스텝 분석을 보여줍니다. -![image](./images/tf_profiler/memory_breakdown_table.png) +![image](./images/tf_profiler/pod_viewer.png) - 상단 창에는 스텝 번호를 선택하는 슬라이더가 있습니다. - 아래쪽 창에는 누적 세로 막대형 차트가 표시됩니다. 이것은 분류된 스텝 시간 범주를 서로의 위에 배치한 고차원적인 보기입니다. 누적된 각 열은 고유한 작업자를 나타냅니다. @@ -391,7 +391,7 @@ UI는 **성능 분석 요약**, **모든 입력 파이프라인 요약** 및 ** #### 성능 분석 요약 -![image](https://github.com/tensorflow/docs-l10n/blob/master/site/ko/guide/images/tf_profiler/tf_data_graph.png?raw=true) +![image](./images/tf_profiler/trace_viewer.png) 이 섹션에서는 분석 요약을 제공합니다. 프로파일에서 느린 `tf.data` 입력 파이프라인이 감지되는지 여부가 보고됩니다. 이 섹션에는 또한 입력 바운드가 가장 큰 호스트와 지연 시간이 가장 큰 가장 느린 입력 파이프라인이 표시됩니다. 그리고 가장 중요한 부분으로, 입력 파이프라인의 어느 부분이 병목인지, 이 병목을 해결할 방법을 알려줍니다. 병목 현상 정보는 반복기 유형과 해당하는 긴 이름과 함께 제공됩니다. @@ -416,7 +416,7 @@ dataset = tf.data.Dataset.range(10).map(lambda x: x).repeat(2).batch(5) #### 모든 입력 파이프라인 요약 -![image](https://github.com/tensorflow/docs-l10n/blob/master/site/ko/guide/images/tf_profiler/tf_data_graph_selector.png?raw=true) +![image](./images/tf_profiler/tf_data_all_hosts.png) 이 섹션에서는 모든 호스트의 모든 입력 파이프라인에 대한 요약을 제공합니다. 일반적으로 하나의 입력 파이프라인이 있습니다. 배포 전략을 사용하는 경우, 프로그램의 `tf.data` 코드를 실행하는 하나의 호스트 입력 파이프라인과 호스트 입력 파이프라인에서 데이터를 검색하여 장치로 전송하는 여러 개의 기기 입력 파이프라인이 있습니다. @@ -424,11 +424,11 @@ dataset = tf.data.Dataset.range(10).map(lambda x: x).repeat(2).batch(5) #### 입력 파이프라인 그래프 -![image](./images/tf_profiler/memory_timeline_graph.png) +![image](https://github.com/tensorflow/docs-l10n/blob/master/site/ko/guide/images/tf_profiler/tf_data_graph_selector.png?raw=true) 이 섹션에서는 실행 시간 정보와 함께 입력 파이프라인 그래프가 표시됩니다. "호스트" 및 "입력 파이프라인"을 사용하여 보려는 호스트와 입력 파이프라인을 선택할 수 있습니다. 입력 파이프라인의 실행은 실행 시간을 기준으로 정렬되며, **Rank** 드롭다운을 사용하여 내림차순으로 정렬할 수 있습니다. -![image](./images/tf_profiler/tf_stats.png) +![image](https://github.com/tensorflow/docs-l10n/blob/master/site/ko/guide/images/tf_profiler/tf_data_graph.png?raw=true) 중요 경로의 노드에는 굵은 윤곽선이 있습니다. 중요 경로에서 가장 긴 자체 시간을 가진 노드인 병목 노드는 빨간색 윤곽선으로 표시됩니다. 중요하지 않은 다른 노드에는 회색 점선 윤곽선이 있습니다. diff --git a/site/ko/guide/ragged_tensor.ipynb b/site/ko/guide/ragged_tensor.ipynb index c94967ba05..dd0892faef 100644 --- a/site/ko/guide/ragged_tensor.ipynb +++ b/site/ko/guide/ragged_tensor.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "tXAbWHtqs1Y2" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -71,7 +73,9 @@ "metadata": { "id": "KKvdSorS-pDD" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install --pre -U tensorflow\n", "import math\n", @@ -111,7 +115,9 @@ "metadata": { "id": "vGmJGSf_-PVB" }, - "outputs": [], + "outputs": [ + + ], "source": [ "digits = tf.ragged.constant([[3, 1, 4, 1], [], [5, 9, 2], [6], []])\n", "words = tf.ragged.constant([[\"So\", \"long\"], [\"thanks\", \"for\", \"all\", \"the\", \"fish\"]])\n", @@ -156,7 +162,9 @@ "metadata": { "id": "n8YMKXpI-PVH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(digits[0]) # First row" ] @@ -167,7 +175,9 @@ "metadata": { "id": "Awi8i9q5_DuX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(digits[:, :2]) # First two values in each row." ] @@ -178,7 +188,9 @@ "metadata": { "id": "sXgQtTcgHHMR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(digits[:, -2:]) # Last two values in each row." ] @@ -198,7 +210,9 @@ "metadata": { "id": "2tdUEtb7-PVL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(digits + 3)" ] @@ -209,7 +223,9 @@ "metadata": { "id": "X-bxG0nc_Nmf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(digits + tf.ragged.constant([[1, 2, 3, 4], [], [5, 6, 7], [8], []]))" ] @@ -229,7 +245,9 @@ "metadata": { "id": "pvt5URbdEt-D" }, - "outputs": [], + "outputs": [ + + ], "source": [ "times_two_plus_one = lambda x: x * 2 + 1\n", "print(tf.ragged.map_flat_values(times_two_plus_one, digits))" @@ -250,7 +268,9 @@ "metadata": { "id": "A5NHb8ViA9dt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "digits.to_list()" ] @@ -261,7 +281,9 @@ "metadata": { "id": "2o1wogVyA6Yp" }, - "outputs": [], + "outputs": [ + + ], "source": [ "digits.numpy()" ] @@ -283,7 +305,9 @@ "metadata": { "id": "yhgKMozw-PVP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "sentences = tf.ragged.constant([\n", " [\"Let's\", \"build\", \"some\", \"ragged\", \"tensors\", \"!\"],\n", @@ -297,7 +321,9 @@ "metadata": { "id": "TW1g7eE2ee8M" }, - "outputs": [], + "outputs": [ + + ], "source": [ "paragraphs = tf.ragged.constant([\n", " [['I', 'have', 'a', 'cat'], ['His', 'name', 'is', 'Mat']],\n", @@ -327,7 +353,9 @@ "metadata": { "id": "SEvcPUcl-PVS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(tf.RaggedTensor.from_value_rowids(\n", " values=[3, 1, 4, 1, 5, 9, 2],\n", @@ -353,7 +381,9 @@ "metadata": { "id": "LBY81WXl-PVW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(tf.RaggedTensor.from_row_lengths(\n", " values=[3, 1, 4, 1, 5, 9, 2],\n", @@ -379,7 +409,9 @@ "metadata": { "id": "FwizuqZI-PVb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(tf.RaggedTensor.from_row_splits(\n", " values=[3, 1, 4, 1, 5, 9, 2],\n", @@ -414,7 +446,9 @@ "metadata": { "id": "SqbPBd_w-PVi" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(tf.ragged.constant([[\"Hi\"], [\"How\", \"are\", \"you\"]])) # ok: type=string, rank=2" ] @@ -425,7 +459,9 @@ "metadata": { "id": "83ZCSJnQAWAf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(tf.ragged.constant([[[1, 2], [3]], [[4, 5]]])) # ok: type=int32, rank=3" ] @@ -436,7 +472,9 @@ "metadata": { "id": "ewA3cISdDfmP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "try:\n", " tf.ragged.constant([[\"one\", \"two\"], [3, 4]]) # bad: multiple types\n", @@ -450,7 +488,9 @@ "metadata": { "id": "EOWIlVidDl-n" }, - "outputs": [], + "outputs": [ + + ], "source": [ "try:\n", " tf.ragged.constant([\"A\", [\"B\", \"C\"]]) # bad: multiple nesting depths\n", @@ -475,7 +515,9 @@ "metadata": { "id": "ZBs_V7e--PVr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "queries = tf.ragged.constant([['Who', 'is', 'Dan', 'Smith'],\n", " ['Pause'],\n", @@ -546,7 +588,9 @@ "metadata": { "id": "M2Wzx4JEIvmb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf.ragged.constant([[\"Hi\"], [\"How\", \"are\", \"you\"]]).shape" ] @@ -566,7 +610,9 @@ "metadata": { "id": "5DHaqXHxlWi0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(tf.ragged.constant([[\"Hi\"], [\"How\", \"are\", \"you\"]]).bounding_shape())" ] @@ -595,7 +641,9 @@ "metadata": { "id": "ush7IGUWLXIn" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ragged_x = tf.ragged.constant([[\"John\"], [\"a\", \"big\", \"dog\"], [\"my\", \"cat\"]])\n", "ragged_y = tf.ragged.constant([[\"fell\", \"asleep\"], [\"barked\"], [\"is\", \"fuzzy\"]])\n", @@ -619,7 +667,9 @@ "metadata": { "id": "eTIhGayQL0gI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "sparse_x = ragged_x.to_sparse()\n", "sparse_y = ragged_y.to_sparse()\n", @@ -662,7 +712,9 @@ "metadata": { "id": "pHls7hQVJlk5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Task: predict whether each sentence is a question or not.\n", "sentences = tf.constant(\n", @@ -709,7 +761,9 @@ "metadata": { "id": "xsiglYM7TXGr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import google.protobuf.text_format as pbtext\n", "\n", @@ -750,7 +804,9 @@ "metadata": { "id": "xcdaIbYVT4mo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "feature_specification = {\n", " 'colors': tf.io.RaggedFeature(tf.string),\n", @@ -787,7 +843,9 @@ "metadata": { "id": "fBml1m2G2vO9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Helper function used to print datasets in the examples below.\n", "def print_dictionary_dataset(dataset):\n", @@ -814,7 +872,9 @@ "metadata": { "id": "BuelF_y2mEq9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "dataset = tf.data.Dataset.from_tensor_slices(feature_tensors)\n", "print_dictionary_dataset(dataset)" @@ -846,7 +906,9 @@ "metadata": { "id": "lk62aRz63IZn" }, - "outputs": [], + "outputs": [ + + ], "source": [ "batched_dataset = dataset.batch(2)\n", "print_dictionary_dataset(batched_dataset)" @@ -867,7 +929,9 @@ "metadata": { "id": "CxLlaPw_5Je4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "unbatched_dataset = batched_dataset.unbatch()\n", "print_dictionary_dataset(unbatched_dataset)" @@ -890,7 +954,9 @@ "metadata": { "id": "PYnhERwh3_mf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "non_ragged_dataset = tf.data.Dataset.from_tensor_slices([1, 5, 3, 2, 8])\n", "non_ragged_dataset = non_ragged_dataset.map(tf.range)\n", @@ -917,7 +983,9 @@ "metadata": { "id": "Ios1GuG-pf9U" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def transform_lengths(features):\n", " return {\n", @@ -944,7 +1012,9 @@ "metadata": { "id": "PfyxgVaj_8tl" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function\n", "def make_palindrome(x, axis):\n", @@ -957,7 +1027,9 @@ "metadata": { "id": "vcZdzvEnDEt0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "make_palindrome(tf.constant([[1, 2], [3, 4], [5, 6]]), axis=1)" ] @@ -968,7 +1040,9 @@ "metadata": { "id": "4WfCMIgdDMxj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "make_palindrome(tf.ragged.constant([[1, 2], [3], [4, 5, 6]]), axis=1)" ] @@ -988,7 +1062,9 @@ "metadata": { "id": "k6-hkhdDBk6G" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function(\n", " input_signature=[tf.RaggedTensorSpec(shape=[None, None], dtype=tf.int32)])\n", @@ -1015,7 +1091,9 @@ "metadata": { "id": "yyJeXJ4wFWox" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function\n", "def increment(x):\n", @@ -1052,7 +1130,9 @@ "metadata": { "id": "D-Dg9w7Je5pU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tempfile\n", "\n", @@ -1077,7 +1157,9 @@ "metadata": { "id": "Sfem1ESrdGzX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class CustomModule(tf.Module):\n", " def __init__(self, variable_value):\n", @@ -1127,7 +1209,9 @@ "metadata": { "id": "skScd37P-PVu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "x = tf.ragged.constant([[1, 2], [3], [4, 5, 6]])\n", "y = tf.ragged.constant([[1, 1], [2], [3, 3, 3]])\n", @@ -1149,7 +1233,9 @@ "metadata": { "id": "IYybEEWc-PVx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "x = tf.ragged.constant([[1, 2], [3], [4, 5, 6]])\n", "print(x + 3)" @@ -1192,7 +1278,9 @@ "metadata": { "id": "MbSRZRDz-PV1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "queries = tf.ragged.constant(\n", " [['Who', 'is', 'George', 'Washington'],\n", @@ -1206,7 +1294,9 @@ "metadata": { "id": "2HRs2xhh-vZE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(queries[1]) # A single query" ] @@ -1217,7 +1307,9 @@ "metadata": { "id": "EFfjZV7YA3UH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(queries[1, 2]) # A single word" ] @@ -1228,7 +1320,9 @@ "metadata": { "id": "VISRPQSdA3xn" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(queries[1:]) # Everything but the first row" ] @@ -1239,7 +1333,9 @@ "metadata": { "id": "J1PpSyKQBMng" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(queries[:, :3]) # The first 3 words of each query" ] @@ -1250,7 +1346,9 @@ "metadata": { "id": "ixrhHmJBeidy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(queries[:, -2:]) # The last 2 words of each query" ] @@ -1270,7 +1368,9 @@ "metadata": { "id": "8VbqbKcE-PV6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "rt = tf.ragged.constant([[[1, 2, 3], [4]],\n", " [[5], [], [6]],\n", @@ -1284,7 +1384,9 @@ "metadata": { "id": "f9WPVWf4grVp" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(rt[1]) # Second row (2D RaggedTensor)" ] @@ -1295,7 +1397,9 @@ "metadata": { "id": "ad8FGJoABjQH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(rt[3, 0]) # First element of fourth row (1D Tensor)" ] @@ -1306,7 +1410,9 @@ "metadata": { "id": "MPPr-a-bBjFE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(rt[:, 1:3]) # Items 1-3 of each row (3D RaggedTensor)" ] @@ -1317,7 +1423,9 @@ "metadata": { "id": "6SIDeoIUBi4z" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(rt[:, -1:]) # Last item of each row (3D RaggedTensor)" ] @@ -1348,7 +1456,9 @@ "metadata": { "id": "INnfmZGcBoU_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ragged_sentences = tf.ragged.constant([\n", " ['Hi'], ['Welcome', 'to', 'the', 'fair'], ['Have', 'fun']])" @@ -1360,7 +1470,9 @@ "metadata": { "id": "__iJ4iXtkGOx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# RaggedTensor -> Tensor\n", "print(ragged_sentences.to_tensor(default_value='', shape=[None, 10]))" @@ -1372,7 +1484,9 @@ "metadata": { "id": "-rfiyYqne8QN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Tensor -> RaggedTensor\n", "x = [[1, 3, -1, -1], [2, -1, -1, -1], [4, 5, 8, 9]]\n", @@ -1385,7 +1499,9 @@ "metadata": { "id": "41WAZLXNnbwH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#RaggedTensor -> SparseTensor\n", "print(ragged_sentences.to_sparse())" @@ -1397,7 +1513,9 @@ "metadata": { "id": "S8MkYo2hfVhj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# SparseTensor -> RaggedTensor\n", "st = tf.SparseTensor(indices=[[0, 0], [2, 0], [2, 1]],\n", @@ -1428,7 +1546,9 @@ "metadata": { "id": "uMm1WMkc-PV_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "rt = tf.ragged.constant([[1, 2], [3, 4, 5], [6], [], [7]])\n", "print(\"Python list:\", rt.to_list())\n", @@ -1470,7 +1590,9 @@ "metadata": { "id": "btGDjT4uNgQy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "x = tf.constant([[1, 2], [3, 4], [5, 6]])\n", "x.shape # shape of a tf.tensor" @@ -1482,7 +1604,9 @@ "metadata": { "id": "__OgvmrGPEjq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "rt = tf.ragged.constant([[1], [2, 3], [], [4]])\n", "rt.shape # shape of a tf.RaggedTensor" @@ -1514,7 +1638,9 @@ "metadata": { "id": "kWJ7Cn1EQTD_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "x = tf.constant([['a', 'b'], ['c', 'd'], ['e', 'f']])\n", "tf.shape(x)" @@ -1535,7 +1661,9 @@ "metadata": { "id": "nZc2wqgQQUFU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "rt = tf.ragged.constant([[1], [2, 3, 4], [], [5, 6]])\n", "rt_shape = tf.shape(rt)\n", @@ -1559,7 +1687,9 @@ "metadata": { "id": "pclAODLXT6Gr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(f\"tf.reshape(x, rt_shape) = {tf.reshape(x, rt_shape)}\")\n", "print(f\"tf.zeros(rt_shape) = {tf.zeros(rt_shape)}\")\n", @@ -1584,7 +1714,9 @@ "metadata": { "id": "MzQvPhsxS6HN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "rt_shape[0]" ] @@ -1604,7 +1736,9 @@ "metadata": { "id": "HgGMk0LeTGik" }, - "outputs": [], + "outputs": [ + + ], "source": [ "try:\n", " rt_shape[1]\n", @@ -1627,7 +1761,9 @@ "metadata": { "id": "APT72EaBU70t" }, - "outputs": [], + "outputs": [ + + ], "source": [ "rt_shape[:1]" ] @@ -1665,7 +1801,9 @@ "metadata": { "id": "NSRgD667WwIZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf.experimental.DynamicRaggedShape(\n", " row_partitions=[tf.experimental.RowPartition.from_row_lengths([5, 3, 2])],\n", @@ -1687,7 +1825,9 @@ "metadata": { "id": "gMxCzADUYIjY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf.experimental.DynamicRaggedShape.from_lengths([4, (2, 1, 0, 8), 12])" ] @@ -1733,7 +1873,9 @@ "metadata": { "id": "0n095XdR-PWU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# x (2D ragged): 2 x (num_rows)\n", "# y (scalar)\n", @@ -1749,7 +1891,9 @@ "metadata": { "id": "0SVYk5AP-PWW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# x (2d ragged): 3 x (num_rows)\n", "# y (2d tensor): 3 x 1\n", @@ -1768,7 +1912,9 @@ "metadata": { "id": "MsfBMD80s8Ux" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# x (3d ragged): 2 x (r1) x 2\n", "# y (2d ragged): 1 x 1\n", @@ -1787,7 +1933,9 @@ "metadata": { "id": "rEj5QVfnva0t" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# x (3d ragged): 2 x (r1) x (r2) x 1\n", "# y (1d tensor): 3\n", @@ -1825,7 +1973,9 @@ "metadata": { "id": "UpI0FlfL4Eim" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# x (2d ragged): 3 x (r1)\n", "# y (2d tensor): 3 x 4 # trailing dimensions do not match\n", @@ -1843,7 +1993,9 @@ "metadata": { "id": "qGq1zOT4zMoc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# x (2d ragged): 3 x (r1)\n", "# y (2d ragged): 3 x (r2) # ragged dimensions do not match.\n", @@ -1861,7 +2013,9 @@ "metadata": { "id": "CvLae5vMqeji" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# x (3d ragged): 3 x (r1) x 2\n", "# y (3d ragged): 3 x (r1) x 3 # trailing dimensions do not match\n", @@ -1908,7 +2062,9 @@ "metadata": { "id": "MrLgMu0gPuo-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "rt = tf.RaggedTensor.from_row_splits(\n", " values=[3, 1, 4, 1, 5, 9, 2],\n", @@ -1950,7 +2106,9 @@ "metadata": { "id": "yy3IGT2a-PWb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "rt = tf.RaggedTensor.from_row_splits(\n", " values=tf.RaggedTensor.from_row_splits(\n", @@ -1977,7 +2135,9 @@ "metadata": { "id": "AKYhtFcT-PWd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "rt = tf.RaggedTensor.from_nested_row_splits(\n", " flat_values=[10, 11, 12, 13, 14, 15, 16, 17, 18, 19],\n", @@ -2002,7 +2162,9 @@ "metadata": { "id": "BXp-Tt2bClem" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# shape = [batch, (paragraph), (sentence), (word)]\n", "conversations = tf.ragged.constant(\n", @@ -2020,7 +2182,9 @@ "metadata": { "id": "DZUMrgxXFd5s" }, - "outputs": [], + "outputs": [ + + ], "source": [ "assert conversations.ragged_rank == len(conversations.nested_row_splits)\n", "conversations.ragged_rank # Number of partitioned dimensions." @@ -2032,7 +2196,9 @@ "metadata": { "id": "xXLSNpS0Fdvp" }, - "outputs": [], + "outputs": [ + + ], "source": [ "conversations.flat_values.numpy()" ] @@ -2056,7 +2222,9 @@ "metadata": { "id": "z2sHwHdy-PWg" }, - "outputs": [], + "outputs": [ + + ], "source": [ "rt = tf.RaggedTensor.from_row_splits(\n", " values=[[1, 3], [0, 0], [1, 3], [5, 3], [3, 3], [1, 2]],\n", @@ -2087,7 +2255,9 @@ "metadata": { "id": "70q1aCKwySgS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "rt = tf.RaggedTensor.from_uniform_row_length(\n", " values=tf.RaggedTensor.from_row_splits(\n", @@ -2102,7 +2272,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "ragged_tensor.ipynb", "toc_visible": true }, diff --git a/site/ko/io/tutorials/azure.ipynb b/site/ko/io/tutorials/azure.ipynb index 649501fa97..80b5f0c020 100644 --- a/site/ko/io/tutorials/azure.ipynb +++ b/site/ko/io/tutorials/azure.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "tuOe1ymfHZPu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -257,7 +259,9 @@ "metadata": { "id": "ZIrXoXgYlsj_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import os\n", "import tensorflow as tf\n", diff --git a/site/ko/io/tutorials/dicom.ipynb b/site/ko/io/tutorials/dicom.ipynb index 33338af7f7..6affd0a9e8 100644 --- a/site/ko/io/tutorials/dicom.ipynb +++ b/site/ko/io/tutorials/dicom.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "tuOe1ymfHZPu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -101,7 +103,9 @@ "metadata": { "id": "Tu01THzWcE-J" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!curl -OL https://github.com/tensorflow/io/raw/master/docs/tutorials/dicom/dicom_00000001_000.dcm\n", "!ls -l dicom_00000001_000.dcm" @@ -122,7 +126,9 @@ "metadata": { "id": "NwL3fEMQuZrk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "try:\n", " # Use the Colab's preinstalled TensorFlow 2.x\n", @@ -137,7 +143,9 @@ "metadata": { "id": "uUDYyMZRfkX4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install tensorflow-io" ] @@ -157,7 +165,9 @@ "metadata": { "id": "YUj0878jPyz7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", @@ -171,7 +181,9 @@ "metadata": { "id": "zK7IEukfuUuF" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow_io as tfio\n", "\n", @@ -215,7 +227,9 @@ "metadata": { "id": "OqHkXwF0oI3L" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tag_id = tfio.image.dicom_tags.PatientsAge\n", "tag_value = tfio.image.decode_dicom_data(image_bytes,tag_id)\n", @@ -228,7 +242,9 @@ "metadata": { "id": "J2wZ-7OcoPPs" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(f\"PatientsAge : {tag_value.numpy().decode('UTF-8')}\")" ] @@ -239,7 +255,9 @@ "metadata": { "id": "Ce6ymbskoTOe" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tag_id = tfio.image.dicom_tags.PatientsSex\n", "tag_value = tfio.image.decode_dicom_data(image_bytes,tag_id)\n", diff --git a/site/ko/io/tutorials/postgresql.ipynb b/site/ko/io/tutorials/postgresql.ipynb index 2f2e729879..3ebb2fe422 100644 --- a/site/ko/io/tutorials/postgresql.ipynb +++ b/site/ko/io/tutorials/postgresql.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "tuOe1ymfHZPu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -91,7 +93,9 @@ "metadata": { "id": "uUDYyMZRfkX4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "try:\n", " %tensorflow_version 2.x\n", @@ -122,7 +126,9 @@ "metadata": { "id": "YUj0878jPyz7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Install postgresql server\n", "!sudo apt-get -y -qq update\n", @@ -154,7 +160,9 @@ "metadata": { "id": "0dRotqDMswcK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%env TFIO_DEMO_DATABASE_NAME=tfio_demo\n", "%env TFIO_DEMO_DATABASE_HOST=localhost\n", @@ -218,7 +226,9 @@ "metadata": { "id": "W1eVidg3JrPV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!curl -s -OL https://github.com/tensorflow/io/raw/master/docs/tutorials/postgresql/AirQualityUCI.sql\n", "\n", @@ -242,7 +252,9 @@ "metadata": { "id": "h21RdP7meGzP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import os\n", "import tensorflow_io as tfio\n", @@ -277,7 +289,9 @@ "metadata": { "id": "qCoueXYZOvqZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "dataset = tfio.experimental.IODataset.from_sql(\n", " query=\"SELECT nox, no2 FROM AirQualityUCI;\",\n", diff --git a/site/ko/io/tutorials/prometheus.ipynb b/site/ko/io/tutorials/prometheus.ipynb index 44dadb4820..779e11da66 100644 --- a/site/ko/io/tutorials/prometheus.ipynb +++ b/site/ko/io/tutorials/prometheus.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "tuOe1ymfHZPu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -102,7 +104,9 @@ "metadata": { "id": "48B9eAMMhAgw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import os" ] @@ -189,7 +193,9 @@ "metadata": { "id": "m6KXZuTBWgRm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "from datetime import datetime\n", "\n", @@ -250,7 +256,9 @@ "metadata": { "id": "n9ujlunrWgRx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Run `./coredns` as a background process.\n", "# IPython doesn't recognize `&` in inline bash cells.\n", @@ -310,7 +318,9 @@ "metadata": { "id": "VSJGsQtoWgR7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Run `./prometheus` as a background process.\n", "# IPython doesn't recognize `&` in inline bash cells.\n", @@ -332,7 +342,9 @@ "metadata": { "id": "FN0YNdstBl8M" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!sudo apt-get install -y -qq dnsutils" ] @@ -588,7 +600,9 @@ "metadata": { "id": "fxObBtlvr6n_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "n_steps, n_features = 2, 1\n", "simple_lstm_model = tf.keras.models.Sequential([\n", @@ -642,7 +656,9 @@ }, "execution_count": 16, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } diff --git a/site/ko/lattice/tutorials/shape_constraints.ipynb b/site/ko/lattice/tutorials/shape_constraints.ipynb index 56f907f09a..d740c3830e 100644 --- a/site/ko/lattice/tutorials/shape_constraints.ipynb +++ b/site/ko/lattice/tutorials/shape_constraints.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "KsOkK8O69PyT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -91,7 +93,9 @@ "metadata": { "id": "bpXjJKpSd3j4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@test {\"skip\": true}\n", "!pip install tensorflow-lattice tensorflow_decision_forests" @@ -113,7 +117,9 @@ "cellView": "both", "id": "iY6awAl058TV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "import tensorflow_lattice as tfl\n", @@ -146,7 +152,9 @@ "metadata": { "id": "kQHPyPsPUF92" }, - "outputs": [], + "outputs": [ + + ], "source": [ "NUM_EPOCHS = 1000\n", "BATCH_SIZE = 64\n", @@ -185,7 +193,9 @@ "metadata": { "id": "mKovnyv1jATw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def click_through_rate(avg_ratings, num_reviews, dollar_ratings):\n", " dollar_rating_baseline = {\"D\": 3, \"DD\": 2, \"DDD\": 4, \"DDDD\": 4.5}\n", @@ -209,7 +219,9 @@ "metadata": { "id": "KC5qX_XKmc7g" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def color_bar():\n", " bar = matplotlib.cm.ScalarMappable(\n", @@ -290,7 +302,9 @@ "metadata": { "id": "MhqcOPdTT_wj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def sample_restaurants(n):\n", " avg_ratings = np.random.uniform(1.0, 5.0, n)\n", @@ -343,7 +357,9 @@ "metadata": { "id": "jS6WOtXQ8jwX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def sample_dataset(n, testing_set):\n", " (avg_ratings, num_reviews, dollar_ratings, ctr_labels) = sample_restaurants(n)\n", @@ -402,7 +418,9 @@ "metadata": { "id": "DYzRTRR2GKoS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_input_fn = tf.compat.v1.estimator.inputs.pandas_input_fn(\n", " x=data_train,\n", @@ -464,7 +482,9 @@ "metadata": { "id": "SX6rARJWURWl" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def analyze_two_d_estimator(estimator, name):\n", " # Extract validation metrics.\n", @@ -535,7 +555,9 @@ "metadata": { "id": "DnPYlRAo2mnQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "gbt_model = tfdf.keras.GradientBoostedTreesModel(\n", " features=[\n", @@ -595,7 +617,9 @@ "metadata": { "id": "gFUeG6kLDNhO" }, - "outputs": [], + "outputs": [ + + ], "source": [ "feature_columns = [\n", " tf.feature_column.numeric_column(\"num_reviews\"),\n", @@ -658,7 +682,9 @@ "metadata": { "id": "FCm1lOjmwur_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "feature_columns = [\n", " tf.feature_column.numeric_column(\"num_reviews\"),\n", @@ -706,7 +732,9 @@ "cellView": "both", "id": "C0py9Q6OBRBE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def save_and_visualize_lattice(tfl_estimator):\n", " saved_model_path = tfl_estimator.export_saved_model(\n", @@ -751,7 +779,9 @@ "metadata": { "id": "XQrM9BskY-wx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "feature_columns = [\n", " tf.feature_column.numeric_column(\"num_reviews\"),\n", @@ -813,7 +843,9 @@ "metadata": { "id": "OA14j0erm6TJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "feature_columns = [\n", " tf.feature_column.numeric_column(\"num_reviews\"),\n", @@ -868,7 +900,9 @@ "cellView": "both", "id": "RounEQebxxnA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "lat_mesh_n = 12\n", "lat_mesh_x, lat_mesh_y = tfl.test_utils.two_dim_mesh_grid(\n", @@ -909,7 +943,9 @@ "metadata": { "id": "qxFHH3hSpWfq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "feature_columns = [\n", " tf.feature_column.numeric_column(\"num_reviews\"),\n", @@ -979,7 +1015,9 @@ "metadata": { "id": "5tLDKwTmjrLw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def analyze_three_d_estimator(estimator, name):\n", " # Extract validation metrics.\n", @@ -1022,7 +1060,9 @@ "metadata": { "id": "m-w7iGEEpgGt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "feature_columns = [\n", " tf.feature_column.numeric_column(\"num_reviews\"),\n", @@ -1119,7 +1159,9 @@ "metadata": { "id": "k5Sg_gUj_0i4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "feature_columns = [\n", " tf.feature_column.numeric_column(\"num_reviews\"),\n", @@ -1193,7 +1235,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "shape_constraints.ipynb", "toc_visible": true }, diff --git a/site/ko/lite/examples/auto_complete/overview.md b/site/ko/lite/examples/auto_complete/overview.md index 75a066bd9d..b63c83fabe 100644 --- a/site/ko/lite/examples/auto_complete/overview.md +++ b/site/ko/lite/examples/auto_complete/overview.md @@ -183,6 +183,7 @@ run_inference("I'm enjoying a", quant_generate_tflite) ### 컨텍스트 창 크기 + 앱에는 변경 가능한 매개변수 '컨텍스트 창 크기'가 있습니다. 이는 현재 LLM이 일반적으로 모델에 '프롬프트'로 공급될 수 있는 단어/토큰의 수를 제한하는 고정된 컨텍스트 크기를 갖기 때문에 필요합니다('단어'와 '토큰'은 토큰화 방법이 다르기 때문에 이 경우 컨텍스트 크기가 반드시 동일하지는 않습니다). 이 숫자가 중요한 이유는 다음과 같습니다. diff --git a/site/ko/lite/examples/on_device_training/overview.ipynb b/site/ko/lite/examples/on_device_training/overview.ipynb index 2d5efdf707..c87483f67a 100644 --- a/site/ko/lite/examples/on_device_training/overview.ipynb +++ b/site/ko/lite/examples/on_device_training/overview.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "2pHVBk_seED1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -155,7 +157,9 @@ "metadata": { "id": "d8577c80" }, - "outputs": [], + "outputs": [ + + ], "source": [ "IMG_SIZE = 28\n", "\n", @@ -251,7 +255,9 @@ "metadata": { "id": "315b8b4dfc16" }, - "outputs": [], + "outputs": [ + + ], "source": [ "fashion_mnist = tf.keras.datasets.fashion_mnist\n", "(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()" @@ -274,7 +280,9 @@ "metadata": { "id": "g0FqHC0yCg6n" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_images = (train_images / 255.0).astype(np.float32)\n", "test_images = (test_images / 255.0).astype(np.float32)" @@ -295,7 +303,9 @@ "metadata": { "id": "Fmc7EgYO30sw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_labels = tf.keras.utils.to_categorical(train_labels)\n", "test_labels = tf.keras.utils.to_categorical(test_labels)" @@ -361,7 +371,8 @@ ] }, "execution_count": 28, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -402,7 +413,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -440,7 +452,9 @@ "metadata": { "id": "WwsDUEKFMYtq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "SAVED_MODEL_DIR = \"saved_model\"\n", "\n", @@ -485,7 +499,9 @@ "metadata": { "id": "qNX2vqXd2-HM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "interpreter = tf.lite.Interpreter(model_content=tflite_model)\n", "interpreter.allocate_tensors()\n", @@ -508,7 +524,9 @@ "metadata": { "id": "IDdaCmPEtE7P" }, - "outputs": [], + "outputs": [ + + ], "source": [ "logits_original = m.infer(x=train_images[:1])['logits'][0]\n", "logits_lite = infer(x=train_images[:1])['logits'][0]" @@ -528,7 +546,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -711,7 +730,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -758,7 +778,8 @@ ] }, "execution_count": 36, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -811,7 +832,9 @@ "metadata": { "id": "5yIZoLveRZgp" }, - "outputs": [], + "outputs": [ + + ], "source": [ "another_interpreter = tf.lite.Interpreter(model_content=tflite_model)\n", "another_interpreter.allocate_tensors()\n", @@ -834,7 +857,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -908,7 +932,9 @@ "metadata": { "id": "_ROmlpHWS0nX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "infer = another_interpreter.get_signature_runner(\"infer\")\n", "result = infer(x=test_images)\n", @@ -931,7 +957,8 @@ ] }, "execution_count": 40, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -962,7 +989,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -999,7 +1027,8 @@ ] }, "execution_count": 42, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -1060,7 +1089,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "overview.ipynb", "toc_visible": true }, diff --git a/site/ko/lite/examples/pose_estimation/overview.md b/site/ko/lite/examples/pose_estimation/overview.md index c54d5c775c..38c4000dae 100644 --- a/site/ko/lite/examples/pose_estimation/overview.md +++ b/site/ko/lite/examples/pose_estimation/overview.md @@ -113,6 +113,7 @@ TensorFlow Lite를 처음 사용하고 Android 또는 iOS로 작업하는 경우 아래에 출력의 예를 나타내었습니다. + 포즈 추정을 보여주는 애니메이션 ## 성능 벤치마크 diff --git a/site/ko/lite/examples/segmentation/overview.md b/site/ko/lite/examples/segmentation/overview.md index fe1f1d89fd..e6fb602a5f 100644 --- a/site/ko/lite/examples/segmentation/overview.md +++ b/site/ko/lite/examples/segmentation/overview.md @@ -57,9 +57,8 @@ Android 또는 iOS 이외의 플랫폼을 사용 중이거나 Deeplab v3 - - 2.7Mb + Deeplab v3 + 2.7 Mb Pixel 3(Android 10) 16ms 37ms * diff --git a/site/ko/lite/examples/text_classification/overview.md b/site/ko/lite/examples/text_classification/overview.md index fe61bd8191..abc5e715cc 100644 --- a/site/ko/lite/examples/text_classification/overview.md +++ b/site/ko/lite/examples/text_classification/overview.md @@ -51,7 +51,7 @@ Android이외의 플랫폼을 사용 중이거나 TensorFlow Lite API에 이미 텍스트 분류 - 0.6Mb + 0.6 Mb Pixel 3(Android 10) 0.05ms * diff --git a/site/ko/lite/guide/model_analyzer.ipynb b/site/ko/lite/guide/model_analyzer.ipynb index 06e774865c..68dc4f760a 100644 --- a/site/ko/lite/guide/model_analyzer.ipynb +++ b/site/ko/lite/guide/model_analyzer.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "2pHVBk_seED1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -99,7 +101,9 @@ "metadata": { "id": "_jkg6UNtdz8c" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "\n", @@ -132,7 +136,9 @@ "metadata": { "id": "QFywJ_g56VW5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = tf.keras.applications.MobileNetV3Large()\n", "fb_model = tf.lite.TFLiteConverter.from_keras_model(model).convert()\n", @@ -170,7 +176,9 @@ "metadata": { "id": "9GEg5plIzD-3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "\n", @@ -210,7 +218,9 @@ "metadata": { "id": "85RgG6tQ3ABT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = tf.keras.models.Sequential([\n", " tf.keras.layers.Flatten(input_shape=(128, 128)),\n", @@ -227,7 +237,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "model_analyzer.ipynb", "toc_visible": true }, diff --git a/site/ko/lite/guide/signatures.ipynb b/site/ko/lite/guide/signatures.ipynb index 2e08b9ac98..e231dcb163 100644 --- a/site/ko/lite/guide/signatures.ipynb +++ b/site/ko/lite/guide/signatures.ipynb @@ -18,7 +18,9 @@ "cellView": "form", "id": "2pHVBk_seED1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -96,7 +98,9 @@ "metadata": { "id": "9j4MGqyKQEo4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf" ] @@ -120,7 +124,9 @@ "metadata": { "id": "d8577c80" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class Model(tf.Module):\n", "\n", @@ -192,7 +198,9 @@ "metadata": { "id": "96c8fc79" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = Model()\n", "\n", @@ -237,7 +245,9 @@ "metadata": { "id": "71f29229" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Generate a Keras model.\n", "keras_model = tf.keras.Sequential(\n", @@ -276,7 +286,9 @@ "metadata": { "id": "c9e8a742" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = Model()\n", "\n", @@ -403,7 +415,9 @@ "metadata": { "id": "ab7b1963" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Load the TFLite model in TFLite Interpreter\n", "interpreter = tf.lite.Interpreter(model_content=tflite_model)\n", @@ -457,7 +471,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "signatures.ipynb", "toc_visible": true }, diff --git a/site/ko/lite/models/bert_qa/overview.md b/site/ko/lite/models/bert_qa/overview.md index 085ed3c723..7ea10f71b0 100644 --- a/site/ko/lite/models/bert_qa/overview.md +++ b/site/ko/lite/models/bert_qa/overview.md @@ -46,7 +46,7 @@ Android/iOS 이외의 플랫폼을 사용 중이거나 [TensorFlow Lite API](htt Mobile Bert - 100.5Mb + 100.5 Mb Pixel 3(Android 10) 123ms * diff --git a/site/ko/lite/models/modify/model_maker/image_classification.ipynb b/site/ko/lite/models/modify/model_maker/image_classification.ipynb index 748c18fe0f..77c9e82c81 100644 --- a/site/ko/lite/models/modify/model_maker/image_classification.ipynb +++ b/site/ko/lite/models/modify/model_maker/image_classification.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "TUfAcER1oUS6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -83,7 +85,9 @@ "metadata": { "id": "6cv3K3oaksJv" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!sudo apt -y install libportaudio2\n", "!pip install -q tflite-model-maker" @@ -104,7 +108,9 @@ "metadata": { "id": "XtxiUeZEiXpt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import os\n", "\n", @@ -149,7 +155,9 @@ "cellView": "form", "id": "3jz5x0JoskPv" }, - "outputs": [], + "outputs": [ + + ], "source": [ "image_path = tf.keras.utils.get_file(\n", " 'flower_photos.tgz',\n", @@ -166,7 +174,7 @@ "source": [ "`image_path`를 자신의 이미지 폴더로 바꿀 수 있습니다. colab에 데이터를 업로드하는 경우, 아래 이미지에 빨간색 사각형으로 표시된 왼쪽 사이드 바에서 Upload 버튼을 찾을 수 있습니다. zip 파일을 업로드하고 압축을 풉니다. 루트 파일 경로는 현재 경로입니다.\n", "\n", - " \"Upload " + " \"Upload " ] }, { @@ -204,7 +212,9 @@ "metadata": { "id": "lANoNS_gtdH1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "data = DataLoader.from_folder(image_path)\n", "train_data, test_data = data.split(0.9)" @@ -225,7 +235,9 @@ "metadata": { "id": "yRXMZbrwtyRD" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = image_classifier.create(train_data)" ] @@ -245,7 +257,9 @@ "metadata": { "id": "wQr02VxJt6Cs" }, - "outputs": [], + "outputs": [ + + ], "source": [ "loss, accuracy = model.evaluate(test_data)" ] @@ -269,7 +283,9 @@ "metadata": { "id": "Zb-eIzfluCoa" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.export(export_dir='.')" ] @@ -338,7 +354,9 @@ "metadata": { "id": "7tOfUr2KlgpU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "image_path = tf.keras.utils.get_file(\n", " 'flower_photos.tgz',\n", @@ -364,7 +382,9 @@ "metadata": { "id": "I_fOlZsklmlL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "data = DataLoader.from_folder(image_path)" ] @@ -384,7 +404,9 @@ "metadata": { "id": "cY4UU5SUobtJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_data, rest_data = data.split(0.8)\n", "validation_data, test_data = rest_data.split(0.5)" @@ -405,7 +427,9 @@ "metadata": { "id": "Ih4Wx44I482b" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plt.figure(figsize=(10,10))\n", "for i, (image, label) in enumerate(data.gen_dataset().unbatch().take(25)):\n", @@ -435,7 +459,9 @@ "metadata": { "id": "TvYSUuJY3QxR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = image_classifier.create(train_data, validation_data=validation_data)" ] @@ -455,7 +481,9 @@ "metadata": { "id": "QNXAfjl192dC" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.summary()" ] @@ -477,7 +505,9 @@ "metadata": { "id": "A8c2ZQ0J3Riy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "loss, accuracy = model.evaluate(test_data)" ] @@ -497,7 +527,9 @@ "metadata": { "id": "n9O9Kx7nDQWD" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# A helper function that returns 'red'/'black' depending on if its two input\n", "# parameter matches or not.\n", @@ -555,7 +587,9 @@ "metadata": { "id": "Im6wA9lK3TQB" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.export(export_dir='.')" ] @@ -592,7 +626,9 @@ "metadata": { "id": "BvxWsOTmKG4P" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.export(export_dir='.', export_format=ExportFormat.LABEL)" ] @@ -612,7 +648,9 @@ "metadata": { "id": "S1YoPX5wOK-u" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.evaluate_tflite('model.tflite', test_data)" ] @@ -671,7 +709,9 @@ "metadata": { "id": "k8hL2mstCxQl" }, - "outputs": [], + "outputs": [ + + ], "source": [ "config = QuantizationConfig.for_float16()" ] @@ -691,7 +731,9 @@ "metadata": { "id": "WTJzFQnJFMjr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.export(export_dir='.', tflite_filename='model_fp16.tflite', quantization_config=config)" ] @@ -733,7 +775,9 @@ "metadata": { "id": "7JKsJ6-P6ae1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = image_classifier.create(train_data, model_spec=model_spec.get('mobilenet_v2'), validation_data=validation_data)" ] @@ -753,7 +797,9 @@ "metadata": { "id": "lB2Go3HW8X7_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "loss, accuracy = model.evaluate(test_data)" ] @@ -779,7 +825,9 @@ "metadata": { "id": "xdiMF2WMfAR4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "inception_v3_spec = image_classifier.ModelSpec(\n", " uri='https://tfhub.dev/google/imagenet/inception_v3/feature_vector/1')\n", @@ -851,7 +899,9 @@ "metadata": { "id": "A3k7mhH54QcK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = image_classifier.create(train_data, validation_data=validation_data, epochs=10)" ] @@ -871,7 +921,9 @@ "metadata": { "id": "VafIYpKWD4Sw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "loss, accuracy = model.evaluate(test_data)" ] @@ -895,7 +947,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "image_classification.ipynb", "toc_visible": true }, diff --git a/site/ko/lite/models/modify/model_maker/object_detection.ipynb b/site/ko/lite/models/modify/model_maker/object_detection.ipynb index b955dba076..713260c2f8 100644 --- a/site/ko/lite/models/modify/model_maker/object_detection.ipynb +++ b/site/ko/lite/models/modify/model_maker/object_detection.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "TUfAcER1oUS6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -81,7 +83,7 @@ "
\n", "\n", "\n", - " \n" + " \n" ] }, { @@ -110,7 +112,9 @@ "metadata": { "id": "qhl8lqVamEty" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!sudo apt -y install libportaudio2\n", "!pip install -q --use-deprecated=legacy-resolver tflite-model-maker\n", @@ -134,7 +138,9 @@ "metadata": { "id": "XtxiUeZEiXpt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import numpy as np\n", "import os\n", @@ -235,7 +241,9 @@ "metadata": { "id": "CtdZ-JDwMimd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "spec = model_spec.get('efficientdet_lite0')" ] @@ -263,7 +271,9 @@ "metadata": { "id": "HD5BvzWe6YKa" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_data, validation_data, test_data = object_detector.DataLoader.from_csv('gs://cloud-ml-data/img/openimage/csv/salads_ml_use.csv')" ] @@ -287,7 +297,9 @@ "metadata": { "id": "kwlYdTcg63xy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = object_detector.create(train_data, model_spec=spec, batch_size=8, train_whole_model=True, validation_data=validation_data)" ] @@ -313,7 +325,9 @@ "metadata": { "id": "8xmnl6Yy7ARn" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.evaluate(test_data)" ] @@ -335,7 +349,9 @@ "metadata": { "id": "Hm_UULdW7A9T" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.export(export_dir='.')" ] @@ -362,7 +378,9 @@ "metadata": { "id": "RS3Ell_lqH4e" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.evaluate_tflite('model.tflite', test_data)" ] @@ -405,7 +423,9 @@ "cellView": "form", "id": "XqS0rFCrqM1o" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Load the trained TFLite model and define some visualization functions\n", "\n", @@ -511,7 +531,9 @@ "cellView": "form", "id": "GkXtipXKqXp4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Run object detection and show the detection results\n", "\n", @@ -559,7 +581,9 @@ "metadata": { "id": "Oy3QIn_YqaRP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "! curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -\n", "\n", @@ -598,7 +622,9 @@ "cellView": "form", "id": "LZdonJGCqieU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "NUMBER_OF_TPUS = 1#@param {type:\"number\"}\n", "\n", @@ -829,7 +855,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "object_detection.ipynb", "toc_visible": true }, diff --git a/site/ko/lite/models/modify/model_maker/question_answer.ipynb b/site/ko/lite/models/modify/model_maker/question_answer.ipynb index b76c4f8c64..069a9708b8 100644 --- a/site/ko/lite/models/modify/model_maker/question_answer.ipynb +++ b/site/ko/lite/models/modify/model_maker/question_answer.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "TUfAcER1oUS6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -160,7 +162,9 @@ "metadata": { "id": "qhl8lqVamEty" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!sudo apt -y install libportaudio2\n", "!pip install -q tflite-model-maker-nightly" @@ -181,7 +185,9 @@ "metadata": { "id": "XtxiUeZEiXpt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import numpy as np\n", "import os\n", @@ -229,7 +235,9 @@ "metadata": { "id": "vEAWuZQ1PFiX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "spec = model_spec.get('mobilebert_qa_squad')" ] @@ -258,7 +266,9 @@ "metadata": { "id": "7tOfUr2KlgpU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_data_path = tf.keras.utils.get_file(\n", " fname='triviaqa-web-train-8000.json',\n", @@ -297,7 +307,9 @@ "metadata": { "id": "I_fOlZsklmlL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_data = DataLoader.from_squad(train_data_path, spec, is_training=True)\n", "validation_data = DataLoader.from_squad(validation_data_path, spec, is_training=False)" @@ -323,7 +335,9 @@ "metadata": { "id": "TvYSUuJY3QxR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = question_answer.create(train_data, model_spec=spec)" ] @@ -343,7 +357,9 @@ "metadata": { "id": "gd7Hs8TF8n3H" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.summary()" ] @@ -365,7 +381,9 @@ "metadata": { "id": "A8c2ZQ0J3Riy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.evaluate(validation_data)" ] @@ -389,7 +407,9 @@ "metadata": { "id": "Im6wA9lK3TQB" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.export(export_dir='.')" ] @@ -424,7 +444,9 @@ "metadata": { "id": "ro2hz4kXVImY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.export(export_dir='.', export_format=ExportFormat.VOCAB)" ] @@ -444,7 +466,9 @@ "metadata": { "id": "ochbq95ZrVFX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.evaluate_tflite('model.tflite', validation_data)" ] @@ -507,7 +531,9 @@ "metadata": { "id": "e9WBN0UTQoMN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "new_spec = model_spec.get('mobilebert_qa')\n", "new_spec.seq_len = 512" @@ -608,7 +634,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "question_answer.ipynb", "toc_visible": true }, diff --git a/site/ko/lite/models/modify/model_maker/text_classification.ipynb b/site/ko/lite/models/modify/model_maker/text_classification.ipynb index 53f4f05590..c082433f12 100644 --- a/site/ko/lite/models/modify/model_maker/text_classification.ipynb +++ b/site/ko/lite/models/modify/model_maker/text_classification.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "TUfAcER1oUS6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -91,7 +93,9 @@ "metadata": { "id": "qhl8lqVamEty" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!sudo apt -y install libportaudio2\n", "!pip install -q tflite-model-maker\n", @@ -114,7 +118,9 @@ "metadata": { "id": "XtxiUeZEiXpt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import numpy as np\n", "import os\n", @@ -151,7 +157,9 @@ "metadata": { "id": "R2BSkxWg6Rhx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "data_dir = tf.keras.utils.get_file(\n", " fname='SST-2.zip',\n", @@ -170,7 +178,7 @@ "\n", "다음은 훈련 데이터세트의 처음 5줄입니다. label=0은 부정적, label=1은 긍정적을 의미합니다.\n", "\n", - "문장 | label | | |\n", + "문장 | 상표 | | |\n", "--- | --- | --- | --- | ---\n", "hide new secretions from the parental units | 0 | | |\n", "contains no wit , only labored gags | 0 | | |\n", @@ -178,7 +186,7 @@ "remains utterly satisfied to remain the same throughout | 0 | | |\n", "on the worst revenge-of-the-nerds clichés the filmmakers could dredge up | 0 | | |\n", "\n", - "문장 | label | | | --- | --- | --- | --- | --- hide new secretions from the parental units | 0 | | | contains no wit , only labored gags | 0 | | | that loves its characters and communicates something rather beautiful about human nature | 1 | | | remains utterly satisfied to remain the same throughout | 0 | | | on the worst revenge-of-the-nerds clichés the filmmakers could dredge up | 0 | | |\n" + "다음으로 데이터세트를 Pandas 데이터 프레임에 로드하고 현재 레이블 이름(`0` 및 `1`)을 좀 더 사람이 읽을 수 있는 이름(`negative` 및 `positive`)으로 변경하여 모델 훈련에 사용합니다.\n" ] }, { @@ -187,7 +195,9 @@ "metadata": { "id": "iLNaOXnl3JQB" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import pandas as pd\n", "\n", @@ -232,7 +242,9 @@ "metadata": { "id": "CtdZ-JDwMimd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "spec = model_spec.get('average_word_vec')" ] @@ -265,7 +277,9 @@ "metadata": { "id": "HD5BvzWe6YKa" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_data = DataLoader.from_csv(\n", " filename='train.csv',\n", @@ -298,7 +312,9 @@ "metadata": { "id": "kwlYdTcg63xy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = text_classifier.create(train_data, model_spec=spec, epochs=10)" ] @@ -322,7 +338,9 @@ "metadata": { "id": "8xmnl6Yy7ARn" }, - "outputs": [], + "outputs": [ + + ], "source": [ "loss, acc = model.evaluate(test_data)" ] @@ -344,7 +362,9 @@ "metadata": { "id": "Hm_UULdW7A9T" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.export(export_dir='average_word_vec')" ] @@ -401,7 +421,9 @@ "metadata": { "id": "XWwvHmIltQC2" }, - "outputs": [], + "outputs": [ + + ], "source": [ "sentence_data = pd.read_csv('/content/dev.csv', index_col=0)\n", "sentence_data" @@ -422,7 +444,9 @@ "metadata": { "id": "IAEEs3_3vPz5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Name of the TFLite text classification model.\n", "_MODEL = '/content/average_word_vec/model.tflite'\n", @@ -453,7 +477,9 @@ "metadata": { "id": "Haham4qT8hmV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Initialize the text classification model.\n", "base_options = core.BaseOptions(file_name=_MODEL, use_coral=_ENABLE_EDGETPU, num_threads=_NUM_THREADS)\n", @@ -478,7 +504,9 @@ "metadata": { "id": "pAQDHFs5tTxZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for idx in range(20):\n", " sentence = sentence_data['sentence'].iloc[idx]\n", @@ -518,7 +546,9 @@ "metadata": { "id": "vEAWuZQ1PFiX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mb_spec = model_spec.get('mobilebert_classifier')" ] @@ -556,7 +586,9 @@ "metadata": { "id": "I_fOlZsklmlL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_data = DataLoader.from_csv(\n", " filename='train.csv',\n", @@ -600,7 +632,9 @@ "metadata": { "id": "TvYSUuJY3QxR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = text_classifier.create(train_data, model_spec=mb_spec, epochs=3)" ] @@ -620,7 +654,9 @@ "metadata": { "id": "gd7Hs8TF8n3H" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.summary()" ] @@ -642,7 +678,9 @@ "metadata": { "id": "A8c2ZQ0J3Riy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "loss, acc = model.evaluate(test_data)" ] @@ -666,7 +704,9 @@ "metadata": { "id": "Im6wA9lK3TQB" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.export(export_dir='mobilebert/')" ] @@ -702,7 +742,9 @@ "metadata": { "id": "nbK7nzK_Mfx4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.export(export_dir='mobilebert/', export_format=[ExportFormat.LABEL, ExportFormat.VOCAB])" ] @@ -722,7 +764,9 @@ "metadata": { "id": "ochbq95ZrVFX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "accuracy = model.evaluate_tflite('mobilebert/model.tflite', test_data)\n", "print('TFLite model accuracy: ', accuracy)" @@ -774,7 +818,9 @@ "metadata": { "id": "4tr9BLcjy4Sh" }, - "outputs": [], + "outputs": [ + + ], "source": [ "new_model_spec = model_spec.get('mobilebert_classifier')\n", "new_model_spec.seq_len = 256" @@ -806,7 +852,9 @@ "metadata": { "id": "e9WBN0UTQoMN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "new_model_spec = AverageWordVecSpec(wordvec_dim=32)" ] @@ -826,7 +874,9 @@ "metadata": { "id": "DVZurFBORG3J" }, - "outputs": [], + "outputs": [ + + ], "source": [ "new_train_data = DataLoader.from_csv(\n", " filename='train.csv',\n", @@ -851,7 +901,9 @@ "metadata": { "id": "PzpV246_JGEu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = text_classifier.create(new_train_data, model_spec=new_model_spec)" ] @@ -878,7 +930,9 @@ "metadata": { "id": "rnWFaYZBG6NW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = text_classifier.create(new_train_data, model_spec=new_model_spec, epochs=20)" ] @@ -898,7 +952,9 @@ "metadata": { "id": "BMPi1xflHDSY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "new_test_data = DataLoader.from_csv(\n", " filename='dev.csv',\n", @@ -929,7 +985,9 @@ "metadata": { "id": "QfFCWrwyggrT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "spec = model_spec.get('bert_classifier')" ] @@ -985,7 +1043,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "text_classification.ipynb", "toc_visible": true }, diff --git a/site/ko/lite/models/modify/model_maker/text_searcher.ipynb b/site/ko/lite/models/modify/model_maker/text_searcher.ipynb index 33ee884183..46f073fae5 100644 --- a/site/ko/lite/models/modify/model_maker/text_searcher.ipynb +++ b/site/ko/lite/models/modify/model_maker/text_searcher.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "TUfAcER1oUS6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -124,7 +126,9 @@ "metadata": { "id": "qhl8lqVamEty" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!sudo apt -y install libportaudio2\n", "!pip install -q tflite-model-maker\n", @@ -146,7 +150,9 @@ "metadata": { "id": "XtxiUeZEiXpt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "from tflite_model_maker import searcher" ] @@ -170,7 +176,9 @@ "metadata": { "id": "-P3zxue1T6Iy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!gdown https://drive.google.com/uc?id=0BwmD_VLjROrfTHk4NFg2SndKcjQ\n", "!gdown https://drive.google.com/uc?id=0BwmD_VLjROrfM1BxdkxVaTY2bWs\n", @@ -198,7 +206,9 @@ "cellView": "form", "id": "bA4PsR6NVU69" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Save the highlights and urls to the CSV file\n", "#@markdown Load the highlights from the stories of CNN / Daily Mail, map urls with highlights, and save them to the CSV file.\n", @@ -343,7 +353,9 @@ "metadata": { "id": "1ymHbk0wjHHZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!wget -O universal_sentence_encoder.tflite https://storage.googleapis.com/download.tensorflow.org/models/tflite_support/searcher/text_to_image_blogpost/text_embedder.tflite" ] @@ -377,7 +389,9 @@ "metadata": { "id": "CtdZ-JDwMimd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "data_loader = searcher.TextDataLoader.create(\"universal_sentence_encoder.tflite\", l2_normalize=True)\n", "data_loader.load_from_csv(\"cnn_dailymail.csv\", text_column=\"highlights\", metadata_column=\"urls\")" @@ -415,7 +429,9 @@ "metadata": { "id": "kwlYdTcg63xy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "scann_options = searcher.ScaNNOptions(\n", " distance_measure=\"dot_product\",\n", @@ -456,7 +472,9 @@ "metadata": { "id": "Hm_UULdW7A9T" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.export(\n", " export_filename=\"searcher.tflite\",\n", @@ -481,7 +499,9 @@ "metadata": { "id": "GkXtipXKqXp4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "from tflite_support.task import text\n", "\n", @@ -522,7 +542,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "text_searcher.ipynb", "toc_visible": true }, diff --git a/site/ko/lite/models/style_transfer/overview.ipynb b/site/ko/lite/models/style_transfer/overview.ipynb new file mode 100644 index 0000000000..8aa30e03de --- /dev/null +++ b/site/ko/lite/models/style_transfer/overview.ipynb @@ -0,0 +1,525 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "g_nWetWWd_ns" + }, + "source": [ + "##### Copyright 2019 The TensorFlow Authors." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "id": "2pHVBk_seED1" + }, + "outputs": [ + + ], + "source": [ + "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# https://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "M7vSdG6sAIQn" + }, + "source": [ + "# TensorFlow Lite를 사용한 예술적 스타일 전이" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fwc5GKHBASdc" + }, + "source": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
TensorFlow.org에서 보기Google Colab에서 실행GitHub에서 소스 보기노트북 다운로드TF 허브 모델 보기
" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "31O0iaROAw8z" + }, + "source": [ + "최근에 와서 딥 러닝에서 가장 흥미로운 발전 중 하나는 [예술적 스타일 전이](https://arxiv.org/abs/1508.06576) 또는 [파스티슈](https://en.wikipedia.org/wiki/Pastiche)라고 알려진 새로운 이미지를 만드는 기능인데, 이는 예술적 스타일을 표현하는 입력 이미지 하나와 그 내용을 나타내는 나머지 하나의 입력 이미지에 기반합니다.\n", + "\n", + "![스타일 전송 예](https://storage.googleapis.com/download.tensorflow.org/models/tflite/arbitrary_style_transfer/formula.png)\n", + "\n", + "이 기술을 사용하여 다양한 스타일의 아름다운 새 작품을 만들 수 있습니다.\n", + "\n", + "![스타일 전송 예](https://storage.googleapis.com/download.tensorflow.org/models/tflite/arbitrary_style_transfer/table.png)\n", + "\n", + "TensorFlow Lite를 처음 사용하고 Android로 작업하는 경우, 다음 예제 애플리케이션을 탐색하면 시작하는 데 도움이 됩니다.\n", + "\n", + "Android 예제 iOS 예제\n", + "\n", + "Android 또는 iOS 이외의 플랫폼을 사용 중이거나 TensorFlow Lite API에 이미 익숙한 경우 이 튜토리얼을 따라 사전 훈련된 TensorFlow Lite 모델로 콘텐츠 및 스타일 이미지 쌍에 스타일 전이를 적용하는 방법을 배울 수 있습니다. 모델을 사용하여 자신의 모바일 애플리케이션에 스타일 전이를 추가할 수 있습니다.\n", + "\n", + "모델은 [GitHub](https://github.com/tensorflow/magenta/tree/master/magenta/models/arbitrary_image_stylization#train-a-model-on-a-large-dataset-with-data-augmentation-to-run-on-mobile)에서 오픈 소스입니다. 다른 매개변수를 사용하여 모델을 다시 훈련할 수 있습니다(예: 출력 이미지가 콘텐츠 이미지처럼 보이도록 콘텐츠 레이어의 가중치를 높임)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ak0S4gkOCSxs" + }, + "source": [ + "## 모델 아키텍처 이해하기" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "oee6G_bBCgAM" + }, + "source": [ + "![모델 아키텍처](https://storage.googleapis.com/download.tensorflow.org/models/tflite/arbitrary_style_transfer/architecture.png)\n", + "\n", + "해당 예술적 스타일 전이 모델은 두 개의 하위 모델로 구성됩니다.\n", + "\n", + "1. **스타일 예측 모델**: 입력 스타일 이미지를 100차원 스타일 병목 벡터로 가져오는 MobilenetV2 기반 신경망\n", + "2. **스타일 변환 모델**: 콘텐츠 이미지에 스타일 병목 벡터를 적용하고 스타일화된 이미지를 만드는 신경망\n", + "\n", + "앱에서 고정된 스타일 이미지 집합만 지원해야 하는 경우 해당 스타일 병목 벡터를 미리 계산하고 앱의 바이너리에서 스타일 예측 모델을 제외할 수 있습니다." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "a7ZETsRVNMo7" + }, + "source": [ + "## 설정" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3n8oObKZN4c8" + }, + "source": [ + "종속성을 가져옵니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "xz62Lb1oNm97" + }, + "outputs": [ + + ], + "source": [ + "import tensorflow as tf\n", + "print(tf.__version__)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "1Ua5FpcJNrIj" + }, + "outputs": [ + + ], + "source": [ + "import IPython.display as display\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib as mpl\n", + "mpl.rcParams['figure.figsize'] = (12,12)\n", + "mpl.rcParams['axes.grid'] = False\n", + "\n", + "import numpy as np\n", + "import time\n", + "import functools" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1b988wrrQnVF" + }, + "source": [ + "콘텐츠 및 스타일 이미지와 사전 훈련된 TensorFlow Lite 모델을 다운로드합니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "16g57cIMQnen" + }, + "outputs": [ + + ], + "source": [ + "content_path = tf.keras.utils.get_file('belfry.jpg','https://storage.googleapis.com/khanhlvg-public.appspot.com/arbitrary-style-transfer/belfry-2611573_1280.jpg')\n", + "style_path = tf.keras.utils.get_file('style23.jpg','https://storage.googleapis.com/khanhlvg-public.appspot.com/arbitrary-style-transfer/style23.jpg')\n", + "\n", + "style_predict_path = tf.keras.utils.get_file('style_predict.tflite', 'https://tfhub.dev/google/lite-model/magenta/arbitrary-image-stylization-v1-256/int8/prediction/1?lite-format=tflite')\n", + "style_transform_path = tf.keras.utils.get_file('style_transform.tflite', 'https://tfhub.dev/google/lite-model/magenta/arbitrary-image-stylization-v1-256/int8/transfer/1?lite-format=tflite')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MQZXL7kON-gM" + }, + "source": [ + "## 입력 전처리하기\n", + "\n", + "- 콘텐츠 이미지와 스타일 이미지는 픽셀 값이 [0..1] 사이의 float32 숫자인 RGB 이미지여야 합니다.\n", + "- 스타일 이미지 크기는 (1, 256, 256, 3)이어야 합니다. 중앙에서 이미지를 자르고 크기를 조정합니다.\n", + "- 콘텐츠 이미지는 (1, 384, 384, 3)이어야 합니다. 중앙에서 이미지를 자르고 크기를 조정합니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Cg0Vi-rXRUFl" + }, + "outputs": [ + + ], + "source": [ + "# Function to load an image from a file, and add a batch dimension.\n", + "def load_img(path_to_img):\n", + " img = tf.io.read_file(path_to_img)\n", + " img = tf.io.decode_image(img, channels=3)\n", + " img = tf.image.convert_image_dtype(img, tf.float32)\n", + " img = img[tf.newaxis, :]\n", + "\n", + " return img\n", + "\n", + "# Function to pre-process by resizing an central cropping it.\n", + "def preprocess_image(image, target_dim):\n", + " # Resize the image so that the shorter dimension becomes 256px.\n", + " shape = tf.cast(tf.shape(image)[1:-1], tf.float32)\n", + " short_dim = min(shape)\n", + " scale = target_dim / short_dim\n", + " new_shape = tf.cast(shape * scale, tf.int32)\n", + " image = tf.image.resize(image, new_shape)\n", + "\n", + " # Central crop the image.\n", + " image = tf.image.resize_with_crop_or_pad(image, target_dim, target_dim)\n", + "\n", + " return image\n", + "\n", + "# Load the input images.\n", + "content_image = load_img(content_path)\n", + "style_image = load_img(style_path)\n", + "\n", + "# Preprocess the input images.\n", + "preprocessed_content_image = preprocess_image(content_image, 384)\n", + "preprocessed_style_image = preprocess_image(style_image, 256)\n", + "\n", + "print('Style Image Shape:', preprocessed_style_image.shape)\n", + "print('Content Image Shape:', preprocessed_content_image.shape)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xE4Yt8nArTeR" + }, + "source": [ + "## 입력 시각화하기" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "ncPA4esJRcEu" + }, + "outputs": [ + + ], + "source": [ + "def imshow(image, title=None):\n", + " if len(image.shape) > 3:\n", + " image = tf.squeeze(image, axis=0)\n", + "\n", + " plt.imshow(image)\n", + " if title:\n", + " plt.title(title)\n", + "\n", + "plt.subplot(1, 2, 1)\n", + "imshow(preprocessed_content_image, 'Content Image')\n", + "\n", + "plt.subplot(1, 2, 2)\n", + "imshow(preprocessed_style_image, 'Style Image')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "CJ7R-CHbjC3s" + }, + "source": [ + "## TensorFlow Lite로 스타일 전이 실행하기" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "euu00ldHjKwD" + }, + "source": [ + "### 스타일 예측" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "o3zd9cTFRiS_" + }, + "outputs": [ + + ], + "source": [ + "# Function to run style prediction on preprocessed style image.\n", + "def run_style_predict(preprocessed_style_image):\n", + " # Load the model.\n", + " interpreter = tf.lite.Interpreter(model_path=style_predict_path)\n", + "\n", + " # Set model input.\n", + " interpreter.allocate_tensors()\n", + " input_details = interpreter.get_input_details()\n", + " interpreter.set_tensor(input_details[0][\"index\"], preprocessed_style_image)\n", + "\n", + " # Calculate style bottleneck.\n", + " interpreter.invoke()\n", + " style_bottleneck = interpreter.tensor(\n", + " interpreter.get_output_details()[0][\"index\"]\n", + " )()\n", + "\n", + " return style_bottleneck\n", + "\n", + "# Calculate style bottleneck for the preprocessed style image.\n", + "style_bottleneck = run_style_predict(preprocessed_style_image)\n", + "print('Style Bottleneck Shape:', style_bottleneck.shape)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "00t8S2PekIyW" + }, + "source": [ + "### 스타일 변환" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "cZp5bCj8SX1w" + }, + "outputs": [ + + ], + "source": [ + "# Run style transform on preprocessed style image\n", + "def run_style_transform(style_bottleneck, preprocessed_content_image):\n", + " # Load the model.\n", + " interpreter = tf.lite.Interpreter(model_path=style_transform_path)\n", + "\n", + " # Set model input.\n", + " input_details = interpreter.get_input_details()\n", + " interpreter.allocate_tensors()\n", + "\n", + " # Set model inputs.\n", + " interpreter.set_tensor(input_details[0][\"index\"], preprocessed_content_image)\n", + " interpreter.set_tensor(input_details[1][\"index\"], style_bottleneck)\n", + " interpreter.invoke()\n", + "\n", + " # Transform content image.\n", + " stylized_image = interpreter.tensor(\n", + " interpreter.get_output_details()[0][\"index\"]\n", + " )()\n", + "\n", + " return stylized_image\n", + "\n", + "# Stylize the content image using the style bottleneck.\n", + "stylized_image = run_style_transform(style_bottleneck, preprocessed_content_image)\n", + "\n", + "# Visualize the output.\n", + "imshow(stylized_image, 'Stylized Image')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vv_71Td-QtrW" + }, + "source": [ + "### 스타일 블렌딩\n", + "\n", + "콘텐츠 이미지의 스타일을 스타일화된 출력에 혼합하여 출력을 콘텐츠 이미지와 더 비슷하게 만들 수 있습니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "eJcAURXQQtJ7" + }, + "outputs": [ + + ], + "source": [ + "# Calculate style bottleneck of the content image.\n", + "style_bottleneck_content = run_style_predict(\n", + " preprocess_image(content_image, 256)\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "4S3yg2MgkmRD" + }, + "outputs": [ + + ], + "source": [ + "# Define content blending ratio between [0..1].\n", + "# 0.0: 0% style extracts from content image.\n", + "# 1.0: 100% style extracted from content image.\n", + "content_blending_ratio = 0.5 #@param {type:\"slider\", min:0, max:1, step:0.01}\n", + "\n", + "# Blend the style bottleneck of style image and content image\n", + "style_bottleneck_blended = content_blending_ratio * style_bottleneck_content \\\n", + " + (1 - content_blending_ratio) * style_bottleneck\n", + "\n", + "# Stylize the content image using the style bottleneck.\n", + "stylized_image_blended = run_style_transform(style_bottleneck_blended,\n", + " preprocessed_content_image)\n", + "\n", + "# Visualize the output.\n", + "imshow(stylized_image_blended, 'Blended Stylized Image')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9k9jGIep8p1c" + }, + "source": [ + "## 성능 벤치마크\n", + "\n", + "성능 벤치마크 수치는 [여기에 설명된](https://www.tensorflow.org/lite/performance/benchmarks) 도구를 사용하여 생성됩니다.\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
모델명 모델 크기 기기 NNAPI CPU GPU
스타일 예측 모델(int8)2.8MbPixel 3(Android 10) 142ms14ms *
Pixel 4(Android 10) 5.2ms6.7ms *
iPhone XS(iOS 12.4.1) 10.7ms **
스타일 변환 모델(int8)0.2MbPixel 3(Android 10) 540ms *
Pixel 4(Android 10) 405ms *
iPhone XS(iOS 12.4.1) 251ms **
스타일 예측 모델(float16)4.7MbPixel 3(Android 10) 86ms28ms *9.1ms
Pixel 4(Android 10)32ms12ms *10ms
스타일 전송 모델(float16)0.4MbPixel 3(Android 10) 1095ms545ms *42ms
Pixel 4(Android 10)603ms377ms *42ms
\n", + "\n", + "** 4개의 스레드가 사용되었습니다.
*\n", + "*** 최상의 결과를 위해 iPhone에 2개의 스레드가 있습니다.*\n" + ] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [ + + ], + "name": "overview.ipynb", + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/site/ko/lite/performance/post_training_float16_quant.ipynb b/site/ko/lite/performance/post_training_float16_quant.ipynb index 4246ae1231..3faf1ea29d 100644 --- a/site/ko/lite/performance/post_training_float16_quant.ipynb +++ b/site/ko/lite/performance/post_training_float16_quant.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "I9sUhVL_VZNO" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -91,7 +93,9 @@ "metadata": { "id": "gyqAw1M9lyab" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import logging\n", "logging.getLogger(\"tensorflow\").setLevel(logging.DEBUG)\n", @@ -117,7 +121,9 @@ "metadata": { "id": "hWSAjQWagIHl" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Load MNIST dataset\n", "mnist = keras.datasets.mnist\n", @@ -177,7 +183,9 @@ "metadata": { "id": "_i8B2nDZmAgQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "converter = tf.lite.TFLiteConverter.from_keras_model(model)\n", "tflite_model = converter.convert()" @@ -198,7 +206,9 @@ "metadata": { "id": "vptWZq2xnclo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tflite_models_dir = pathlib.Path(\"/tmp/mnist_tflite_models/\")\n", "tflite_models_dir.mkdir(exist_ok=True, parents=True)" @@ -210,7 +220,9 @@ "metadata": { "id": "Ie9pQaQrn5ue" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tflite_model_file = tflite_models_dir/\"mnist_model.tflite\"\n", "tflite_model_file.write_bytes(tflite_model)" @@ -231,7 +243,9 @@ "metadata": { "id": "HEZ6ET1AHAS3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "converter.optimizations = [tf.lite.Optimize.DEFAULT]\n", "converter.target_spec.supported_types = [tf.float16]" @@ -252,7 +266,9 @@ "metadata": { "id": "yuNfl3CoHNK3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tflite_fp16_model = converter.convert()\n", "tflite_model_fp16_file = tflite_models_dir/\"mnist_model_quant_f16.tflite\"\n", @@ -274,7 +290,9 @@ "metadata": { "id": "JExfcfLDscu4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!ls -lh {tflite_models_dir}" ] @@ -312,7 +330,9 @@ "metadata": { "id": "Jn16Rc23zTss" }, - "outputs": [], + "outputs": [ + + ], "source": [ "interpreter = tf.lite.Interpreter(model_path=str(tflite_model_file))\n", "interpreter.allocate_tensors()" @@ -324,7 +344,9 @@ "metadata": { "id": "J8Pztk1mvNVL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "interpreter_fp16 = tf.lite.Interpreter(model_path=str(tflite_model_fp16_file))\n", "interpreter_fp16.allocate_tensors()" @@ -345,7 +367,9 @@ "metadata": { "id": "AKslvo2kwWac" }, - "outputs": [], + "outputs": [ + + ], "source": [ "test_image = np.expand_dims(test_images[0], axis=0).astype(np.float32)\n", "\n", @@ -363,7 +387,9 @@ "metadata": { "id": "XZClM2vo3_bm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import matplotlib.pylab as plt\n", "\n", @@ -380,7 +406,9 @@ "metadata": { "id": "3gwhv4lKbYZ4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "test_image = np.expand_dims(test_images[0], axis=0).astype(np.float32)\n", "\n", @@ -398,7 +426,9 @@ "metadata": { "id": "CIH7G_MwbY2x" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plt.imshow(test_images[0])\n", "template = \"True:{true}, predicted:{predict}\"\n", @@ -422,7 +452,9 @@ "metadata": { "id": "05aeAuWjvjPx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# A helper function to evaluate the TF Lite model using \"test\" dataset.\n", "def evaluate_model(interpreter):\n", @@ -462,7 +494,9 @@ "metadata": { "id": "T5mWkSbMcU5z" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(evaluate_model(interpreter))" ] @@ -482,7 +516,9 @@ "metadata": { "id": "-9cnwiPp6EGm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# NOTE: Colab runs on server CPUs. At the time of writing this, TensorFlow Lite\n", "# doesn't have super optimized server CPU kernels. For this reason this may be\n", @@ -519,7 +555,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "post_training_float16_quant.ipynb", "toc_visible": true }, diff --git a/site/ko/lite/tutorials/pose_classification.ipynb b/site/ko/lite/tutorials/pose_classification.ipynb index 3c8ddddd21..e14aaf28e5 100644 --- a/site/ko/lite/tutorials/pose_classification.ipynb +++ b/site/ko/lite/tutorials/pose_classification.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "ZtimvKLdili0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -86,7 +88,9 @@ "metadata": { "id": "PWlbrkMCx-W-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install -q opencv-python" ] @@ -97,7 +101,9 @@ "metadata": { "id": "KTkttSWnUi1Q" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import csv\n", "import cv2\n", @@ -136,7 +142,9 @@ "cellView": "form", "id": "48kW1c2F5l1R" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Functions to run pose estimation with MoveNet\n", "\n", @@ -194,7 +202,9 @@ "cellView": "form", "id": "fKo0NzwQJ5Rm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Functions to visualize the pose estimation results.\n", "\n", @@ -239,7 +249,9 @@ "cellView": "form", "id": "QUkOW_26S6K-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Code to load the images, detect pose landmarks and save them into a CSV file\n", "\n", @@ -431,7 +443,9 @@ "cellView": "form", "id": "LB3QIVrdU108" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title (Optional) Code snippet to try out the Movenet pose estimation logic\n", "\n", @@ -474,7 +488,9 @@ "cellView": "form", "id": "Kw6jwOFD40Fr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "is_skip_step_1 = False #@param [\"False\", \"True\"] {type:\"raw\"}" ] @@ -495,7 +511,9 @@ "cellView": "form", "id": "iEnjgeKeS_VP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "use_custom_dataset = False #@param [\"False\", \"True\"] {type:\"raw\"}\n", "\n", @@ -560,7 +578,9 @@ "cellView": "form", "id": "joAHy_r62dsI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@markdown Be sure you run this cell. It's hiding the `split_into_train_test()` function that's called in the next code block.\n", "\n", @@ -633,7 +653,9 @@ "metadata": { "id": "IfpNIjAmR0lp" }, - "outputs": [], + "outputs": [ + + ], "source": [ "if use_custom_dataset:\n", " # ATTENTION:\n", @@ -677,7 +699,9 @@ "metadata": { "id": "GVpOi5Hr4Xxt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "if not is_skip_step_1 and not use_custom_dataset:\n", " !wget -O yoga_poses.zip http://download.tensorflow.org/data/pose_classification/yoga_poses.zip\n", @@ -700,7 +724,9 @@ "metadata": { "id": "OsdqxGfxTE2H" }, - "outputs": [], + "outputs": [ + + ], "source": [ "if not is_skip_step_1:\n", " images_in_train_folder = os.path.join(IMAGES_ROOT, 'train')\n", @@ -731,7 +757,9 @@ "metadata": { "id": "hddKVPjrTNbt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "if not is_skip_step_1:\n", " images_in_test_folder = os.path.join(IMAGES_ROOT, 'test')\n", @@ -778,7 +806,9 @@ "metadata": { "id": "ShpOD7yb4MRp" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Download the preprocessed CSV files which are the same as the output of step 1\n", "if is_skip_step_1:\n", @@ -805,7 +835,9 @@ "metadata": { "id": "pOUcc8EL5rrj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def load_pose_landmarks(csv_path):\n", " \"\"\"Loads a CSV created by MoveNetPreprocessor.\n", @@ -853,7 +885,9 @@ "metadata": { "id": "xawmSDGXUUzW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Load the train data\n", "X, y, class_names, _ = load_pose_landmarks(csvs_out_train_path)\n", @@ -869,7 +903,9 @@ "metadata": { "id": "R42kicUMaTX0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Load the test data\n", "X_test, y_test, _, df_test = load_pose_landmarks(csvs_out_test_path)" @@ -898,7 +934,9 @@ "metadata": { "id": "HgQMdfeT65Z5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def get_center_point(landmarks, left_bodypart, right_bodypart):\n", " \"\"\"Calculates the center point of the two given landmarks.\"\"\"\n", @@ -1000,7 +1038,9 @@ "metadata": { "id": "1Pte6b1bgWKv" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Define the model\n", "inputs = tf.keras.Input(shape=(51))\n", @@ -1022,7 +1062,9 @@ "metadata": { "id": "5ZuMwd7Ugtsa" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.compile(\n", " optimizer='adam',\n", @@ -1055,7 +1097,9 @@ "metadata": { "id": "pNVqmd2JO6Rp" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Visualize the training history to see whether you're overfitting.\n", "plt.plot(history.history['accuracy'])\n", @@ -1073,7 +1117,9 @@ "metadata": { "id": "m_byMBVQgyQm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Evaluate the model using the TEST dataset\n", "loss, accuracy = model.evaluate(X_test, y_test)" @@ -1094,7 +1140,9 @@ "metadata": { "id": "CJuVw7gygyyd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def plot_confusion_matrix(cm, classes,\n", " normalize=False,\n", @@ -1161,7 +1209,9 @@ "metadata": { "id": "bdJdwOkFGonK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "if is_skip_step_1:\n", " raise RuntimeError('You must have run step 1 to run this cell.')\n", @@ -1210,7 +1260,9 @@ "metadata": { "id": "FmwEAgi2Flb3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "converter = tf.lite.TFLiteConverter.from_keras_model(model)\n", "converter.optimizations = [tf.lite.Optimize.DEFAULT]\n", @@ -1237,7 +1289,9 @@ "metadata": { "id": "ZVW9j5vF6hBM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "with open('pose_labels.txt', 'w') as f:\n", " f.write('\\n'.join(class_names))" @@ -1258,7 +1312,9 @@ "metadata": { "id": "rv4fZFNcsN-1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def evaluate_model(interpreter, X, y_true):\n", " \"\"\"Evaluates the given TFLite model and return its accuracy.\"\"\"\n", @@ -1308,7 +1364,9 @@ "metadata": { "id": "KvcM_LkApOT3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!zip pose_classifier.zip pose_labels.txt pose_classifier.tflite" ] @@ -1319,7 +1377,9 @@ "metadata": { "id": "VQ-i27VypI1u" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Download the zip archive if running on Colab.\n", "try:\n", @@ -1332,7 +1392,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "pose_classification.ipynb", "toc_visible": true }, diff --git a/site/ko/model_optimization/guide/clustering/clustering_comprehensive_guide.ipynb b/site/ko/model_optimization/guide/clustering/clustering_comprehensive_guide.ipynb index 23edbb655c..78e2e4b5c1 100644 --- a/site/ko/model_optimization/guide/clustering/clustering_comprehensive_guide.ipynb +++ b/site/ko/model_optimization/guide/clustering/clustering_comprehensive_guide.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "ITj3u97-tNR7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -90,7 +92,9 @@ "metadata": { "id": "08dJRvOqN4rw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "! pip install -q tensorflow-model-optimization\n", "\n", @@ -198,7 +202,9 @@ "metadata": { "id": "29g7OADjN4r1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow_model_optimization as tfmot\n", "\n", @@ -249,7 +255,9 @@ "metadata": { "id": "IqBdl3uJN4r_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Create a base model\n", "base_model = setup_model()\n", @@ -317,7 +325,9 @@ "metadata": { "id": "73iboQ7MmxTs" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class MyDenseLayer(tf.keras.layers.Dense, tfmot.clustering.keras.ClusterableLayer):\n", "\n", @@ -373,7 +383,9 @@ "metadata": { "id": "w7P67mPk6RkQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Define the model.\n", "base_model = setup_model()\n", @@ -448,7 +460,9 @@ "metadata": { "id": "ZvuiCBsVN4sR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = setup_model()\n", "clustered_model = cluster_weights(model, **clustering_params)\n", @@ -479,7 +493,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "clustering_comprehensive_guide.ipynb", "toc_visible": true }, diff --git a/site/ko/model_optimization/guide/clustering/clustering_example.ipynb b/site/ko/model_optimization/guide/clustering/clustering_example.ipynb index 031670c4b3..b3478d71d0 100644 --- a/site/ko/model_optimization/guide/clustering/clustering_example.ipynb +++ b/site/ko/model_optimization/guide/clustering/clustering_example.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "mEE8NFIMSGO-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -48,8 +50,7 @@ "source": [ "\n", " \n", - " \n", + " \n", " \n", " \n", "
TensorFlow.org에서 보기 Google Colab에서 실행하기\n", - " Google Colab에서 실행하기 GitHub에서 소그 보기노트북 다운로드하기
" @@ -99,7 +100,9 @@ "metadata": { "id": "3asgXMqnSGPE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "! pip install -q tensorflow-model-optimization" ] @@ -110,7 +113,9 @@ "metadata": { "id": "gL6JiLXkSGPI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "from tensorflow import keras\n", @@ -136,7 +141,9 @@ "metadata": { "id": "w7Fd6jZ7SGPL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Load MNIST dataset\n", "mnist = keras.datasets.mnist\n", @@ -184,7 +191,9 @@ "metadata": { "id": "HYulekocSGPP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_, baseline_model_accuracy = model.evaluate(\n", " test_images, test_labels, verbose=0)\n", @@ -238,7 +247,9 @@ "metadata": { "id": "OzqKKt0mSGPT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow_model_optimization as tfmot\n", "\n", @@ -288,7 +299,9 @@ "metadata": { "id": "jn29-coXSGPX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Fine-tune model\n", "clustered_model.fit(\n", @@ -314,7 +327,9 @@ "metadata": { "id": "bE7MxpWLTaQ1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_, clustered_model_accuracy = clustered_model.evaluate(\n", " test_images, test_labels, verbose=0)\n", @@ -349,7 +364,9 @@ "metadata": { "id": "4h6tSvMzSGPd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "final_model = tfmot.clustering.keras.strip_clustering(clustered_model)\n", "\n", @@ -374,7 +391,9 @@ "metadata": { "id": "v2N47QW6SGPh" }, - "outputs": [], + "outputs": [ + + ], "source": [ "clustered_tflite_file = '/tmp/clustered_mnist.tflite'\n", "converter = tf.lite.TFLiteConverter.from_keras_model(final_model)\n", @@ -399,7 +418,9 @@ "metadata": { "id": "1XJ4QBMpW5JB" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def get_gzipped_model_size(file):\n", " # It returns the size of the gzipped model in bytes.\n", @@ -428,7 +449,9 @@ "metadata": { "id": "SG1MgZCeSGPk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(\"Size of gzipped baseline Keras model: %.2f bytes\" % (get_gzipped_model_size(keras_file)))\n", "print(\"Size of gzipped clustered Keras model: %.2f bytes\" % (get_gzipped_model_size(clustered_keras_file)))\n", @@ -459,7 +482,9 @@ "metadata": { "id": "XyHC8euLSGPo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "converter = tf.lite.TFLiteConverter.from_keras_model(final_model)\n", "converter.optimizations = [tf.lite.Optimize.DEFAULT]\n", @@ -499,7 +524,9 @@ "metadata": { "id": "EJ9B7pRISGPw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def eval_model(interpreter):\n", " input_index = interpreter.get_input_details()[0][\"index\"]\n", @@ -546,7 +573,9 @@ "metadata": { "id": "RFD4LXjpSGPz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "interpreter = tf.lite.Interpreter(model_content=tflite_quant_model)\n", "interpreter.allocate_tensors()\n", @@ -578,7 +607,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "clustering_example.ipynb", "toc_visible": true }, diff --git a/site/ko/model_optimization/guide/combine/cqat_example.ipynb b/site/ko/model_optimization/guide/combine/cqat_example.ipynb index e48b04524f..9b659426c6 100644 --- a/site/ko/model_optimization/guide/combine/cqat_example.ipynb +++ b/site/ko/model_optimization/guide/combine/cqat_example.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "mEE8NFIMSGO-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -97,7 +99,9 @@ "metadata": { "id": "3asgXMqnSGPE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "! pip install -q tensorflow-model-optimization" ] @@ -108,7 +112,9 @@ "metadata": { "id": "gL6JiLXkSGPI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "\n", @@ -133,7 +139,9 @@ "metadata": { "id": "w7Fd6jZ7SGPL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Load MNIST dataset\n", "mnist = tf.keras.datasets.mnist\n", @@ -181,7 +189,9 @@ "metadata": { "id": "HYulekocSGPP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_, baseline_model_accuracy = model.evaluate(\n", " test_images, test_labels, verbose=0)\n", @@ -235,7 +245,9 @@ "metadata": { "id": "OzqKKt0mSGPT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow_model_optimization as tfmot\n", "\n", @@ -285,7 +297,9 @@ "metadata": { "id": "jn29-coXSGPX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Fine-tune model\n", "clustered_model.fit(\n", @@ -310,7 +324,9 @@ "metadata": { "id": "f3gf1TDjR2rp" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def print_model_weight_clusters(model):\n", "\n", @@ -345,7 +361,9 @@ "metadata": { "id": "5l1jOLMfR2rq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "stripped_clustered_model = tfmot.clustering.keras.strip_clustering(clustered_model)\n", "\n", @@ -367,7 +385,9 @@ "metadata": { "id": "bE7MxpWLTaQ1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_, clustered_model_accuracy = clustered_model.evaluate(\n", " test_images, test_labels, verbose=0)\n", @@ -400,7 +420,9 @@ "metadata": { "id": "4h6tSvMzSGPd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# QAT\n", "qat_model = tfmot.quantization.keras.quantize_model(stripped_clustered_model)\n", @@ -431,7 +453,9 @@ "metadata": { "id": "-25FRoM0R2rt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(\"QAT Model clusters:\")\n", "print_model_weight_clusters(qat_model)\n", @@ -456,7 +480,9 @@ "metadata": { "id": "gc5txUkwR2ru" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def get_gzipped_model_size(file):\n", " # It returns the size of the gzipped model in kilobytes.\n", @@ -483,7 +509,9 @@ "metadata": { "id": "OChikLlhR2rv" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# QAT model\n", "converter = tf.lite.TFLiteConverter.from_keras_model(qat_model)\n", @@ -524,7 +552,9 @@ "metadata": { "id": "BEeTH_qBR2rw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def eval_model(interpreter):\n", " input_index = interpreter.get_input_details()[0][\"index\"]\n", @@ -571,7 +601,9 @@ "metadata": { "id": "LLHIyrumR2rx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "interpreter = tf.lite.Interpreter(cqat_model_file)\n", "interpreter.allocate_tensors()\n", @@ -601,7 +633,9 @@ "metadata": { "id": "LoVVjF-zR2ry" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def mnist_representative_data_gen():\n", " for image in train_images[:1000]: \n", @@ -624,7 +658,9 @@ "metadata": { "id": "4MK8mjIuR2ry" }, - "outputs": [], + "outputs": [ + + ], "source": [ "converter = tf.lite.TFLiteConverter.from_keras_model(stripped_clustered_model)\n", "converter.optimizations = [tf.lite.Optimize.DEFAULT]\n", @@ -666,7 +702,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "cqat_example.ipynb", "toc_visible": true }, diff --git a/site/ko/model_optimization/guide/combine/pcqat_example.ipynb b/site/ko/model_optimization/guide/combine/pcqat_example.ipynb index b5322c0b1a..e28c9499ea 100644 --- a/site/ko/model_optimization/guide/combine/pcqat_example.ipynb +++ b/site/ko/model_optimization/guide/combine/pcqat_example.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "mEE8NFIMSGO-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -39,11 +41,11 @@ "source": [ "\n", " \n", - " \n", - " \n", - " \n", + " \n", "
TensorFlow.org에서보기 Google Colab에서 실행하기\n", + " Google Colab에서 실행하기\n", " GitHub에서 소스 보기\n", + " GitHub에서 소스 보기\n", " 노트북 다운로드하기 노트북 다운로드하기
" ] }, @@ -101,7 +103,9 @@ "metadata": { "id": "3asgXMqnSGPE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "! pip install -q tensorflow-model-optimization" ] @@ -112,7 +116,9 @@ "metadata": { "id": "gL6JiLXkSGPI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "\n", @@ -137,7 +143,9 @@ "metadata": { "id": "w7Fd6jZ7SGPL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Load MNIST dataset\n", "mnist = tf.keras.datasets.mnist\n", @@ -187,7 +195,9 @@ "metadata": { "id": "HYulekocSGPP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_, baseline_model_accuracy = model.evaluate(\n", " test_images, test_labels, verbose=0)\n", @@ -234,7 +244,9 @@ "metadata": { "id": "mqsN5tP-kXZF" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow_model_optimization as tfmot\n", "\n", @@ -276,7 +288,9 @@ "metadata": { "id": "2aBxR8uEkXZG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Fine-tune model\n", "pruned_model.fit(\n", @@ -302,7 +316,9 @@ "metadata": { "id": "XL-zWoU4kXZG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def print_model_weights_sparsity(model):\n", " for layer in model.layers:\n", @@ -352,7 +368,9 @@ "metadata": { "id": "_8_p--1NkXZG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "stripped_pruned_model = tfmot.sparsity.keras.strip_pruning(pruned_model)\n", "\n", @@ -383,7 +401,9 @@ "metadata": { "id": "RetnGeQnkXZH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow_model_optimization as tfmot\n", "from tensorflow_model_optimization.python.core.clustering.keras.experimental import (\n", @@ -426,7 +446,9 @@ "metadata": { "id": "iHN3NW8OkXZI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "stripped_clustered_model = tfmot.clustering.keras.strip_clustering(sparsity_clustered_model)\n", "\n", @@ -461,7 +483,9 @@ "metadata": { "id": "Nfp-xfHdZIUc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# QAT\n", "qat_model = tfmot.quantization.keras.quantize_model(stripped_clustered_model)\n", @@ -492,7 +516,9 @@ "metadata": { "id": "6kluyg_2ZIUd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(\"QAT Model clusters:\")\n", "print_model_weight_clusters(qat_model)\n", @@ -521,7 +547,9 @@ "metadata": { "id": "vehNHBYsZIUe" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def get_gzipped_model_size(file):\n", " # It returns the size of the gzipped model in kilobytes.\n", @@ -548,7 +576,9 @@ "metadata": { "id": "mbe2jMAyZIUe" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# QAT model\n", "converter = tf.lite.TFLiteConverter.from_keras_model(qat_model)\n", @@ -589,7 +619,9 @@ "metadata": { "id": "9P-1dmQcZIUf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def eval_model(interpreter):\n", " input_index = interpreter.get_input_details()[0][\"index\"]\n", @@ -636,7 +668,9 @@ "metadata": { "id": "6p4RBECpZIUg" }, - "outputs": [], + "outputs": [ + + ], "source": [ "interpreter = tf.lite.Interpreter(pcqat_model_file)\n", "interpreter.allocate_tensors()\n", @@ -674,7 +708,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "pcqat_example.ipynb", "toc_visible": true }, diff --git a/site/ko/model_optimization/guide/combine/pqat_example.ipynb b/site/ko/model_optimization/guide/combine/pqat_example.ipynb index 95e6e90bdb..6cac9aa588 100644 --- a/site/ko/model_optimization/guide/combine/pqat_example.ipynb +++ b/site/ko/model_optimization/guide/combine/pqat_example.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "mEE8NFIMSGO-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -39,11 +41,11 @@ "source": [ "\n", " \n", - " \n", - " \n", - " \n", + " \n", "
TensorFlow.org에서보기 Google Colab에서 실행하기\n", + " Google Colab에서 실행하기\n", " GitHub에서 소스 보기\n", + " GitHub에서 소스 보기\n", " 노트북 다운로드하기 노트북 다운로드하기
" ] }, @@ -99,7 +101,9 @@ "metadata": { "id": "3asgXMqnSGPE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "! pip install -q tensorflow-model-optimization" ] @@ -110,7 +114,9 @@ "metadata": { "id": "gL6JiLXkSGPI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "\n", @@ -135,7 +141,9 @@ "metadata": { "id": "w7Fd6jZ7SGPL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Load MNIST dataset\n", "mnist = tf.keras.datasets.mnist\n", @@ -183,7 +191,9 @@ "metadata": { "id": "HYulekocSGPP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_, baseline_model_accuracy = model.evaluate(\n", " test_images, test_labels, verbose=0)\n", @@ -237,7 +247,9 @@ "metadata": { "id": "OzqKKt0mSGPT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow_model_optimization as tfmot\n", "\n", @@ -288,7 +300,9 @@ "metadata": { "id": "jn29-coXSGPX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Fine-tune model\n", "pruned_model.fit(\n", @@ -314,7 +328,9 @@ "metadata": { "id": "69468934028c" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def print_model_weights_sparsity(model):\n", "\n", @@ -350,7 +366,9 @@ "metadata": { "id": "a3fada83ffd7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "stripped_pruned_model = tfmot.sparsity.keras.strip_pruning(pruned_model)\n", "\n", @@ -372,7 +390,9 @@ "metadata": { "id": "bE7MxpWLTaQ1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_, pruned_model_accuracy = pruned_model.evaluate(\n", " test_images, test_labels, verbose=0)\n", @@ -405,7 +425,9 @@ "metadata": { "id": "4h6tSvMzSGPd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# QAT\n", "qat_model = tfmot.quantization.keras.quantize_model(stripped_pruned_model)\n", @@ -436,7 +458,9 @@ "metadata": { "id": "8e90c14cce8d" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(\"QAT Model sparsity:\")\n", "print_model_weights_sparsity(qat_model)\n", @@ -461,7 +485,9 @@ "metadata": { "id": "b72869768986" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def get_gzipped_model_size(file):\n", " # It returns the size of the gzipped model in kilobytes.\n", @@ -488,7 +514,9 @@ "metadata": { "id": "057965bfae3d" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# QAT model\n", "converter = tf.lite.TFLiteConverter.from_keras_model(qat_model)\n", @@ -529,7 +557,9 @@ "metadata": { "id": "8808bb8628bd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def eval_model(interpreter):\n", " input_index = interpreter.get_input_details()[0][\"index\"]\n", @@ -576,7 +606,9 @@ "metadata": { "id": "4eaf0160ea09" }, - "outputs": [], + "outputs": [ + + ], "source": [ "interpreter = tf.lite.Interpreter(pqat_model_file)\n", "interpreter.allocate_tensors()\n", @@ -606,7 +638,9 @@ "metadata": { "id": "e92771026b96" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def mnist_representative_data_gen():\n", " for image in train_images[:1000]: \n", @@ -629,7 +663,9 @@ "metadata": { "id": "0c913c4d4f9b" }, - "outputs": [], + "outputs": [ + + ], "source": [ "converter = tf.lite.TFLiteConverter.from_keras_model(stripped_pruned_model)\n", "converter.optimizations = [tf.lite.Optimize.DEFAULT]\n", @@ -671,7 +707,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "pqat_example.ipynb", "toc_visible": true }, diff --git a/site/ko/model_optimization/guide/combine/sparse_clustering_example.ipynb b/site/ko/model_optimization/guide/combine/sparse_clustering_example.ipynb index 72806a9ce4..c6b94c6e4c 100644 --- a/site/ko/model_optimization/guide/combine/sparse_clustering_example.ipynb +++ b/site/ko/model_optimization/guide/combine/sparse_clustering_example.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "mEE8NFIMSGO-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -48,11 +50,11 @@ "source": [ "\n", " \n", - " \n", - " \n", - " \n", + " \n", "
TensorFlow.org에서보기 Google Colab에서 실행하기\n", + " Google Colab에서 실행하기\n", " GitHub에서 소스 보기\n", + " GitHub에서 소스 보기\n", " 노트북 다운로드하기 노트북 다운로드하기
" ] }, @@ -99,7 +101,9 @@ "metadata": { "id": "3asgXMqnSGPE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "! pip install -q tensorflow-model-optimization" ] @@ -110,7 +114,9 @@ "metadata": { "id": "gL6JiLXkSGPI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "\n", @@ -135,7 +141,9 @@ "metadata": { "id": "w7Fd6jZ7SGPL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Load MNIST dataset\n", "mnist = tf.keras.datasets.mnist\n", @@ -183,7 +191,9 @@ "metadata": { "id": "HYulekocSGPP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_, baseline_model_accuracy = model.evaluate(\n", " test_images, test_labels, verbose=0)\n", @@ -230,7 +240,9 @@ "metadata": { "id": "mqsN5tP-kXZF" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow_model_optimization as tfmot\n", "\n", @@ -274,7 +286,9 @@ "metadata": { "id": "2aBxR8uEkXZG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Fine-tune model\n", "pruned_model.fit(\n", @@ -300,7 +314,9 @@ "metadata": { "id": "XL-zWoU4kXZG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def print_model_weights_sparsity(model):\n", "\n", @@ -335,7 +351,9 @@ "metadata": { "id": "_8_p--1NkXZG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "stripped_pruned_model = tfmot.sparsity.keras.strip_pruning(pruned_model)\n", "\n", @@ -369,7 +387,9 @@ "metadata": { "id": "RetnGeQnkXZH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Clustering\n", "cluster_weights = tfmot.clustering.keras.cluster_weights\n", @@ -430,7 +450,9 @@ "metadata": { "id": "iHN3NW8OkXZI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(\"Clustered Model sparsity:\\n\")\n", "print_model_weights_sparsity(clustered_model)\n", @@ -455,7 +477,9 @@ "metadata": { "id": "obozrEwrkXZI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def get_gzipped_model_size(file):\n", " # It returns the size of the gzipped model in kilobytes.\n", @@ -473,7 +497,9 @@ "metadata": { "id": "RTjq8zjnkXZJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Clustered model\n", "clustered_model_file = 'clustered_model.h5'\n", @@ -508,7 +534,9 @@ "metadata": { "id": "i4dI7XSakXZJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "stripped_sparsity_clustered_model = tfmot.clustering.keras.strip_clustering(sparsity_clustered_model)\n", "\n", @@ -541,7 +569,9 @@ "metadata": { "id": "c1HTl0x0kXZK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def eval_model(interpreter):\n", " input_index = interpreter.get_input_details()[0][\"index\"]\n", @@ -588,7 +618,9 @@ "metadata": { "id": "lbumQ_-0kXZL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Keras model evaluation\n", "stripped_sparsity_clustered_model.compile(optimizer='adam',\n", @@ -628,7 +660,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "sparse_clustering_example.ipynb", "toc_visible": true }, diff --git a/site/ko/model_optimization/guide/pruning/comprehensive_guide.ipynb b/site/ko/model_optimization/guide/pruning/comprehensive_guide.ipynb index 7c6748731d..1eb84a5815 100644 --- a/site/ko/model_optimization/guide/pruning/comprehensive_guide.ipynb +++ b/site/ko/model_optimization/guide/pruning/comprehensive_guide.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "IcfrhafzkZbH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -103,7 +105,9 @@ "cellView": "both", "id": "lvpH1Hg7ULFz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "! pip install -q tensorflow-model-optimization\n", "\n", @@ -199,7 +203,9 @@ "metadata": { "id": "aIn-hFO_T_PU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "base_model = setup_model()\n", "base_model.load_weights(pretrained_weights) # optional but recommended.\n", @@ -245,7 +251,9 @@ "metadata": { "id": "HN0B_QB-ZhE2" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Create a base model\n", "base_model = setup_model()\n", @@ -283,7 +291,9 @@ "metadata": { "id": "CjY_JyB808Da" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(base_model.layers[0].name)" ] @@ -323,7 +333,9 @@ "metadata": { "id": "7Wow55hg5oiM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Use `prune_low_magnitude` to make the `Dense` layer train with pruning.\n", "i = tf.keras.Input(shape=(20,))\n", @@ -349,7 +361,9 @@ "metadata": { "id": "mQOiDUGgfi4y" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Use `prune_low_magnitude` to make the `Dense` layer train with pruning.\n", "model_for_pruning = tf.keras.Sequential([\n", @@ -391,7 +405,9 @@ "metadata": { "id": "77jgBjccnTh6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class MyDenseLayer(tf.keras.layers.Dense, tfmot.sparsity.keras.PrunableLayer):\n", "\n", @@ -443,7 +459,9 @@ "metadata": { "id": "fKZ2PxcpY_WV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Define the model.\n", "base_model = setup_model()\n", @@ -509,7 +527,9 @@ "metadata": { "id": "hPQUrkodbIF2" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Define the model.\n", "base_model = setup_model()\n", @@ -610,7 +630,9 @@ "metadata": { "id": "6khQg-q7imfH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Define the model.\n", "base_model = setup_model()\n", @@ -638,7 +660,9 @@ "metadata": { "id": "2nGC1hZnYlzb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Deserialize model.\n", "with tfmot.sparsity.keras.prune_scope():\n", @@ -680,7 +704,9 @@ "metadata": { "id": "EZ3TD8cYkxZM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Define the model.\n", "base_model = setup_model()\n", @@ -727,7 +753,9 @@ "metadata": { "id": "xedaVDeFc0bw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "base_model = setup_model()\n", "\n", diff --git a/site/ko/model_optimization/guide/pruning/pruning_for_on_device_inference.ipynb b/site/ko/model_optimization/guide/pruning/pruning_for_on_device_inference.ipynb index 2907e97683..e77025f370 100644 --- a/site/ko/model_optimization/guide/pruning/pruning_for_on_device_inference.ipynb +++ b/site/ko/model_optimization/guide/pruning/pruning_for_on_device_inference.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "DwBljPxTJ4Ng" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -48,10 +50,10 @@ "source": [ "\n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", "
TensorFlow.org에서보기 Google Colab에서 실행하기\n", + " Google Colab에서 실행하기\n", "GitHub에서 소그 보기 노트북 다운로드하기 GitHub에서 소그 보기 노트북 다운로드하기
" ] }, @@ -90,7 +92,9 @@ "metadata": { "id": "re0qdmOAJ4Nk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "! pip install -q tensorflow\n", "! pip install -q tensorflow-model-optimization" @@ -102,7 +106,9 @@ "metadata": { "id": "aIn7sB8-J4Nk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tempfile\n", "\n", @@ -140,7 +146,9 @@ "metadata": { "id": "Ws4cmZCJJ4Nm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Load CIFAR10 dataset.\n", "(ds_train, ds_val, ds_test), ds_info = tfds.load(\n", @@ -240,7 +248,9 @@ "metadata": { "id": "N1WQt5dmJ4Nn" }, - "outputs": [], + "outputs": [ + + ], "source": [ "prune_low_magnitude = tfmot.sparsity.keras.prune_low_magnitude\n", "\n", @@ -281,7 +291,9 @@ "metadata": { "id": "qvALAbZeJ4No" }, - "outputs": [], + "outputs": [ + + ], "source": [ "fixed_dense_model = keras.Sequential([\n", " keras.layers.InputLayer(input_shape=(32, 32, 3)),\n", @@ -352,7 +364,9 @@ "metadata": { "id": "GzdS6AgRJ4Np" }, - "outputs": [], + "outputs": [ + + ], "source": [ "logdir = tempfile.mkdtemp()\n", "\n", @@ -394,7 +408,9 @@ "metadata": { "id": "fGDkSxKJJ4Nq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#docs_infra: no_execute\n", "%tensorboard --logdir={logdir}" @@ -426,7 +442,9 @@ "metadata": { "id": "AAJr2XKCJ4Nr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "converter = tf.lite.TFLiteConverter.from_keras_model(dense_model)\n", "dense_tflite_model = converter.convert()\n", @@ -461,7 +479,9 @@ "metadata": { "id": "-qamJwAM7psU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "! adb shell /data/local/tmp/benchmark_model \\\n", " --graph=/data/local/tmp/dense_model.tflite \\\n", @@ -476,7 +496,9 @@ "metadata": { "id": "fpTxyOcd7psU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "! adb shell /data/local/tmp/benchmark_model \\\n", " --graph=/data/local/tmp/pruned_model.tflite \\\n", @@ -517,7 +539,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "pruning_for_on_device_inference.ipynb", "toc_visible": true }, diff --git a/site/ko/model_optimization/guide/pruning/pruning_with_sparsity_2_by_4.ipynb b/site/ko/model_optimization/guide/pruning/pruning_with_sparsity_2_by_4.ipynb index 3e152d76be..a74c148109 100644 --- a/site/ko/model_optimization/guide/pruning/pruning_with_sparsity_2_by_4.ipynb +++ b/site/ko/model_optimization/guide/pruning/pruning_with_sparsity_2_by_4.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "IcfrhafzkZbH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -48,10 +50,10 @@ "source": [ "\n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", "
TensorFlow.org에서보기 Google Colab에서 실행하기\n", + " Google Colab에서 실행하기\n", "GitHub에서 소그 보기 노트북 다운로드하기 GitHub에서 소그 보기 노트북 다운로드하기
" ] }, @@ -119,7 +121,9 @@ "cellView": "both", "id": "lvpH1Hg7ULFz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "! pip install -q tensorflow\n", "! pip install -q tensorflow-model-optimization\n", @@ -132,7 +136,9 @@ "metadata": { "id": "_hn5e5_gWr_E" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "from tensorflow import keras\n", @@ -156,7 +162,9 @@ "metadata": { "id": "hSf4jYKGWr_E" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Load MNIST dataset.\n", "mnist = keras.datasets.mnist\n", @@ -193,7 +201,9 @@ "metadata": { "id": "1EXNYAPJWr_F" }, - "outputs": [], + "outputs": [ + + ], "source": [ "pruning_params_2_by_4 = {\n", " 'sparsity_m_by_n': (2, 4),\n", @@ -215,7 +225,9 @@ "metadata": { "id": "un24AZUOWr_F" }, - "outputs": [], + "outputs": [ + + ], "source": [ "pruning_params_sparsity_0_5 = {\n", " 'pruning_schedule': tfmot.sparsity.keras.ConstantSparsity(target_sparsity=0.5,\n", @@ -243,7 +255,9 @@ "metadata": { "id": "BDGzC6YlWr_G" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = keras.Sequential([\n", " prune_low_magnitude(\n", @@ -293,7 +307,9 @@ "metadata": { "id": "F4CnppA1Wr_H" }, - "outputs": [], + "outputs": [ + + ], "source": [ "batch_size = 128\n", "epochs = 2\n", @@ -326,7 +342,9 @@ "metadata": { "id": "3wn-OQ_gWr_H" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = tfmot.sparsity.keras.strip_pruning(model)" ] @@ -346,7 +364,9 @@ "metadata": { "id": "EJ7DsA6-Wr_I" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tempfile\n", "\n", @@ -383,7 +403,9 @@ "metadata": { "id": "fOIp6QB5Wr_J" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Load tflite file with the created pruned model\n", "interpreter = tf.lite.Interpreter(model_path=tflite_file)\n", @@ -414,7 +436,9 @@ "metadata": { "id": "mCDkwMUPWr_K" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(f\"Shape of Dense layer is {tensor_data.shape}\")" ] @@ -434,7 +458,9 @@ "metadata": { "id": "WZfn34bRWr_K" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", @@ -464,7 +490,9 @@ "metadata": { "id": "LUplruw9Wr_L" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def plot_separation_lines(height, width):\n", "\n", @@ -498,7 +526,9 @@ "metadata": { "id": "ATeyf5vCWr_L" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plot_separation_lines(height, width)\n", "\n", @@ -524,7 +554,9 @@ "metadata": { "id": "_Dkbt7eRWr_M" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Get weights of the convolutional layer that has been pruned with 2 by 4 sparsity.\n", "tensor_name = 'structural_pruning/Conv2D'\n", @@ -548,7 +580,9 @@ "metadata": { "id": "wyvLpfa6Wr_M" }, - "outputs": [], + "outputs": [ + + ], "source": [ "weights_to_display = tf.reshape(tensor_data, [tf.reduce_prod(tensor_data.shape[:-1]), -1])\n", "weights_to_display = weights_to_display[0:width, 0:height]\n", @@ -581,7 +615,9 @@ "metadata": { "id": "eEHu5nizWr_M" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Get weights of the convolutional layer that has been pruned with random pruning.\n", "tensor_name = 'pruning_sparsity_0_5/Conv2D'\n", @@ -596,7 +632,9 @@ "metadata": { "id": "Cimzp3kVWr_M" }, - "outputs": [], + "outputs": [ + + ], "source": [ "weights_to_display = tf.reshape(tensor_data, [tensor_data.shape[0],tf.reduce_prod(tensor_data.shape[1:])])\n", "weights_to_display = weights_to_display[0:width, 0:height]\n", @@ -629,7 +667,9 @@ "metadata": { "id": "7HDYffebWr_N" }, - "outputs": [], + "outputs": [ + + ], "source": [ "! python3 ./tensorflow_model_optimization/python/core/sparsity/keras/tools/check_sparsity_m_by_n.py --model_tflite=pruned_model.tflite --m_by_n=2,4\n" ] diff --git a/site/ko/neural_structured_learning/tutorials/adversarial_keras_cnn_mnist.ipynb b/site/ko/neural_structured_learning/tutorials/adversarial_keras_cnn_mnist.ipynb index 9c552cc9dd..922bb70295 100644 --- a/site/ko/neural_structured_learning/tutorials/adversarial_keras_cnn_mnist.ipynb +++ b/site/ko/neural_structured_learning/tutorials/adversarial_keras_cnn_mnist.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "nxbcnXODdE06" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -177,7 +179,9 @@ "metadata": { "id": "ByJ7133BQULR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install --quiet neural-structured-learning" ] @@ -197,7 +201,9 @@ "metadata": { "id": "EuqEuAYzTMo0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import matplotlib.pyplot as plt\n", "import neural_structured_learning as nsl\n", @@ -246,7 +252,9 @@ "metadata": { "id": "iOc8YdmIRSHo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class HParams(object):\n", " def __init__(self):\n", @@ -292,7 +300,9 @@ "metadata": { "id": "R1dK6E4axNHB" }, - "outputs": [], + "outputs": [ + + ], "source": [ "datasets = tfds.load('mnist')\n", "\n", @@ -318,7 +328,9 @@ "metadata": { "id": "VhMEJqKs0_7z" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def normalize(features):\n", " features[IMAGE_INPUT_NAME] = tf.cast(\n", @@ -352,7 +364,9 @@ "metadata": { "id": "4UjrtuIsYWo3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def build_base_model(hparams):\n", " \"\"\"Builds a model according to the architecture defined in `hparams`.\"\"\"\n", @@ -381,7 +395,9 @@ "metadata": { "id": "288nsmN5pLoo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "base_model = build_base_model(HPARAMS)\n", "base_model.summary()" @@ -402,7 +418,9 @@ "metadata": { "id": "K2cFDbmRpRMp" }, - "outputs": [], + "outputs": [ + + ], "source": [ "base_model.compile(\n", " optimizer='adam',\n", @@ -417,7 +435,9 @@ "metadata": { "id": "J94Y_WTaqAsi" }, - "outputs": [], + "outputs": [ + + ], "source": [ "results = base_model.evaluate(test_dataset)\n", "named_results = dict(zip(base_model.metrics_names, results))\n", @@ -459,7 +479,9 @@ "metadata": { "id": "-WWVwJB2qstE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "adv_config = nsl.configs.make_adv_reg_config(\n", " multiplier=HPARAMS.adv_multiplier,\n", @@ -485,7 +507,9 @@ "metadata": { "id": "TObqJLEX4sQq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "base_adv_model = build_base_model(HPARAMS)\n", "adv_model = nsl.keras.AdversarialRegularization(\n", @@ -513,7 +537,9 @@ "metadata": { "id": "aTSK-cHbuWDw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "adv_model.compile(\n", " optimizer='adam',\n", @@ -528,7 +554,9 @@ "metadata": { "id": "3v_Jn7wuviZx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "results = adv_model.evaluate(test_set_for_adv_model)\n", "named_results = dict(zip(adv_model.metrics_names, results))\n", @@ -563,7 +591,9 @@ "metadata": { "id": "FLkYw54pvxJO" }, - "outputs": [], + "outputs": [ + + ], "source": [ "reference_model = nsl.keras.AdversarialRegularization(\n", " base_model, label_keys=[LABEL_INPUT_NAME], adv_config=adv_config)\n", @@ -590,7 +620,9 @@ "metadata": { "id": "igRBxPlPm_JE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "models_to_eval = {\n", " 'base': base_model,\n", @@ -617,7 +649,9 @@ "metadata": { "id": "IGnLXhswmUN8" }, - "outputs": [], + "outputs": [ + + ], "source": [ "perturbed_images, labels, predictions = [], [], []\n", "\n", @@ -665,7 +699,9 @@ "metadata": { "id": "3iK9vO_xKJfg" }, - "outputs": [], + "outputs": [ + + ], "source": [ "batch_index = 0\n", "\n", @@ -708,7 +744,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "adversarial_keras_cnn_mnist.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/A_Tour_of_TensorFlow_Probability.ipynb b/site/ko/probability/examples/A_Tour_of_TensorFlow_Probability.ipynb index ad78c647a9..fccaf8ae62 100644 --- a/site/ko/probability/examples/A_Tour_of_TensorFlow_Probability.ipynb +++ b/site/ko/probability/examples/A_Tour_of_TensorFlow_Probability.ipynb @@ -18,7 +18,9 @@ "cellView": "form", "id": "CpDUTVKYTowI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -73,7 +75,9 @@ "metadata": { "id": "5UYdUIGU5KJ6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Import { display-mode: \"form\" }\n", "\n", @@ -104,7 +108,9 @@ "metadata": { "id": "di_gCffY43PT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Utils { display-mode: \"form\" }\n", "def print_subclasses_from_module(module, base_class, maxwidth=80):\n", @@ -394,7 +400,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -422,7 +430,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -447,7 +457,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -698,7 +710,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -778,7 +792,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -854,7 +870,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -915,7 +933,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -948,7 +968,9 @@ "metadata": { "id": "n0xgOdM2XstI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Suppose we have some observed data\n", "obs_x = [[-3.], [0.], [2.]] # Shape 3x1 (3 1-D vectors)\n", @@ -972,7 +994,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1001,7 +1025,7 @@ "각 bijector는 최소 3가지 메서드를 구현합니다.\n", "\n", "- `forward`\n", - "- `inverse`\n", + "- `inverse` , 그리고\n", "- (적어도) `forward_log_det_jacobian` 및 `inverse_log_det_jacobian` 중 하나.\n", "\n", "위의 성분을 사용하여 분포를 변환하고 결과에서 샘플 및 log_probs를 얻을 수 있습니다.\n", @@ -1072,7 +1096,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1099,7 +1125,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1133,7 +1161,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1217,7 +1247,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1298,7 +1330,9 @@ "metadata": { "id": "5lZhXdbgbSwP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Generate some data\n", "def f(x, w):\n", @@ -1332,7 +1366,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1367,7 +1403,9 @@ "metadata": { "id": "UY56HpEaduUV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Define the joint_log_prob function, and our unnormalized posterior.\n", "def joint_log_prob(w, x, y):\n", @@ -1390,7 +1428,9 @@ "metadata": { "id": "lgL8c1nKjSi8" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Create our unnormalized target density by currying x and y from the joint.\n", "def unnormalized_posterior(w):\n", @@ -1412,7 +1452,9 @@ "metadata": { "id": "T9Myqb0Yjph3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Create an HMC TransitionKernel\n", "hmc_kernel = tfp.mcmc.HamiltonianMonteCarlo(\n", @@ -1427,7 +1469,9 @@ "metadata": { "id": "JBuIs-IbedWo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# We wrap sample_chain in tf.function, telling TF to precompile a reusable\n", "# computation graph, which will dramatically improve performance.\n", @@ -1490,7 +1534,9 @@ "metadata": { "id": "QzAocJeU0wib" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Apply a simple step size adaptation during burnin\n", "@tf.function\n", @@ -1544,7 +1590,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -1556,7 +1604,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1730,7 +1780,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -1742,7 +1794,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1811,7 +1865,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "A_Tour_of_TensorFlow_Probability.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/Bayesian_Gaussian_Mixture_Model.ipynb b/site/ko/probability/examples/Bayesian_Gaussian_Mixture_Model.ipynb index e91f3259cf..a9ab321886 100644 --- a/site/ko/probability/examples/Bayesian_Gaussian_Mixture_Model.ipynb +++ b/site/ko/probability/examples/Bayesian_Gaussian_Mixture_Model.ipynb @@ -18,7 +18,9 @@ "cellView": "form", "id": "9HGeUNoteaSm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -118,7 +120,9 @@ "metadata": { "id": "uswTWdgNu46j" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%matplotlib inline\n", "\n", @@ -164,7 +168,9 @@ "metadata": { "id": "nc4yy6vW-lC_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class MVNCholPrecisionTriL(tfd.TransformedDistribution):\n", " \"\"\"MVN from loc and (Cholesky) precision matrix.\"\"\"\n", @@ -274,7 +280,9 @@ "metadata": { "id": "xhzxySDjL2-S" }, - "outputs": [], + "outputs": [ + + ], "source": [ "dtype = np.float64\n", "dims = 2\n", @@ -288,7 +296,9 @@ "metadata": { "id": "xAOmHhZ7LzDQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "bgmm = tfd.JointDistributionNamed(dict(\n", " mix_probs=tfd.Dirichlet(\n", @@ -323,7 +333,9 @@ "metadata": { "id": "CpLnRJr2TXYD" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def joint_log_prob(observations, mix_probs, loc, chol_precision):\n", " \"\"\"BGMM with priors: loc=Normal, precision=Inverse-Wishart, mix=Dirichlet.\n", @@ -370,7 +382,9 @@ "metadata": { "id": "1AJZAtwXV8RQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "true_loc = np.array([[-2., -2],\n", " [0, 0],\n", @@ -408,7 +422,9 @@ "metadata": { "id": "tVoaDFSf7L_j" }, - "outputs": [], + "outputs": [ + + ], "source": [ "unnormalized_posterior_log_prob = functools.partial(joint_log_prob, observations)" ] @@ -419,7 +435,9 @@ "metadata": { "id": "a0OMIWIYeMmQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "initial_state = [\n", " tf.fill([components],\n", @@ -481,7 +499,9 @@ "metadata": { "id": "_atEQrDR7JvG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "unconstraining_bijectors = [\n", " tfb.SoftmaxCentered(),\n", @@ -498,7 +518,9 @@ "metadata": { "id": "0zq6QJJ-NSPJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function(autograph=False)\n", "def sample():\n", @@ -534,7 +556,9 @@ "metadata": { "id": "_ceX1A3-ZFiN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "acceptance_rate = tf.reduce_mean(tf.cast(is_accepted, dtype=tf.float32)).numpy()\n", "mean_mix_probs = tf.reduce_mean(mix_probs, axis=0).numpy()\n", @@ -594,7 +618,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -628,7 +654,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "Bayesian_Gaussian_Mixture_Model.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/Distributed_Inference_with_JAX.ipynb b/site/ko/probability/examples/Distributed_Inference_with_JAX.ipynb index ea96fd110c..0a0973bfc4 100644 --- a/site/ko/probability/examples/Distributed_Inference_with_JAX.ipynb +++ b/site/ko/probability/examples/Distributed_Inference_with_JAX.ipynb @@ -18,7 +18,9 @@ "cellView": "form", "id": "_RX4_K8Z5msT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -43,8 +45,7 @@ "\n", "\n", " \n", - " \n", + " \n", " \n", " \n", "
TensorFlow.org에서보기 Google Colab에서 실행하기\n", - " Google Colab에서 실행하기 GitHub에서 소그 보기 노트북 다운로드하기
" @@ -172,7 +173,9 @@ "metadata": { "id": "X4Pe3mZKgO6i" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tfd = tfp.distributions\n", "tfb = tfp.bijectors\n", @@ -374,7 +377,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -411,7 +416,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -479,7 +486,9 @@ "metadata": { "id": "LQAqJ4O3h1oM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def run(seed):\n", " target_log_prob = tfd.Sample(tfd.Normal(0., 1.), 2).log_prob\n", @@ -546,7 +555,9 @@ "metadata": { "id": "uz1etedpjw_f" }, - "outputs": [], + "outputs": [ + + ], "source": [ "states = states.transpose([0, 2, 1, 3]).reshape([-1, 1000, 2])\n", "log_probs = log_probs.transpose([0, 2, 1]).reshape([-1, 1000])" @@ -568,7 +579,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -665,7 +678,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -702,7 +717,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -738,7 +755,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -784,7 +803,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -861,7 +882,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -927,7 +950,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -996,7 +1021,7 @@ "id": "wUeySkfVuqI-" }, "source": [ - "MNIST 분류를 위해 다음 베이지안 로지스틱 회귀 모델을 사용합니다: $$ \\begin{align*} w &\\sim \\mathcal{N}(0, 1) \\ b &\\sim \\mathcal{N}(0, 1) \\ y_i | w, b, x_i &\\sim \\textrm{Categorical}(w^T x_i + b) \\end{align*} $$" + "MNIST 분류를 위해 다음 베이지안 로지스틱 회귀 모델을 사용합니다: $$ \\begin{align*} w &\\sim \\mathcal{N}(0, 1) \\ b &\\sim \\mathcal{N}(0, 1) \\ y_i | w, b, x_i &\\sim \\textrm{Categorical}(w^T x_i + b) \\end{align*} $$" ] }, { @@ -1045,7 +1070,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -1083,7 +1110,9 @@ "metadata": { "id": "cRvMbzl8vO3h" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def shard_value(x):\n", " x = x.reshape((jax.device_count(), -1, *x.shape[1:]))\n", @@ -1138,7 +1167,9 @@ "metadata": { "id": "VuJ9Um1xvSPt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# We can use `out_axes=None` in the `pmap` because the results will be the same\n", "# on every device. \n", @@ -1284,7 +1315,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1398,7 +1431,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -1414,7 +1449,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -1430,7 +1467,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -1458,7 +1497,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -1482,7 +1523,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -1557,7 +1600,7 @@ "id": "H8hKi0Aw-KVT" }, "source": [ - "간단한 확률적 행렬 인수 분해 모델을 사용하여 $W$에 대한 생성 모델을 정의할 수 있습니다. 잠재 $N \\times D$ 사용자 행렬 $U$ 및 잠재 $M \\times D$ 영화 행렬 $V$를 추정합니다. 이 행렬을 곱하면 시청 행렬 $W$에 대한 베르누이 로짓을 생성합니다. 또한 사용자 및 영화, $u$ and $v$에 대한 편향 벡터를 포함하겠습니다. $$ \\begin{align*} U &\\sim \\mathcal{N}(0, 1) \\quad u \\sim \\mathcal{N}(0, 1)\\ V &\\sim \\mathcal{N}(0, 1) \\quad v \\sim \\mathcal{N}(0, 1)\\ W_{ij} &\\sim \\textrm{Bernoulli}\\left(\\sigma\\left(\\left(UV^T\\right)_{ij} + u_i + v_j\\right)\\right) \\end{align*} $$" + "간단한 확률적 행렬 인수 분해 모델을 사용하여 $W$에 대한 생성 모델을 정의할 수 있습니다. 잠재 $N \\times D$ 사용자 행렬 $U$ 및 잠재 $M \\times D$ 영화 행렬 $V$를 추정합니다. 이 행렬을 곱하면 시청 행렬 $W$에 대한 베르누이 로짓을 생성합니다. 또한 사용자 및 영화, $u$ and $v$에 대한 편향 벡터를 포함하겠습니다. $$ \\begin{align*} U &\\sim \\mathcal{N}(0, 1) \\quad u \\sim \\mathcal{N}(0, 1)\\ V &\\sim \\mathcal{N}(0, 1) \\quad v \\sim \\mathcal{N}(0, 1)\\ W_{ij} &\\sim \\textrm{Bernoulli}\\left(\\sigma\\left(\\left(UV^T\\right)_{ij} + u_i + v_j\\right)\\right) \\end{align*} $$" ] }, { @@ -1575,7 +1618,9 @@ "metadata": { "id": "4SUlkEg__ElT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "sharded_watch_matrix = shard(watch_matrix)" ] @@ -1595,7 +1640,9 @@ "metadata": { "id": "XEPHnzdo-_G2" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def make_run(*,\n", " axis_name,\n", @@ -1753,7 +1800,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1819,7 +1868,9 @@ "metadata": { "id": "q-cc2vAfZYyz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@jax.jit\n", "def recommend(sample, user_id):\n", @@ -1845,7 +1896,9 @@ "metadata": { "id": "hfAjsSmueSZH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def get_recommendations(user_id): \n", " movie_ids = []\n", @@ -1924,7 +1977,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1966,7 +2021,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1994,7 +2051,9 @@ "metadata": { "accelerator": "TPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "Distributed_Inference_with_JAX.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/Gaussian_Process_Regression_In_TFP.ipynb b/site/ko/probability/examples/Gaussian_Process_Regression_In_TFP.ipynb index 9d86cc99e8..3812538216 100644 --- a/site/ko/probability/examples/Gaussian_Process_Regression_In_TFP.ipynb +++ b/site/ko/probability/examples/Gaussian_Process_Regression_In_TFP.ipynb @@ -18,7 +18,9 @@ "cellView": "form", "id": "S2AOrHzjK0_L" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -64,57 +66,7 @@ "id": "n4-qQf7qZLVI" }, "source": [ - "## 배경 설명\n", - "\n", - "$\\mathcal{X}$를 임의의 집합으로 둡니다. *가우시안 프로세스*(GP)는 $\\mathcal{X}$로 인덱싱한 확률 함수 모음으로, ${X_1, \\ldots, X_n} \\subset \\mathcal{X}$가 유한 부분 집합이면 한계 밀도 $p(X_1 = x_1, \\ldots, X_n = x_n)$는 다변량 가우시안입니다. 모든 가우시안 분포는 첫 번째와 두 번째 중심 모멘트(평균 및 공분산)로 완전히 지정되며 GP도 예외는 아닙니다. 평균 함수 $\\mu : \\mathcal{X} \\to \\mathbb{R}$ 및 공분산 함수 $k : \\mathcal{X} \\times \\mathcal{X} \\to \\mathbb{R}$로 GP를 완전히 지정할 수 있습니다. GP의 표현 능력의 대부분은 선택한 공분산 함수로 캡슐화됩니다. 다양한 이유로 공분산 함수를 *커널 함수*라고도 합니다. 대칭 양정치면 됩니다([Rasmussen & Williams의 4장](http://www.gaussianprocess.org/gpml/chapters/RW4.pdf) 참조). 아래에서는 ExponentiatedQuadratic 공분산 커널을 사용합니다. 형태는 다음과 같습니다.\n", - "\n", - "$$ k(x, x') := \\sigma^2 \\exp \\left( \\frac{|x - x'|^2}{\\lambda^2} \\right) $$\n", - "\n", - "여기서 $\\sigma^2$는 '진폭'이고 $\\lambda$는 *길이 척도* 입니다. 커널 매개변수는 최대 가능성 최적화 절차를 통해 선택할 수 있습니다.\n", - "\n", - "GP의 전체 샘플은 전체 공간 $\\mathcal{X}$에 대한 실수값 함수로 구성되며 실제로는 실현하기가 비현실적입니다. 종종 샘플을 관찰할 점집합을 선택하고 이들 지점에서 함수값을 추출합니다. 이는 적절한 유한 차원 다변량 가우시안에서 샘플링하여 달성됩니다.\n", - "\n", - "위의 정의에 따르면 모든 유한 차원 다변량 가우시안 분포도 가우시안 프로세스입니다. 일반적으로 GP를 참조할 때 인덱스 세트가 일부 $\\mathbb{R}^n$라는 것은 암시적이며 여기에서도 실제로 이러한 가정을 사용할 것입니다.\n", - "\n", - "머신러닝에서 가우시안 프로세스의 일반적인 적용은 가우시안 프로세스 회귀입니다. 이 아이디어는 유한수의 지점 ${x_1, \\ldots x_N}.$에서 함수의 노이즈가 있는 관측치 ${y_1, \\ldots, y_N}$를 고려하여 알려지지 않은 함수를 추정하는 것입니다. 다음의 생성 과정을 생각해봅니다.\n", - "\n", - "$$ \\begin{align} f \\sim : & \\textsf{GaussianProcess}\\left( \\text{mean_fn}=\\mu(x), \\text{covariance_fn}=k(x, x')\\right) \\ y_i \\sim : & \\textsf{Normal}\\left( \\text{loc}=f(x_i), \\text{scale}=\\sigma\\right), i = 1, \\ldots, N \\end{align} $$\n", - "\n", - "위에서 언급했듯이 샘플링된 함수는 무한수의 지점에서 값이 필요하므로 계산이 불가능합니다. 대신 다변량 가우시안의 유한 샘플을 고려합니다.\n", - "\n", - "$$ \\begin{gather} \\begin{bmatrix} f(x_1) \\ \\vdots \\ f(x_N) \\end{bmatrix} \\sim \\textsf{MultivariateNormal} \\left( : \\text{loc}= \\begin{bmatrix} \\mu(x_1) \\ \\vdots \\ \\mu(x_N) \\end{bmatrix} :,: \\text{scale}= \\begin{bmatrix} k(x_1, x_1) & \\cdots & k(x_1, x_N) \\ \\vdots & \\ddots & \\vdots \\ k(x_N, x_1) & \\cdots & k(x_N, x_N) \\ \\end{bmatrix}^{1/2} : \\right) \\end{gather} \\ y_i \\sim \\textsf{Normal} \\left( \\text{loc}=f(x_i), \\text{scale}=\\sigma \\right) $$\n", - "\n", - "공분산 행렬의 지수 $\\frac{1}{2}$에 유의하세요. 이는 콜레스키(Cholesky) 분해를 나타냅니다. MVN은 위치 스케일 패밀리 분포이므로 콜레스키 계산이 필요합니다. 불행히도 콜레스키 분해는 $O(N^3)$ 시간과 $O(N^2)$ 공간을 차지하기 때문에 계산 비용이 많이 듭니다. GP 문헌의 대부분은 이 겉보기에 무해한 작은 지수를 다루는 데 초점을 맞추고 있습니다.\n", - "\n", - "사전 확률 평균 함수를 상수(종종 0)로 사용하는 것이 일반적입니다. 일부 표기법도 편리합니다. 샘플링된 함수값의 유한 벡터에 대해 $\\mathbf{f}$를 종종 작성합니다. $k$를 입력 쌍에 적용한 결과 공분산 행렬에는 여러 가지 흥미로운 표기법이 사용됩니다. [(Quiñonero-Candela, 2005)](http://www.jmlr.org/papers/volume6/quinonero-candela05a/quinonero-candela05a.pdf)에 이어 행렬의 구성 요소가 특정 입력 지점에서 함수값의 공분산이라는 점에 주목합니다. 따라서 공분산 행렬을 $K_{AB}$로 표시할 수 있습니다. 여기서 $A$ 및 $B$는 주어진 행렬 차원에 따른 함수값 모음의 일부 지표입니다.\n", - "\n", - "예를 들어, 잠재 함수값 $\\mathbf{f}$가 포함된 관측 데이터 $(\\mathbf{x}, \\mathbf{y})$가 주어지면 다음과 같이 작성할 수 있습니다.\n", - "\n", - "$$ K_{\\mathbf{f},\\mathbf{f}} = \\begin{bmatrix} k(x_1, x_1) & \\cdots & k(x_1, x_N) \\ \\vdots & \\ddots & \\vdots \\ k(x_N, x_1) & \\cdots & k(x_N, x_N) \\ \\end{bmatrix} $$\n", - "\n", - "이와 유사하게, 다음과 같이 입력 집합을 혼합할 수 있습니다.\n", - "\n", - "$$ K_{\\mathbf{f},} = \\begin{bmatrix} k(x_1, x^_1) & \\cdots & k(x_1, x^_T) \\ \\vdots & \\ddots & \\vdots \\ k(x_N, x^_1) & \\cdots & k(x_N, x^*_T) \\ \\end{bmatrix} $$\n", - "\n", - "$N$ 훈련 입력과 $T$ 테스트 입력이 있다고 가정합니다. 위의 생성 프로세스는 다음과 같이 간결하게 작성될 수 있습니다.\n", - "\n", - "$$ \\begin{align} \\mathbf{f} \\sim : & \\textsf{MultivariateNormal} \\left( \\text{loc}=\\mathbf{0}, \\text{scale}=K_{\\mathbf{f},\\mathbf{f}}^{1/2} \\right) \\ y_i \\sim : & \\textsf{Normal} \\left( \\text{loc}=f_i, \\text{scale}=\\sigma \\right), i = 1, \\ldots, N \\end{align} $$\n", - "\n", - "첫 번째 줄의 샘플링 연산은 *위의 GP 추출 표기법에서와 같이 전체 함수가 아닌* 다변량 가우시안에서 유한한 $N$ 함수값 집합을 생성합니다. 두 번째 줄은 고정된 관측 노이즈 $\\sigma^2$를 사용하여 다양한 함수값을 중심으로 하는 *일변량* 가우시안에서 $N$ 추출 모음을 설명합니다.\n", - "\n", - "위의 생성 모델을 사용하면 사후 확률 추론 문제를 고려할 수 있습니다. 이렇게 하면 위의 프로세스에서 관찰된 노이즈가 있는 데이터를 조건으로 새로운 테스트 포인트 집합에서 함수값에 대한 사후 확률 분포가 생성됩니다.\n", - "\n", - "위의 표기법을 사용하면 다음과 같이 해당 입력 및 훈련 데이터를 조건으로 미래의 관찰(노이즈가 있는)에 대한 사후 확률 예측 분포를 다음과 같이 간결하게 작성할 수 있습니다(자세한 내용은 [Rasmussen & Williams](http://www.gaussianprocess.org/gpml/)의 §2.2 참조).\n", - "\n", - "$$ \\mathbf{y}^* \\mid \\mathbf{x}^, \\mathbf{x}, \\mathbf{y} \\sim \\textsf{Normal} \\left( \\text{loc}=\\mathbf{\\mu}^, \\text{scale}=(\\Sigma^*)^{1/2} \\right), $$\n", - "\n", - "여기서\n", - "\n", - "$$ \\mathbf{\\mu}^* = K_{*,\\mathbf{f}}\\left(K_{\\mathbf{f},\\mathbf{f}} + \\sigma^2 I \\right)^{-1} \\mathbf{y} $$\n", - "\n", - "및\n", - "\n", - "$$ \\Sigma^* = K_{,} - K_{,\\mathbf{f}} \\left(K_{\\mathbf{f},\\mathbf{f}} + \\sigma^2 I \\right)^{-1} K_{\\mathbf{f},} $$" + "$$ \\begin{align} \\mathbf{f} \\sim : & \\textsf{MultivariateNormal} \\left( \\text{loc}=\\mathbf{0}, \\text{scale}=K_{\\mathbf{f},\\mathbf{f}}^{1/2} \\right) \\ y_i \\sim : & \\textsf{Normal} \\left( \\text{loc}=f_i, \\text{scale}=\\sigma \\right), i = 1, \\ldots, N \\end{align} $$" ] }, { @@ -179,7 +131,9 @@ "metadata": { "id": "Qrys68xzZE-c" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def sinusoid(x):\n", " return np.sin(3 * np.pi * x[..., 0])\n", @@ -206,7 +160,9 @@ "metadata": { "id": "Tem9p8rUlqQR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Generate training data with a known noise level (we'll later try to recover\n", "# this value from the data).\n", @@ -231,7 +187,9 @@ "metadata": { "id": "i63dMy4FbnTd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def build_gp(amplitude, length_scale, observation_noise_variance):\n", " \"\"\"Defines the conditional dist. of GP outputs, given kernel parameters.\"\"\"\n", @@ -324,7 +282,9 @@ "metadata": { "id": "ByXndE3pkA4x" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Create the trainable model parameters, which we'll subsequently optimize.\n", "# Note that we constrain them to be strictly positive.\n", @@ -370,7 +330,9 @@ "metadata": { "id": "yjO8TWIXvFr5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def target_log_prob(amplitude, length_scale, observation_noise_variance):\n", " return gp_joint_model.log_prob({\n", @@ -440,7 +402,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -459,7 +422,9 @@ "metadata": { "id": "1DOkwqQEsXVs" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Having trained the model, we'd like to sample from the posterior conditioned\n", "# on observations. We'd like the samples to be at points other than the training\n", @@ -499,7 +464,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -554,7 +520,9 @@ "metadata": { "id": "t1sZUooao1D0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "num_results = 100\n", "num_burnin_steps = 50\n", @@ -628,7 +596,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -658,7 +627,9 @@ "metadata": { "id": "XzZmJc7yrNGJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# The sampled hyperparams have a leading batch dimension, `[num_results, ...]`,\n", "# so they construct a *batch* of kernels.\n", @@ -699,7 +670,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -733,7 +705,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "Gaussian_Process_Regression_In_TFP.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/HLM_TFP_R_Stan.ipynb b/site/ko/probability/examples/HLM_TFP_R_Stan.ipynb index f5f9818f65..187f1f6271 100644 --- a/site/ko/probability/examples/HLM_TFP_R_Stan.ipynb +++ b/site/ko/probability/examples/HLM_TFP_R_Stan.ipynb @@ -18,7 +18,9 @@ "cellView": "form", "id": "li5wNGR6naj0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -75,7 +77,9 @@ "metadata": { "id": "0axKjgZvRtL9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%matplotlib inline\n", "\n", @@ -120,9 +124,7 @@ "id": "fAD8am2a4TaY" }, "source": [ - "다음 생성 모델을 가정합니다.\n", - "\n", - "$$\\begin{align*} \\text{for } & c=1\\ldots \\text{NumCounties}:\\ & \\beta_c \\sim \\text{Normal}\\left(\\text{loc}=0, \\text{scale}=\\sigma_C \\right) \\ \\text{for } & i=1\\ldots \\text{NumSamples}:\\ &\\eta_i = \\underbrace{\\omega_0 + \\omega_1 \\text{Floor}i}\\text{fixed effects} + \\underbrace{\\beta_{ \\text{County}i} \\log( \\text{UraniumPPM}{\\text{County}i}))}\\text{random effects} \\ &\\log(\\text{Radon}_i) \\sim \\text{Normal}(\\text{loc}=\\eta_i , \\text{scale}=\\sigma_N) \\end{align*}$$\n" + "$$\\begin{align*} \\text{for } & c=1\\ldots \\text{NumCounties}:\\ & \\beta_c \\sim \\text{Normal}\\left(\\text{loc}=0, \\text{scale}=\\sigma_C \\right) \\ \\text{for } & i=1\\ldots \\text{NumSamples}:\\ &\\eta_i = \\underbrace{\\omega_0 + \\omega_1 \\text{Floor}i}\\text{fixed effects} + \\underbrace{\\beta_{ \\text{County}i} \\log( \\text{UraniumPPM}{\\text{County}i}))}\\text{random effects} \\ &\\log(\\text{Radon}_i) \\sim \\text{Normal}(\\text{loc}=\\eta_i , \\text{scale}=\\sigma_N) \\end{align*}$$\n" ] }, { @@ -180,7 +182,9 @@ "metadata": { "id": "4LjOBqLDV0IQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def load_and_preprocess_radon_dataset(state='MN'):\n", " \"\"\"Preprocess Radon dataset as done in \"Bayesian Data Analysis\" book.\n", @@ -223,7 +227,9 @@ "metadata": { "id": "hJE3-eC0I-Lm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "radon, county_name = load_and_preprocess_radon_dataset()" ] @@ -234,7 +240,9 @@ "metadata": { "id": "nV-IAEW2FIqX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# We'll use the following directory to store our preprocessed dataset.\n", "CACHE_DIR = os.path.join(os.sep, 'tmp', 'radon')\n", @@ -349,7 +357,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -373,7 +383,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -403,7 +415,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -467,7 +481,9 @@ "metadata": { "id": "ZBqZjyHdsPIB" }, - "outputs": [], + "outputs": [ + + ], "source": [ "suppressMessages({\n", " library('bayesplot')\n", @@ -532,7 +548,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -547,7 +565,9 @@ "metadata": { "id": "uRqAdn3WsoN-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# https://github.com/stan-dev/example-models/wiki/ARM-Models-Sorted-by-Chapter\n", "radon.model <- lmer(log_radon ~ 1 + floor + (0 + log_uranium_ppm | county), data = data)" @@ -591,7 +611,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -615,7 +637,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" }, @@ -624,7 +648,9 @@ "image/png": "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" }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -639,7 +665,9 @@ "metadata": { "id": "nCsGcLnP40Lg" }, - "outputs": [], + "outputs": [ + + ], "source": [ "write.csv(as.data.frame(ranef(radon.model, condVar = TRUE)), '/tmp/radon/lme4_fit.csv')" ] @@ -811,7 +839,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -835,7 +865,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" }, @@ -844,7 +876,9 @@ "image/png": "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" }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -870,7 +904,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" }, @@ -879,7 +915,9 @@ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeAAAAHgCAIAAADytinCAAAgAElEQVR4nOydd3wUVdfHf1O2b5LdTe+kEZIAoZcgHQUFqSJFBfXRB1Ts5cGK+vj6iCIWUBQVUBEbAmIBEYHQAyGEHkjvPZtke5t5/1gSQrKpJNkk3O8ffmRy594zZc/cOXPu71A8z4NAIBAIXQ/a2QYQCAQCwTHEQRMIBEIXhThoAoFA6KIQB00gEAhdFOKgCQQCoYvS2Q46KSnpiSeeWLVq1b333rtnzx77xvz8/CVLlnz66adPP/10SkqKfeOePXvmz5//xRdfpKamarXarVu3PvbYY51srUNOnDhx5syZzh/XYrF88sknQ4cOLS4ubpUZN2Jw5x/skSNHHnjggWeffbYzByUQuiZsZw7G8/zMmTOPHj0aEBBQWFjYr1+/4uJihmGWLl362GOPTZkyJTc3d9SoURcvXmQY5t577z158mRwcPAPP/wQFRVVVlY2bty4DjJs//79KpUqNja2JY03bNigUCha2LgdEQgEcXFxy5Yta4kZdY/oRgxudt9WnbqWMHz48HfeeYdlO/XOJBC6KHwnotVqGYZJSkrieV6v1wcEBFgslqNHj8rlcovFYm8zbNiwdevW2Tfat+zatYvn+cWLF5eWlnaEVVeuXFGpVImJiR3RefuSl5cHoKioqOlmnXZEHTTQ0qVLH3roofbtk0DojnTqPEUmk02bNu3ee+/dtWvXN99888Ybb7Ase+LEiYiIiNoZU1RU1L59+/r162d/eFAUlZ+fD0CtVnt4eDTW87Zt2z777LPZs2fv3LkzISFh/vz5H330Ecuyp0+f3rp1q7e398GDBxcvXnznnXcCePnll0NDQ1NSUqKioh588MFz585VVFRs2rQpNzd35syZe/bsOXLkyMWLFwGsX78+Pj7+888/v/vuu9etW9e7d+8nn3zys88+8/b2fvvttwE07H/Hjh1122/evLlpI3///fd67esZoFQqL126tGHDBh8fn8zMTHtXJ0+erGtGcnLy9u3bPTw84uPjX3311fT09Noj8vf3r23522+/zZo1a+HChV999ZXNZlu4cOGwYcMGDRpUb7hag+uOsm/fvtWrV8+ZM+f48ePbtm175plnXnzxxVadunnz5jUcffny5atWrbJarQaDoby8fM2aNRRF1b2y9S5WO9yFBEI3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" }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -908,7 +946,9 @@ "metadata": { "id": "h9HtqG65x1a6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Write the posterior samples (4000 for each variable) to a CSV.\n", "write.csv(tidy(as.matrix(fit)), \"/tmp/radon/stan_fit.csv\")" @@ -929,7 +969,9 @@ "metadata": { "id": "wwhJD-t86Dnq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "with tf.gfile.Open('/tmp/radon/lme4_fit.csv', 'r') as f:\n", " lme4_fit = pd.read_csv(f, index_col=0)" @@ -1026,7 +1068,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1080,7 +1124,9 @@ "metadata": { "id": "S8TQNRaKFecg" }, - "outputs": [], + "outputs": [ + + ], "source": [ "with tf.Session() as sess:\n", " lme4_dist = tfp.distributions.Independent(\n", @@ -1106,7 +1152,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1130,7 +1178,9 @@ "metadata": { "id": "YxXhcMfG3uoX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "with tf.gfile.Open('/tmp/radon/stan_fit.csv', 'r') as f:\n", " samples = pd.read_csv(f, index_col=0)" @@ -1382,7 +1432,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1448,7 +1500,9 @@ "metadata": { "id": "TOh_69los9gK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Handy snippet to reset the global graph and global session.\n", "with warnings.catch_warnings():\n", @@ -1497,7 +1551,9 @@ "metadata": { "id": "NzpFXkvOXMav" }, - "outputs": [], + "outputs": [ + + ], "source": [ "inv_scale_transform = lambda y: np.log(y) # Not using TF here.\n", "fwd_scale_transform = tf.exp" @@ -1520,7 +1576,9 @@ "metadata": { "id": "JnPFL-pKXMRl" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def _make_weights_prior(num_counties, dtype):\n", " \"\"\"Returns a `len(log_uranium_ppm)` batch of univariate Normal.\"\"\"\n", @@ -1555,7 +1613,9 @@ "metadata": { "id": "wNQTcHcQXMIp" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def _make_log_radon_likelihood(random_effect_weights, floor, county,\n", " log_county_uranium_ppm, init_log_radon_stddev):\n", @@ -1594,7 +1654,9 @@ "metadata": { "id": "_UBayNK538JD" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def joint_log_prob(random_effect_weights, log_radon, floor, county,\n", " log_county_uranium_ppm, dtype):\n", @@ -1625,13 +1687,7 @@ "id": "h7Xr0X4Qbe9C" }, "source": [ - "선형 혼합 효과 회귀 모델에 피팅하기 위해 기대값 최대화 알고리즘(SAEM)의 확률적 근사 버전을 사용합니다. 기본적인 개념은 예상되는 결합 로그-밀도를 근사하기 위해 사후 샘플을 사용하는 것입니다(E-단계). 그런 다음 이 계산을 최대화하는 매개변수를 찾습니다(M-단계). 좀 더 구체적으로, 고정 소수점 반복은 다음과 같이 주어집니다.\n", - "\n", - "$$\\begin{align*} \\text{E}[ \\log p(x, Z | \\theta) | \\theta_0] &\\approx \\frac{1}{M} \\sum_{m=1}^M \\log p(x, z_m | \\theta), \\quad Z_m\\sim p(Z | x, \\theta_0) && \\text{E-step}\\ &=: Q_M(\\theta, \\theta_0) \\ \\theta_0 &= \\theta_0 - \\eta \\left.\\nabla_\\theta Q_M(\\theta, \\theta_0)\\right|_{\\theta=\\theta_0} && \\text{M-step} \\end{align*}$$\n", - "\n", - "여기서 $x$는 증거를 나타내고, $Z$는 주변화해야 하는 일부 잠재 변수를 나타내며, $\\theta,\\theta_0$은 가능한 매개변수화를 나타냅니다.\n", - "\n", - "더 자세한 설명은 [Bernard Delyon, Marc Lavielle, Eric, Moulines(Ann. Statist., 1999)의 *EM 알고리즘의 확률적 근사 버전의 수렴*](https://projecteuclid.org/euclid.aos/1018031103)을 참조하세요." + "$$\\begin{align*} \\text{E}[ \\log p(x, Z | \\theta) | \\theta_0] &\\approx \\frac{1}{M} \\sum_{m=1}^M \\log p(x, z_m | \\theta), \\quad Z_m\\sim p(Z | x, \\theta_0) && \\text{E-step}\\ &=: Q_M(\\theta, \\theta_0) \\ \\theta_0 &= \\theta_0 - \\eta \\left.\\nabla_\\theta Q_M(\\theta, \\theta_0)\\right|_{\\theta=\\theta_0} && \\text{M-step} \\end{align*}$$" ] }, { @@ -1658,7 +1714,9 @@ "metadata": { "id": "FSwVJAkNEx6Y" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Specify unnormalized posterior.\n", "\n", @@ -1701,7 +1759,9 @@ "metadata": { "id": "WnZ_KMP0E0ot" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Set-up E-step.\n", "\n", @@ -1743,7 +1803,9 @@ "metadata": { "id": "wceMwnGwvUfF" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Set-up M-step.\n", "\n", @@ -1776,7 +1838,9 @@ "metadata": { "id": "PakV59O8E3m5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Initialize all variables.\n", "\n", @@ -1789,7 +1853,9 @@ "metadata": { "id": "FziBCkW_NXFF" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Grab variable handles for diagnostic purposes.\n", "\n", @@ -1828,7 +1894,9 @@ "metadata": { "id": "Cy36-LMMNbTc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "init_op.run()\n", "w_ = np.zeros([len(log_county_uranium_ppm)], dtype=dtype)" @@ -2017,7 +2085,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -2085,7 +2155,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -2183,7 +2255,7 @@ "id": "qt8a50GYSqbe" }, "source": [ - "$$\\begin{align*} \\text{for } & c=1\\ldots \\text{NumCounties}:\\ & \\beta_c \\sim \\text{MultivariateNormal}\\left(\\text{loc}=\\left[ \\begin{array}{c} 0 \\ 0 \\end{array}\\right] , \\text{scale}=\\left[\\begin{array}{cc} \\sigma_{11} & 0 \\ \\sigma_{12} & \\sigma_{22} \\end{array}\\right] \\right) \\ \\text{for } & i=1\\ldots \\text{NumSamples}:\\ & c_i := \\text{County}i \\ &\\eta_i = \\underbrace{\\omega_0 + \\omega_1\\text{Floor}i \\vphantom{\\log( \\text{CountyUraniumPPM}{c_i}))}}{\\text{fixed effects}} + \\underbrace{\\beta_{c_i,0} + \\beta_{c_i,1}\\log( \\text{CountyUraniumPPM}{c_i}))}{\\text{random effects}} \\ &\\log(\\text{Radon}_i) \\sim \\text{Normal}(\\text{loc}=\\eta_i , \\text{scale}=\\sigma) \\end{align*}$$\n" + "$$\\begin{align*} \\text{for } & c=1\\ldots \\text{NumCounties}:\\ & \\beta_c \\sim \\text{MultivariateNormal}\\left(\\text{loc}=\\left[ \\begin{array}{c} 0 \\ 0 \\end{array}\\right] , \\text{scale}=\\left[\\begin{array}{cc} \\sigma_{11} & 0 \\ \\sigma_{12} & \\sigma_{22} \\end{array}\\right] \\right) \\ \\text{for } & i=1\\ldots \\text{NumSamples}:\\ & c_i := \\text{County}i \\ &\\eta_i = \\underbrace{\\omega_0 + \\omega_1\\text{Floor}i \\vphantom{\\log( \\text{CountyUraniumPPM}{c_i}))}}{\\text{fixed effects}} + \\underbrace{\\beta_{c_i,0} + \\beta_{c_i,1}\\log( \\text{CountyUraniumPPM}{c_i}))}{\\text{random effects}} \\ &\\log(\\text{Radon}_i) \\sim \\text{Normal}(\\text{loc}=\\eta_i , \\text{scale}=\\sigma) \\end{align*}$$\n" ] }, { @@ -2284,7 +2356,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "HLM_TFP_R_Stan.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/JointDistributionAutoBatched_A_Gentle_Tutorial.ipynb b/site/ko/probability/examples/JointDistributionAutoBatched_A_Gentle_Tutorial.ipynb index 6f90cb4a07..c0aeb0bb33 100644 --- a/site/ko/probability/examples/JointDistributionAutoBatched_A_Gentle_Tutorial.ipynb +++ b/site/ko/probability/examples/JointDistributionAutoBatched_A_Gentle_Tutorial.ipynb @@ -27,7 +27,9 @@ "cellView": "form", "id": "CpDUTVKYTowI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -91,7 +93,9 @@ "metadata": { "id": "coUnDhkpT5_6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Import and set ups{ display-mode: \"form\" }\n", "\n", @@ -151,7 +155,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -210,7 +216,9 @@ "metadata": { "id": "kY501q-QVR9g" }, - "outputs": [], + "outputs": [ + + ], "source": [ "jds = tfd.JointDistributionSequential([\n", " tfd.Normal(loc=0., scale=1.), # m\n", @@ -256,7 +264,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -292,7 +302,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -403,7 +415,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -438,7 +452,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -475,7 +491,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -500,7 +518,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -569,7 +589,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -602,7 +624,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -636,7 +660,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -669,7 +695,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -702,7 +730,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -833,7 +863,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -857,7 +889,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -936,7 +970,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -974,7 +1010,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1007,7 +1045,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1047,7 +1087,9 @@ "metadata": { "id": "LZtVljb0fRx2" }, - "outputs": [], + "outputs": [ + + ], "source": [ "jds_ab = tfd.JointDistributionSequentialAutoBatched([\n", " tfd.Normal(loc=0., scale=1.), # m\n", @@ -1071,7 +1113,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1100,7 +1144,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1130,7 +1176,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1175,7 +1223,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1199,7 +1249,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1223,7 +1275,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1247,7 +1301,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1290,7 +1346,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1444,7 +1502,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1480,7 +1540,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1567,7 +1629,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "JointDistributionAutoBatched_A_Gentle_Tutorial.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/Linear_Mixed_Effects_Model_Variational_Inference.ipynb b/site/ko/probability/examples/Linear_Mixed_Effects_Model_Variational_Inference.ipynb index ee9afcf0fc..48b43de8b8 100644 --- a/site/ko/probability/examples/Linear_Mixed_Effects_Model_Variational_Inference.ipynb +++ b/site/ko/probability/examples/Linear_Mixed_Effects_Model_Variational_Inference.ipynb @@ -18,7 +18,9 @@ "cellView": "form", "id": "3jTEqPzFiHQ0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -55,7 +57,9 @@ "metadata": { "id": "yPby2hWGS651" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Install { display-mode: \"form\" }\n", "TF_Installation = 'System' #@param ['TF Nightly', 'TF Stable', 'System']\n", @@ -79,7 +83,9 @@ "metadata": { "id": "ZKFMx9zmTBbd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Install { display-mode: \"form\" }\n", "TFP_Installation = \"System\" #@param [\"Nightly\", \"Stable\", \"System\"]\n", @@ -139,9 +145,7 @@ "id": "H-B38entvltq" }, "source": [ - "생성 프로세스로서 일반화된 선형 혼합 효과 모델(GLMM)은 다음과 같은 특징이 있습니다.\n", - "\n", - "$$ \\begin{align} \\text{for } & r = 1\\ldots R: \\hspace{2.45cm}\\text{# for each random-effect group}\\ &\\begin{aligned} \\text{for } &c = 1\\ldots |C_r|: \\hspace{1.3cm}\\text{# for each category (\"level\") of group $r$}\\ &\\begin{aligned} \\beta_{rc} &\\sim \\text{MultivariateNormal}(\\text{loc}=0_{D_r}, \\text{scale}=\\Sigma_r^{1/2}) \\end{aligned} \\end{aligned}\\ \\text{for } & i = 1 \\ldots N: \\hspace{2.45cm}\\text{# for each sample}\\ &\\begin{aligned} &\\eta_i = \\underbrace{\\vphantom{\\sum_{r=1}^R}x_i^\\top\\omega}\\text{fixed-effects} + \\underbrace{\\sum{r=1}^R z_{r,i}^\\top \\beta_{r,C_r(i) }}\\text{random-effects} \\ &Y_i|x_i,\\omega,{z{r,i} , \\beta_r}_{r=1}^R \\sim \\text{Distribution}(\\text{mean}= g^{-1}(\\eta_i)) \\end{aligned} \\end{align} $$" + "$$ \\begin{align} \\text{for } & r = 1\\ldots R: \\hspace{2.45cm}\\text{# for each random-effect group}\\ &\\begin{aligned} \\text{for } &c = 1\\ldots |C_r|: \\hspace{1.3cm}\\text{# for each category (\"level\") of group $r$}\\ &\\begin{aligned} \\beta_{rc} &\\sim \\text{MultivariateNormal}(\\text{loc}=0_{D_r}, \\text{scale}=\\Sigma_r^{1/2}) \\end{aligned} \\end{aligned}\\ \\text{for } & i = 1 \\ldots N: \\hspace{2.45cm}\\text{# for each sample}\\ &\\begin{aligned} &\\eta_i = \\underbrace{\\vphantom{\\sum_{r=1}^R}x_i^\\top\\omega}\\text{fixed-effects} + \\underbrace{\\sum{r=1}^R z_{r,i}^\\top \\beta_{r,C_r(i) }}\\text{random-effects} \\ &Y_i|x_i,\\omega,{z{r,i} , \\beta_r}_{r=1}^R \\sim \\text{Distribution}(\\text{mean}= g^{-1}(\\eta_i)) \\end{aligned} \\end{align} $$" ] }, { @@ -150,8 +154,6 @@ "id": "3gZmFJXAHwfy" }, "source": [ - "여기서\n", - "\n", "$$ \\begin{align} R &= \\text{number of random-effect groups}\\ |C_r| &= \\text{number of categories for group $r$}\\ N &= \\text{number of training samples}\\ x_i,\\omega &\\in \\mathbb{R}^{D_0}\\ D_0 &= \\text{number of fixed-effects}\\ C_r(i) &= \\text{category (under group $r$) of the $i$th sample}\\ z_{r,i} &\\in \\mathbb{R}^{D_r}\\ D_r &= \\text{number of random-effects associated with group $r$}\\ \\Sigma_{r} &\\in {S\\in\\mathbb{R}^{D_r \\times D_r} : S \\succ 0 }\\ \\eta_i\\mapsto g^{-1}(\\eta_i) &= \\mu_i, \\text{inverse link function}\\ \\text{Distribution} &=\\text{some distribution parameterizable solely by its mean} \\end{align} $$" ] }, @@ -241,7 +243,9 @@ "metadata": { "id": "_zr34b0IBqgY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%matplotlib inline\n", "%config InlineBackend.figure_format = 'retina'\n", @@ -390,7 +394,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -478,7 +484,9 @@ "height": 296, "width": 729 }, - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -501,18 +509,7 @@ "id": "8MqU1SefgRy5" }, "source": [ - "지리에 관한 내용을 포함하여 모델을 좀 더 정교하게 만드는 것이 아마도 더 좋을 것입니다. 라돈은 땅에 존재할 수 있는 우라늄의 붕괴 사슬의 일부이므로 지리를 설명하는 것이 중요합니다.\n", - "\n", - "$$ \\mathbb{E}[\\log(\\text{radon}_j)] = c + \\text{floor_effect}_j + \\text{county_effect}_j $$\n", - "\n", - "다시 하면, 의사 코드에서 다음과 같습니다.\n", - "\n", - "```\n", - "def estimate_log_radon(floor, county):\n", - " return intercept + floor_effect[floor] + county_effect[county]\n", - "```\n", - "\n", - "카운티별 가중치를 제외하고는 이전과 동일합니다." + "$$ \\mathbb{E}[\\log(\\text{radon}_j)] = c + \\text{floor_effect}_j + \\text{county_effect}_j $$" ] }, { @@ -545,7 +542,9 @@ "height": 421, "width": 1291 }, - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -564,22 +563,7 @@ "id": "VxtwlODcdJZe" }, "source": [ - "이 모델을 맞춤 조정하면 `county_effect` 벡터는 훈련 샘플이 거의 없는 카운티에 대한 결과를 기억하게 될 것입니다. 아마도 과대적합이 발생하여 일반화가 불량할 수 있습니다.\n", - "\n", - "GLMM은 위의 두 GLM에 대해 적절한 타협점을 제공합니다. 다음과 같이 맞춤 조정하는 것을 고려할 수 있습니다.\n", - "\n", - "$$ \\log(\\text{radon}_j) \\sim c + \\text{floor_effect}_j + \\mathcal{N}(\\text{county_effect}_j, \\text{county_scale}) $$\n", - "\n", - "이 모델은 첫 번째 모델과 같지만, 가능성이 정규 분포가 되도록 고정했으며 단일 변수 `county_scale`을 통해 모든 카운티에서 분산을 공유합니다. 의사 코드는 다음과 같습니다.\n", - "\n", - "```\n", - "def estimate_log_radon(floor, county):\n", - " county_mean = county_effect[county]\n", - " random_effect = np.random.normal() * county_scale + county_mean\n", - " return intercept + floor_effect[floor] + random_effect\n", - "```\n", - "\n", - "관측된 데이터로 `county_scale`, `county_mean` 및 `random_effect`에 대한 결합 분포를 추론합니다. 글로벌 `county_scale`을 사용하면 카운티 간에 통계적 강도를 공유할 수 있습니다. 관측치가 많은 경우 관측치가 거의 없는 카운티 분산에 도움이 됩니다. 또한 더 많은 데이터를 수집하면 이 모델은 scale 변수가 풀링하지 않는 모델로 수렴됩니다. 이 데이터세트를 사용하더라도 두 모델 중 하나를 사용하여 관측치가 가장 많은 카운티에 대한 유사한 결론에 도달하게 됩니다." + "$$ \\log(\\text{radon}_j) \\sim c + \\text{floor_effect}_j + \\mathcal{N}(\\text{county_effect}_j, \\text{county_scale}) $$" ] }, { @@ -606,7 +590,9 @@ "metadata": { "id": "AFFj4KrwfPMg" }, - "outputs": [], + "outputs": [ + + ], "source": [ "features = df[['county_code', 'floor']].astype(int)\n", "labels = df[['log_radon']].astype(np.float32).values.flatten()" @@ -627,7 +613,9 @@ "metadata": { "id": "ujtDCBCcCu1q" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def make_joint_distribution_coroutine(floor, county, n_counties, n_floors):\n", "\n", @@ -683,7 +671,9 @@ "metadata": { "id": "Ov8PwoebKn2T" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Initialize locations and scales randomly with `tf.Variable`s and \n", "# `tfp.util.TransformedVariable`s.\n", @@ -744,7 +734,9 @@ "metadata": { "id": "Ow-XvCiJczNr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "optimizer = tf.optimizers.Adam(learning_rate=1e-2)\n", "\n", @@ -804,7 +796,9 @@ "height": 228, "width": 628 }, - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -846,7 +840,9 @@ "height": 418, "width": 1185 }, - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -905,7 +901,9 @@ "height": 459, "width": 632 }, - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -947,7 +945,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -962,7 +962,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -977,7 +979,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -992,7 +996,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -1007,7 +1013,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -1022,7 +1030,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -1037,7 +1047,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -1052,7 +1064,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1153,7 +1167,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "Linear_Mixed_Effects_Model_Variational_Inference.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/Linear_Mixed_Effects_Models.ipynb b/site/ko/probability/examples/Linear_Mixed_Effects_Models.ipynb index 1e49b55372..116e7cb57e 100644 --- a/site/ko/probability/examples/Linear_Mixed_Effects_Models.ipynb +++ b/site/ko/probability/examples/Linear_Mixed_Effects_Models.ipynb @@ -18,7 +18,9 @@ "cellView": "form", "id": "G5eriUZ9g1Ia" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -75,7 +77,9 @@ "metadata": { "id": "coUnDhkpT5_6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Import and set ups{ display-mode: \"form\" }\n", "\n", @@ -169,7 +173,9 @@ "metadata": { "id": "lZ8OfS3cDMeG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def load_insteval():\n", " \"\"\"Loads the InstEval data set.\n", @@ -395,7 +401,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -432,7 +439,9 @@ "metadata": { "id": "NzfVQJN9B7VQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "get_value = lambda dataframe, key, dtype: dataframe[key].values.astype(dtype)\n", "features_train = {\n", @@ -493,9 +502,11 @@ "\n", "이를 캡처하기 위해 $N\\times D$ 특성 $\\mathbf{X}$ 및 $N$ 레이블 $\\mathbf{y}$의 데이터세트에 대해 선형 회귀가 모델을 가정한다는 점을 기억하세요.\n", "\n", - "```\n", - "$$ \\begin{equation*} \\mathbf{y} = \\mathbf{X}\\beta + \\alpha + \\epsilon, \\end{equation*} $$\n", - "```\n", + "$$\n", + "\\begin{equation*}\n", + "\\mathbf{y} = \\mathbf{X}\\beta + \\alpha + \\epsilon,\n", + "\\end{equation*}\n", + "$$\n", "\n", "여기에 기울기 벡터 $\\beta\\in\\mathbb{R}^D$, 절편 $\\alpha\\in\\mathbb{R}$와 무작위 노이즈 $\\epsilon\\sim\\text{Normal}(\\mathbf{0}, \\mathbf{I})$가 있습니다. $\\beta$와 $\\alpha$는 '고정 효과'라고 합니다. 이들은 데이터 포인트 $(x, y)$ 전체에 걸쳐 일정하게 유지되는 효과입니다. 등가식의 가능성 공식은 $\\mathbf{y} \\sim \\text{Normal}(\\mathbf{X}\\beta + \\alpha, \\mathbf{I})$입니다. 이 가능성은 데이터에 맞춤 조정된 $\\beta$와 $\\alpha$의 포인트 추정치를 찾기 위해 추론하는 동안 최대화됩니다.\n", "\n", @@ -541,7 +552,9 @@ "metadata": { "id": "GS7SjqREp9wC" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class LinearMixedEffectModel(tf.Module):\n", " def __init__(self):\n", @@ -611,7 +624,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -647,7 +661,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -682,7 +697,9 @@ "metadata": { "id": "U1Ro35iA7UPG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "target_log_prob_fn = lambda *x: lmm_train.log_prob(x + (labels_train,))\n", "trainable_variables = lmm_train.trainable_variables\n", @@ -703,7 +720,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -718,7 +736,9 @@ "metadata": { "id": "F7uOcwQFB7Vb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Set up E-step (MCMC).\n", "hmc = tfp.mcmc.HamiltonianMonteCarlo(\n", @@ -761,7 +781,9 @@ "metadata": { "id": "XwZMt2uqVDzh" }, - "outputs": [], + "outputs": [ + + ], "source": [ "num_warmup_iters = 1000\n", "num_iters = 1500\n", @@ -835,7 +857,9 @@ "metadata": { "id": "9WmwCZNQWqh7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function(autograph=False, jit_compile=True)\n", "def run_k_e_steps(k, current_state, kernel_results):\n", @@ -947,7 +971,9 @@ "metadata": { "id": "p4vreJekB7Vf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "lmm_test = lmm_jointdist(features_test)\n", "\n", diff --git a/site/ko/probability/examples/Modeling_with_JointDistribution.ipynb b/site/ko/probability/examples/Modeling_with_JointDistribution.ipynb index 8c72d7041e..de833357a6 100644 --- a/site/ko/probability/examples/Modeling_with_JointDistribution.ipynb +++ b/site/ko/probability/examples/Modeling_with_JointDistribution.ipynb @@ -18,7 +18,9 @@ "cellView": "form", "id": "CpDUTVKYTowI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -73,7 +75,9 @@ "metadata": { "id": "x5d1QObzCrlR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# We will be using ArviZ, a multi-backend Bayesian diagnosis and plotting library\n", "!pip3 install -q git+git://github.com/arviz-devs/arviz.git" @@ -85,7 +89,9 @@ "metadata": { "id": "coUnDhkpT5_6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Import and set ups{ display-mode: \"form\" }\n", "\n", @@ -234,7 +240,9 @@ "height": 565, "width": 567 }, - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -300,7 +308,9 @@ "metadata": { "id": "YLlvnGSk5awL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "X_np = dfhoggs['x'].values\n", "sigma_y_np = dfhoggs['sigma_y'].values\n", @@ -324,7 +334,9 @@ "metadata": { "id": "G61a6pDYW82H" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mdl_ols = tfd.JointDistributionSequential([\n", " # b0 ~ Normal(0, 1)\n", @@ -363,7 +375,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -402,7 +416,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -439,7 +455,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -479,7 +497,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -505,7 +525,9 @@ "metadata": { "id": "kmo6QgUvtKzv" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mdl_ols_ = tfd.JointDistributionSequential([\n", " # b0\n", @@ -571,7 +593,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -605,7 +629,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -646,7 +672,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -670,7 +698,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -711,7 +741,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -745,7 +777,9 @@ "cellView": "both", "id": "nSJZfpUT7DI5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Define some helper functions\n", "\n", @@ -829,7 +863,9 @@ "metadata": { "id": "ucA51UWFL84D" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mapper = Mapper(mdl_ols_.sample()[:-1],\n", " [tfb.Identity(), tfb.Identity()],\n", @@ -844,7 +880,9 @@ "metadata": { "id": "-w0Jha-rxFUG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@_make_val_and_grad_fn\n", "def neg_log_likelihood(x):\n", @@ -890,7 +928,9 @@ "height": 565, "width": 567 }, - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -937,7 +977,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -988,7 +1030,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1017,7 +1061,9 @@ "metadata": { "id": "8ZFQTCktDXWc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def gen_ols_batch_model(X, sigma, hyperprior_mean=0, hyperprior_scale=1):\n", " hyper_mean = tf.cast(hyperprior_mean, dtype)\n", @@ -1051,7 +1097,9 @@ "metadata": { "id": "y3q-On2sYj9y" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Small helper function to validate log_prob shape (avoid wrong broadcasting)\n", "def validate_log_prob_part(model, batch_shape=1, observed=-1):\n", @@ -1115,7 +1163,9 @@ "cellView": "form", "id": "o9NELzZFHwtp" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title A common `run_chain` function\n", "@tf.function(autograph=False, experimental_compile=True)\n", @@ -1162,7 +1212,9 @@ "metadata": { "id": "eEjA8P8x-1HP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "nchain = 10\n", "b0, b1, _ = mdl_ols_batch.sample(nchain)\n", @@ -1186,7 +1238,9 @@ "metadata": { "id": "4qQdOPk90f7t" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# using the pymc3 naming convention\n", "sample_stats_name = ['lp', 'tree_size', 'diverging', 'energy', 'mean_tree_accept']\n", @@ -1219,7 +1273,9 @@ "height": 294, "width": 872 }, - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1247,7 +1303,9 @@ "height": 296, "width": 656 }, - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1292,7 +1350,9 @@ "height": 565, "width": 567 }, - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1342,7 +1402,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1378,7 +1440,9 @@ "metadata": { "id": "mG3HwG8ubK9a" }, - "outputs": [], + "outputs": [ + + ], "source": [ "validate_log_prob_part(mdl_studentt, 4)" ] @@ -1407,7 +1471,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1432,7 +1498,9 @@ "metadata": { "id": "SiVOEdlsTCqL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# bijector to map contrained parameters to real\n", "a, b = tf.constant(1., dtype), tf.constant(100., dtype),\n", @@ -1465,7 +1533,9 @@ "metadata": { "id": "Kd_-b20W_un2" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@_make_val_and_grad_fn\n", "def neg_log_likelihood(x):\n", @@ -1512,7 +1582,9 @@ "height": 565, "width": 567 }, - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1542,7 +1614,9 @@ "metadata": { "id": "7SRaHxfFUMvB" }, - "outputs": [], + "outputs": [ + + ], "source": [ "nchain = 10\n", "b0, b1, df, _ = mdl_studentt.sample(nchain)\n", @@ -1561,7 +1635,9 @@ "metadata": { "id": "J61CwG0_3Qfg" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# using the pymc3 naming convention\n", "sample_stats_name = ['lp', 'tree_size', 'diverging', 'energy', 'mean_tree_accept']\n", @@ -1674,7 +1750,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1702,7 +1780,9 @@ "height": 438, "width": 872 }, - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1730,7 +1810,9 @@ "height": 296, "width": 656 }, - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1763,7 +1845,9 @@ "height": 255, "width": 376 }, - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1803,7 +1887,9 @@ "height": 565, "width": 567 }, - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1837,7 +1923,9 @@ "metadata": { "id": "ZPT1yHaDhAw1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "data = pd.read_table('https://raw.githubusercontent.com/pymc-devs/pymc3/master/pymc3/examples/data/efron-morris-75-data.tsv',\n", " sep=\"\\t\")\n", @@ -1863,7 +1951,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1909,7 +1999,9 @@ "metadata": { "id": "26Y9MRDPlF6G" }, - "outputs": [], + "outputs": [ + + ], "source": [ "phi, kappa_log, thetas, y = mdl_baseball.sample(4)\n", "# phi, kappa_log, thetas, y" @@ -1966,7 +2058,9 @@ "metadata": { "id": "8l9PIYHlwMnG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "unconstraining_bijectors = [\n", " tfb.Sigmoid(),\n", @@ -1987,7 +2081,9 @@ "metadata": { "id": "FyykqiOVBeej" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@_make_val_and_grad_fn\n", "def neg_log_likelihood(x):\n", @@ -2026,7 +2122,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -2050,7 +2148,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -2075,7 +2175,9 @@ "metadata": { "id": "-UNxjka5gfGr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "if result.shape[0] > 0:\n", " phi_est, kappa_est, theta_est = mapper.split_and_reshape(result)\n", @@ -2097,7 +2199,9 @@ "metadata": { "id": "kuT8ILmjgfGy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "target_log_prob_fn = lambda *x: mdl_baseball.log_prob(x + (hits, ))\n", "\n", @@ -2117,7 +2221,9 @@ "metadata": { "id": "1qr9PFPt9i3S" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# using the pymc3 naming convention\n", "sample_stats_name = ['lp', 'tree_size', 'diverging', 'energy', 'mean_tree_accept']\n", @@ -2150,7 +2256,9 @@ "height": 440, "width": 872 }, - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -2178,7 +2286,9 @@ "height": 584, "width": 656 }, - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -2213,7 +2323,9 @@ "cellView": "form", "id": "Udlc1qnFXNJ3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Load raw data and clean up\n", "srrs2 = pd.read_csv('https://raw.githubusercontent.com/pymc-devs/pymc3/master/pymc3/examples/data/srrs2.dat')\n", @@ -2261,7 +2373,9 @@ "metadata": { "id": "_ogaMtI3drVX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def affine(u_val, x_county, county, floor, gamma, eps, b):\n", " \"\"\"Linear equation of the coefficients and the covariates, with broadcasting.\"\"\"\n", @@ -2357,7 +2471,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -2394,7 +2510,9 @@ "metadata": { "id": "jO3FjTTbgUoc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "from tensorflow_probability.python.mcmc.transformed_kernel import (\n", " make_transform_fn, make_transformed_log_prob)" @@ -2406,7 +2524,9 @@ "metadata": { "id": "86dDqmgUgUog" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Wrap logp so that all parameters are in the Real domain\n", "# copied and edited from tensorflow_probability/python/mcmc/transformed_kernel.py\n", @@ -2475,7 +2595,9 @@ "metadata": { "id": "YNnTSjPngUoi" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Build meanfield ADVI for a jointdistribution\n", "# Inspect the input jointdistribution and replace the list of distribution with\n", @@ -2554,7 +2676,9 @@ "metadata": { "id": "JAyOK6VYN9N9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "opt = tf.optimizers.Adam(learning_rate=.1)\n", "\n", @@ -2590,7 +2714,9 @@ "height": 271, "width": 414 }, - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -2607,7 +2733,9 @@ "metadata": { "id": "SF7clFifgUoq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "graph_info = contextual_effect2.resolve_graph()\n", "approx_param = dict()\n", @@ -2632,7 +2760,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -2657,7 +2787,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -2685,7 +2817,9 @@ "height": 271, "width": 405 }, - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -2727,7 +2861,9 @@ "height": 271, "width": 729 }, - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -2765,7 +2901,9 @@ "metadata": { "id": "cybiDlswI_7K" }, - "outputs": [], + "outputs": [ + + ], "source": [ "USE_FULLRANK = True" ] @@ -2776,7 +2914,9 @@ "metadata": { "id": "i72_qlt2zj6p" }, - "outputs": [], + "outputs": [ + + ], "source": [ "*prior_tensors, _ = contextual_effect2.sample()\n", "\n", @@ -2856,7 +2996,9 @@ "metadata": { "id": "3aJFQ8mrKI8R" }, - "outputs": [], + "outputs": [ + + ], "source": [ "learning_rate = tf.optimizers.schedules.ExponentialDecay(\n", " initial_learning_rate=1e-2,\n", @@ -2898,7 +3040,9 @@ "height": 271, "width": 407 }, - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -2928,7 +3072,9 @@ "height": 326, "width": 631 }, - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -2949,7 +3095,9 @@ "metadata": { "id": "Lndt-B20Gmjr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "graph_info = contextual_effect2.resolve_graph()\n", "approx_param = dict()\n", @@ -2980,7 +3128,9 @@ "height": 271, "width": 405 }, - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -3022,7 +3172,9 @@ "height": 271, "width": 729 }, - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -3060,7 +3212,9 @@ "metadata": { "id": "yqir31vbSWjX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "dtype = tf.float32" ] @@ -3071,7 +3225,9 @@ "metadata": { "id": "I4c5nHUtdE8f" }, - "outputs": [], + "outputs": [ + + ], "source": [ "n = 50000 # number of examples reviewed\n", "p_bad_ = 0.1 # fraction of bad events\n", @@ -3117,7 +3273,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -3159,7 +3317,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -3187,7 +3347,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -3211,7 +3373,9 @@ "metadata": { "id": "amcaMV2bKfEH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "nchain = 10\n", "prc, rcl, p_bad, _ = mdl_mixture.sample(nchain)\n", @@ -3240,7 +3404,9 @@ "metadata": { "id": "IWAA2JbqBXnf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# using the pymc3 naming convention\n", "sample_stats_name = ['lp', 'tree_size', 'diverging', 'energy', 'mean_tree_accept']\n", @@ -3273,7 +3439,9 @@ "height": 440, "width": 872 }, - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -3285,7 +3453,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "Modeling_with_JointDistribution.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/Multilevel_Modeling_Primer.ipynb b/site/ko/probability/examples/Multilevel_Modeling_Primer.ipynb index 75a4b47c4e..d5c9c33a3f 100644 --- a/site/ko/probability/examples/Multilevel_Modeling_Primer.ipynb +++ b/site/ko/probability/examples/Multilevel_Modeling_Primer.ipynb @@ -18,7 +18,9 @@ "cellView": "form", "id": "bJFDjPpKnMRt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -66,7 +68,9 @@ "metadata": { "id": "LI9d-F11u_yW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Import { display-mode: \"form\" }\n", "\n", @@ -179,7 +183,9 @@ "metadata": { "id": "RdJw71grz89v" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def load_and_preprocess_radon_dataset(state='MN'): \n", " \"\"\"Preprocess Radon dataset as done in \"Bayesian Data Analysis\" book.\n", @@ -222,7 +228,9 @@ "metadata": { "id": "LgxATJVF0FfV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "radon, county_name = load_and_preprocess_radon_dataset()\n", "num_counties = len(county_name)\n", @@ -235,7 +243,9 @@ "metadata": { "id": "ogZQTW9S1jLJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Create copies of variables as Tensors.\n", "county = tf.convert_to_tensor(radon['county'], dtype=tf.int32)\n", @@ -413,7 +423,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -444,7 +455,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -499,7 +511,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -563,7 +576,9 @@ "metadata": { "id": "nL-S3qLbPpSz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function\n", "def affine(x, kernel_diag, bias=tf.zeros([])):\n", @@ -579,7 +594,9 @@ "metadata": { "id": "R-HjDR2LNdSk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def pooled_model(floor):\n", " \"\"\"Creates a joint distribution representing our generative process.\"\"\"\n", @@ -605,7 +622,9 @@ "metadata": { "id": "xAicPeh7N9Cs" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function\n", "def sample_pooled(num_chains, num_results, num_burnin_steps, num_observations):\n", @@ -700,7 +719,9 @@ "metadata": { "id": "CVYEBL8qVtjW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def reduce_samples(var_samples, reduce_fn):\n", " \"\"\"Reduces across leading two dims using reduce_fn.\"\"\"\n", @@ -737,7 +758,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -764,7 +786,9 @@ "metadata": { "id": "v0hZwZfQyjsR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Utility function to plot traces of sampled variables.\n", "def plot_traces(var_name, samples, num_chains):\n", @@ -795,7 +819,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" }, { @@ -805,7 +830,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" }, { @@ -815,7 +841,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -847,7 +874,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -903,7 +931,9 @@ "metadata": { "id": "mm-llNYvQh6i" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def unpooled_model(floor, county):\n", " \"\"\"Creates a joint distribution for the unpooled model.\"\"\"\n", @@ -932,7 +962,9 @@ "metadata": { "id": "SmTXK4-YzeRT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function\n", "def sample_unpooled(num_chains, num_results, num_burnin_steps):\n", @@ -1016,7 +1048,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" }, { @@ -1026,7 +1059,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -1051,7 +1085,9 @@ "cellView": "form", "id": "UZv1Hg-HIzlU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Utility function for Forest plots.\n", "def forest_plot(num_chains, num_vars, var_name, var_labels, samples):\n", @@ -1101,7 +1137,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -1137,7 +1174,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -1167,7 +1205,9 @@ "cellView": "form", "id": "Ig9MyVbN0tsK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Utility function to plot estimates for a sample set of counties.\n", "def plot_estimates(linear_estimates, labels, sample_counties):\n", @@ -1230,7 +1270,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -1285,7 +1326,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -1331,7 +1373,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -1381,7 +1424,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -1449,7 +1493,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -1508,7 +1553,9 @@ "metadata": { "id": "-bPcpgMsIykz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def partial_pooling_model(county):\n", " \"\"\"Creates a joint distribution for the partial pooling model.\"\"\"\n", @@ -1538,7 +1585,9 @@ "metadata": { "id": "7hSPAeErXfAG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function\n", "def sample_partial_pooling(num_chains, num_results, num_burnin_steps):\n", @@ -1639,7 +1688,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -1711,7 +1761,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -1781,7 +1832,9 @@ "metadata": { "id": "fYXWHqduZ6l9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def varying_intercept_model(floor, county):\n", " \"\"\"Creates a joint distribution for the varying intercept model.\"\"\"\n", @@ -1811,7 +1864,9 @@ "metadata": { "id": "Mowimh-sbH0M" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function\n", "def sample_varying_intercepts(num_chains, num_results, num_burnin_steps):\n", @@ -1915,7 +1970,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -1947,7 +2003,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" }, { @@ -1957,7 +2014,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -2026,7 +2084,9 @@ "metadata": { "id": "10vbr5f9CafT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def plot_intercepts_and_slopes(linear_estimates, title):\n", " xvals = np.arange(2)\n", @@ -2057,7 +2117,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -2095,7 +2156,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -2174,7 +2236,9 @@ "metadata": { "id": "0jOXEyCzDqZC" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def varying_slopes_model(floor, county):\n", " \"\"\"Creates a joint distribution for the varying slopes model.\"\"\"\n", @@ -2203,7 +2267,9 @@ "metadata": { "id": "de1c3PThDrNW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function\n", "def sample_varying_slopes(num_chains, num_results, num_burnin_steps):\n", @@ -2307,7 +2373,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -2350,7 +2417,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -2440,7 +2508,9 @@ "metadata": { "id": "UTxOCUgvqRo0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def varying_intercepts_and_slopes_model(floor, county):\n", " \"\"\"Creates a joint distribution for the varying slope model.\"\"\"\n", @@ -2477,7 +2547,9 @@ "metadata": { "id": "M24GusA_p87C" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function\n", "def sample_varying_intercepts_and_slopes(num_chains, num_results,\n", @@ -2588,7 +2660,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -2616,7 +2689,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" }, { @@ -2626,7 +2700,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -2678,7 +2753,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -2760,7 +2836,9 @@ "metadata": { "id": "-R-_0RGq6_x1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def hierarchical_intercepts_model(floor, county, log_uranium):\n", " \"\"\"Creates a joint distribution for the varying slope model.\"\"\"\n", @@ -2796,7 +2874,9 @@ "metadata": { "id": "xe7DtZ7hMo2J" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function\n", "def sample_hierarchical_intercepts(num_chains, num_results, num_burnin_steps):\n", @@ -2906,7 +2986,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -2975,7 +3056,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -3049,7 +3131,9 @@ "metadata": { "id": "OQfrcxjtrPbq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Create a new variable for mean of floor across counties\n", "xbar = tf.convert_to_tensor(radon.groupby('county')['floor'].mean(), tf.float32)\n", @@ -3062,7 +3146,9 @@ "metadata": { "id": "NPg5IFi_7SkH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def contextual_effects_model(floor, county, log_uranium, xbar):\n", " \"\"\"Creates a joint distribution for the varying slope model.\"\"\"\n", @@ -3100,7 +3186,9 @@ "metadata": { "id": "S1aycsvdYVyW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function\n", "def sample_contextual_effects(num_chains, num_results, num_burnin_steps):\n", @@ -3281,7 +3369,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -3306,7 +3395,9 @@ "metadata": { "id": "3EySq4TJlsTr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "st_louis_log_uranium = tf.convert_to_tensor(\n", " radon.where(radon['county'] == 69)['log_uranium_ppm'].mean(), tf.float32)\n", @@ -3320,7 +3411,9 @@ "metadata": { "id": "NFvRstfncwAg" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function\n", "def intercept_a(gamma_0, gamma_1, gamma_2, eps_a, log_uranium, xbar, county):\n", @@ -3377,7 +3470,9 @@ "metadata": { "id": "ymV4ANtBhLxw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function\n", "def sample_contextual_effects_predictive(num_chains, num_results,\n", @@ -3498,7 +3593,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], @@ -3520,7 +3616,8 @@ "
" ] }, - "metadata": {}, + "metadata": { + }, "output_type": "display_data" } ], diff --git a/site/ko/probability/examples/Multiple_changepoint_detection_and_Bayesian_model_selection.ipynb b/site/ko/probability/examples/Multiple_changepoint_detection_and_Bayesian_model_selection.ipynb index 8921f07f47..e21e2c4da3 100644 --- a/site/ko/probability/examples/Multiple_changepoint_detection_and_Bayesian_model_selection.ipynb +++ b/site/ko/probability/examples/Multiple_changepoint_detection_and_Bayesian_model_selection.ipynb @@ -18,7 +18,9 @@ "cellView": "form", "id": "YCriMWd-pRTP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -73,7 +75,9 @@ "metadata": { "id": "No2QPkJ1_9z9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import numpy as np\n", "import tensorflow.compat.v2 as tf\n", @@ -121,7 +125,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" }, @@ -133,7 +139,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -232,7 +240,9 @@ "metadata": { "id": "bvEpqBxvoleY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Define variable to represent the unknown log rates.\n", "trainable_log_rates = tf.Variable(\n", @@ -272,7 +282,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" }, @@ -284,7 +296,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -354,7 +368,9 @@ "metadata": { "id": "IpTbdyah-IyX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Runs forward-backward algorithm to compute marginal posteriors.\n", "posterior_dists = hmm.posterior_marginals(observed_counts)\n", @@ -385,7 +401,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -445,7 +463,9 @@ "metadata": { "id": "PsXpBrH3DKbl" }, - "outputs": [], + "outputs": [ + + ], "source": [ "most_probable_states = hmm.posterior_mode(observed_counts)\n", "most_probable_rates = tf.gather(rates, most_probable_states)" @@ -466,7 +486,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" }, @@ -478,7 +500,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -650,7 +674,9 @@ "metadata": { "id": "ly0mT_mqdubx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "rate_prior = tfd.LogNormal(5, 5)\n", "\n", @@ -685,7 +711,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" }, @@ -697,7 +725,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -726,7 +756,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" }, @@ -738,7 +770,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -819,7 +853,9 @@ "metadata": { "id": "XEuhytSKcn4g" }, - "outputs": [], + "outputs": [ + + ], "source": [ "most_probable_states = hmm.posterior_mode(observed_counts)" ] @@ -839,7 +875,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -884,7 +922,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "Multiple_changepoint_detection_and_Bayesian_model_selection.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/Optimizers_in_TensorFlow_Probability.ipynb b/site/ko/probability/examples/Optimizers_in_TensorFlow_Probability.ipynb index f598bc9f64..7125f3885d 100644 --- a/site/ko/probability/examples/Optimizers_in_TensorFlow_Probability.ipynb +++ b/site/ko/probability/examples/Optimizers_in_TensorFlow_Probability.ipynb @@ -18,7 +18,9 @@ "cellView": "form", "id": "YCriMWd-pRTP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -42,14 +44,10 @@ "# TensorFlow Probability에서 옵티마이저\n", "\n", "\n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", "
TensorFlow.org에서 보기\n", - " Google Colab에서 실행\n", - " GitHub에서 소스 보기\n", - " 노트북 다운로드하기\n", - " TensorFlow.org에서 보기 Google Colab에서 실행 GitHub에서 소스 보기 노트북 다운로드하기
" ] }, @@ -79,7 +77,9 @@ "metadata": { "id": "2nA2FSdTgcEM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Import { display-mode: \"form\" }\n", "\n", @@ -125,7 +125,9 @@ "cellView": "form", "id": "Tm6BS93hQ9Ym" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Helper functions\n", "\n", @@ -367,7 +369,9 @@ "metadata": { "id": "G7d6oBnYFZwh" }, - "outputs": [], + "outputs": [ + + ], "source": [ "np.random.seed(12345)\n", "\n", @@ -633,20 +637,7 @@ "id": "xVAO1lit8zzK" }, "source": [ - "### 단일 함수, 복수 시작 지점\n", - "\n", - "Himmelblau 함수는 최적화 테스트 케이스입니다. 함수는 다음과 같이 주어집니다.\n", - "\n", - "$$f(x, y) = (x^2 + y - 11)^2 + (x + y^2 - 7)^2$$\n", - "\n", - "함수는 다음 위치에서 4개의 minima를 가집니다.\n", - "\n", - "- (3, 2),\n", - "- (-2.805118, 3.131312),\n", - "- (-3.779310, -3.283186),\n", - "- (3.584428, -1.848126).\n", - "\n", - "이러한 모든 minima는 적절한 시작 지점으로부터 도달할 수 있습니다.\n" + "$$f(x, y) = (x^2 + y - 11)^2 + (x + y^2 - 7)^2$$\n" ] }, { @@ -762,7 +753,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "Optimizers_in_TensorFlow_Probability.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/Probabilistic_Layers_VAE.ipynb b/site/ko/probability/examples/Probabilistic_Layers_VAE.ipynb index 41d0ee469b..af4c9e40e6 100644 --- a/site/ko/probability/examples/Probabilistic_Layers_VAE.ipynb +++ b/site/ko/probability/examples/Probabilistic_Layers_VAE.ipynb @@ -18,7 +18,9 @@ "cellView": "form", "id": "CpDUTVKYTowI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -73,7 +75,9 @@ "metadata": { "id": "kZ0MdF1j8WJf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Import { display-mode: \"form\" }\n", "\n", @@ -161,7 +165,9 @@ "metadata": { "id": "daPl6ycN9cD3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "datasets, datasets_info = tfds.load(name='mnist',\n", " with_info=True,\n", @@ -216,7 +222,9 @@ "metadata": { "id": "rd3Voa64_Gtv" }, - "outputs": [], + "outputs": [ + + ], "source": [ "input_shape = datasets_info.features['image'].shape\n", "encoded_size = 16\n", @@ -229,7 +237,9 @@ "metadata": { "id": "9d7Jbm66FN_u" }, - "outputs": [], + "outputs": [ + + ], "source": [ "prior = tfd.Independent(tfd.Normal(loc=tf.zeros(encoded_size), scale=1),\n", " reinterpreted_batch_ndims=1)" @@ -290,7 +300,9 @@ "metadata": { "id": "baP--pt6-ewK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "decoder = tfk.Sequential([\n", " tfkl.InputLayer(input_shape=[encoded_size]),\n", @@ -320,7 +332,9 @@ "metadata": { "id": "7itugvZVLyWL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "vae = tfk.Model(inputs=encoder.inputs,\n", " outputs=decoder(encoder.outputs[0]))" @@ -405,7 +419,9 @@ "metadata": { "id": "3ZqfOYMP_2p_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# We'll just examine ten random digits.\n", "x = next(iter(eval_dataset))[0][:10]\n", @@ -420,7 +436,9 @@ "cellView": "form", "id": "MM7wW4S2OrBt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Image Plot Util\n", "import matplotlib.pyplot as plt\n", @@ -464,7 +482,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -484,7 +504,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -504,7 +526,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -524,7 +548,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -549,7 +575,9 @@ "metadata": { "id": "C3_5HPUCQpYO" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Now, let's generate ten never-before-seen digits.\n", "z = prior.sample(10)\n", @@ -580,7 +608,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -600,7 +630,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -620,7 +652,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -640,7 +674,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "Probabilistic_Layers_VAE.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/STS_approximate_inference_for_models_with_non_Gaussian_observations.ipynb b/site/ko/probability/examples/STS_approximate_inference_for_models_with_non_Gaussian_observations.ipynb index af4818e08f..ecce8c85e6 100644 --- a/site/ko/probability/examples/STS_approximate_inference_for_models_with_non_Gaussian_observations.ipynb +++ b/site/ko/probability/examples/STS_approximate_inference_for_models_with_non_Gaussian_observations.ipynb @@ -18,7 +18,9 @@ "cellView": "form", "id": "S2AOrHzjK0_L" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -64,7 +66,9 @@ "metadata": { "id": "4YJz-JDu0X9E" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import time\n", "import matplotlib.pyplot as plt\n", @@ -105,7 +109,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" }, @@ -117,7 +123,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -147,7 +155,9 @@ "metadata": { "id": "hSsekKzIwsg6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def build_model(approximate_unconstrained_rates):\n", " trend = tfp.sts.LocalLinearTrend(\n", @@ -173,7 +183,9 @@ "metadata": { "id": "Hg_B4tofzxgc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "positive_bijector = tfb.Softplus() # Or tfb.Exp()\n", "\n", @@ -199,7 +211,9 @@ "metadata": { "id": "vquh2LxgBjfy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def sts_with_poisson_likelihood_model():\n", " # Encode the parameters of the STS model as random variables.\n", @@ -235,7 +249,9 @@ "metadata": { "id": "rSj7blvWh1w8" }, - "outputs": [], + "outputs": [ + + ], "source": [ "pinned_model = model.experimental_pin(observed_counts=observed_counts)" ] @@ -255,7 +271,9 @@ "metadata": { "id": "ZVajaBpLf8h0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "constraining_bijector = pinned_model.experimental_default_event_space_bijector()" ] @@ -279,7 +297,9 @@ "metadata": { "id": "NMPlVBk6PcpT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Sampler configuration\n", "\n", @@ -306,7 +326,9 @@ "metadata": { "id": "15ue-mBGdcmh" }, - "outputs": [], + "outputs": [ + + ], "source": [ "sampler = tfp.mcmc.TransformedTransitionKernel(\n", " tfp.mcmc.NoUTurnSampler(\n", @@ -382,7 +404,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -419,7 +443,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" }, @@ -431,7 +457,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -473,7 +501,9 @@ "metadata": { "id": "v1HuVuk6Qocm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def sample_forecasted_counts(sts_model, posterior_latent_rates,\n", " posterior_params, num_steps_forecast,\n", @@ -513,7 +543,9 @@ "metadata": { "id": "MyPFQzV8SOSs" }, - "outputs": [], + "outputs": [ + + ], "source": [ "forecast_samples = np.squeeze(forecast_samples)" ] @@ -524,7 +556,9 @@ "metadata": { "id": "iD_kLwF1V3m-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def plot_forecast_helper(data, forecast_samples, CI=90):\n", " \"\"\"Plot the observed time series alongside the forecast.\"\"\"\n", @@ -572,7 +606,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -600,7 +636,9 @@ "metadata": { "id": "7aZQEnTThgMT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "surrogate_posterior = tfp.experimental.vi.build_factored_surrogate_posterior(\n", " event_shape=pinned_model.event_shape,\n", @@ -651,7 +689,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -677,7 +717,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" }, @@ -689,7 +731,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -725,7 +769,9 @@ "metadata": { "id": "0aoMoQyf_fWC" }, - "outputs": [], + "outputs": [ + + ], "source": [ "forecast_samples, rate_samples = sample_forecasted_counts(\n", " sts_model,\n", @@ -742,7 +788,9 @@ "metadata": { "id": "eQ7zJpEr_hHU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "forecast_samples = np.squeeze(forecast_samples)" ] @@ -762,7 +810,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -774,7 +824,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "STS_approximate_inference_for_models_with_non_Gaussian_observations.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/TFP_Release_Notebook_0_11_0.ipynb b/site/ko/probability/examples/TFP_Release_Notebook_0_11_0.ipynb index e257965d57..d3f5ee3637 100644 --- a/site/ko/probability/examples/TFP_Release_Notebook_0_11_0.ipynb +++ b/site/ko/probability/examples/TFP_Release_Notebook_0_11_0.ipynb @@ -18,7 +18,9 @@ "cellView": "form", "id": "qS8MroChhSzR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -155,7 +157,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -241,7 +245,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -254,7 +260,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -302,7 +310,9 @@ "metadata": { "id": "x8Un2FoJf0ne" }, - "outputs": [], + "outputs": [ + + ], "source": [ "nparticles = 2048\n", "seed = ()\n", @@ -334,7 +344,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -369,7 +381,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -382,7 +396,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -428,7 +444,9 @@ "cellView": "form", "id": "bzJMetHkhBHe" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title `plot_spherical`\n", "def plot_spherical(dist, nsamples):\n", @@ -626,7 +644,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -733,7 +753,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -843,7 +865,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -883,7 +907,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -919,7 +945,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -967,7 +995,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -998,7 +1028,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1033,7 +1065,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1064,7 +1098,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1101,7 +1137,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1132,7 +1170,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1185,7 +1225,9 @@ }, "execution_count": 19, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1328,7 +1370,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "WARNING:tensorflow:Note that RandomUniformInt inside pfor op may not give same output as inside a sequential loop.\n" + "WARNING:tensorflow:Note that RandomStandardNormal inside pfor op may not give same output as inside a sequential loop.\n" ] }, { @@ -1342,14 +1384,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "(, ) \n", - " ((3,) sample)\n" + "(, ) \n", + " ((1,) sample)\n", + "WARNING:tensorflow:Note that RandomUniformInt inside pfor op may not give same output as inside a sequential loop.\n" ] }, { @@ -1370,7 +1409,14 @@ "name": "stderr", "output_type": "stream", "text": [ - "WARNING:tensorflow:Note that RandomStandardNormal inside pfor op may not give same output as inside a sequential loop.\n" + "(, ) \n", + " ((3,) sample)\n" ] }, { @@ -1599,7 +1645,9 @@ }, "execution_count": 3, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1732,7 +1780,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1812,7 +1862,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -1834,7 +1886,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -1856,7 +1910,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1921,7 +1977,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "TFP_Release_Notebook_0_11_0.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/TFP_Release_Notebook_0_12_1.ipynb b/site/ko/probability/examples/TFP_Release_Notebook_0_12_1.ipynb index f379a554dc..0d199a8c8e 100644 --- a/site/ko/probability/examples/TFP_Release_Notebook_0_12_1.ipynb +++ b/site/ko/probability/examples/TFP_Release_Notebook_0_12_1.ipynb @@ -18,7 +18,9 @@ "cellView": "form", "id": "FW9em4rqnw0S" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -45,8 +47,7 @@ "\n", "\n", " \n", - " \n", + " \n", " \n", " \n", "
TensorFlow.org에서보기 Google Colab에서 실행하기\n", - " Google Colab에서 실행하기 GitHub에서 소그 보기 노트북 다운로드하기
" @@ -58,7 +59,9 @@ "metadata": { "id": "oUPWBWHIHBPM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Installs & imports { vertical-output: true }\n", "!pip3 install -qU tensorflow==2.4.0 tensorflow_probability==0.12.1 tensorflow-datasets inference_gym\n", @@ -125,7 +128,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -177,7 +182,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -247,7 +254,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -294,7 +303,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -344,7 +355,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -396,7 +409,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -447,7 +462,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -487,7 +504,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -500,7 +519,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -658,7 +679,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -702,7 +725,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -762,7 +787,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -941,7 +968,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -954,7 +983,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -967,7 +998,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1016,7 +1049,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1053,7 +1088,9 @@ "metadata": { "id": "Hjv8snlYm7Gi" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Import a Brownian Motion model from TFP's inference gym.\r\n", "model = gym.targets.BrownianMotionMissingMiddleObservations()\r\n", @@ -1098,7 +1135,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1134,7 +1173,9 @@ "metadata": { "id": "g1iSSYX-nCLT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "logging.getLogger('tensorflow').setLevel(logging.ERROR) # suppress pfor warnings\r\n", "\r\n", @@ -1154,7 +1195,9 @@ "metadata": { "id": "sFmuRAt1Czvr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Construct and train a Mean-Field Surrogate Posterior.\r\n", "factored_surrogate_posterior = tfp.experimental.vi.build_factored_surrogate_posterior(event_shape=prior.event_shape)\r\n", @@ -1171,7 +1214,9 @@ "metadata": { "id": "GJPtYZAspk8x" }, - "outputs": [], + "outputs": [ + + ], "source": [ "logging.getLogger('tensorflow').setLevel(logging.ERROR) # suppress pfor warnings\r\n", "\r\n", @@ -1207,7 +1252,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1249,7 +1296,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1315,7 +1364,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1353,7 +1404,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -1415,7 +1468,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1490,7 +1545,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -1503,7 +1560,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1547,7 +1606,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1602,7 +1663,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "TFP_Release_Notebook_0_12_1.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/TFP_Release_Notebook_0_13_0.ipynb b/site/ko/probability/examples/TFP_Release_Notebook_0_13_0.ipynb index fa0c4913bb..37e2f8ec6d 100644 --- a/site/ko/probability/examples/TFP_Release_Notebook_0_13_0.ipynb +++ b/site/ko/probability/examples/TFP_Release_Notebook_0_13_0.ipynb @@ -18,7 +18,9 @@ "cellView": "form", "id": "FW9em4rqnw0S" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -45,8 +47,7 @@ "\n", "\n", " \n", - " \n", + " \n", " \n", " \n", "
TensorFlow.org에서보기 Google Colab에서 실행하기\n", - " Google Colab에서 실행하기 GitHub에서 소그 보기 노트북 다운로드하기
" @@ -133,7 +134,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -179,7 +182,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -254,7 +259,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -307,7 +314,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -364,7 +373,9 @@ }, "execution_count": 6, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -410,7 +421,9 @@ }, "execution_count": 7, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -482,7 +495,9 @@ }, "execution_count": 8, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -688,7 +703,9 @@ }, "execution_count": 13, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -811,7 +828,9 @@ }, "execution_count": 73, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -893,7 +912,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1014,7 +1035,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -1027,7 +1050,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -1040,7 +1065,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -1053,7 +1080,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1151,7 +1180,9 @@ }, "execution_count": 26, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" }, @@ -1164,7 +1195,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1213,7 +1246,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1231,7 +1266,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "TFP_Release_Notebook_0_13_0.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/TensorFlow_Distributions_Tutorial.ipynb b/site/ko/probability/examples/TensorFlow_Distributions_Tutorial.ipynb index 8709b45ac1..4b13909324 100644 --- a/site/ko/probability/examples/TensorFlow_Distributions_Tutorial.ipynb +++ b/site/ko/probability/examples/TensorFlow_Distributions_Tutorial.ipynb @@ -18,7 +18,9 @@ "cellView": "form", "id": "MeKZo1dnV1cE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -75,7 +77,9 @@ "metadata": { "id": "J6t0EUihrG4B" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import collections\n", "\n", @@ -124,7 +128,9 @@ }, "execution_count": 3, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -158,7 +164,9 @@ }, "execution_count": 4, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -191,7 +199,9 @@ }, "execution_count": 5, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -224,7 +234,9 @@ }, "execution_count": 6, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -257,7 +269,9 @@ }, "execution_count": 7, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -290,7 +304,9 @@ }, "execution_count": 8, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -315,7 +331,9 @@ }, "execution_count": 9, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -339,7 +357,9 @@ }, "execution_count": 10, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -363,7 +383,9 @@ }, "execution_count": 11, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -387,7 +409,9 @@ }, "execution_count": 12, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -429,7 +453,9 @@ }, "execution_count": 13, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -463,7 +489,9 @@ }, "execution_count": 14, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -505,7 +533,9 @@ }, "execution_count": 15, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -534,7 +564,9 @@ }, "execution_count": 16, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -558,7 +590,9 @@ }, "execution_count": 17, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -591,7 +625,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -640,7 +676,9 @@ }, "execution_count": 19, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -676,7 +714,9 @@ }, "execution_count": 20, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -706,7 +746,9 @@ }, "execution_count": 21, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -739,7 +781,9 @@ }, "execution_count": 22, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -794,7 +838,9 @@ }, "execution_count": 23, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -828,7 +874,9 @@ }, "execution_count": 24, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -863,7 +911,9 @@ }, "execution_count": 25, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -896,7 +946,9 @@ }, "execution_count": 26, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -959,7 +1011,9 @@ }, "execution_count": 27, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1015,7 +1069,9 @@ }, "execution_count": 28, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1048,7 +1104,9 @@ }, "execution_count": 29, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1111,7 +1169,9 @@ }, "execution_count": 30, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1136,7 +1196,9 @@ }, "execution_count": 31, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1160,7 +1222,9 @@ }, "execution_count": 32, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1186,7 +1250,9 @@ }, "execution_count": 33, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1219,7 +1285,9 @@ }, "execution_count": 34, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1253,7 +1321,9 @@ }, "execution_count": 35, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1286,7 +1356,9 @@ }, "execution_count": 36, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1321,7 +1393,9 @@ }, "execution_count": 37, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1345,7 +1419,9 @@ }, "execution_count": 38, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1371,7 +1447,9 @@ "metadata": { "id": "mKHtmSP6SnvY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "b3 = tfd.Bernoulli(probs=[.3, .5, .7])" ] @@ -1400,7 +1478,9 @@ }, "execution_count": 40, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1441,7 +1521,9 @@ }, "execution_count": 41, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1485,7 +1567,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "TensorFlow_Distributions_Tutorial.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/TensorFlow_Probability_Case_Study_Covariance_Estimation.ipynb b/site/ko/probability/examples/TensorFlow_Probability_Case_Study_Covariance_Estimation.ipynb index 764df20c0c..c03143ecc2 100644 --- a/site/ko/probability/examples/TensorFlow_Probability_Case_Study_Covariance_Estimation.ipynb +++ b/site/ko/probability/examples/TensorFlow_Probability_Case_Study_Covariance_Estimation.ipynb @@ -18,7 +18,9 @@ "cellView": "form", "id": "I4NyePmVaxhL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -116,7 +118,9 @@ "metadata": { "id": "tQ_h8ns5Inq-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import collections\n", "import math\n", @@ -175,7 +179,9 @@ "metadata": { "id": "z4lSqTGHKAyf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# We're assuming 2-D data with a known true mean of (0, 0)\n", "true_mean = np.zeros([2], dtype=np.float32)\n", @@ -226,7 +232,7 @@ "source": [ "### 일부 합성 관측 생성\n", "\n", - "**TensorFlow 확률은 데이터의 초기 차원이 샘플 인덱스를 나타내며 데이터의 최종 차원이 여러분의 샘플의 차원수를 나타낸다는 규칙을 사용합니다.**\n", + "TensorFlow 확률은 데이터의 초기 차원이 샘플 인덱스를 나타내며 데이터의 최종 차원이 여러분의 샘플의 차원수를 나타낸다는 규칙을 사용합니다.\n", "\n", "여기에서 우리는 각각 길이 2의 벡터인 샘플 100개가 필요합니다. 우리는 형상이 (100,2)인 배열 `my_data`를 생성합니다. `my_data[i, :]`는 $i$번째 샘플이며 길이 2의 벡터입니다.\n", "\n", @@ -239,7 +245,9 @@ "metadata": { "id": "XjHoAXOlXbYi" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Set the seed so the results are reproducible.\n", "np.random.seed(123)\n", @@ -268,7 +276,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -303,7 +313,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -407,7 +419,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -461,7 +475,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -495,7 +511,9 @@ "metadata": { "id": "ibgUDLfImeZy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "n = my_data.shape[0]\n", "nu_prior = PRIOR_DF\n", @@ -532,7 +550,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -660,7 +680,9 @@ "metadata": { "id": "9ITlkvOvHkX5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "VALIDATE_ARGS = True\n", "ALLOW_NAN_STATS = False" @@ -691,7 +713,9 @@ "metadata": { "id": "GJB5wJ1IEsBu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def log_lik_data(precisions, replicated_data):\n", " n = tf.shape(precisions)[0] # number of precision matrices\n", @@ -798,7 +822,9 @@ "metadata": { "id": "dIzU4zNxEQPQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function(autograph=False)\n", "def log_lik_prior(precisions):\n", @@ -859,7 +885,9 @@ "metadata": { "id": "Ps6teXnZluC5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def get_log_lik(data, n_chains=1):\n", " # The data argument that is passed in will be available to the inner function\n", @@ -967,7 +995,9 @@ "metadata": { "id": "ZWg3y5KU_mg9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def get_log_lik_verbose(data, n_chains=1):\n", " # The data argument that is passed in will be available to the inner function\n", @@ -1131,7 +1161,9 @@ "metadata": { "id": "OM4s01mGsjfZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Our transform has 3 stages that we chain together via composition:\n", "precision_to_unconstrained = tfb.Chain([\n", @@ -1222,7 +1254,9 @@ "metadata": { "id": "k0pQ7HqrN8aq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def log_lik_prior_transformed(transformed_precisions):\n", " rv_precision = tfd.TransformedDistribution(\n", @@ -1291,7 +1325,9 @@ "metadata": { "id": "vM-nF4t2QqSr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def log_lik_data_transformed(transformed_precisions, replicated_data):\n", " # We recover the precision matrix by inverting our bijector. This is\n", @@ -1360,7 +1396,9 @@ "metadata": { "id": "JKWHJFisTIzo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def get_log_lik_transformed(data, n_chains=1):\n", " # The data argument that is passed in will be available to the inner function\n", @@ -1417,7 +1455,9 @@ "metadata": { "id": "PFvyLlP_Tbi4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# We'll choose a proper random initial value this time\n", "np.random.seed(123)\n", @@ -1440,7 +1480,9 @@ "metadata": { "id": "pUobCu7xTnoa" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Sample!\n", "@tf.function(autograph=False)\n", @@ -1546,7 +1588,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1633,7 +1677,9 @@ "metadata": { "id": "xgLX6o9PZRwQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# The number of chains is determined by the shape of the initial values.\n", "# Here we'll generate 3 chains, so we'll need a tensor of 3 initial values.\n", @@ -1660,7 +1706,9 @@ "metadata": { "id": "M7A-JG6hwCVu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function(autograph=False)\n", "def sample():\n", @@ -1854,7 +1902,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1900,7 +1950,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1963,7 +2015,9 @@ "metadata": { "id": "Vv4JqbHUP9n7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# The bijector we need for the TransformedTransitionKernel is the inverse of\n", "# the one we used above\n", @@ -2026,7 +2080,9 @@ "metadata": { "id": "a2VVVg4KhSnb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function(autograph=False)\n", "def sample():\n", @@ -2123,7 +2179,9 @@ "metadata": { "id": "jXxuO15HkeTD" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# The output samples have shape [n_steps, n_chains, 2, 2]\n", "# Flatten them to [n_steps * n_chains, 2, 2] via reshape:\n", @@ -2234,7 +2292,9 @@ "metadata": { "id": "QgUyMB4OEyFZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# An optimized Wishart distribution that has been transformed to operate on\n", "# Cholesky factors instead of full matrices. Note that we gain a modest\n", @@ -2401,7 +2461,9 @@ "metadata": { "id": "BJXoPZ1e-8yh" }, - "outputs": [], + "outputs": [ + + ], "source": [ "inverse_wishart_cholesky = tfd.TransformedDistribution(\n", " distribution=CholeskyWishart(\n", @@ -2447,7 +2509,9 @@ "metadata": { "id": "f8V5hA9SUqHy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Our new prior.\n", "PRIOR_SCALE_CHOLESKY = np.linalg.cholesky(PRIOR_SCALE)\n", @@ -2542,7 +2606,9 @@ "metadata": { "id": "GLUqa6lvPCIM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class MVNPrecisionCholesky(tfd.TransformedDistribution):\n", " \"\"\"Multivariate normal parameterized by loc and Cholesky precision matrix.\"\"\"\n", @@ -2567,7 +2633,9 @@ "metadata": { "id": "5rp-71gFUdUz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function(autograph=False)\n", "def log_lik_data_cholesky(precisions_cholesky, replicated_data):\n", @@ -2631,7 +2699,9 @@ "metadata": { "id": "tqx8TS2wYTYh" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def get_log_lik_cholesky(data, n_chains=1):\n", " # The data argument that is passed in will be available to the inner function\n", @@ -2663,7 +2733,9 @@ "metadata": { "id": "8Nva4oOGTjN_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "unconstrained_to_precision_cholesky = tfb.Chain([\n", " # step 2: exponentiate the diagonals \n", @@ -2730,7 +2802,9 @@ "metadata": { "id": "oIOjT1HxZg0C" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# The number of chains is determined by the shape of the initial values.\n", "# Here we'll generate 3 chains, so we'll need a tensor of 3 initial values.\n", @@ -2764,7 +2838,9 @@ "metadata": { "id": "aFzFjNIoYre3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function(autograph=False)\n", "def sample():\n", @@ -2867,7 +2943,9 @@ "metadata": { "id": "merfcOkkrKMS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# The output samples have shape [n_steps, n_chains, 2, 2]\n", "# Flatten them to [n_steps * n_chains, 2, 2] via reshape:\n", @@ -2945,7 +3023,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "TensorFlow_Probability_Case_Study_Covariance_Estimation.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/TensorFlow_Probability_on_JAX.ipynb b/site/ko/probability/examples/TensorFlow_Probability_on_JAX.ipynb index 7c130d1c50..d582fe2207 100644 --- a/site/ko/probability/examples/TensorFlow_Probability_on_JAX.ipynb +++ b/site/ko/probability/examples/TensorFlow_Probability_on_JAX.ipynb @@ -18,7 +18,9 @@ "cellView": "form", "id": "MeKZo1dnV1cE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -84,7 +86,9 @@ "metadata": { "id": "dQMyDsSckCpV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip uninstall tensorflow -y -q" ] @@ -104,7 +108,9 @@ "metadata": { "id": "Tl5CfrtVkQd7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install -Uq tfp-nightly[jax] > /dev/null" ] @@ -157,7 +163,9 @@ "metadata": { "id": "pSa7v4CWk38v" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import jax.numpy as jnp\n", "from jax import grad\n", @@ -184,7 +192,9 @@ "metadata": { "id": "nlx8w2gPkEM6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "from tensorflow_probability.substrates import jax as tfp\n", "tfd = tfp.distributions\n", @@ -218,7 +228,9 @@ "metadata": { "id": "0HHsy5lsf_S7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "iris = datasets.load_iris()\n", "features, labels = iris['data'], iris['target']\n", @@ -242,7 +254,9 @@ "metadata": { "id": "0Ri7RxnekWUr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "Root = tfd.JointDistributionCoroutine.Root\n", "def model():\n", @@ -284,7 +298,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -328,7 +344,9 @@ "metadata": { "id": "sRkYo3z1lox5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def classifier_probs(params):\n", " dists, _ = dist.sample_distributions(seed=random.PRNGKey(0),\n", @@ -474,7 +492,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -619,7 +639,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -653,7 +675,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -679,7 +703,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -757,7 +783,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -804,7 +832,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -836,7 +866,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -866,7 +898,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -917,7 +951,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1050,7 +1086,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1150,7 +1188,9 @@ }, "execution_count": 0, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1174,7 +1214,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1218,7 +1260,9 @@ "metadata": { "id": "dJaHRkDI_qY_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "target_log_prob = tfd.MultivariateNormalDiag(jnp.zeros(2), jnp.ones(2)).log_prob" ] @@ -1247,7 +1291,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -1259,7 +1305,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1304,7 +1352,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -1316,7 +1366,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1356,7 +1408,9 @@ "metadata": { "id": "veOHaWtOeE0-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "minimum = jnp.array([1.0, 1.0]) # The center of the quadratic bowl.\n", "scales = jnp.array([2.0, 3.0]) # The scales along the two axes.\n", @@ -1660,7 +1714,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "TensorFlow_Probability_on_JAX.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/Understanding_TensorFlow_Distributions_Shapes.ipynb b/site/ko/probability/examples/Understanding_TensorFlow_Distributions_Shapes.ipynb index 6c5e33f16e..e4b4b25550 100644 --- a/site/ko/probability/examples/Understanding_TensorFlow_Distributions_Shapes.ipynb +++ b/site/ko/probability/examples/Understanding_TensorFlow_Distributions_Shapes.ipynb @@ -18,7 +18,9 @@ "cellView": "form", "id": "htHLjlnLYSoB" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -55,7 +57,9 @@ "metadata": { "id": "J6t0EUihrG4B" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import collections\n", "\n", @@ -116,7 +120,9 @@ "metadata": { "id": "bq8guNPtrG4M" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def describe_distributions(distributions):\n", " print('\\n'.join([str(d) for d in distributions]))" @@ -435,7 +441,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -460,7 +467,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -484,7 +492,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -524,7 +533,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -560,7 +570,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -587,7 +598,9 @@ "metadata": { "id": "MkSWkwYarG5d" }, - "outputs": [], + "outputs": [ + + ], "source": [ "poisson_2_by_3 = tfd.Poisson(\n", " rate=[[1., 10., 100.,], [2., 20., 200.]],\n", @@ -610,7 +623,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -634,7 +648,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -658,7 +673,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -682,7 +698,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -706,7 +723,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -730,7 +748,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -754,7 +773,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -790,7 +810,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -826,7 +847,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -862,7 +884,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -898,7 +921,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -934,7 +958,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -978,7 +1003,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -1004,7 +1030,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -1153,7 +1180,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -1187,7 +1215,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -1220,7 +1249,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -1252,7 +1282,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -1294,7 +1325,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -1328,7 +1360,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -1353,7 +1386,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -1375,7 +1409,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -1417,7 +1452,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -1454,7 +1490,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -1486,7 +1523,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -1521,7 +1559,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -1552,7 +1591,8 @@ ] }, "execution_count": 0, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], diff --git a/site/ko/probability/examples/Variational_Inference_with_Multipart_Bijectors.ipynb b/site/ko/probability/examples/Variational_Inference_with_Multipart_Bijectors.ipynb new file mode 100644 index 0000000000..04cad07142 --- /dev/null +++ b/site/ko/probability/examples/Variational_Inference_with_Multipart_Bijectors.ipynb @@ -0,0 +1,1260 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "u3Zq5VrfiDqB" + }, + "source": [ + "##### Copyright 2021 The TensorFlow Authors.\n", + "\n", + "Licensed under the Apache License, Version 2.0 (the \"License\");" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "id": "3jTEqPzFiHQ0" + }, + "outputs": [ + + ], + "source": [ + "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# https://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "x97n3SaNmNpB" + }, + "source": [ + "# 결합 분포를 사용한 확률론적 그래픽 모델에 대한 변분 추론\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + "
TensorFlow.org에서보기 Google Colab에서 실행하기\n", + "GitHub에서 소스 보기노트북 다운로드하기
" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SVcOch4u2bVS" + }, + "source": [ + "변분 추론(VI)은 거의 정확한 베이지안 추론을 최적화 문제로 제시하며 진정한 사후 확률 분포로 KL 발산을 최소화하는 '대체' 사후 확률 분포를 찾습니다. 그래디언트 기반 VI는 종종 MCMC 메서드보다 빠르며, 모델 매개변수의 최적화로 자연스럽게 구성되며, 모델 비교, 수렴 진단, 구성 가능한 추론에 직접 사용할 수 있는 모델 증거에 하한를 제공합니다.\n", + "\n", + "TensorFlow 확률은 TFP 스택에 자연스럽게 맞는 빠르고, 유연하며, 확장 가능한 VI를 위한 도구를 제공합니다. 이러한 도구를 사용하여 선형 변이 또는 정규화 흐름으로 유도된 공분산 구조의 대체 사후 확률을 구성할 수 있습니다.\n", + "\n", + "VI는 관심 결과에 대한 여러 처리 또는 관측된 기능의 영향을 추정하기 위한 회귀 모델의 매개변수에 대한 베이지안 [신용 구간](https://en.wikipedia.org/wiki/Credible_interval)을 추측하기 위해 사용될 수 있습니다. 신용 구간은 관측된 데이터에 따라 조건화되고 매개변수의 이전 분포에 대한 추정에 따라 특정 확률로 관측되지 않은 매개변수의 값을 한정합니다.\n", + "\n", + "이 Colab에서, VI를 사용하여 가정에서 측정된 라돈 수준에 대한 베이지안 선형 회귀 모델의 매개변수 신용 구간을 얻는 방법을 시연합니다([Gelman 등의(2007) 라돈 데이터세트](http://www.stat.columbia.edu/~gelman/arm/)) 사용, Stan의 [유사한 예시](https://mc-stan.org/users/documentation/case-studies/radon.html#Correlations-among-levels) 참조). TFP `JointDistribution`이 `bijectors`와 결합하여 표현 대체 사후 확률의 두 개 유형을 구축하고 맞추는 방법을 시연합니다.\n", + "\n", + "- 표준 정규 분포는 블록 행렬로 변환됩니다. 행렬은 사후 확률의 일부 구성 요소들 간의 독립성과 다른 요소들 간의 의존성을 반영하며, 평균장 또는 완전 공분산 사후 확률의 가정을 완화할 수 있습니다.\n", + "- 보다 복잡한 고용량의 [역 자기 회귀성 유동](https://arxiv.org/abs/1606.04934).\n", + "\n", + "대체 사후 확률은 헤밀토니언 몬테 카를로의 ground-truth 샘플과 마찬가지로 훈련되고 평균장 대체 사후 확률 기준선의 결과와 비교됩니다." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pt5Lzw4hjd6A" + }, + "source": [ + "## 베이지안 변분 추론 개요\n", + "\n", + "$\\omega$는 결정론적 매개변수이고 $\\theta$는 무작위 매개변수를 나타내며 $x_i$는 기능이며 $y_i$는 관측된 데이터 지점 $i=1,\\ldots,n$에 대한 대상 값인 다음과 같은 생성 프로세스가 있다고 가정해 봅니다: \\begin{align*} &\\theta \\sim r(\\Theta) && \\text{(Prior)}\\ &\\text{for } i = 1 \\ldots n: \\nonumber \\ &\\quad y_i \\sim p(Y_i|x_i, \\theta, \\omega) && \\text{(Likelihood)} \\end{align*}\n", + "\n", + "VI는 다음과 같은 특성을 갖습니다: $\\newcommand{\\E}{\\operatorname{\\mathbb{E}}} \\newcommand{\\K}{\\operatorname{\\mathbb{K}}} \\newcommand{\\defeq}{\\overset{\\tiny\\text{def}}{=}} \\DeclareMathOperator*{\\argmin}{arg,min}$\n", + "\n", + "\\begin{align*} -\\log p({y_i}_i^n|{x_i}*i^n, \\omega) &\\defeq -\\log \\int \\textrm{d}\\theta, r(\\theta) \\prod_i^n p(y_i|x_i,\\theta, \\omega) && \\text{(Really hard integral)} \\ &= -\\log \\int \\textrm{d}\\theta, q(\\theta) \\frac{1}{q(\\theta)} r(\\theta) \\prod_i^n p(y_i|x_i,\\theta, \\omega) && \\text{(Multiply by 1)}\\ &\\le - \\int \\textrm{d}\\theta, q(\\theta) \\log \\frac{r(\\theta) \\prod_i^n p(y_i|x_i,\\theta, \\omega)}{q(\\theta)} && \\text{(Jensen's inequality)}\\ &\\defeq \\E*{q(\\Theta)}[ -\\log p(y_i|x_i,\\Theta, \\omega) ] + \\K[q(\\Theta), r(\\Theta)]\\ &\\defeq `\\text{expected negative log likelihood\"} + `\\text{kl regularizer\"} \\end{align*}\n", + "\n", + "(기술적으로 $q$는 $r$에 관하여 [절대 연속](https://en.wikipedia.org/wiki/Absolute_continuity#Absolute_continuity_of_measures)으로 추정됩니다. [젠센 부등식](https://en.wikipedia.org/wiki/Jensen%27s_inequality)도 참조합니다.)\n", + "\n", + "경계는 모든 q에 대해 성립하기 때문에 다음과 같은 경우에 확실히 가장 빠듯합니다.\n", + "\n", + "$$q^*,w^* = \\argmin_{q \\in \\mathcal{Q},\\omega\\in\\mathbb{R}^d} \\left\\{ \\sum_i^n\\E_{q(\\Theta)}\\left[ -\\log p(y_i|x_i,\\Theta, \\omega) \\right] + \\K[q(\\Theta), r(\\Theta)] \\right\\}$$\n", + "\n", + "용어에 관련해서는, 다음을 호출합니다.\n", + "\n", + "- \"대체 후속 확률\" $q^*$ 및\n", + "- \"대체 패밀리\" $\\mathcal{Q}$\n", + "\n", + "$\\omega^*$는 VI 손실에 대한 결정론적 매개변수의 최대 가능 값을 나타냅니다. 변분 추론에 대한 더 자세한 정보는 [이 설문 조사](https://arxiv.org/abs/1601.00670)를 참조하세요." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pt532xMzBJiR" + }, + "source": [ + "## 예: 라돈 측정에 대한 베이지안 계층적 선형 회귀 분석\n", + "\n", + "라돈은 지면과의 접촉점을 통해 가정으로 유입되는 방사성 가스로, 비흡연자에게 폐암을 유발하는 주요 원인이 되는 발암물질입니다. 라돈 수치는 가정마다 크게 다릅니다.\n", + "\n", + "EPA는 80,000개 가정의 라돈 수준을 연구했습니다. 두 가지 중요한 예측 변수는 다음과 같습니다.\n", + "\n", + "- 측정이 수행된 층(지하에서 더 높은 라돈)\n", + "- 자치주 우라늄 수준(라돈 수준과 양성 상관 관계)\n", + "\n", + "자치주별로 그룹화된 가정 내 라돈 수준을 예측하는 것은 [Gelman 및 Hill (2006)](http://www.stat.columbia.edu/~gelman/arm/)이 소개한 베이지안 계층적 모델링의 전형적인 문제입니다. 가정의 라돈 측정치를 예측하기 위해 계층적 선형 모델을 구축할 것이며 이 계층은 자치주별 가정의 그룹입니다. 미네소타 내 가정의 라돈 수치에 대한 위치(자치주)의 효과에 대한 신뢰 곡선에 관심이 있습니다. 이 효과를 분리하기 위해, 층 및 우라늄 수준의 효과 또한 모델에 포함됩니다. 추가로, 자치주별로 측정이 수행된 보통의 층에 해당하는 맥락과 관련된 효과를 포함하여 측정이 수행된 층의 자치주에 변화가 있다면, 이는 자치주 효과로 인한 것이 아닙니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "i00BTGk5tiwe" + }, + "outputs": [ + + ], + "source": [ + "!pip3 install -q tf-nightly tfp-nightly" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "H9omoz32_Y9F" + }, + "outputs": [ + + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import seaborn as sns\n", + "import tensorflow as tf\n", + "import tensorflow_datasets as tfds\n", + "import tensorflow_probability as tfp\n", + "import warnings\n", + "\n", + "tfd = tfp.distributions\n", + "tfb = tfp.bijectors\n", + "\n", + "plt.rcParams['figure.facecolor'] = '1.'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "BFKYEEfY1FhB" + }, + "outputs": [ + + ], + "source": [ + "# Load the Radon dataset from `tensorflow_datasets` and filter to data from\n", + "# Minnesota.\n", + "dataset = tfds.as_numpy(\n", + " tfds.load('radon', split='train').filter(\n", + " lambda x: x['features']['state'] == 'MN').batch(10**9))\n", + "\n", + "# Dependent variable: Radon measurements by house.\n", + "dataset = next(iter(dataset))\n", + "radon_measurement = dataset['activity'].astype(np.float32)\n", + "radon_measurement[radon_measurement <= 0.] = 0.1\n", + "log_radon = np.log(radon_measurement)\n", + "\n", + "# Measured uranium concentrations in surrounding soil.\n", + "uranium_measurement = dataset['features']['Uppm'].astype(np.float32)\n", + "log_uranium = np.log(uranium_measurement)\n", + "\n", + "# County indicator.\n", + "county_strings = dataset['features']['county'].astype('U13')\n", + "unique_counties, county = np.unique(county_strings, return_inverse=True)\n", + "county = county.astype(np.int32)\n", + "num_counties = unique_counties.size\n", + "\n", + "# Floor on which the measurement was taken.\n", + "floor_of_house = dataset['features']['floor'].astype(np.int32)\n", + "\n", + "# Average floor by county (contextual effect).\n", + "county_mean_floor = []\n", + "for i in range(num_counties):\n", + " county_mean_floor.append(floor_of_house[county == i].mean())\n", + "county_mean_floor = np.array(county_mean_floor, dtype=log_radon.dtype)\n", + "floor_by_county = county_mean_floor[county]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "EU9ieWyOjddQ" + }, + "source": [ + "회귀 모델은 다음과 같이 지정됩니다.\n", + "\n", + "$\\newcommand{\\Normal}{\\operatorname{\\sf Normal}}$ \\begin{align*} &\\text{uranium_weight} \\sim \\Normal(0, 1) \\ &\\text{county_floor_weight} \\sim \\Normal(0, 1) \\ &\\text{for } j = 1\\ldots \\text{num_counties}:\\ &\\quad \\text{county_effect}*j \\sim \\Normal (0, \\sigma_c)\\ &\\text{for } i = 1\\ldots n:\\ &\\quad \\mu_i = ( \\ &\\quad\\quad \\text{bias} \\ &\\quad\\quad + \\text{county_effect}*{\\text{county}_i} \\ &\\quad\\quad +\\text{log_uranium}_i \\times \\text{uranium_weight} \\ &\\quad\\quad +\\text{floor_of_house}*i \\times \\text{floor_weight} \\ &\\quad\\quad +\\text{floor_by_county}*{\\text{county}_i} \\times \\text{county_floor_weight} ) \\ &\\quad \\text{log_radon}_i \\sim \\Normal(\\mu_i, \\sigma_y) \\end{align*} 여기서 $i$는 관측을 인덱싱하고 $\\text{context}_i$는 $i$번째 관찰이 수행된 자치주입니다.\n", + "\n", + "자치주 수준의 무작위 효과를 사용해 지리적 변화를 포착합니다. 매개변수 `uranium_weight` 및 `county_floor_weight`는 확률적으로 모델링 되며 `floor_weight` 및 상수 `bias`는 결정론적입니다. 이러한 모델링 선택은 대부분 임의적이며 합리적인 복잡성의 확률론적 모델에 대한 VI를 입증하기 위한 목적으로 이루어졌습니다. 라돈 데이터세트를 사용한 TFP 내 고정 및 무작위 효과를 사용하는 다층 모델링의 더욱 철저한 논의는, [다층 모델링 프라이머](https://github.com/tensorflow/probability/blob/main/tensorflow_probability/examples/jupyter_notebooks/Multilevel_Modeling_Primer.ipynb) 및 [변분 추론을 사용한 일반화된 선형 혼합 효과 모델 피팅](https://github.com/tensorflow/probability/blob/main/tensorflow_probability/examples/jupyter_notebooks/Linear_Mixed_Effects_Model_Variational_Inference.ipynb)을 참조합니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "awL6fCUh6OCF" + }, + "outputs": [ + + ], + "source": [ + "# Create variables for fixed effects.\n", + "floor_weight = tf.Variable(0.)\n", + "bias = tf.Variable(0.)\n", + "\n", + "# Variables for scale parameters.\n", + "log_radon_scale = tfp.util.TransformedVariable(1., tfb.Exp())\n", + "county_effect_scale = tfp.util.TransformedVariable(1., tfb.Exp())\n", + "\n", + "# Define the probabilistic graphical model as a JointDistribution.\n", + "@tfd.JointDistributionCoroutineAutoBatched\n", + "def model():\n", + " uranium_weight = yield tfd.Normal(0., scale=1., name='uranium_weight')\n", + " county_floor_weight = yield tfd.Normal(\n", + " 0., scale=1., name='county_floor_weight')\n", + " county_effect = yield tfd.Sample(\n", + " tfd.Normal(0., scale=county_effect_scale),\n", + " sample_shape=[num_counties], name='county_effect')\n", + " yield tfd.Normal(\n", + " loc=(log_uranium * uranium_weight + floor_of_house* floor_weight\n", + " + floor_by_county * county_floor_weight\n", + " + tf.gather(county_effect, county, axis=-1)\n", + " + bias),\n", + " scale=log_radon_scale[..., tf.newaxis],\n", + " name='log_radon') \n", + "\n", + "# Pin the observed `log_radon` values to model the un-normalized posterior.\n", + "target_model = model.experimental_pin(log_radon=log_radon)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UlkQTJSlkjJ1" + }, + "source": [ + "## 표현적 대체 사후 확률\n", + "\n", + "다음으로 다음과 같은 두 가지 다른 유형의 대체 사후 확률로 VI를 사용하여 무작위 효과의 사후 확률 분포를 추정합니다.\n", + "\n", + "- 블럭화 행렬 변환에 의해 유도되는 공분산 구조를 갖는 제한된 다변량 정규 분포입니다.\n", + "- [역 자기 회귀성 유동](https://arxiv.org/abs/1606.04934)에 의해 변환된 다변량 표준 정규 분포는 사후 확률의 지원과 일치하도록 분할되고 재구성됩니다." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3QG0scmDcdTw" + }, + "source": [ + "### 다변량 정규 대체 사후 확률" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "K8soBr2oBHSV" + }, + "source": [ + "이 대체 사후 확률을 구축하기 위해 훈련 가능한 선형 연산자가 사후 확률의 구성 요소 중 상관관계를 유도하는 데 사용됩니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "sJuvC5ykBAiK" + }, + "outputs": [ + + ], + "source": [ + "# Determine the `event_shape` of the posterior, and calculate the size of each\n", + "# `event_shape` component. These determine the sizes of the components of the\n", + "# underlying standard Normal distribution, and the dimensions of the blocks in\n", + "# the blockwise matrix transformation.\n", + "event_shape = target_model.event_shape_tensor()\n", + "flat_event_shape = tf.nest.flatten(event_shape)\n", + "flat_event_size = tf.nest.map_structure(tf.reduce_prod, flat_event_shape)\n", + "\n", + "# The `event_space_bijector` maps unconstrained values (in R^n) to the support\n", + "# of the prior -- we'll need this at the end to constrain Multivariate Normal\n", + "# samples to the prior's support.\n", + "event_space_bijector = target_model.experimental_default_event_space_bijector()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "LxLqBKBgsQPg" + }, + "source": [ + "벡터 값 표준 정규 구성 요소로 해당 이전 구성 요소에 의해 크기가 결정되는 `JointDistribution`을 구성합니다. 구성요소는 벡터 값이어야 선형 연산자로 변형될 수 있습니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "0ceaCfU8sPjg" + }, + "outputs": [ + + ], + "source": [ + "base_standard_dist = tfd.JointDistributionSequential(\n", + " [tfd.Sample(tfd.Normal(0., 1.), s) for s in flat_event_size])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uu0d8uWS4luv" + }, + "source": [ + "훈련 가능한 블록화 하위 삼각형 선형 연산자를 구축합니다. 이를 표준 정규 분포에 적용하여 (훈련 가능한) 블록화 확률 변형에 구현하고 사후 확률의 연관 구조를 유도하겠습니다.\n", + "\n", + "블록화 선형 연산자에서, 훈련 가능한 완전 행렬 블록은 사후 확률의 두 구성 요소 사이의 완전 공분산을 나타냅니다. 반면 0 블록(또는 `None`)은 독립성을 나타냅니다. 대각선의 블록은 하위 삼각형 또는 대각선 행렬이므로, 전체 블록 구조는 하위 삼각형 행렬을 나타냅니다.\n", + "\n", + "이 bijector를 기저 분포 결과에 적용하면 평균 0 및 (숄레스키 분해된) 공분산이 하위 삼각형 블록 행렬과 동일한 다변량 정규 분포가 됩니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "dUCks9qg6nU2" + }, + "outputs": [ + + ], + "source": [ + "operators = (\n", + " (tf.linalg.LinearOperatorDiag,), # Variance of uranium weight (scalar).\n", + " (tf.linalg.LinearOperatorFullMatrix, # Covariance between uranium and floor-by-county weights.\n", + " tf.linalg.LinearOperatorDiag), # Variance of floor-by-county weight (scalar).\n", + " (None, # Independence between uranium weight and county effects.\n", + " None, # Independence between floor-by-county and county effects.\n", + " tf.linalg.LinearOperatorDiag) # Independence among the 85 county effects.\n", + " )\n", + "\n", + "block_tril_linop = (\n", + " tfp.experimental.vi.util.build_trainable_linear_operator_block(\n", + " operators, flat_event_size))\n", + "scale_bijector = tfb.ScaleMatvecLinearOperatorBlock(block_tril_linop)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dHI0bziq44od" + }, + "source": [ + "선형 연산자를 표준 정규 분포에 적용한 후, 복수 `Shift` 평균이 0이 아닌 값을 취하도록 bijector를 적용합니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "ceS386lN448r" + }, + "outputs": [ + + ], + "source": [ + "loc_bijector = tfb.JointMap(\n", + " tf.nest.map_structure(\n", + " lambda s: tfb.Shift(\n", + " tf.Variable(tf.random.uniform(\n", + " (s,), minval=-2., maxval=2., dtype=tf.float32))),\n", + " flat_event_size))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gLO_8C0_Hd7f" + }, + "source": [ + "규모 및 위치 bijector를 사용해 표준 정규 분포를 변환하여 얻은 다변량 정규 분포의 결과는 이전의 분포와 일치하도록 재형상 및 재구성되고 최종적으로 이전의 분포의 지지에 제한되어야 합니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "PnnU3lJ7H-pj" + }, + "outputs": [ + + ], + "source": [ + "# Reshape each component to match the prior, using a nested structure of\n", + "# `Reshape` bijectors wrapped in `JointMap` to form a multipart bijector.\n", + "reshape_bijector = tfb.JointMap(\n", + " tf.nest.map_structure(tfb.Reshape, flat_event_shape))\n", + "\n", + "# Restructure the flat list of components to match the prior's structure\n", + "unflatten_bijector = tfb.Restructure(\n", + " tf.nest.pack_sequence_as(\n", + " event_shape, range(len(flat_event_shape))))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HK3n0iqc5Ei3" + }, + "source": [ + "자, 이제, 모든 것을 합쳐서, 훈련 가능한 bijector를 함께 묶고, 기본 표준 정규 분포에 적용하여 대체 사후 확률을 구성합니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "xlrIbELO5EWR" + }, + "outputs": [ + + ], + "source": [ + "surrogate_posterior = tfd.TransformedDistribution(\n", + " base_standard_dist,\n", + " bijector = tfb.Chain( # Note that the chained bijectors are applied in reverse order\n", + " [\n", + " event_space_bijector, # constrain the surrogate to the support of the prior\n", + " unflatten_bijector, # pack the reshaped components into the `event_shape` structure of the posterior\n", + " reshape_bijector, # reshape the vector-valued components to match the shapes of the posterior components\n", + " loc_bijector, # allow for nonzero mean\n", + " scale_bijector # apply the block matrix transformation to the standard Normal distribution\n", + " ]))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bVmf3qld5oPP" + }, + "source": [ + "다변량 정규 대체 사후 확률을 훈련합니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "J5c5mhh-F9l-" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Multivariate Normal surrogate posterior ELBO: -1065.705322265625\n" + ] + }, + { + "data": { + "image/png": "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\neBARUY/9f4IYoj+gmvdcAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [ + + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "optimizer = tf.optimizers.Adam(learning_rate=1e-2)\n", + "mvn_loss = tfp.vi.fit_surrogate_posterior(\n", + " target_model.unnormalized_log_prob,\n", + " surrogate_posterior,\n", + " optimizer=optimizer,\n", + " num_steps=10**4,\n", + " sample_size=16,\n", + " jit_compile=True)\n", + "\n", + "mvn_samples = surrogate_posterior.sample(1000)\n", + "mvn_final_elbo = tf.reduce_mean(\n", + " target_model.unnormalized_log_prob(*mvn_samples)\n", + " - surrogate_posterior.log_prob(mvn_samples))\n", + "\n", + "print('Multivariate Normal surrogate posterior ELBO: {}'.format(mvn_final_elbo))\n", + "\n", + "plt.plot(mvn_loss)\n", + "plt.xlabel('Training step')\n", + "_ = plt.ylabel('Loss value')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_Wh2eps0fQCZ" + }, + "source": [ + "훈련된 대체 사후 확률은 TFP 분포이기 때문에, 샘플을 얻을 수 있고 처리하여 매개변수를 위한 사후 확률 신뢰 구간을 생성할 수 있습니다.\n", + "\n", + "아래 상자 그림은 두 개의 가장 큰 자치주의 자치주 효과와 토양 우라늄 측정 및 자치주별 평균 층의 회귀 가중치에 대한 50% 및 95%의 [신뢰 구간](https://en.wikipedia.org/wiki/Credible_interval)을 보여줍니다. 다른 변수를 고려한 후, 자치주 효과에 대한 사후 확률 신뢰 구간은 낮은 라돈 수준과 관련된 세인트루이스 자치주의 위치를 나타내며 헤너핀 자치주의 위치 효과는 중립에 가깝습니다.\n", + "\n", + "회귀 가중치에 대한 사후 확률 신뢰 구간은 높은 수준의 토양 우라늄이 더욱 높은 라돈 수준과 관련이 있음을 보여주며, 더욱 높은 층에서 측정이 이루어진 자치주(아마 가정에 지하가 없었기 때문에)는 라돈 수준이 더 높은 경향이 있으며, 이는 토양 특성과 건축된 건축물의 유형에 대한 영향과 관련이 있을 수 있습니다.\n", + "\n", + "층의 (결정론적) 계수가 음수이기 때문에 예상대로 낮은 층의 라돈 수치가 더 높다는 것을 알 수 있다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "600DiJ8xfQf-" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Bias is: 1.40\n", + "Floor fixed effect is: -0.72\n" + ] + }, + { + "data": { + "image/png": "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\n9NCWq6ursWjRIgwYMAC9e/fG+PHjUVVVpbNysTF/C1pz4wdXBweHJuXmjh0cHIxDhw7h559/hr+/\nP8LCwnD48GEcOXIECoUCbm5uBvWZRiUlJfDy8oJEItE+5u3trVOntT5DXdvevXu1f/P37t3b5PnW\nPk+1dg6+uS/ed9992gWoPv74Y+3jN/5e3niMls67UVFR2mNt3LgRRUVF6Nu3L1xcXPS+jxvjdHJy\ngqurq8GfC2/++wCgxX4SERGBXbt2AbiejDaXhDs4OECpVOLw4cP45ptvEBwcjDFjxuD777/XSWjP\nnDmDTz/9tMlF59LSUr3v9caf5819Xt/7scY+z4RWj9GjR6NHjx56O3MjmUyGM2fOaMt//vmn9uZ5\nR0dHVFdXa587e/asyTE1doZPP/0Uo0ePhpeXl9563t7eWL16tc4H0erqajzyyCMGvY63tzfef/99\nnfY1NTUYM2YMvL29cerUKb3tbjxBNicgIAB//PGH3ufs7e3xt7/9DQEBAfjtt98MPqYhZDIZKisr\ndT60//nnn9qfoTH/X4MGDUJSUhLOnTuHZ599Fg899BCuXr0K4PoCBwUFBRg+fHi7xE262C87v1+2\nFI8p76c5bm5ucHBwwO+//6497sWLF3VOrhcuXND2OUD3/9hYx48fZ3+1cv37928yqnL69GmdD6s3\n94M33ngDJ0+eRFZWFi5duoRvvvkGACCEMPr1O+LvSqMxY8bg5MmT2LNnD4KDgzF06FD8+eef+Oqr\nr7QfbA3pM42kUinUarXO+ywqKjI4nvY6J5P1au3zVEvnYKDp71BaWpp2AaobLwjf+Ht58zGaO+/G\nx8drj/X888/D29sblZWVemfh3Bzn1atXUVFRAS8vL+0F07b2a339ZM6cOUhJScGxY8dw/PhxvaPf\njYKDg/Gf//wHR48eRVBQEIKDg7F//35kZ2dj/PjxAK6fgx977DGdc/DVq1f1jr5KpVIUFxdry121\nzzOh1aNPnz54+eWXsWTJEuzduxfV1dWoq6tDWloannnmGQDAI488gldeeQXl5eU4f/48Xn75Ze02\nAcOHD8fvv/+O3NxcXLt2DevWrTPq9T09PfG///1P57EHH3wQP//8MzZv3oy5c+c223bhwoWIj49H\nVlYWhBC4evUqvvrqqyYjMM2JiorCq6++it9//x0AcPHiRe22IVOmTMHZs2fx9ttv46+//sLly5eR\n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\nsIZe+cFuNQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [ + + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "st_louis_co = 69 # Index of St. Louis, the county with the most observations.\n", + "hennepin_co = 25 # Index of Hennepin, with the second-most observations.\n", + "\n", + "def pack_samples(samples):\n", + " return {'County effect (St. Louis)': samples.county_effect[..., st_louis_co],\n", + " 'County effect (Hennepin)': samples.county_effect[..., hennepin_co],\n", + " 'Uranium weight': samples.uranium_weight,\n", + " 'Floor-by-county weight': samples.county_floor_weight}\n", + "\n", + "def plot_boxplot(posterior_samples):\n", + " fig, axes = plt.subplots(1, 4, figsize=(16, 4))\n", + "\n", + " # Invert the results dict for easier plotting.\n", + " k = list(posterior_samples.values())[0].keys()\n", + " plot_results = {\n", + " v: {p: posterior_samples[p][v] for p in posterior_samples} for v in k}\n", + " for i, (var, var_results) in enumerate(plot_results.items()):\n", + " sns.boxplot(data=list(var_results.values()), ax=axes[i],\n", + " width=0.18*len(var_results), whis=(2.5, 97.5))\n", + " # axes[i].boxplot(list(var_results.values()), whis=(2.5, 97.5))\n", + " axes[i].title.set_text(var)\n", + " fs = 10 if len(var_results) < 4 else 8\n", + " axes[i].set_xticklabels(list(var_results.keys()), fontsize=fs)\n", + "\n", + "results = {'Multivariate Normal': pack_samples(mvn_samples)}\n", + "\n", + "print('Bias is: {:.2f}'.format(bias.numpy()))\n", + "print('Floor fixed effect is: {:.2f}'.format(floor_weight.numpy()))\n", + "plot_boxplot(results)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WnWb8WSDcjEK" + }, + "source": [ + "### 역 자기 회귀성 유동 대체 사후 확률" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SUHcK4WzJ27o" + }, + "source": [ + "역 자기 회귀성 유동(IAF)은 신경망을 사용하여 분포의 구성요소 중 복합하고 비선형적인 종속성을 포착하는 흐름을 정규화합니다. 다음으로, IAF 대체 사후 확률을 구축하여 이 높은 용량, 더 유동적인 모델이 제한된 다변량 정규 모델을 능가하는지 확인합니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "R0FFLYnaGRrc" + }, + "outputs": [ + + ], + "source": [ + "# Build a standard Normal with a vector `event_shape`, with length equal to the\n", + "# total number of degrees of freedom in the posterior.\n", + "base_distribution = tfd.Sample(\n", + " tfd.Normal(0., 1.), sample_shape=[tf.reduce_sum(flat_event_size)])\n", + "\n", + "# Apply an IAF to the base distribution.\n", + "num_iafs = 2\n", + "iaf_bijectors = [\n", + " tfb.Invert(tfb.MaskedAutoregressiveFlow(\n", + " shift_and_log_scale_fn=tfb.AutoregressiveNetwork(\n", + " params=2, hidden_units=[256, 256], activation='relu')))\n", + " for _ in range(num_iafs)\n", + "]\n", + "\n", + "# Split the base distribution's `event_shape` into components that are equal\n", + "# in size to the prior's components.\n", + "split = tfb.Split(flat_event_size)\n", + "\n", + "# Chain these bijectors and apply them to the standard Normal base distribution\n", + "# to build the surrogate posterior. `event_space_bijector`,\n", + "# `unflatten_bijector`, and `reshape_bijector` are the same as in the\n", + "# multivariate Normal surrogate posterior.\n", + "iaf_surrogate_posterior = tfd.TransformedDistribution(\n", + " base_distribution,\n", + " bijector=tfb.Chain([\n", + " event_space_bijector, # constrain the surrogate to the support of the prior\n", + " unflatten_bijector, # pack the reshaped components into the `event_shape` structure of the prior\n", + " reshape_bijector, # reshape the vector-valued components to match the shapes of the prior components\n", + " split] + # Split the samples into components of the same size as the prior components\n", + " iaf_bijectors # Apply a flow model to the Tensor-valued standard Normal distribution\n", + " ))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "j4pzY9dPrBny" + }, + "source": [ + "IAF 대체 사후 확률을 훈련합니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "WyQayFhIz1Bq" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "IAF surrogate posterior ELBO: -1065.3663330078125\n" + ] + }, + { + "data": { + "image/png": "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\nuO222wzDGN4NyEbKhg0bjJ///OeGYRhGe3u70dDQMGbH7XK5jIiICKOlpcUwDMO48847jRdffHHM\njTfQm+nl5+cb3/72tw3DMIw9e/YYWVlZfteo8PjMoUOHjJtuusn7/ZNPPmk8+eSTI1jR0MrIyDB+\n97vfGQsXLjRqa2sNwzgfMAsDZSBBAAAHZklEQVQXLjQM4+Lx3nTTTcahQ4eM2tpaIyoqytv+n//5\nn0ZOTs7wFj9INTU1xsqVK40333zTGx5jebyGYRhnzpwxIiIijJ6engvax+q4XS6XYbfbjdOnTxud\nnZ3GbbfdZhw4cGBMjreqquqC8BjKMX5+jGEYRmdnpzF9+vSLfod80WWrz/S3IdVYUF1dzeHDh1m2\nbNmY3pDr/vvv50c/+hFm899/rcfyeAGOHz/OzJkz2bRpE9deey3f+ta3aG5uHrPjnjNnDg8//DDz\n5s3DZrMxZcoUbrrppjE73i8ayjF+sY/VamXKlCmcPn3ar3oUHp8x/Nx46nJx7tw5MjMzeeaZZ5g8\neXK/x/U3/svl5/L6668TFhY26FsUL/fxfq6rq4v333+f3NxcDh8+zMSJEwecr7vcx93Q0EBRURFV\nVVXU1tbS3NzM7t27+z3+ch/vYFzKGIdi/AqPz/S3IdXlrLOzk8zMTO666y5uv/12IPAbco2Ud999\nl9dee42IiAjWrl3LW2+9xfr168fseD9nt9ux2+0sW7YMgDvuuIP3339/zI774MGDREZGMnPmTIKC\ngrj99ts5dOjQmB3vFw3lGL/Yp6urizNnzjBt2jS/6lF4fGbp0qU4nU6qqqro6OigsLCQjIyMkS7r\nkhmGwT333EN0dDQPPvigt32sbsiVl5eHy+WiurqawsJCVq5cye7du8fseD83a9Ys5s6dy9/+9jcA\n3nzzTWJiYsbsuOfNm0dJSQktLS0YhsGbb75JdHT0mB3vFw3lGL/4Wq+88gorV670/8zLrxmSMe6N\nN94wFixYYMyfP9944oknRrqcf8g777xjAEZ8fLyxePFiY/HixcYbb7xhnDp1yli5cqXhcDiMlStX\nGqdPn/b2eeKJJ4z58+cbCxcuvODOk/fee8+IjY015s+fb3z3u9/1e2JtuP3+97/3TphfCeM9fPiw\nsWTJEiM+Pt5Ys2aNUV9fP6bH/dhjjxlRUVFGbGyssX79eqOtrW3MjXft2rXGrFmzDKvVasyZM8d4\n/vnnh3SMra2txh133GFcc801xtKlS41jx475XaNWmIuIiN902UpERPym8BAREb8pPERExG8KDxER\n8ZvCQ0RE/KbwkCvK6dOnSUxMJDExkVmzZjFnzhzv9x0dHYN6jU2bNnnXVfQnPz+fX/3qV0NRcp9e\nffVVPv7444C9vogvulVXrlhbt25l0qRJPPzwwxe0G+cfGHrBM7JGm/Xr13PHHXfwta99baRLkSvU\n6P3XITKMPvnkE+Li4vjOd75DUlISHo+HnJwckpOTiY2N5fHHH/cee/3111NRUUFXVxdTp05ly5Yt\nLF68mNTUVO/D6r7//e/zzDPPeI/fsmULKSkpREVFcejQIQCam5vJzMxk8eLFrFu3juTkZCoqKi6q\n7ZFHHiEmJoaEhAS+973v8c4777B//34eeOABEhMTqa6uxul0cvPNN7NkyRKWL1/O0aNHgfMhk5ub\ny5e//GUWLlzIb3/720D/KOUKYR3pAkRGiyNHjvDiiy/ys5/9DIBt27Yxbdo0urq6WLFiBXfccQcx\nMTEX9Dlz5gxf+cpX2LZtGw8++CC/+MUv2LJly0WvbRgGpaWlvPbaazz++OMUFxfz05/+lFmzZvHr\nX/+aDz74gKSkpIv6nThxgv3791NZWYnJZKKxsZGpU6dy6623XnDmsWLFCp5//nmuueYa3n33Xf7l\nX/6F3/3ud8D5jcH+8Ic/4HQ6ufHGG/nkk08ICQkZ6h+fXGF05iHymWuuuYalS5d6v9+zZw9JSUkk\nJSXx0UcfceTIkYv6jB8/nvT0dACWLFnS745snz+Y8ovH/PGPf2Tt2rUALF68mNjY2Iv6TZs2DbPZ\nzL333svevXuZOHHiRcc0NjZSUlJCZmYmiYmJfPe736W2ttb751lZWZjNZqKiopg7dy5Op3NwPxCR\nAejMQ+QzX/xgdjqdbN++ndLSUqZOncr69etpa2u7qE9wcLD3a4vFQldXV5+v/fn/9L94zGCmG4OC\ngigrK+O//uu/KCwsZMeOHd4zis8ZhsGMGTP6vOQFFz9q+3J99LiMLjrzEOlDU1MToaGhTJ48GY/H\nc8G+0EPl+uuv56WXXgLgr3/9a59nNmfPnqWpqYnVq1fz9NNPc/jwYQBCQ0M5e/YsAFdddRU2m429\ne/cC0NPTwwcffOB9jZdffhnDMDh69Cg1NTUsWLBgyMciVx6deYj0ISkpiZiYGOLi4pg/fz5f+tKX\nhvw9/vVf/5UNGzaQkJBAUlIScXFxTJky5YJjzpw5w+233057ezs9PT38+Mc/BmDdunV8+9vf5qmn\nnmLfvn0UFhaSm5vL1q1b6ejoYP369SxevBgAh8PB8uXLOXnyJAUFBRecLYlcKt2qKzJCurq66Orq\nYty4cTidTm666SacTidW69D9n0639Eqg6MxDZIScO3eOVatW0dXVhWEYPPfcc0MaHCKBpDMPERHx\nmybMRUTEbwoPERHxm8JDRET8pvAQERG/KTxERMRvCg8REfHb/wd/ug2lN6HG5gAAAABJRU5ErkJg\ngg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [ + + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "optimizer=tf.optimizers.Adam(learning_rate=1e-2)\n", + "iaf_loss = tfp.vi.fit_surrogate_posterior(\n", + " target_model.unnormalized_log_prob,\n", + " iaf_surrogate_posterior,\n", + " optimizer=optimizer,\n", + " num_steps=10**4,\n", + " sample_size=4,\n", + " jit_compile=True)\n", + "\n", + "iaf_samples = iaf_surrogate_posterior.sample(1000)\n", + "iaf_final_elbo = tf.reduce_mean(\n", + " target_model.unnormalized_log_prob(*iaf_samples)\n", + " - iaf_surrogate_posterior.log_prob(iaf_samples))\n", + "print('IAF surrogate posterior ELBO: {}'.format(iaf_final_elbo))\n", + "\n", + "plt.plot(iaf_loss)\n", + "plt.xlabel('Training step')\n", + "_ = plt.ylabel('Loss value')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tzrbAezxPLeB" + }, + "source": [ + "IAF 대체 사후 확률에 대한 신뢰 구간은 제한된 다변량 정규의 신뢰 구간과 유사한 것으로 보입니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "QmKl4G1BGIIl" + }, + "outputs": [ + { + "data": { + "image/png": "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\niEgXCoWiXfaTn3+rbn+++iSe7u0WDxERSYuJK5GZOHDgABQKBXx9fQEAU6dORWpqqlrymZqaimnT\npsHKygrDhg3D9evXUVRUhIKCgha3JSLSxYsvvtgu+4mLiwMArF27tl32Z2nO37bB6kNtb60GgOKK\nuhFl7va1esXRV68oiIjqMHElMhOFhYXw9vZWlb28vJCTk9NincLCQp22BYCkpCQkJSUBAEpKStr7\nIxARUTtor1bmqvx8AEDn3m3fX992jEdKug6n+e233zBs2DD8+9//xhNPPGHkKHVTWFgIm4obenfn\nbw82FaUoLKyROgzqIJi4NkPf8TntMTanPg6OzyFdaFov2crKSqc6umwLADExMYiJiQEABAUFtTVU\nMgOFhYUov6V/i057OHfLBg6FhVKHQWQy2OrdvnQdTqNUKvHaa69hzJgxEkVKZN6YuGrQHk8G22ds\nDsDxOaQrLy8vXLhwQVW+ePEiPDw8dKpTVVXV4rZERESWSJehOACwbt06TJ48Gb/99psUYerM09MT\nl+/aorJfpNShwO7PNHh6soGGdMPEVYP2eFLJp5T603d8TnuMzamPoyOMzwkODkZeXh7Onj0LT09P\npKSkYNu2bWp1oqKisH79ekydOhU5OTno3r075HI5XF1dW9yWqCFPT0/crSnCogdvSh0KVh/qhs6e\nnlKHQURmStehON988w1+/PFHrYkrh9wQwF5LbcXElUxSe7Qyt8fYHKDjjM+xtbXF+vXrMWbMGCiV\nSsyYMQP+/v5ITEwEAMTGxiIyMhJpaWlQKBSwt7fHpk2btG5rqkxlfA7H5hARmT9dhtO89NJLWLNm\nDWxsbLTui0NuiNqOiSuZJLZ6t01kZCQiI9W7/sTGxqr+bWVlhQ0bNui8LRERkaXTZShObm4upk6d\nCgC4evUq0tLSYGtri8cff9yosVLHwF5LbcPElYg6HFMZn8OxOURE5k+XoThnz55V/Xv69OkYN24c\nk1aidsbElYiIiIioGboMxSEiw2PiSkRERESkRUtDcRravHmzESIisjzWUgdAREREREREpA0TVyIi\nIiIiIjJpTFyJiIiIiIjIpDFxJSIiIiIiIpPGxJWIiIiIiIhMGhNXIiIiIiIiMmlMXImIiIiIiMik\nMXElIiIiIiIik8bElYiIiIiIiEwaE1ciIiIiIiIyaUxciYiIJJaRkYH7778fCoUCCQkJGutkZ2cj\n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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [ + + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "results['IAF'] = pack_samples(iaf_samples)\n", + "plot_boxplot(results)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "IWKqLYPOZOO_" + }, + "source": [ + "### 기준선: 평균장 대체 사후 확률\n", + "\n", + "VI 대체 사후 확률은 종종 훈련 가능한 평균 및 분신이 있는 평균장(독립) 정규 분포로 추정되며, 이는 bijective 변환으로 선행의 지원에 제한됩니다. 두 개의 더욱 표현적인 대체 사후 확률에 더해 다변량 정규 대체 사후 확률로 동일한 공식을 사용해 평균장 대체 사후 확률을 정의합니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "GoPeLGAjZLbS" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mean-field surrogate posterior ELBO: -1065.7652587890625\n" + ] + }, + { + "data": { + "image/png": "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\nAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [ + + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "# A block-diagonal linear operator, in which each block is a diagonal operator,\n", + "# transforms the standard Normal base distribution to produce a mean-field\n", + "# surrogate posterior.\n", + "operators = (tf.linalg.LinearOperatorDiag,\n", + " tf.linalg.LinearOperatorDiag,\n", + " tf.linalg.LinearOperatorDiag)\n", + "block_diag_linop = (\n", + " tfp.experimental.vi.util.build_trainable_linear_operator_block(\n", + " operators, flat_event_size))\n", + "mean_field_scale = tfb.ScaleMatvecLinearOperatorBlock(block_diag_linop)\n", + "\n", + "mean_field_loc = tfb.JointMap(\n", + " tf.nest.map_structure(\n", + " lambda s: tfb.Shift(\n", + " tf.Variable(tf.random.uniform(\n", + " (s,), minval=-2., maxval=2., dtype=tf.float32))),\n", + " flat_event_size))\n", + "\n", + "mean_field_surrogate_posterior = tfd.TransformedDistribution(\n", + " base_standard_dist,\n", + " bijector = tfb.Chain( # Note that the chained bijectors are applied in reverse order\n", + " [\n", + " event_space_bijector, # constrain the surrogate to the support of the prior\n", + " unflatten_bijector, # pack the reshaped components into the `event_shape` structure of the posterior\n", + " reshape_bijector, # reshape the vector-valued components to match the shapes of the posterior components\n", + " mean_field_loc, # allow for nonzero mean\n", + " mean_field_scale # apply the block matrix transformation to the standard Normal distribution\n", + " ]))\n", + "\n", + "optimizer=tf.optimizers.Adam(learning_rate=1e-2)\n", + "mean_field_loss = tfp.vi.fit_surrogate_posterior(\n", + " target_model.unnormalized_log_prob,\n", + " mean_field_surrogate_posterior,\n", + " optimizer=optimizer,\n", + " num_steps=10**4,\n", + " sample_size=16,\n", + " jit_compile=True)\n", + "\n", + "mean_field_samples = mean_field_surrogate_posterior.sample(1000)\n", + "mean_field_final_elbo = tf.reduce_mean(\n", + " target_model.unnormalized_log_prob(*mean_field_samples)\n", + " - mean_field_surrogate_posterior.log_prob(mean_field_samples))\n", + "print('Mean-field surrogate posterior ELBO: {}'.format(mean_field_final_elbo))\n", + "\n", + "plt.plot(mean_field_loss)\n", + "plt.xlabel('Training step')\n", + "_ = plt.ylabel('Loss value')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qv3VzGvMX83Q" + }, + "source": [ + "이 경우, 표준장 대체 사후 확률은 더욱 표현적인 대체 사후 확률에 유사한 결과를 제공하므로, 이 더욱 단순한 모델이 추론 작업에 적합할 수 있음을 나타냅니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "3_P2nrNSGiG5" + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [ + + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "results['Mean Field'] = pack_samples(mean_field_samples)\n", + "plot_boxplot(results)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6FtKcJUyTToh" + }, + "source": [ + "### Ground truth: 헤밀토니언 몬테 카를로(HMC)\n", + "\n", + "대체 사후 확률의 결과와 비교를 위해 HMC를 사용하여 실제 사후 확률에서 \"ground truth\" 샘플을 생성합니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "bwTmpfxuC_A4" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Acceptance rate is 0.9008625149726868\n" + ] + } + ], + "source": [ + "num_chains = 8\n", + "num_leapfrog_steps = 3\n", + "step_size = 0.4\n", + "num_steps=20000\n", + "\n", + "flat_event_shape = tf.nest.flatten(target_model.event_shape)\n", + "enum_components = list(range(len(flat_event_shape)))\n", + "bijector = tfb.Restructure(\n", + " enum_components,\n", + " tf.nest.pack_sequence_as(target_model.event_shape, enum_components))(\n", + " target_model.experimental_default_event_space_bijector())\n", + "\n", + "current_state = bijector(\n", + " tf.nest.map_structure(\n", + " lambda e: tf.zeros([num_chains] + list(e), dtype=tf.float32),\n", + " target_model.event_shape))\n", + "\n", + "hmc = tfp.mcmc.HamiltonianMonteCarlo(\n", + " target_log_prob_fn=target_model.unnormalized_log_prob,\n", + " num_leapfrog_steps=num_leapfrog_steps,\n", + " step_size=[tf.fill(s.shape, step_size) for s in current_state])\n", + "\n", + "hmc = tfp.mcmc.TransformedTransitionKernel(\n", + " hmc, bijector)\n", + "hmc = tfp.mcmc.DualAveragingStepSizeAdaptation(\n", + " hmc,\n", + " num_adaptation_steps=int(num_steps // 2 * 0.8),\n", + " target_accept_prob=0.9)\n", + "\n", + "chain, is_accepted = tf.function(\n", + " lambda current_state: tfp.mcmc.sample_chain(\n", + " current_state=current_state,\n", + " kernel=hmc,\n", + " num_results=num_steps // 2,\n", + " num_burnin_steps=num_steps // 2,\n", + " trace_fn=lambda _, pkr:\n", + " (pkr.inner_results.inner_results.is_accepted),\n", + " ),\n", + " autograph=False,\n", + " jit_compile=True)(current_state)\n", + "\n", + "accept_rate = tf.reduce_mean(tf.cast(is_accepted, tf.float32))\n", + "ess = tf.nest.map_structure(\n", + " lambda c: tfp.mcmc.effective_sample_size(\n", + " c,\n", + " cross_chain_dims=1,\n", + " filter_beyond_positive_pairs=True),\n", + " chain)\n", + "\n", + "r_hat = tf.nest.map_structure(tfp.mcmc.potential_scale_reduction, chain)\n", + "hmc_samples = pack_samples(\n", + " tf.nest.pack_sequence_as(target_model.event_shape, chain))\n", + "print('Acceptance rate is {}'.format(accept_rate))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GSRQTbT-T07X" + }, + "source": [ + "샘플 추적을 플롯하여 HMC 결과를 타당성 검사합니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "z34B7sa05KX1" + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAz4AAACOCAYAAADw6d0wAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzsnXmcFcXVsJ/uvvu9s2/MMAPIJoiC\nsohoFI2oCSiJy2vUaDSbGpKIid8bjRpJYoz5NMmbL2+iRpNoXBLXxC2gKCCLssi+w8ww+z5zt7lb\nr/X9cYc7DAwwCojBfvzND/t2ddXpququOnXqnJaEEAIbGxsbGxsbGxsbG5sTGPl4C2BjY2NjY2Nj\nY2NjY3OssRUfGxsbGxsbGxsbG5sTHlvxsbGxsbGxsbGxsbE54bEVHxsbGxsbGxsbGxubEx5b8bGx\nsbGxsbGxsbGxOeGxFR8bGxsbGxsbGxsbmxMeW/GxOeFIJpNcdtll5OTk8F//9V8A3HvvvRQWFjJo\n0KBjXv7ChQv58pe/fMzLOZrceuut3H///YdNd+aZZ7Jt27ZPQCIbGxubTxf22PLR+aTGlmHDhvHu\nu+8C8Mtf/pJvfetbHzuv/QkEAuzZsweAm266iXvvvfeo5T3Q+rE5igibzxRDhw4VNTU1mePVq1eL\nL37xiyInJ0fk5eWJKVOmiL/+9a/HXI7p06eLJ5544pjk/fTTT4spU6YIXdeFEELU19cLj8cj2tra\njijfJUuWiMGDBx823aRJk8TKlSszx6+++qqYMGGCyMrKEgUFBeLzn/98pg3mzZsnvvrVrw5Yhpqa\nGgFk7u2T5oUXXhBXXHFF5njJkiVi+vTp/aY93rLa2Nh8cthjy8fHHls+2tjSH0OHDhXvvPPORyrz\n4/SVG2+8Udxzzz0f6Zq9PPnkk+Kcc875WNfaHD1si89nmJUrV/L5z3+e6dOnU1VVRVdXF48++igL\nFiw43qIdEXV1dYwePRqHw5E5LigooLi4+JiX/eGHHxKJRDjrrLMAqKqq4mtf+xq/+c1viEQi1NTU\nMGfOHGT5P/PRmz17NkuWLKGlpeWo5GcYxlHJx8bG5tODPbYcfeyx5ZPHHp9OUI635mXzybLvqtw5\n55wj5syZc8j0jz/+uBgxYoTIy8sTl112mWhqahJC9L86tO/qyd6VjTvuuEPk5uaKYcOGifnz5wsh\nhLj77ruFLMvC7XYLv98vvvvd74o5c+aIH/7wh33KvvTSS8X//M//9CvXjh07xIwZM0ReXp4YPXq0\neOGFF4QQQtx3333C6XQKh8Mh/H6/eOyxx4TH4xGSJAm/3y9uvPFGIYQQK1euFNOmTRM5OTli/Pjx\nYsmSJZm8u7q6xE033SRKS0tFbm6u+NKXviRisViffPx+f6Yu9uVnP/uZ+OY3v5k5fumll8SECRP6\nvYcFCxb0kXX8+PGHagohxKFX5VKplJg7d64oLS0VpaWlYu7cuSKVSgkh+l9pAkRlZaUQou8qVkdH\nh5g1a1ZmpfZzn/ucME0zc92MGTPEU089JYQ49KpcRUWFADL19cEHH4gnn3xSnH322eL2228XeXl5\n4p577hFVVVXiggsuEPn5+aKgoEBcd911IhQKZfKpr68Xl19+uSgsLBT5+fniu9/9bubcX/7yFzFm\nzBiRm5srLr74YlFbW3vYOrSxsTn62GPLjUIIe2wR4tiPLUKkrW9DhgwR+fn54he/+EUfi8++1q5k\nMim++tWvivz8fJGTkyMmT54sWltb++0re2X/wx/+IEaOHCmGDRvW7/3ccsstYsaMGSIQCIjzzjsv\nM+4cqu9u375duN1uIcuy8Pv9Iicn54D6EeLgz8VeOR599FExcuRIkZubK+bMmSMsyzpoHdn0j634\nfEaJx+NClmWxePHig6ZZtGiRKCgoEOvWrROpVEp873vfE+eee64QYmCDk8PhEI8//rgwDEM88sgj\norS0NPOQ7m9iXr16tSgtLc28BDs6OoTX6xWtra0HyBWLxUR5ebn461//KnRdF+vWrRMFBQVi69at\nQogDTfz7byNobGwU+fn54t///rcwTVMsXLhQ5Ofni/b2diGEEDNnzhRXX321CAaDQtM08d577/Wb\nT39cddVV4qGHHsocV1dXC7fbLW6//XaxePFi0d3d3Sf90dyO8JOf/ERMnTpVtLW1ifb2djFt2jRx\n7733CiE+2uB01113iVtuuUVomiY0TRPLli3r83L9/ve/L37wgx98LFmffPJJoSiK+P3vfy90XReJ\nREJUVlaKhQsXilQqJdrb28W5554r5s6dK4QQwjAMMX78eHH77beLWCwmksmkWL58uRBCiH/9619i\nxIgRYvv27ULXdXH//feLadOmDbgubWxsjj722GKPLcd6bNm2bZvw+/1i6dKlIpVKiR/84AdCUZR+\n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\nR+JaEAtwngAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [ + + ] + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\nK7RlUwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [ + + ] + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzwAAACOCAYAAAD0HA0NAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzsnWeYHcWVsN/uvmnu5KwwyhIgiSBA\nIpggbK+FESxebLJNWLAxu4BlDDY24vkMay947TUYDGtjDCJaJIERQhJZQiCUEwqjyTnemZtDx/p+\n9J07M5pRQAiE5X6fBzS3q7r6dHWoc+qcOi0JIQQODg4ODg4ODg4ODg5HIPLhFsDBwcHBwcHBwcHB\nweHzwjF4HBwcHBwcHBwcHByOWByDx8HBwcHBwcHBwcHhiMUxeBwcHBwcHBwcHBwcjlgcg8fBwcHB\nwcHBwcHB4YjFMXgcHBwcHBwcHBwcHI5YHIPH4Yhg+vTprFix4nCLccDk5ORQV1d3QHUlSaKmpuZz\nlsjBwcHBYTic8eXgWLFiBRUVFZnfh7Ifn3vuOebMmZP5fajP49P0ocM/Bo7B43BIGD9+PA0NDQCc\nc845/PWvfx1UvueL71CzY8cOzjnnnM+t/UNNLBZj4sSJn7mdJ598kjPPPHPQtmuvvZYnn3xy2Pp3\n33033/ve9z7zcR0cHBy+KJzx5dNxuMaX/XEg/djQ0IAkSRiGsc963/3ud3nrrbcOSo49Ge6eOlR9\n6PDlwTF4HA47+3uxOXxxCCGwLOtwi+Hg4OBwSHDGlyMP55o6HAyOweNwWJAkiUceeYQpU6YwZcoU\nAObNm8eYMWPIy8vj5JNPZtWqVZn6d999N5deeilXX301ubm5TJ8+nQ0bNmTKx48fzzvvvAPYM1B3\n3XVXpmzP2b/x48fzu9/9juOPP57s7Gyuv/56Ojs7Oe+888jNzeVf/uVfCAaDw8o9e/ZsFi1aBMCH\nH36IJEksXboUgHfeeYcZM2Zk6j7xxBNMnTqVwsJCzj33XBobGwedf5/7vaenh3/9138lLy+PWbNm\ncddddw2ZVXvnnXeYMmUKhYWF3HTTTQgh2LVrFzfeeCMff/wxOTk5FBQU7LPPly9fzr333ssLL7xA\nTk4OJ5xwAmDPbs2fP58zzjgDv99PXV0dCxYsYOrUqeTm5jJx4kQeffTRQW299tprzJgxg7y8PCZN\nmsTy5csBCIfDXH/99YwcOZLRo0dz1113YZrmPuVycHBwOJQ448sXP74AJJNJrr32WgoLC5k2bRrr\n168fVD6wH9etW8fMmTPJy8ujvLycn/zkJwCcffbZABQUFJCTk8PHH3/Mk08+yRlnnMGtt95KUVER\nd99997Dep6VLlzJx4kRKSkr46U9/mpm82zOyYaAXaf78+axatYqbb76ZnJwcbr755iF9GA6Hufrq\nqyktLWXcuHH8+te/zrTdJ8ftt99OYWEhEyZMYNmyZfvtK4cvHsfgcTgkNDQ0MH78+E+1z9///nfW\nrl3Lzp07AZg1axZbtmyht7eXK6+8kksuuYRUKpWpv3jxYi6//HJCoRAXXnhh5sV0MCxatIi3336b\nqqoqXn/9dc477zzuvfdeAoEAlmXx0EMPDbvf7NmzMzHIH3zwARMnTmTlypWZ37Nnz86c27333ssr\nr7xCd3c3Z511FldcccWwbd50001kZ2fT0dHBU089xVNPPTWkzpIlS1i/fj1bt27lxRdf5M0332Tq\n1Kn8+c9/5vTTTycWixEKhQD7BXzttdcOaeOb3/wmd955J5dddhmxWIytW7dmyp555hn+8pe/EI1G\nGTduHGVlZSxZsoRIJMKCBQu49dZb2bRpE2APVFdffTW/+93vCIVCfPDBB5lrf8011+ByuaipqWHz\n5s289dZbQ0IFHBwcHD4Nzvjy5R9fAO655x5qa2upra3lzTffHPZYfcybN4958+YRiUSora3l0ksv\nzZwnQCgUIhaLcfrppwOwdu1aJk6cSFdXF/Pnzx+2zVdffZUNGzawadMmXnvtNZ544om9Hr+P//7v\n/+ass87i4YcfJhaL8fDDDw+pc8sttxAOh6mrq2PlypU8/fTTLFiwIFO+du1ajj76aAKBAD/72c+4\n/vrrEULs99gOXyyOweNw2PjFL35BUVERWVlZAHzve9+juLgYl8vFbbfdhqqq7N69O1P/zDPPZO7c\nuSiKwlVXXTVIYf+03HLLLZSXlzN69GjOOussTj31VE488US8Xi8XXXQRmzdvHna/2bNnDxqAfvGL\nX2R+r1y5MjMgPfroo/ziF79g6tSpuFwu7rzzTrZs2TJoFg7ANE0WLVrEPffcg9/vZ9q0aVxzzTVD\njvvzn/+cgoICxo4dy1e/+lW2bNly0Oc+HNdeey3Tp0/H5XLhdrs5//zzmTRpEpIkMXv2bObMmZOZ\n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\nkO9Y70i8ek9i1nv+FrOeHqcG5HN4rpW/Px/B3+sPEgN/rz9IDEBiIK4v+Xz1jsSr9yRmvScx65x0\naRNCCCGEEEL4LEl4hBBCCCGEED5L/8Mf/vCH3i7E9TBu3DhvF8Gr/L3+IDHw9/qDxAAkBuL6ks9X\n70i8ek9i1nsSs4588h4eIYQQQgghhADp0iaEEEIIIYTwYZLwCCGEEEIIIXyWTyU8H330ESkpKVit\nVtasWePt4nhMUVER06dPJy0tDZvNxgsvvADA+fPnmTlzJiNHjmTmzJlUVVW511m9ejVWq5WUlBQ2\nb97snr5v3z4yMjKwWq08/vjj3Gg9Gp1OJ2PGjGHevHmAf8XgwoULLFmyhNTUVNLS0ti5c6df1R9g\n7dq12Gw20tPTWbZsGU1NTT4fgwceeIDo6GjS09Pd0zxZZ7vdzt13343VaiU3N9dvnr0jeq6nx9b8\n/Hz0ej3vvPNOP5Zu4OlJvLZu3Up2djY2m42bb765n0s48FwtZtXV1cyfP5+srCxsNhuvvfaaF0o5\ncHR2XGhPKcXjjz+O1WolMzOT/fv393MJByDlIxwOh7JYLOrkyZPKbrerzMxMdeTIEW8XyyNKS0vV\nvn37lFJK1dTUqJEjR6ojR46op556Sq1evVoppdTq1avV9773PaWUUkeOHFGZmZmqqalJnTp1Slks\nFuVwOJRSSuXk5KgdO3Yol8ul5syZo/7yl794p1J99POf/1wtW7ZMzZ07Vyml/CoGK1asUL/5zW+U\nUkrZ7XZVVVXlV/UvLi5WSUlJqqGhQSml1J133qlee+01n4/BZ599pvbt26dsNpt7mifr/Mtf/lJ9\n61vfUkop9ac//Unddddd/Vk9McD19NjqcDjU9OnT1a233qrefvttL5R0YOhJvKqqqlRaWpo6ffq0\nUkqpc+fOeaOoA0ZPYvbcc8+593NlZWVqyJAhym63e6O4A0Jnx4X2Nm3apObMmaNcLpfauXOnmjBh\nQj+XcODxmSs8e/bswWq1YrFYCAgIYOnSpeTl5Xm7WB4RFxfH2LFjAQgLCyMtLY2SkhLy8vK47777\nALjvvvt4//33AcjLy2Pp0qWYTCaSk5OxWq3s2bOHM2fOUFNTw0033YSmaaxYscK9zo2guLiYTZs2\nsXLlSvc0f4lBTU0Nn3/+OQ8++CAAAQEBDB482G/qf5HD4aCxsRGHw0FDQwPx8fE+H4OpU6cSERFx\n2TRP1rn9tpYsWcKWLVsG9BUv0b96emx96aWXWLx4MdHR0V4o5cDRk3i9+eabLFq0iMTERACJWQ9i\npmkatbW1KKWoq6sjIiICg8HgpRJ7X2fHhfby8vJYsWIFmqYxceJELly4wJkzZ/qxhAOPzyQ8JSUl\nJCQkuF+bzWZKSkq8WKLro7CwkAMHDpCbm8u5c+eIi4sDWpOisrIyoOtYlJSUYDabO0y/UTz55JM8\n//zz6HSXPrb+EoNTp04RFRXFN7/5TcaMGcPKlSupr6/3m/oDDBs2jO9+97skJiYSFxdHeHg4s2bN\n8qsYXOTJOrdfx2AwEB4eTmVlZX9VRQxwPTm2lpSU8N577/HQQw/1d/EGnJ7E6/jx41RVVTFt2jTG\njRvH+vXr+7uYA0pPYvbYY4/x1VdfER8fT0ZGBi+88MJl5wLicv5yTtwbPvNp6axFUtM0L5Tk+qmr\nq2Px4sX84he/YNCgQV0u11UsbuQYffDBB0RHR/d4bHlfi4HD4WD//v08/PDDHDhwgJCQkG770vta\n/QGqqqrIy8ujoKCA0tJS6uvreeONN7pc3hdjcDV9qbMvx0Ncu558Pp588kl+8pOfoNfr+6tYA1ZP\n4uVwONi3bx+bNm1i8+bNPPPMMxw/fry/ijjg9CRmmzdvJjs7m9LSUg4ePMhjjz1GTU1NfxXxhiP7\n9Y58JuExm80UFRW5XxcXFxMfH+/FEnlWS0sLixcvZvny5SxatAiAmJgY9yXKM2fOuC+LdxULs9lM\ncXFxh+k3gu3bt/PnP/+ZpKQkli5dyl//+lfuvfdev4mB2WzGbDaTm5sLtHY92r9/v9/UH+DTTz8l\nOTmZqKgojEYjixYtYseOHX4Vg4s8Wef26zgcDqqrq7vtKiH8S0+OrXv37mXp0qUkJSXxzjvv8Mgj\njwzobqLXU0/iZTabmTNnDiEhIURGRjJ16lQOHTrU30UdMHoSs9dee41FixahaRpWq5Xk5GSOHj3a\n30W9Yfj6OXFf+EzCk5OTw4kTJygoKKC5uZkNGzawYMECbxfLI5RSPPjgg6SlpfGd73zHPX3BggW8\n/vrrALz++ussXLjQPX3Dhg3Y7XYKCgo4ceIEEyZMIC4ujrCwMHbt2oVSivXr17vXGehWr15NcXEx\nhYWFbNiwgRkzZvDGG2/4TQxiY2NJSEjg2LFjAGzZsoXRo0f7Tf0BEhMT2bVrFw0NDSil2LJlC2lp\naX4Vg4s8Wef223rnnXeYMWOG37cEikt6cmwtKCigsLCQwsJClixZwq9+9Stuv/12L5XYu3oSr4UL\nF7Jt2zb3vYi7d+8mLS3NSyX2vp7ELDExkS1btgCtXXqPHTuGxWLxRnFvCAsWLGD9+vUopdi1axfh\n4eHubtB+q79GR+gPmzZtUiNHjlQWi0U9++yz3i6Ox2zbtk0BKiMjQ2VlZamsrCy1adMmVVFRoWbM\nmKGsVquaMWOGqqysdK/z7LPPKovFokaNGnXZCFT5+fnKZrMpi8WiHn30UeVyubxRpWvyt7/9zT1K\nmz/F4MCBA2rcuHEqIyNDLVy4UJ0/f96v6q+UUt///vdVSkqKstls6t5771VNTU0+H4OlS5eq2NhY\nZTAY1LBhw9Rvf/tbj9a5sbFRLVmyRI0YMULl5OSokydP9nsdxcDW2bH1lVdeUa+88kqHZe+77z6/\nHqVNqZ7F6/nnn1dpaWnKZrOptWvXequoA8bVYlZSUqJmzpyp0tPTlc1mU3/4wx+8WVyv6+y40D5e\nLpdLPfLII8pisaj09HSVn5/v5RJ7n6aUDMcjhBBCCCGE8E0+06VNCCGEEEIIIa4kCY8QQgghhBDC\nZ0nCI4QQQgghhPBZkvAIIYQQQgghfJYkPEIIIYQQQgifJQmPEEBoaCgAhYWFvPnmmx7d9o9//OPL\nXk+aNMmj2xdCCCGEEF2ThEeIdvqS8Didzm7nX5nw7Nixo9flEkIIIYQQfSMJjxDtPP3002zbto3s\n7GzWrl2L0+nkqaeeIicnh8zMTF599VUAtm7dyvTp07nnnnvIyMgA4Pbbb2fcuHHYbDbWrVvn3l5j\nYyPZ2dksX74cuHQ1SSnFU089RXp6OhkZGWzcuNG97WnTprFkyRJSU1NZvnw58rgsIYQQQoi+MXi7\nAEIMJGvWrOFnP/sZH3zwAQDr1q0jPDyc/Px87HY7kydPZtasWQDs2bOHw4cPk5ycDMDvfvc7IiIi\naGxsJCcnh8WLF7NmzRpefvllDh482OG93n33XQ4ePMihQ4eoqKggJyeHqVOnAnDgwAGOHDlCfHw8\nkydPZvv27UyZMqWfoiCEEEII4TvkCo8Q3fj4449Zv3492dnZ5ObmUllZyYkTJwCYMGGCO9kBePHF\nF8nKymLixIkUFRW5l+vKF198wbJly9Dr9cTExHDzzTeTn5/v3rbZbEan05GdnU1hYeF1q6MQQggh\nhC+TKzxCdEMpxUsvvcTs2bMvm75161ZCQkIue/3pp5+yc+dOgoODmTZtGk1NTVfddldMJpP7Z71e\nj8Ph6GMNhBBCCCH8m1zhEaKdsLAwamtr3a9nz57NK6+8QktLCwDHjx+nvr6+w3rV1dUMGTKE4OBg\njh49yq5du9zzjEaje/32pk6dysaNG3E6nZSXl/P5558zYcKE61ArIYQQQgj/JVd4hGgnMzMTg8FA\nVlYW999/P0888QSFhYWMHTsWpRRRUVG8//77HdabM2cOv/71r8nMzCQlJYWJEye6561atYrMzEzG\njh3LH//4R/f0O+64g507d5KVlYWmaTz//PPExsZy9OjRfqmrEEIIIYQ/0JQM/ySEEEIIIYTwUdKl\nTQghhBBCCOGzJOERQgghhBBC+CxJeIQQQgghhBA+SxIeIYQQQgghhM+ShEcIIYQQQgjhsyThEUII\nIYQQQvgsSXiEEEIIIYQQPuv/A6soukFsBBi+AAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [ + + ] + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\ncLvdPP/88wCcPXuWiRMnMmTIECZOnEhZWZl/m8WLF+NyuUhNTeWTTz7xL9++fTuZmZm4XC4eeeQR\n+lJLRI/Hw/Dhw7n99tuBgRf/uXPnmDVrFsOGDSMtLY1NmzYNqHPw7LPP4na7ycjIYO7cudTU1PT7\n+B944AGio6PJyMjwL+vOmGtra7nnnntwuVyMHDlyQM19c7Vc7vNp0t41vTfr6P6qlOKRRx7B5XKR\nlZXFjh07eiCVV6ajGN966y2ysrLIyspi1KhR7N69uwdSeeUCzStt27YNvV7Pe++9dw1T1z0CiXHt\n2rXk5OTgdru56aabrnEKr1xHMZ4/f5477riD7Oxs3G43y5Yt64FUdl1b97/munzNUX1MQ0ODSklJ\nUYcOHVK1tbUqKytL7d27t6eT1S2+//57tX37dqWUUuXl5WrIkCFq79696vHHH1eLFy9WSim1ePFi\n9fOf/1wppdTevXtVVlaWqqmpUYcPH1YpKSmqoaFBKaVUXl6e2rhxo/J6vWry5Mlq9erVPRNUF/z+\n979Xc+fOVbfddptSSg24+O+77z715z//WSmlVG1trSorKxsw56C4uFgNGjRIVVVVKaWUmj17tlq2\nbFm/j3/dunVq+/btyu12+5d1Z8wvvfSS+uEPf6iUUuqdd95Rd99997UMr19q7/Nprr1rem8VyP11\n1apVavLkycrr9apNmzap/Pz8Hkpt1wQS44YNG9TZs2eVUkqtXr26z8WoVOB5pYaGBjV+/Hg1ZcoU\n9de//rUHUtp1gcRYVlam0tLS1JEjR5RSSp08ebInktplgcT41FNP+a8/p06dUmFhYaq2trYnktsl\nbd3/muvqNafP1eBs3boVl8tFSkoKJpOJOXPmsHLlyp5OVreIi4tjxIgRANhsNtLS0igpKWHlypUs\nWLAAgAULFvDBBx8AsHLlSubMmYPZbCY5ORmXy8XWrVs5fvw45eXl3HDDDWiaxn333effprcrLi5m\n1apVLFy40L9sIMVfXl7Ol19+yYMPPgiAyWTC4XAMqHPQ0NBAdXU1DQ0NVFVVER8f3+/jHzt2LOHh\n4S2WdWfMzfc1a9Ys1qxZ06trtPqC9j6f5tq7pvdWgdxfV65cyX333YemaRQUFHDu3DmOHz/eQynu\nvEBiHDVqFGFhYQAUFBRQXFzcE0m9IoHmlV544QVmzpxJdHR0D6TyygQS49tvv82MGTNISkoC6HNx\n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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [ + + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "def plot_traces(var_name, samples):\n", + " fig, axes = plt.subplots(1, 2, figsize=(14, 1.5), sharex='col', sharey='col')\n", + " for chain in range(num_chains):\n", + " s = samples.numpy()[:, chain]\n", + " axes[0].plot(s, alpha=0.7)\n", + " sns.kdeplot(s, ax=axes[1], shade=False)\n", + " axes[0].title.set_text(\"'{}' trace\".format(var_name))\n", + " axes[1].title.set_text(\"'{}' distribution\".format(var_name))\n", + " axes[0].set_xlabel('Iteration')\n", + "\n", + "warnings.filterwarnings('ignore')\n", + "for var, var_samples in hmc_samples.items():\n", + " plot_traces(var, var_samples)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ioys0R7QYzH1" + }, + "source": [ + "신뢰 구간을 생성한 모든 세 개의 대체 사후 확률은 시각적으로 HMC 샘플과 유사하지만, 때때로 VI에서 흔히 볼 수 있듯이 ELBO 손실 효과로 인해 분산이 부족합니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "hZ1GUl1dJtpl" + }, + "outputs": [ + { + "data": { + "image/png": "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\nEj/88APy8vIAdCTuFVdc4fK7J06cwMMPP4yff/4ZX331lTR+vdPRo0dRVFSErVu34uLFi7j55pvd\nXv/yyy9Hamoqtm3bBqDjj+/aa69FaGgoYmJi8N///hdAxx9sdHS09HuJiYkAgKioKOn/YWFhcDgc\n2LdvH5588km0tbXh8OHDPZ6DqqoqHDt2DADQ3NwsPT4YwycAz5/l0aNHsW/fPrz++us4f/485s2b\n1+357nz/o0ePxtmzZ12eu+vwiT179kjPX11dLY3pvzRZ7HY7rr32WoSEhPhtj6m7774bTz/9NICO\nFtNON910E5544gmUlpaiqKhIiu3kyZOIi4vzSyz+whxljjJHlY05yhxljiobc5Q5yhz1v0GruG7d\nuhWTJk2SHrvyyiths9ngdDrd/ohDQ0PhcDjcnueOO+7Ao48+CpvNhhtvvBH79u3DuXPnsHPnTvzt\nb3+TJqZ7Gmv/17/+FStXroROp0NqaiqcTidCQ0Pxv//9D0DHBeCee+7Bww8/DADSZOSulixZguzs\nbCQmJiI8PBwNDQ1oa2tDU1MTrrzySo+vf+mFq+tFbM2aNdiwYQNGjx7d4x/A/v37kZeXh6eeegoA\nUFBQgC+//NLr7ww0T59lfHw80tPTMXv2bAAd52758uVu5xvw7SIeHx+PzMxMaf5H5/kGALVajW+/\n/RYOhwNffPHFgLzH3rrzzjtht9sxatQo6bE5c+bghRdewPr166FSqbBz506pxVTJmKPMUeaosjFH\nmaPMUWVjjjJHmaP+NygV17CwMLzxxhsuj82aNQt5eXkoKSnB1Vdf7fKzUaNG4cyZM7jjjjtchhRc\ne+21+Oabb6Tu6vj4eBw/fhwzZszAmDFjMHr06G5jmDlzJpYuXYobbrgBw4YNA9AxPn/BggU4dOgQ\nXnnlFTzwwAPScz/00EMeu+M1Go3UkhIcHIylS5diypQpCAoKwrp16/p8bvLy8pCbm4vk5GS389BV\n52pqnXQ6ncuKdIPB02dpMplw//3347XXXoPT6cSzzz7r8Xz7KikpCaNGjYJOp4NKpcK8efOQmZkJ\nAAgJCcG9996LW265ZdDnwfz617/GmjVrXB7Lzs7G0aNHMW3aNLS3t2PixIlCfOEyR7vHHO0Zc9T/\nmKPdY472jDnqf8zR7jFHe8Yc7R2Vs7dNAUREREREREQy8PviTERERERERET9wYorERERERERKRor\nrkRERERERKRorLgSERERERGRorHiSkRERERERIrGiisREREREREpGiuuREREREREpGj/B/xkcchL\nBGanAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [ + + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "results['HMC'] = hmc_samples\n", + "plot_boxplot(results)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "V8Y-O_CsT7vH" + }, + "source": [ + "## 추가 결과\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "id": "OUnECXkG42uZ" + }, + "outputs": [ + + ], + "source": [ + "#@title Plotting functions\n", + "\n", + "plt.rcParams.update({'axes.titlesize': 'medium', 'xtick.labelsize': 'medium'})\n", + "def plot_loss_and_elbo():\n", + " fig, axes = plt.subplots(1, 2, figsize=(12, 4))\n", + "\n", + " axes[0].scatter([0, 1, 2],\n", + " [mvn_final_elbo.numpy(),\n", + " iaf_final_elbo.numpy(),\n", + " mean_field_final_elbo.numpy()])\n", + " axes[0].set_xticks(ticks=[0, 1, 2])\n", + " axes[0].set_xticklabels(labels=[\n", + " 'Multivariate Normal', 'IAF', 'Mean Field'])\n", + " axes[0].title.set_text('Evidence Lower Bound (ELBO)')\n", + "\n", + " axes[1].plot(mvn_loss, label='Multivariate Normal')\n", + " axes[1].plot(iaf_loss, label='IAF')\n", + " axes[1].plot(mean_field_loss, label='Mean Field')\n", + " axes[1].set_ylim([1000, 4000])\n", + " axes[1].set_xlabel('Training step')\n", + " axes[1].set_ylabel('Loss (negative ELBO)')\n", + " axes[1].title.set_text('Loss')\n", + " plt.legend()\n", + " plt.show()\n", + "\n", + "plt.rcParams.update({'axes.titlesize': 'medium', 'xtick.labelsize': 'small'})\n", + "def plot_kdes(num_chains=8):\n", + " fig, axes = plt.subplots(2, 2, figsize=(12, 8))\n", + " k = list(results.values())[0].keys()\n", + " plot_results = {\n", + " v: {p: results[p][v] for p in results} for v in k}\n", + " for i, (var, var_results) in enumerate(plot_results.items()):\n", + " ax = axes[i % 2, i // 2]\n", + " for posterior, posterior_results in var_results.items():\n", + " if posterior == 'HMC':\n", + " label = posterior\n", + " for chain in range(num_chains):\n", + " sns.kdeplot(\n", + " posterior_results[:, chain],\n", + " ax=ax, shade=False, color='k', linestyle=':', label=label)\n", + " label=None\n", + " else:\n", + " sns.kdeplot(\n", + " posterior_results, ax=ax, shade=False, label=posterior)\n", + " ax.title.set_text('{}'.format(var))\n", + " ax.legend()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WXzsxJcG1kPH" + }, + "source": [ + "### 증거 하한(ELBO)\n", + "\n", + "가장 크고 유연한 큰 대체 사후 확률인 IAF는 가장 높은 증거 하한(ELBO)으로 수렴합니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "cKf_nCvpxohJ" + }, + "outputs": [ + { + "data": { + "image/png": "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\n77z169czfPhwrrnmGlq0aEF8fDwAJ06c4J///Cd33HEHVquVe++91z5rCxWzkm5ubnTp0oX9+/cD\nsGbNGiZNmsQ111wDQOvWrS96nQv597//TUxMDN7e3nh4eHDnnXfy5Zdfct1113HixAmKiorYu3cv\n48eP58svv2T9+vX07duXXbt2sW3bNuLi4rBarcycOdNewwsVJQ/VOVcO8dNPPxEeHs7s2bMB+Prr\nrxk/fjwAv/3tb/nqq68uGn90dDT+/v64ublhtVrJy8tj586dBAYGEhwcjGEY3HXXXVWea7PZ8Pb2\nrjK2c6+mTZtecPxzpRo//fQTa9eu5Z///CemaVb5b/SX7e7u7jRu3JiioqKL3qOISH0697n0xhtv\nMHPmTPbu3YvVauXQoUOMHz+e5cuX07RpUwYNGmT/q5lIfXDpxLkmCgoKaN++vf29v78/BQUFAOze\nvZv169fTs2dP+vfvz7///W97v9zcXLp27Ur//v1Zv349AAcPHmTmzJmsWbOGb775hqioKF5++WX7\nOZMmTeK6665j586d59WkOoMxY8awZMkS1q1bR48ePfDy8qrUp6pEqry8nFatWp2XqH333Xf24+d+\n6QDsJQhVJWUXu86FnLtuVXr37s2CBQsICQmhb9++rF+/nq+//pqbbroJ0zQJDQ21j/ef//yHzz77\nzH5us2bNLjq2YRjcdtttfPnll9UeB/Dw8KC8vNwe79mzZ+19fvk9cnd3t9dU1+SXq6ZNm9pLLGqr\nefPmxMTE8NVXXxEUFMQPP/xQKSn+5ptvzquZPnPmDE2aNKmT8UVEaurGG28kPT0dgHfffddefrdn\nzx569uzJs88+S9u2bdm7dy/ff/89HTp0YOrUqcTHx7N161ZHhi4NnNMnzgMHDiQsLKzS69ys8cVU\nlXSdS1hKS0s5cuQIGzduZPbs2YwePRrTNLFYLPz4449s2bKFl19+mfHjx3P8+HE2btzIjh07uOmm\nm7BaraSlpfHDDz/Yr7tgwQL27dtH586dne6hqpiYGL755hv+3//7f1XOtPbr14+lS5dSXFxMUVER\nK1asACpm0gMDA3n//feBiu/nt99+e8GxbrnlFt566y37ShSHDx++rOuc07NnT7744gsOHjxIWVkZ\nixcvpn///va4X3zxRfr160fXrl35/PPP8fT0pGXLloSEhFBYWMjXX38NQElJCdu3b6/RmL/01Vdf\n0bFjR6D6D/OAgAA2b94MQEZGBiUlJRe8ZqdOncjNzWXPnj1ARQ13VTp37sx///vfS465KqWlpfzr\nX/+iY8eONGvWjMTERKZNm0ZZWRkAb7/9NqdOneLmm28G4NChQ3h7e9OoUaM6GV9EpCqnTp3C39/f\n/nr55Zd59dVXWbBgARERESxatMj+LMqjjz5qf96lX79+REZG8t577xEWFobVamXnzp1MmDDBwXck\nDZmHowO4mDVr1tTqfH9/f/bu3Wt/n5+fj5+fn/3YiBEjMAyD6Oho3NzcOHjwIN7e3vZZwu7du9Ox\nY0d2796NaZrExcVVm+RAxYzimDFjmD17NpMmTapV7JejuLgYq9Vqfz948GBSUlJwd3dn2LBhLFy4\nkLS0tErndevWjTFjxmC1Wrnhhhvo27ev/di7777LlClTmDlzJiUlJYwdO/aCD6sNHjyY7OxsoqKi\naNy4MUOHDuXPf/5zja+zcOFCli1bZn+/ceNGZs2axYABAzBNk6FDh9pLTfr27cvevXvp168f7u7u\ntG/fnk6dOgHQuHFjPvjgA6ZOncqxY8coLS3lwQcfJDQ09KLfx/fee4+vvvqK8vJy/P39WbhwIQCv\nvvoqkydPZvbs2Xh7e7NgwQIA7rnnHhISEoiOjiY2Nvais9lNmjQhNTWVW2+9lbZt29KnTx+2bdtW\nqV+nTp04duwYRUVF9r8SnIvtnL/85S/4+fmxa9eu8x6KmTNnDlDxg2bmzJmcPXuW2NhYRowYAcCs\nWbN45JFH+M1vfoObmxudOnVi6dKl9l8sP//8c4YOHXrR75WISG2c+2vdr1VVclHVg9RPPPEETzzx\nRJ3HJVIVw7zQ38FdRExMDC+++CJRUVGVjpWWlvKb3/yGtWvX0q5dO3r06MHf//53QkNDeeONN9i3\nbx/PPvssu3fvtq+ScPDgQVq3bo27uzvff/89ffv25T//+Q9lZWV0796ddevWERQUxKlTp8jPzyc4\nOJg9e/YQFBSEaZo8+uijAA5ZB1kanjlz5uDl5WVfy/lKGTFiBLNmzbrocwQiIiJXC6cv1biQpUuX\n4u/vz9dff82tt97KoEGDANi3b599pszDw4PXX3+dQYMG0blzZ0aPHm2fcZw8eTLff/89YWFhjB07\nlrS0NAzD4MsvvyQiIoLIyEhGjRrFG2+8QevWrfH29mbhwoWMGzeOiIgIevXqxc6dOzFNk8TERMLD\nwwkPD8dms/H000877PsiDcuUKVPOq5O+Es6ePcvtt9+upNlFlZWV0bVrV/umOocPHyYuLo7g4GDi\n4uI4cuSIve+sWbMICgoiJCSETz/91N6+efNmwsPDCQoKYurUqRd81kBE5GrRIGacRUTkf15++WWy\nsrI4fvw4H330EY899hitW7cmOTmZlJQUjhw5wvPPP8+OHTsYN24cmzZtYt++fQwcOJDdu3fj7u5O\ndHQ0c+fOpVevXgwdOpSpU6cyZMgQR9+aiIhDufSMs4iInC8/P5+PP/74vNKejIwMEhMTAUhMTLQ/\nQ5CRkcHYsWPx9PQkMDCQoKAgNm3ahM1m4/jx4/Tu3RvDMJgwYcJ5zx2IiFytnPrhwLZt2xIQEODo\nMERELlleXp59V84r6cEHH+SFF144b6nB/fv3Y7FYALBYLBw4cACoWK6zV69e9n7nluts1KjReQ+a\n/nIZz19LTU0lNTUVgJ07d9ofzq2pXUd20aJxCyzNLJd0nohIXarpZ7ZTJ84BAQEX3EpbRMRZVfWw\ncn376KOP8PHxoXv37mRmZl60f3XLdV5oGc9fS0pKIikpCai450v6zC4rIeb9mxnQrh9/6vtczc8T\nEaljNf3MdurEWUREam7Dhg0sX76clStXcvr0aY4fP85dd92Fr68vNpsNi8WCzWaz75Ja3XKd/v7+\n5+2y+ctlPOvUyUKMk4cwj+TW/bVFROqBapxFRBqIWbNmkZ+fT15eHunp6dx888288847xMfH29dv\nT0tLs6+DHh8fT3p6OmfOnCE3N5ecnByio6OxWCx4eXmxceNGTNPk7bfftp9T1wz0fLqIuA7NOIuI\nNHDJycmMHj2aN998k+uvv96+g2doaCijR4+mS5cueHh4MG/ePNzd3QGYP38+EydOpLi4mCFDhtTb\nihoGYCp5FhEXocRZRKQBiomJISYmBoA2bdqwdu3aKvtNnz6d6dOnV2qPioqqcjfL+qBFUaU+lJSU\nkJ+fz+nTpx0dijiRJk2a4O/vT6NGjS7rfCXOIiLiMJpxlvqSn5+Pl5cXAQEB1T7cKlcX0zQ5dOgQ\n+fn5BAYGXtY1VOMsIiIOYvycOIvUvdOnT9OmTRslzWJnGAZt2rSp1V8hlDiLiIjDaMZZ6pOSZvm1\n2v6bUOIsIiIOY5hoyllEXIYSZxERcRjNOEtDZhgGv/3tb+3vS0tL8fb2ZtiwYRc9t3nz5kDFjnZ/\n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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [ + + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_loss_and_elbo()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5ag72K8X3tpJ" + }, + "source": [ + "### 사후 확률 샘플\n", + "\n", + "각 대체 사후 확률의 샘플은 HMC ground truth 샘플(상자 슬롯에 표시된 샘플의 다른 시각화)과 비교됩니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "_yjwsHIoftLX" + }, + "outputs": [ + { + "data": { + "image/png": "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\n+v6oUaN0/7569SqjRo0iMTGRoqIimjVrprs2YMAADA0NMTQ0xNbWlqSkJF1cuheDBw8GwMvLi9zc\nXMzNzTE3N8fIyIjMzEwaNmyoK9uuXTtOnDhBTk4OhoaG+Pr6Eh4ezoEDB/jkk084cuQI0dHRuqVp\nRUVFBAQElGvv2LFjdO3aVfc7YcSIEeX28AwdOhSlUom7u7tuJl082WRJxhPKw8ODEydOVHpNq9VW\n+r6enh4ajUb3uqCgoNx1Q0NDoGzZQklJSaV1BAYGkpCQwL59+ygtLa10M5xGoyEsLIzIyEgiIyO5\ndu0a5ubmd3werVbL22+/rbvn/PnzPPfcc2i12ip/KVTF2Ni4wrM1b96cyZMns2fPHk6dOkVaWlq1\n6qyO2z/nf/bjlpkzZ7Jy5Ury8/Pp2LEjMTExuvLGxsa11jchRP1hZWWlWwp2S3p6um6CAcDU1FT3\n79dee40pU6Zw5swZvvzyy3Lx6Vb8h8p/B9zr7w+lUlmuLqVSWaEufX19XFxc+O677+jUqRNBQUHs\n3buXCxcu4ObmhlarpVevXrrfB9HR0XzzzTfl6qjq91xlz3O3suLJIAPmJ1T37t0pLCwsN8N7/Phx\n9u3bR5cuXVi/fj2lpaWkpKSwf/9+2rdvj7OzM9HR0RQWFpKVlcWePXvu2o65uXmF2eHx48czZsyY\nKjfr9e7dm08//VT3+tYmvzvp06cP3377rW6d2rVr10hOTqZHjx789NNPugFuenp6lf26xc3NjfPn\nz+teb926VRcw4+PjUalUNGzY8I513I2FhQWWlpa6tc+rV6/WzTa7uLjo/pipbKc2wIULF/Dy8uKt\nt97Cz89PN2COi4urkYwcQoj6z8zMjMaNG+tieXp6Ojt27KBz586Vls/KysLR0RGA77//vlpt3c/v\njzvp0qULixcvpkuXLgQFBfHFF1+gVqtRKBR07NiRQ4cO6eJ4Xl5ehQxQ7du3Z9++fWRkZFBSUsIv\nv/xy1zYfJOaLx58MmJ9QCoWCjRs3smvXLpo3b46Hhwfz58/HwcGBkJAQ3Sa57t27s2jRIuzt7WnS\npAkjR47E29ubsWPH6pY/3MmgQYPYuHFjuY1xY8eOJSMjgzFjxlR6zyeffEJ4eDje3t64u7tXuunj\nn3r37s3TTz9NQEAAXl5eDB8+nJycHDw8PJg9ezZdu3albdu2vPnmmwCMHj2aDz/8EB8fnwqb/vr1\n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\nT+32dO6Oyvgv9l+8WENPIoS4HxKzHz1arZYSTUmtDZhvrWOWbBmittRqHub6wtTUlKioKPLz8zE2\nNmbXrl04Ojo+lLY//PBDhg8fXu69bdu2PZS2H0carYbzmecZ1nJYpdf3xCThZJiPXkEmYMrMmTPZ\nu3cvGo2Gp556CkdHRwYMGADSfpQnAAAgAElEQVTAyJEjGTlyJAD5+fnk5eVhZWVVZdvdmnTjs8jP\nOJMeRmFJTwz1VDX+fEKIu5OY/egp1hSjRVtrA2Z7U3uaWTQj7HoYEzwm1Eob4skmM8z3qF+/fmzd\nuhUoO251zJgxums3b95k0qRJ+Pv74+Pjw2+//QZAQkICQUFB+Pr64uvry+HDZX/5hoaGEhwczPDh\nw2nTpg1jx46t1rqr22cifvzxR9q3b49areall16qdN3te++9R+vWrenZs6fu2Nv66mrOVfJL8itd\nv5xTUMzRi+mk/7GCgIAACgsL2bBhAz169GDTpk307duXa9euAZCdna37f1JaWkpgYCDPPvvsHdtu\nZdmKhgY2aI1jiLwi65iFqEsSsx8tt46urq0BM0BA4wBOJJ2gsLSw1toQT67Haob5g2MfEJMeU6N1\ntmnUhrfav3XXcqNHj+bdd99l4MCBnD59mkmTJnHgwAGgLLh1796db7/9lszMTNq3b0/Pnj2xtbVl\n165dGBkZER8fz5gxY3SnaJ08eZKzZ8/i4OBAYGAghw4donPnzhXanTFjBgsWLABg9erVeHl56a6d\nO3eO9evXc+jQIfT19XnllVf43//+x/jx43VlTpw4wbp16zh58iQlJSX4+vrSrl3NnbL0qInPKMuQ\n0cqyVYVrB+JTKdFo+eD9RejnXMfQ0BBHR0cCAwOZPXs2u3bt4u2338bNzY3ExERefvllZs+ejbm5\nOVOnTr3rDJVCoaCrUxc25W/h4IUbdHCtejZaiCeBxGyJ2bdUGDDfiIL4nWBmBx5DwcD0gdvo5NCJ\nNTFrOJl8ko6NOz5wfULc7rEaMNclb29vEhISWLt2Lf379y93befOnWzevFm3zqygoIArV67g4ODA\nlClTiIyMRKVSERcXp7unffv2ODk5AWXH0SYkJFQafCv7eu+WPXv2cOLECfz9/YGyZQO2tuVzCx84\ncICQkBBMTEwAGDx48H1+Ao+HuIw4FCho3rB5hWu7zt7AwlifwUE+lJZ4kpKSQq9evdBoNIwePRof\n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\nwJQAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [ + + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_kdes()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "45bp131ngAxT" + }, + "source": [ + "## 결론" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0xXnCEkKgDa5" + }, + "source": [ + "이 Colab에서, 결합 분포 및 다중 bijector를 사용하여 VI 대체 사후 확률을 구축하고 라돈 데이터세트의 회귀 모델의 가중치에 대한 신리 구간을 추정하기 위해 이들을 맞췄습니다. 이 간단한 모델의 경우, 더욱 표현적인 대체 사후 확률은 평균장 대체 사후 확률과 유사하게 수행되었습니다. 하지만, 입증한 도구는 더욱 복잡한 모델에 적합한 광범위하고 유연한 대체 사후 확률을 구축하기 위해 사용될 수 있습니다. " + ] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [ + + ], + "name": "Variational_Inference_and_Joint_Distributions.ipynb", + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/site/ko/quantum/tutorials/hello_many_worlds.ipynb b/site/ko/quantum/tutorials/hello_many_worlds.ipynb index a8ae9093a0..ebe71acf91 100644 --- a/site/ko/quantum/tutorials/hello_many_worlds.ipynb +++ b/site/ko/quantum/tutorials/hello_many_worlds.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "iiQkM5ZgQ8r2" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -78,7 +80,9 @@ "metadata": { "id": "TorxE5tnkvb2" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install tensorflow==2.7.0" ] @@ -98,7 +102,9 @@ "metadata": { "id": "saFHsRDpkvkH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install tensorflow-quantum==0.7.2" ] @@ -109,7 +115,9 @@ "metadata": { "id": "4Ql5PW-ACO0J" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Update package resources to account for version changes.\n", "import importlib, pkg_resources\n", @@ -131,7 +139,9 @@ "metadata": { "id": "enZ300Bflq80" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "import tensorflow_quantum as tfq\n", @@ -174,7 +184,9 @@ "metadata": { "id": "2yQdmhQLCrzQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "a, b = sympy.symbols('a b')" ] @@ -194,7 +206,9 @@ "metadata": { "id": "Ps-pd2mndXs7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Create two qubits\n", "q0, q1 = cirq.GridQubit.rect(1, 2)\n", @@ -222,7 +236,9 @@ "metadata": { "id": "VMq7EayNRyQb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Calculate a state vector with a=0.5 and b=-0.5.\n", "resolver = cirq.ParamResolver({a: 0.5, b: -0.5})\n", @@ -245,7 +261,9 @@ "metadata": { "id": "hrSnOCi3ehr_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "z0 = cirq.Z(q0)\n", "\n", @@ -260,7 +278,9 @@ "metadata": { "id": "OZ0lWFXv6pII" }, - "outputs": [], + "outputs": [ + + ], "source": [ "z0x1 = 0.5 * z0 + cirq.X(q1)\n", "\n", @@ -284,7 +304,9 @@ "metadata": { "id": "1gLQjA02mIyy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Rank 1 tensor containing 1 circuit.\n", "circuit_tensor = tfq.convert_to_tensor([circuit])\n", @@ -308,7 +330,9 @@ "metadata": { "id": "aX_vEmCKmpQS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Rank 1 tensor containing 2 Pauli operators.\n", "pauli_tensor = tfq.convert_to_tensor([z0, z0x1])\n", @@ -336,7 +360,9 @@ "metadata": { "id": "1fsVZhF5lIXp" }, - "outputs": [], + "outputs": [ + + ], "source": [ "batch_vals = np.array(np.random.uniform(0, 2 * np.pi, (5, 2)), dtype=float)" ] @@ -356,7 +382,9 @@ "metadata": { "id": "RsfF53UCJtr9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "cirq_results = []\n", "cirq_simulator = cirq.Simulator()\n", @@ -388,7 +416,9 @@ "metadata": { "id": "kGZVdcZ6y9lC" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tfq.layers.Expectation()(circuit,\n", " symbol_names=[a, b],\n", @@ -442,7 +472,9 @@ "metadata": { "id": "N-j7SCl-51-q" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Parameters that the classical NN will feed values into.\n", "control_params = sympy.symbols('theta_1 theta_2 theta_3')\n", @@ -474,7 +506,9 @@ "metadata": { "id": "1v4CK2jD6pIj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# The classical neural network layers.\n", "controller = tf.keras.Sequential([\n", @@ -500,7 +534,9 @@ "metadata": { "id": "kZbYRTe16pIm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "controller(tf.constant([[0.0],[1.0]])).numpy()" ] @@ -533,7 +569,9 @@ "metadata": { "id": "UfHF8NNE6pIr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# This input is the simulated miscalibration that the model will learn to correct.\n", "circuits_input = tf.keras.Input(shape=(),\n", @@ -562,7 +600,9 @@ "metadata": { "id": "Zvt2YGmZ6pIu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "dense_2 = controller(commands_input)\n", "\n", @@ -588,7 +628,9 @@ "metadata": { "id": "Xs6EMhah6pIz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# The full Keras model is built from our layers.\n", "model = tf.keras.Model(inputs=[circuits_input, commands_input],\n", @@ -612,7 +654,9 @@ "metadata": { "id": "ERXNPe4F6pI4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf.keras.utils.plot_model(model, show_shapes=True, dpi=70)" ] @@ -650,7 +694,9 @@ "metadata": { "id": "ciMIJAuH6pJA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# The command input values to the classical NN.\n", "commands = np.array([[0], [1]], dtype=np.float32)\n", @@ -685,7 +731,9 @@ "metadata": { "id": "_VYfzHffWo7n" }, - "outputs": [], + "outputs": [ + + ], "source": [ "random_rotations = np.random.uniform(0, 2 * np.pi, 3)\n", "noisy_preparation = cirq.Circuit(\n", @@ -713,7 +761,9 @@ "metadata": { "id": "6nk2Yr3e6pJJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "datapoint_circuits.shape" ] @@ -742,7 +792,9 @@ "metadata": { "id": "Lwphqvs96pJO" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model([datapoint_circuits, commands]).numpy()" ] @@ -762,7 +814,9 @@ "metadata": { "id": "dtPYqbNi8zeZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "optimizer = tf.keras.optimizers.Adam(learning_rate=0.05)\n", "loss = tf.keras.losses.MeanSquaredError()\n", @@ -779,7 +833,9 @@ "metadata": { "id": "azE-qV0OaC1o" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plt.plot(history.history['loss'])\n", "plt.title(\"Learning to Control a Qubit\")\n", @@ -814,7 +870,9 @@ "metadata": { "id": "RoIlb7r7j5SY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def check_error(command_values, desired_values):\n", " \"\"\"Based on the value in `command_value` see how well you could prepare\n", @@ -854,7 +912,9 @@ "metadata": { "id": "aYskLTacs8Ku" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model([datapoint_circuits, commands])" ] @@ -892,7 +952,9 @@ "metadata": { "id": "hta0G3Nc6pJY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Define inputs.\n", "commands_input = tf.keras.layers.Input(shape=(1),\n", @@ -922,7 +984,9 @@ "metadata": { "id": "n_aTG4g3-y0F" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Define classical NN.\n", "controller = tf.keras.Sequential([\n", @@ -946,7 +1010,9 @@ "metadata": { "id": "IMHjiKit6pJg" }, - "outputs": [], + "outputs": [ + + ], "source": [ "dense_2 = controller(commands_input)\n", "\n", @@ -981,7 +1047,9 @@ "metadata": { "id": "4gw_L3JG0_G0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# The operators to measure, for each command.\n", "operator_data = tfq.convert_to_tensor([[cirq.X(qubit)], [cirq.Z(qubit)]])\n", @@ -1010,7 +1078,9 @@ "metadata": { "id": "nFuGA73MAA4p" }, - "outputs": [], + "outputs": [ + + ], "source": [ "optimizer = tf.keras.optimizers.Adam(learning_rate=0.05)\n", "loss = tf.keras.losses.MeanSquaredError()\n", @@ -1030,7 +1100,9 @@ "metadata": { "id": "Cf_G-GdturLL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plt.plot(history.history['loss'])\n", "plt.title(\"Learning to Control a Qubit\")\n", @@ -1063,7 +1135,9 @@ "metadata": { "id": "uXmH0TQ76pJt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "controller.predict(np.array([0,1]))" ] @@ -1080,7 +1154,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "hello_many_worlds.ipynb", "toc_visible": true }, diff --git a/site/ko/quantum/tutorials/mnist.ipynb b/site/ko/quantum/tutorials/mnist.ipynb index 4e5da8a780..ca2b8759f8 100644 --- a/site/ko/quantum/tutorials/mnist.ipynb +++ b/site/ko/quantum/tutorials/mnist.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "iiQkM5ZgQ8r2" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -78,7 +80,9 @@ "metadata": { "id": "TorxE5tnkvb2" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install tensorflow==2.7.0" ] @@ -98,7 +102,9 @@ "metadata": { "id": "saFHsRDpkvkH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install tensorflow-quantum==0.7.2" ] @@ -109,7 +115,9 @@ "metadata": { "id": "4Ql5PW-ACO0J" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Update package resources to account for version changes.\n", "import importlib, pkg_resources\n", @@ -131,7 +139,9 @@ "metadata": { "id": "enZ300Bflq80" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "import tensorflow_quantum as tfq\n", @@ -190,7 +200,9 @@ "metadata": { "id": "d9OSExvCojg0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()\n", "\n", @@ -216,7 +228,9 @@ "metadata": { "id": "hOw68cCZojg4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def filter_36(x, y):\n", " keep = (y == 3) | (y == 6)\n", @@ -231,7 +245,9 @@ "metadata": { "id": "p-XEU8egGL6q" }, - "outputs": [], + "outputs": [ + + ], "source": [ "x_train, y_train = filter_36(x_train, y_train)\n", "x_test, y_test = filter_36(x_test, y_test)\n", @@ -255,7 +271,9 @@ "metadata": { "id": "j5STP7MbojhA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(y_train[0])\n", "\n", @@ -287,7 +305,9 @@ "metadata": { "id": "lbhUdBFWojhE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "x_train_small = tf.image.resize(x_train, (4,4)).numpy()\n", "x_test_small = tf.image.resize(x_test, (4,4)).numpy()" @@ -308,7 +328,9 @@ "metadata": { "id": "YIYOtCRIGL6y" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(y_train[0])\n", "\n", @@ -342,7 +364,9 @@ "metadata": { "id": "LqOPW0C7ojhL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def remove_contradicting(xs, ys):\n", " mapping = collections.defaultdict(set)\n", @@ -396,7 +420,9 @@ "metadata": { "id": "zpnsAssWojhP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "x_train_nocon, y_train_nocon = remove_contradicting(x_train_small, y_train)" ] @@ -418,7 +444,9 @@ "metadata": { "id": "1z8J7OyDojhV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "THRESHOLD = 0.5\n", "\n", @@ -441,7 +469,9 @@ "metadata": { "id": "1z8J7OyDojhW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_ = remove_contradicting(x_train_bin, y_train_nocon)" ] @@ -461,7 +491,9 @@ "metadata": { "id": "aOu_3-3ZGL61" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def convert_to_circuit(image):\n", " \"\"\"Encode truncated classical image into quantum datapoint.\"\"\"\n", @@ -493,7 +525,9 @@ "metadata": { "id": "w3POmUEUojhe" }, - "outputs": [], + "outputs": [ + + ], "source": [ "SVGCircuit(x_train_circ[0])" ] @@ -513,7 +547,9 @@ "metadata": { "id": "TBIsiXdtojhh" }, - "outputs": [], + "outputs": [ + + ], "source": [ "bin_img = x_train_bin[0,:,:,0]\n", "indices = np.array(np.where(bin_img)).T\n", @@ -535,7 +571,9 @@ "metadata": { "id": "IZStEMk4ojhk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "x_train_tfcirc = tfq.convert_to_tensor(x_train_circ)\n", "x_test_tfcirc = tfq.convert_to_tensor(x_test_circ)" @@ -571,7 +609,9 @@ "metadata": { "id": "-hjxxgU5ojho" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class CircuitLayerBuilder():\n", " def __init__(self, data_qubits, readout):\n", @@ -599,7 +639,9 @@ "metadata": { "id": "SzXWOpUGojhs" }, - "outputs": [], + "outputs": [ + + ], "source": [ "demo_builder = CircuitLayerBuilder(data_qubits = cirq.GridQubit.rect(4,1),\n", " readout=cirq.GridQubit(-1,-1))\n", @@ -624,7 +666,9 @@ "metadata": { "id": "JiALbpwRGL69" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def create_quantum_model():\n", " \"\"\"Create a QNN model circuit and readout operation to go along with it.\"\"\"\n", @@ -656,7 +700,9 @@ "metadata": { "id": "2QZvVh7vojhx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model_circuit, model_readout = create_quantum_model()" ] @@ -680,7 +726,9 @@ "metadata": { "id": "ZYdf_KOxojh0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Build the Keras model.\n", "model = tf.keras.Sequential([\n", @@ -712,7 +760,9 @@ "metadata": { "id": "CgMNkC1Fojh5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "y_train_hinge = 2.0*y_train_nocon-1.0\n", "y_test_hinge = 2.0*y_test-1.0" @@ -733,7 +783,9 @@ "metadata": { "id": "3XKtZ_TEojh8" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def hinge_accuracy(y_true, y_pred):\n", " y_true = tf.squeeze(y_true) > 0.0\n", @@ -749,7 +801,9 @@ "metadata": { "id": "FlpETlLRojiA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.compile(\n", " loss=tf.keras.losses.Hinge(),\n", @@ -763,7 +817,9 @@ "metadata": { "id": "jkHq2RstojiC" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(model.summary())" ] @@ -785,7 +841,9 @@ "metadata": { "id": "n8vuQpSLlBV2" }, - "outputs": [], + "outputs": [ + + ], "source": [ "EPOCHS = 3\n", "BATCH_SIZE = 32\n", @@ -799,7 +857,9 @@ "metadata": { "id": "qJnNG-3JojiI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "x_train_tfcirc_sub = x_train_tfcirc[:NUM_EXAMPLES]\n", "y_train_hinge_sub = y_train_hinge[:NUM_EXAMPLES]" @@ -820,7 +880,9 @@ "metadata": { "id": "Ya9qP3KkojiM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "qnn_history = model.fit(\n", " x_train_tfcirc_sub, y_train_hinge_sub,\n", @@ -860,7 +922,9 @@ "metadata": { "id": "pZofEHhLGL7L" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def create_classical_model():\n", " # A simple model based off LeNet from https://keras.io/examples/mnist_cnn/\n", @@ -890,7 +954,9 @@ "metadata": { "id": "CiAJl7sZojiU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.fit(x_train,\n", " y_train,\n", @@ -917,7 +983,9 @@ "metadata": { "id": "70TOM6r-ojiZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def create_fair_classical_model():\n", " # A simple model based off LeNet from https://keras.io/examples/mnist_cnn/\n", @@ -942,7 +1010,9 @@ "metadata": { "id": "lA_Fx-8gojid" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.fit(x_train_bin,\n", " y_train_nocon,\n", @@ -971,7 +1041,9 @@ "metadata": { "id": "NOMeN7pMGL7P" }, - "outputs": [], + "outputs": [ + + ], "source": [ "qnn_accuracy = qnn_results[1]\n", "cnn_accuracy = cnn_results[1]\n", @@ -984,7 +1056,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "mnist.ipynb", "toc_visible": true }, diff --git a/site/ko/quantum/tutorials/quantum_reinforcement_learning.ipynb b/site/ko/quantum/tutorials/quantum_reinforcement_learning.ipynb index daf8ef7bdd..021f8709f1 100644 --- a/site/ko/quantum/tutorials/quantum_reinforcement_learning.ipynb +++ b/site/ko/quantum/tutorials/quantum_reinforcement_learning.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "5w2rucWZwpUA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -116,7 +118,9 @@ "metadata": { "id": "bPTH8ScrwpUG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install tensorflow==2.7.0" ] @@ -136,7 +140,9 @@ "metadata": { "id": "MZeJimx6wpUI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install tensorflow-quantum==0.7.2" ] @@ -156,7 +162,9 @@ "metadata": { "id": "6A2JRKhMwpUJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install gym==0.18.0" ] @@ -176,7 +184,9 @@ "metadata": { "id": "4Ql5PW-ACO0J" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Update package resources to account for version changes.\n", "import importlib, pkg_resources\n", @@ -189,7 +199,9 @@ "metadata": { "id": "RIIYRJ79wpUK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "import tensorflow_quantum as tfq\n", @@ -223,7 +235,7 @@ "PQC에서 입력 벡터를 인코딩하는 일반적인 방법은 단일 큐비트 회전을 사용하는 것입니다. 여기서 회전 각도는 이 입력 벡터의 구성 요소에 의해 제어됩니다. [표현력이 높은 모델](https://arxiv.org/abs/2008.08605)을 얻기 위해 이러한 단일 큐비트 인코딩을 PQC에서 한 번만 수행하는 것이 아닌 여러 번의 \"[재업로드](https://quantum-journal.org/papers/q-2020-02-06-226/)\"로 변이 게이트 사이에 삽입하여 수행합니다. 이러한 PQC의 레이아웃은 다음과 같습니다.\n", "\n", "\n", - " " + " " ] }, { @@ -259,7 +271,9 @@ "metadata": { "id": "X4P5EORYwpUM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def one_qubit_rotation(qubit, symbols):\n", " \"\"\"\n", @@ -294,7 +308,9 @@ "metadata": { "id": "PEicpzq9wpUN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def generate_circuit(qubits, n_layers):\n", " \"\"\"Prepares a data re-uploading circuit on `qubits` with `n_layers` layers.\"\"\"\n", @@ -355,7 +371,8 @@ ] }, "execution_count": 4, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -383,7 +400,9 @@ "metadata": { "id": "7XJvWgQ4wpUP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class ReUploadingPQC(tf.keras.layers.Layer):\n", " \"\"\"\n", @@ -469,7 +488,9 @@ "metadata": { "id": "kPLHsGRewpUQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class Alternating(tf.keras.layers.Layer):\n", " def __init__(self, output_dim):\n", @@ -497,7 +518,9 @@ "metadata": { "id": "l3yZCMhywpUQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "n_qubits = 4 # Dimension of the state vectors in CartPole\n", "n_layers = 5 # Number of layers in the PQC\n", @@ -521,7 +544,9 @@ "metadata": { "id": "qMAc2_--wpUR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ops = [cirq.Z(q) for q in qubits]\n", "observables = [reduce((lambda x, y: x * y), ops)] # Z_0*Z_1*Z_2*Z_3" @@ -542,7 +567,9 @@ "metadata": { "id": "-ivAvce6wpUR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def generate_model_policy(qubits, n_layers, n_actions, beta, observables):\n", " \"\"\"Generates a Keras model for a data re-uploading PQC policy.\"\"\"\n", @@ -578,7 +605,9 @@ }, "execution_count": 10, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -614,7 +643,9 @@ "metadata": { "id": "dYepv83JwpUT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def gather_episodes(state_bounds, n_actions, model, n_episodes, env_name):\n", " \"\"\"Interact with environment in batched fashion.\"\"\"\n", @@ -662,7 +693,9 @@ "metadata": { "id": "KGDLrNN1wpUT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def compute_returns(rewards_history, gamma):\n", " \"\"\"Compute discounted returns with discount factor `gamma`.\"\"\"\n", @@ -695,7 +728,9 @@ "metadata": { "id": "QUuSU1LRwpUU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "state_bounds = np.array([2.4, 2.5, 0.21, 2.5])\n", "gamma = 1\n", @@ -718,7 +753,9 @@ "metadata": { "id": "2fxGvCKpwpUU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "optimizer_in = tf.keras.optimizers.Adam(learning_rate=0.1, amsgrad=True)\n", "optimizer_var = tf.keras.optimizers.Adam(learning_rate=0.01, amsgrad=True)\n", @@ -743,7 +780,9 @@ "metadata": { "id": "zLfbu8Q2wpUV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function\n", "def reinforce_update(states, actions, returns, model):\n", @@ -884,7 +923,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -921,7 +962,9 @@ "metadata": { "id": "-VpROTJ1wpUX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# from PIL import Image\n", "\n", @@ -947,7 +990,8 @@ "id": "i0iA0nubwpUX" }, "source": [ - " " + "\n", + " " ] }, { @@ -985,7 +1029,9 @@ "metadata": { "id": "MX5l96qywpUY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class Rescaling(tf.keras.layers.Layer):\n", " def __init__(self, input_dim):\n", @@ -1014,7 +1060,9 @@ "metadata": { "id": "cpV0PxZqwpUY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "n_qubits = 4 # Dimension of the state vectors in CartPole\n", "n_layers = 5 # Number of layers in the PQC\n", @@ -1040,7 +1088,9 @@ "metadata": { "id": "PBGM6RHIwpUZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def generate_model_Qlearning(qubits, n_layers, n_actions, observables, target):\n", " \"\"\"Generates a Keras model for a data re-uploading PQC Q-function approximator.\"\"\"\n", @@ -1075,7 +1125,9 @@ }, "execution_count": 9, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1100,7 +1152,9 @@ }, "execution_count": 10, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1133,7 +1187,9 @@ "metadata": { "id": "0L9cV26PwpUb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def interact_env(state, model, epsilon, n_actions, env):\n", " # Preprocess state\n", @@ -1172,7 +1228,9 @@ "metadata": { "id": "RR2DjesVwpUb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function\n", "def Q_learning_update(states, actions, rewards, next_states, done, model, gamma, n_actions):\n", @@ -1216,7 +1274,9 @@ "metadata": { "id": "SQ937aYPwpUc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "gamma = 0.99\n", "n_episodes = 2000\n", @@ -1248,7 +1308,9 @@ "metadata": { "id": "713nl3oUwpUc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "optimizer_in = tf.keras.optimizers.Adam(learning_rate=0.001, amsgrad=True)\n", "optimizer_var = tf.keras.optimizers.Adam(learning_rate=0.001, amsgrad=True)\n", @@ -1449,7 +1511,9 @@ }, "metadata": { "needs_background": "light", - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } diff --git a/site/ko/tensorboard/get_started.ipynb b/site/ko/tensorboard/get_started.ipynb index 262b3ffa25..926ce2ba77 100644 --- a/site/ko/tensorboard/get_started.ipynb +++ b/site/ko/tensorboard/get_started.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "0sK8X2O9bTlz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -64,7 +66,9 @@ "metadata": { "id": "6B95Hb6YVgPZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Load the TensorBoard notebook extension\n", "%load_ext tensorboard" @@ -76,7 +80,9 @@ "metadata": { "id": "_wqSAZExy6xV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "import datetime" @@ -88,7 +94,9 @@ "metadata": { "id": "Ao7fJW1Pyiza" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Clear any logs from previous runs\n", "!rm -rf ./logs/ " @@ -186,7 +194,9 @@ }, "execution_count": 6, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -222,7 +232,9 @@ "metadata": { "id": "A4UKgTLb9fKI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%tensorboard --logdir logs/fit" ] @@ -277,7 +289,9 @@ "metadata": { "id": "nnHx4DsMezy1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))\n", "test_dataset = tf.data.Dataset.from_tensor_slices((x_test, y_test))\n", @@ -301,7 +315,9 @@ "metadata": { "id": "H2Y5-aPbAANs" }, - "outputs": [], + "outputs": [ + + ], "source": [ "loss_object = tf.keras.losses.SparseCategoricalCrossentropy()\n", "optimizer = tf.keras.optimizers.Adam()" @@ -322,7 +338,9 @@ "metadata": { "id": "jD0tEWrgH0TL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Define our metrics\n", "train_loss = tf.keras.metrics.Mean('train_loss', dtype=tf.float32)\n", @@ -346,7 +364,9 @@ "metadata": { "id": "TTWcJO35IJgK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def train_step(model, optimizer, x_train, y_train):\n", " with tf.GradientTape() as tape:\n", @@ -381,7 +401,9 @@ "metadata": { "id": "3Qp-exmbWf4w" }, - "outputs": [], + "outputs": [ + + ], "source": [ "current_time = datetime.datetime.now().strftime(\"%Y%m%d-%H%M%S\")\n", "train_log_dir = 'logs/gradient_tape/' + current_time + '/train'\n", @@ -465,7 +487,9 @@ "metadata": { "id": "-Iue509kgOyE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%tensorboard --logdir logs/gradient_tape" ] @@ -507,7 +531,9 @@ "metadata": { "id": "Q3nupQL24E5E" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!tensorboard dev upload \\\n", " --logdir logs/fit \\\n", @@ -532,7 +558,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "get_started.ipynb", "toc_visible": true }, diff --git a/site/ko/tensorboard/graphs.ipynb b/site/ko/tensorboard/graphs.ipynb index 37179ce1f4..077048e680 100644 --- a/site/ko/tensorboard/graphs.ipynb +++ b/site/ko/tensorboard/graphs.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "0sK8X2O9bTlz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -82,7 +84,9 @@ "metadata": { "id": "6B95Hb6YVgPZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Load the TensorBoard notebook extension.\n", "%load_ext tensorboard" @@ -129,7 +133,8 @@ ] }, "execution_count": 4, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -144,7 +149,9 @@ "metadata": { "id": "Ao7fJW1Pyiza" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Clear any logs from previous runs\n", "!rm -rf ./logs/ " @@ -167,7 +174,9 @@ "metadata": { "id": "skqORzvE3Egy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Define the model.\n", "model = keras.models.Sequential([\n", @@ -198,7 +207,9 @@ "metadata": { "id": "6TDmc41z3g38" }, - "outputs": [], + "outputs": [ + + ], "source": [ "(train_images, train_labels), _ = keras.datasets.fashion_mnist.load_data()\n", "train_images = train_images / 255.0" @@ -245,7 +256,8 @@ ] }, "execution_count": 8, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -280,7 +292,9 @@ "metadata": { "id": "PFgFjlPEqXb9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%tensorboard --logdir logs" ] @@ -300,7 +314,9 @@ "metadata": { "id": "b9PFgFjlPEqX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!tensorboard dev upload \\\n", " --logdir logs \\\n", @@ -401,7 +417,9 @@ "metadata": { "id": "woI67Stgv_uY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# The function to be traced.\n", "@tf.function\n", @@ -436,7 +454,9 @@ "metadata": { "id": "zCArnWzP0VuZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%tensorboard --logdir logs/func" ] diff --git a/site/ko/tensorboard/hyperparameter_tuning_with_hparams.ipynb b/site/ko/tensorboard/hyperparameter_tuning_with_hparams.ipynb index 7daf37c99b..210d1cd70d 100644 --- a/site/ko/tensorboard/hyperparameter_tuning_with_hparams.ipynb +++ b/site/ko/tensorboard/hyperparameter_tuning_with_hparams.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "atWM-s8yVnfX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -75,7 +77,9 @@ "metadata": { "id": "8p3Tbx8cWEFA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Load the TensorBoard notebook extension\n", "%load_ext tensorboard" @@ -87,7 +91,9 @@ "metadata": { "id": "lEWCCQYkWIdA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Clear any logs from previous runs\n", "!rm -rf ./logs/ " @@ -108,7 +114,9 @@ "metadata": { "id": "mVtYvbbIWRkV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "from tensorboard.plugins.hparams import api as hp" @@ -175,7 +183,9 @@ "metadata": { "id": "5Euw0agpWb4V" }, - "outputs": [], + "outputs": [ + + ], "source": [ "HP_NUM_UNITS = hp.HParam('num_units', hp.Discrete([16, 32]))\n", "HP_DROPOUT = hp.HParam('dropout', hp.RealInterval(0.1, 0.2))\n", @@ -216,7 +226,9 @@ "metadata": { "id": "hG-zalNfW5Zl" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def train_test_model(hparams):\n", " model = tf.keras.models.Sequential([\n", @@ -251,7 +263,9 @@ "metadata": { "id": "8j-fO6nEXRfW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def run(run_dir, hparams):\n", " with tf.summary.create_file_writer(run_dir).as_default():\n", @@ -382,7 +396,9 @@ "metadata": { "id": "Xf4KM-U2bbP_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%tensorboard --logdir logs/hparam_tuning" ] @@ -441,7 +457,9 @@ "metadata": { "id": "oxrSUAnCeFmQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%bash\n", "wget -q 'https://storage.googleapis.com/download.tensorflow.org/tensorboard/hparams_demo_logs.zip'\n", @@ -463,7 +481,9 @@ "metadata": { "id": "KBHp6M_zgjp4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%tensorboard --logdir logs/hparam_demo" ] @@ -491,7 +511,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "hyperparameter_tuning_with_hparams.ipynb", "toc_visible": true }, diff --git a/site/ko/tensorboard/image_summaries.ipynb b/site/ko/tensorboard/image_summaries.ipynb index 3b5f3d886d..f71e32680d 100644 --- a/site/ko/tensorboard/image_summaries.ipynb +++ b/site/ko/tensorboard/image_summaries.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "su2RaORHpReL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -69,6 +71,65 @@ "## 설정" ] }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "3U5gdCw_nSG3" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "TensorFlow 2.x selected.\n" + ] + } + ], + "source": [ + "try:\n", + " # %tensorflow_version only exists in Colab.\n", + " %tensorflow_version 2.x\n", + "except Exception:\n", + " pass\n", + "\n", + "# Load the TensorBoard notebook extension.\n", + "%load_ext tensorboard" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "id": "1qIKtOBrqc9Y" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "TensorFlow version: 2.2\n" + ] + } + ], + "source": [ + "from datetime import datetime\n", + "import io\n", + "import itertools\n", + "from packaging import version\n", + "\n", + "import tensorflow as tf\n", + "from tensorflow import keras\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import sklearn.metrics\n", + "\n", + "print(\"TensorFlow version: \", tf.__version__)\n", + "assert version.parse(tf.__version__).release[0] >= 2, \\\n", + " \"This notebook requires TensorFlow 2.0 or above.\"" + ] + }, { "cell_type": "markdown", "metadata": { @@ -169,7 +230,9 @@ "metadata": { "id": "5yPh-7EWB8IK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Reshape the image for the Summary API.\n", "img = np.reshape(train_images[0], (-1, 28, 28, 1))" @@ -190,7 +253,9 @@ "metadata": { "id": "IJNpyVyxbVtT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Clear out any prior log data.\n", "!rm -rf logs\n", @@ -220,7 +285,9 @@ "metadata": { "id": "T_X-wIy-lD9f" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%tensorboard --logdir logs/train_data" ] @@ -266,7 +333,9 @@ "metadata": { "id": "iHUjCXbetIpb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "with file_writer.as_default():\n", " # Don't forget to reshape.\n", @@ -306,7 +375,9 @@ "metadata": { "id": "F5U_5WKt8bdQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Clear out prior logging data.\n", "!rm -rf logs/plots\n", @@ -383,7 +454,9 @@ "metadata": { "id": "R74hPWJHzgvZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = keras.models.Sequential([\n", " keras.layers.Flatten(input_shape=(28, 28)),\n", @@ -415,7 +488,9 @@ "metadata": { "id": "rBiXP8-UO8t6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def plot_confusion_matrix(cm, class_names):\n", " \"\"\"\n", @@ -471,7 +546,9 @@ "metadata": { "id": "utd-vH6hn5RY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Clear out prior logging data.\n", "!rm -rf logs/image\n", @@ -488,7 +565,9 @@ "metadata": { "id": "bXQ7-9CF0TPA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def log_confusion_matrix(epoch, logs):\n", " # Use the model to predict the values from the validation dataset.\n", @@ -515,7 +594,9 @@ "metadata": { "id": "k6CV7dy-oJZu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Start TensorBoard.\n", "%tensorboard --logdir logs/image\n", @@ -562,7 +643,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "image_summaries.ipynb", "toc_visible": true }, diff --git a/site/ko/tensorboard/migrate.ipynb b/site/ko/tensorboard/migrate.ipynb index 6e87e99bc0..42306def3b 100644 --- a/site/ko/tensorboard/migrate.ipynb +++ b/site/ko/tensorboard/migrate.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "0sK8X2O9bTlz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -41,9 +43,9 @@ "\n", "\n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", "
TensorFlow.org에서 보기 Google Colab에서 실행 GitHub에서 소스 보기노트북 다운로드 Google Colab에서 실행 GitHub에서 소스 보기노트북 다운로드
" ] }, @@ -62,7 +64,9 @@ "metadata": { "id": "c50hsFk2MiWs" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf" ] @@ -127,7 +131,9 @@ "metadata": { "id": "GgFXOtSeVFqP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "writer = tf.summary.create_file_writer(\"/tmp/mylogs/eager\")\n", "\n", @@ -144,7 +150,9 @@ "metadata": { "id": "h5fk_NG7QKve" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ls /tmp/mylogs/eager" ] @@ -164,7 +172,9 @@ "metadata": { "id": "kovK0LEEVKjR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "writer = tf.summary.create_file_writer(\"/tmp/mylogs/tf_function\")\n", "\n", @@ -185,7 +195,9 @@ "metadata": { "id": "Qw5nHhRUSM7_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ls /tmp/mylogs/tf_function" ] @@ -205,7 +217,9 @@ "metadata": { "id": "OyQgeqZhVRNB" }, - "outputs": [], + "outputs": [ + + ], "source": [ "g = tf.compat.v1.Graph()\n", "with g.as_default():\n", @@ -233,7 +247,9 @@ "metadata": { "id": "iqKOyawnNQSH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ls /tmp/mylogs/session" ] @@ -276,7 +292,9 @@ "metadata": { "id": "6457297c0b9d" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Enable eager execution.\n", "tf.compat.v1.enable_v2_behavior()\n", @@ -388,7 +406,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "migrate.ipynb", "toc_visible": true }, diff --git a/site/ko/tensorboard/scalars_and_keras.ipynb b/site/ko/tensorboard/scalars_and_keras.ipynb index c8580c7995..2cb59552cb 100644 --- a/site/ko/tensorboard/scalars_and_keras.ipynb +++ b/site/ko/tensorboard/scalars_and_keras.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "su2RaORHpReL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -74,7 +76,9 @@ "metadata": { "id": "3U5gdCw_nSG3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Load the TensorBoard notebook extension.\n", "%load_ext tensorboard" @@ -116,7 +120,9 @@ "metadata": { "id": "UbFM4dlnGB3S" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Clear any logs from previous runs\n", "!rm -rf ./logs/ " @@ -143,7 +149,9 @@ "metadata": { "id": "j-ryO6OxnQH_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "data_size = 1000\n", "# 80% of the data is for training.\n", @@ -246,7 +254,9 @@ "metadata": { "id": "6pck56gKReON" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%tensorboard --logdir logs/scalars" ] @@ -348,7 +358,9 @@ "metadata": { "id": "XB95ltRiXVXk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "logdir = \"logs/scalars/\" + datetime.now().strftime(\"%Y%m%d-%H%M%S\")\n", "file_writer = tf.summary.create_file_writer(logdir + \"/metrics\")\n", @@ -408,7 +420,9 @@ "metadata": { "id": "0sjM2wXGa0mF" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%tensorboard --logdir logs/scalars" ] @@ -550,7 +564,9 @@ "metadata": { "id": "7OTD7Vpg2DLv" }, - "outputs": [], + "outputs": [ + + ], "source": [ "log_dir = 'logs/batch_level/' + datetime.now().strftime(\"%Y%m%d-%H%M%S\") + '/train'\n", "train_writer = tf.summary.create_file_writer(log_dir)" @@ -571,7 +587,9 @@ "metadata": { "id": "IGcNr1ZS1xXL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class MyModel(tf.keras.Model):\n", " def __init__(self, model):\n", @@ -640,7 +658,8 @@ ] }, "execution_count": 15, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -670,7 +689,9 @@ "metadata": { "id": "XlcafPNY2oUW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%tensorboard --logdir logs/batch_level" ] @@ -708,7 +729,9 @@ "metadata": { "id": "hX3nsdqi28W1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "log_dir = 'logs/batch_avg/' + datetime.now().strftime(\"%Y%m%d-%H%M%S\") + '/train'\n", "train_writer = tf.summary.create_file_writer(log_dir)" @@ -729,7 +752,9 @@ "metadata": { "id": "0cAiVu_KjOVi" }, - "outputs": [], + "outputs": [ + + ], "source": [ "batch_loss = tf.keras.metrics.Mean('batch_loss', dtype=tf.float32)\n", "batch_accuracy = tf.keras.metrics.SparseCategoricalAccuracy('batch_accuracy')" @@ -750,7 +775,9 @@ "metadata": { "id": "vQ_-46fpjUVl" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class MyModel(tf.keras.Model):\n", " def __init__(self, model):\n", @@ -820,7 +847,8 @@ ] }, "execution_count": 26, - "metadata": {}, + "metadata": { + }, "output_type": "execute_result" } ], @@ -850,7 +878,9 @@ "metadata": { "id": "kYmYfTeSk7AD" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%tensorboard --logdir logs/batch_avg" ] @@ -867,7 +897,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "scalars_and_keras.ipynb", "toc_visible": true }, diff --git a/site/ko/tensorboard/tbdev_getting_started.ipynb b/site/ko/tensorboard/tbdev_getting_started.ipynb index cdb1e01c7e..f0802bae27 100644 --- a/site/ko/tensorboard/tbdev_getting_started.ipynb +++ b/site/ko/tensorboard/tbdev_getting_started.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "zZ81_4tLxSvd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -68,7 +70,9 @@ "metadata": { "id": "L3ns52Luracm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "import datetime\n", @@ -90,7 +94,9 @@ "metadata": { "id": "LZExSr2Qrc5S" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mnist = tf.keras.datasets.mnist\n", "\n", @@ -121,7 +127,9 @@ "metadata": { "id": "dsVjm5CrUtXm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = create_model()\n", "model.compile(\n", @@ -183,7 +191,9 @@ "metadata": { "id": "n2PvxhOkW7vn" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!tensorboard dev upload --logdir ./logs \\\n", " --name \"Simple experiment with MNIST\" \\\n", @@ -210,7 +220,9 @@ "metadata": { "id": "C2Pj3RQCNQvP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!tensorboard dev list" ] @@ -249,7 +261,9 @@ "metadata": { "id": "VSkJTT9rNWJq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# You must replace YOUR_EXPERIMENT_ID with the value output from the previous\n", "# tensorboard `list` command or `upload` command. For example\n", @@ -261,7 +275,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "tbdev_getting_started.ipynb", "toc_visible": true }, diff --git a/site/ko/tensorboard/tensorboard_profiling_keras.ipynb b/site/ko/tensorboard/tensorboard_profiling_keras.ipynb index 5d8c5ae35f..06f179d66f 100644 --- a/site/ko/tensorboard/tensorboard_profiling_keras.ipynb +++ b/site/ko/tensorboard/tensorboard_profiling_keras.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "su2RaORHpReL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -73,7 +75,9 @@ "metadata": { "id": "cpS3QzrHkPia" }, - "outputs": [], + "outputs": [ + + ], "source": [ "from datetime import datetime\n", "from packaging import version\n", @@ -193,7 +197,9 @@ "metadata": { "id": "E9iGdPe8knMP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow_datasets as tfds\n", "tfds.disable_progress_bar()" @@ -251,7 +257,9 @@ "metadata": { "id": "ZI31gE_3ktiz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def normalize_img(image, label):\n", " \"\"\"Normalizes images: `uint8` -> `float32`.\"\"\"\n", @@ -267,7 +275,9 @@ "metadata": { "id": "2vjIX9O8k0fx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ds_test = ds_test.map(normalize_img)\n", "ds_test = ds_test.batch(128)" @@ -288,7 +298,9 @@ "metadata": { "id": "QabMuRcWk2qr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = tf.keras.models.Sequential([\n", " tf.keras.layers.Flatten(input_shape=(28, 28, 1)),\n", @@ -354,7 +366,9 @@ }, "execution_count": 11, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -390,7 +404,9 @@ "metadata": { "id": "jqx5wF1Vlwe9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Load the TensorBoard notebook extension.\n", "%load_ext tensorboard" @@ -688,7 +704,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -773,7 +791,9 @@ "metadata": { "id": "m5JRkpRLk1Gn" }, - "outputs": [], + "outputs": [ + + ], "source": [ "(ds_train, ds_test), ds_info = tfds.load(\n", " 'mnist',\n", @@ -790,7 +810,9 @@ "metadata": { "id": "ZWYYeN-aSP4K" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ds_train = ds_train.map(normalize_img)\n", "ds_train = ds_train.batch(128)\n", @@ -804,7 +826,9 @@ "metadata": { "id": "9CmH9HkTlF3e" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ds_test = ds_test.map(normalize_img)\n", "ds_test = ds_test.batch(128)\n", @@ -846,7 +870,9 @@ }, "execution_count": 17, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "execute_result" } @@ -1122,7 +1148,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" }, @@ -1146,7 +1174,9 @@ ] }, "metadata": { - "tags": [] + "tags": [ + + ] }, "output_type": "display_data" } @@ -1199,7 +1229,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "tensorboard_profiling_keras.ipynb", "toc_visible": true }, diff --git a/site/ko/tensorboard/text_summaries.ipynb b/site/ko/tensorboard/text_summaries.ipynb index 7510b997a9..c0396fadbd 100644 --- a/site/ko/tensorboard/text_summaries.ipynb +++ b/site/ko/tensorboard/text_summaries.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "su2RaORHpReL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -42,10 +44,10 @@ "\n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", "
TensorFlow.org에서 보기\n", " Google Colab에서 실행하기\n", + " Google Colab에서 실행하기\n", "GitHub에서 소스 보기노트북 다운로드GitHub에서 소스 보기노트북 다운로드
" ] }, @@ -77,7 +79,9 @@ "metadata": { "id": "3U5gdCw_nSG3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "try:\n", " # %tensorflow_version only exists in Colab.\n", @@ -134,7 +138,9 @@ "metadata": { "id": "FxMPcdmvBn9t" }, - "outputs": [], + "outputs": [ + + ], "source": [ "my_text = \"Hello world! 😃\"" ] @@ -145,7 +151,9 @@ "metadata": { "id": "IJNpyVyxbVtT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Clear out any prior log data.\n", "!rm -rf logs\n", @@ -175,7 +183,9 @@ "metadata": { "id": "T_X-wIy-lD9f" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%tensorboard --logdir logs" ] @@ -208,7 +218,9 @@ "metadata": { "id": "dda6960f0119" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Sets up a second directory to not overwrite the first one.\n", "logdir = \"logs/multiple_texts/\" + datetime.now().strftime(\"%Y%m%d-%H%M%S\")\n", @@ -232,7 +244,9 @@ "metadata": { "id": "515199f4b547" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%tensorboard --logdir logs/multiple_texts --samples_per_plugin 'text=5'" ] @@ -254,7 +268,9 @@ "metadata": { "id": "iHUjCXbetIpb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Sets up a third timestamped log directory under \"logs\"\n", "logdir = \"logs/markdown/\" + datetime.now().strftime(\"%Y%m%d-%H%M%S\")\n", @@ -309,7 +325,9 @@ "metadata": { "id": "57082d8d6839" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%tensorboard --logdir logs/markdown" ] @@ -317,7 +335,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "text_summaries.ipynb", "toc_visible": true }, diff --git a/site/ko/tfx/tutorials/data_validation/tfdv_basic.ipynb b/site/ko/tfx/tutorials/data_validation/tfdv_basic.ipynb index 051288405c..d0d21d74b2 100644 --- a/site/ko/tfx/tutorials/data_validation/tfdv_basic.ipynb +++ b/site/ko/tfx/tutorials/data_validation/tfdv_basic.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "rSGJWC5biBiG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -52,9 +54,9 @@ "\n", "" ] }, @@ -145,7 +147,9 @@ "metadata": { "id": "b0ISmRq3nY3-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "try:\n", " import colab\n", @@ -171,7 +175,9 @@ "metadata": { "id": "hPJsE5Gkdp8m" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print('Installing TensorFlow Data Validation')\n", "!pip install --upgrade 'tensorflow_data_validation[visualization]<2'" @@ -196,7 +202,9 @@ "metadata": { "id": "E2j9VD9HbGWw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import pkg_resources\n", "import importlib\n", @@ -218,7 +226,9 @@ "metadata": { "id": "F5rPatTDSCHB" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "import tensorflow_data_validation as tfdv\n", @@ -243,7 +253,9 @@ "metadata": { "id": "x5gfFiTeDa6Y" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import os\n", "import tempfile, urllib, zipfile\n", @@ -286,7 +298,9 @@ "metadata": { "id": "EE481oMbT-H0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_stats = tfdv.generate_statistics_from_csv(data_location=TRAIN_DATA)" ] @@ -314,7 +328,9 @@ "metadata": { "id": "U3tUKgh7Up3x" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# docs-infra: no-execute\n", "tfdv.visualize_statistics(train_stats)" @@ -348,7 +364,9 @@ "metadata": { "id": "6LLkRJThVr9m" }, - "outputs": [], + "outputs": [ + + ], "source": [ "schema = tfdv.infer_schema(statistics=train_stats)\n", "tfdv.display_schema(schema=schema)" @@ -378,7 +396,9 @@ "metadata": { "id": "j_P0RLYlV6XG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Compute stats for evaluation data\n", "eval_stats = tfdv.generate_statistics_from_csv(data_location=EVAL_DATA)" @@ -390,7 +410,9 @@ "metadata": { "id": "Qn-3fQWJLimn" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# docs-infra: no-execute\n", "# Compare evaluation data with training data\n", @@ -426,7 +448,9 @@ "metadata": { "id": "T7uGVeL2WOam" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Check eval data for errors by validating the eval data stats using the previously inferred schema.\n", "anomalies = tfdv.validate_statistics(statistics=eval_stats, schema=schema)\n", @@ -456,7 +480,9 @@ "metadata": { "id": "legN2nXLWZAc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Relax the minimum fraction of values that must come from the domain for feature company.\n", "company = tfdv.get_feature(schema, 'company')\n", @@ -508,7 +534,9 @@ "metadata": { "id": "wSZfbnifJuTA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "serving_stats = tfdv.generate_statistics_from_csv(SERVING_DATA)\n", "serving_anomalies = tfdv.validate_statistics(serving_stats, schema)\n", @@ -533,7 +561,9 @@ "metadata": { "id": "OhtYF8aAczpd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "options = tfdv.StatsOptions(schema=schema, infer_type_from_schema=True)\n", "serving_stats = tfdv.generate_statistics_from_csv(SERVING_DATA, stats_options=options)\n", @@ -557,7 +587,9 @@ "metadata": { "id": "bnbnw8H6Lp2M" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# All features are by default in both TRAINING and SERVING environments.\n", "schema.default_environment.append('TRAINING')\n", @@ -626,7 +658,9 @@ "metadata": { "id": "wEUsZm_rOd1Q" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Add skew comparator for 'payment_type' feature.\n", "payment_type = tfdv.get_feature(schema, 'payment_type')\n", @@ -669,7 +703,9 @@ "metadata": { "id": "ydkL4DkIWn18" }, - "outputs": [], + "outputs": [ + + ], "source": [ "from tensorflow.python.lib.io import file_io\n", "from google.protobuf import text_format\n", diff --git a/site/ko/tfx/tutorials/serving/rest_simple.ipynb b/site/ko/tfx/tutorials/serving/rest_simple.ipynb index ebe5397066..1c203d5e66 100644 --- a/site/ko/tfx/tutorials/serving/rest_simple.ipynb +++ b/site/ko/tfx/tutorials/serving/rest_simple.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "_ckMIh7O7s6D" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -77,7 +79,9 @@ "metadata": { "id": "FWkuJabJSKGB" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import sys\n", "\n", @@ -91,7 +95,9 @@ "metadata": { "id": "dzLKpmZICaWN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# TensorFlow and tf.keras\n", "print(\"Installing dependencies for Colab environment\")\n", @@ -144,7 +150,9 @@ "metadata": { "id": "7MqDQO0KCaWS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "fashion_mnist = keras.datasets.fashion_mnist\n", "(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()\n", @@ -181,7 +189,9 @@ "metadata": { "id": "LTNN0ANGgA36" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = keras.Sequential([\n", " keras.layers.Conv2D(input_shape=(28,28,1), filters=8, kernel_size=3, \n", @@ -220,7 +230,9 @@ "metadata": { "id": "0w5Rq8SsgWE6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Fetch the Keras session and save the model\n", "# The signature definition is defined by the input and output tensors,\n", @@ -263,7 +275,9 @@ "metadata": { "id": "LU4GDF_aYtfQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!saved_model_cli show --dir {export_path} --all" ] @@ -300,7 +314,9 @@ "metadata": { "id": "v2hF_ChoOrEd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import sys\n", "# We need sudo prefix if not on a Google Colab.\n", @@ -316,7 +332,9 @@ "metadata": { "id": "EWg9X2QHlbGS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# This is the same as you would do from your command line, but without the [arch=amd64], and no sudo\n", "# You would instead do:\n", @@ -345,7 +363,9 @@ "metadata": { "id": "ygwa9AgRloYy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# TODO: Use the latest model server version when colab supports it.\n", "#!{SUDO_IF_NEEDED} apt-get install tensorflow-model-server\n", @@ -377,7 +397,9 @@ "metadata": { "id": "aUgp3vUdU5GS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "os.environ[\"MODEL_DIR\"] = MODEL_DIR" ] @@ -388,7 +410,9 @@ "metadata": { "id": "kJDhHNJVnaLN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%bash --bg \n", "nohup tensorflow_model_server \\\n", @@ -403,7 +427,9 @@ "metadata": { "id": "IxbeiOCUUs2z" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!tail server.log" ] @@ -425,7 +451,9 @@ "metadata": { "id": "Luqm_Jyff9iR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def show(idx, title):\n", " plt.figure()\n", @@ -453,7 +481,9 @@ "metadata": { "id": "2dsD7KQG1m-R" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import json\n", "data = json.dumps({\"signature_name\": \"serving_default\", \"instances\": test_images[0:3].tolist()})\n", @@ -486,7 +516,9 @@ "metadata": { "id": "vGvFyuIzW6n6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# docs_infra: no_execute\n", "!pip install -q requests\n", @@ -517,7 +549,9 @@ "metadata": { "id": "zRftRxeR1tZx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# docs_infra: no_execute\n", "headers = {\"content-type\": \"application/json\"}\n", @@ -533,7 +567,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "rest_simple.ipynb", "toc_visible": true }, diff --git a/site/ko/tfx/tutorials/tfx/cloud-ai-platform-pipelines.md b/site/ko/tfx/tutorials/tfx/cloud-ai-platform-pipelines.md index 5ea3a4a92c..ed5f4219b1 100644 --- a/site/ko/tfx/tutorials/tfx/cloud-ai-platform-pipelines.md +++ b/site/ko/tfx/tutorials/tfx/cloud-ai-platform-pipelines.md @@ -41,7 +41,7 @@ https://pixabay.com/photos/new-york-cab-cabs-taxi-urban-city-2087998/ --> 2. Google Cloud 이용 약관에 동의합니다. - + 3. 무료 평가판 계정으로 시작하려면 [**무료로 사용하기**](https://console.cloud.google.com/freetrial)(또는 [**무료로 시작하기**](https://console.cloud.google.com/freetrial))를 클릭하세요. @@ -75,15 +75,15 @@ https://pixabay.com/photos/new-york-cab-cabs-taxi-urban-city-2087998/ --> 2. **+ New Instance(+ 새 인스턴스)**를 클릭하여 새 클러스터를 만듭니다. - + 3. **Kubeflow Pipelines(Kubeflow 파이프라인)** 개요 페이지에서 **Configure(구성)**을 클릭합니다. - + 4. "활성화"를 클릭하여 Kubernetes Engine API를 활성화합니다. - + 오픈 대시 보드 참고: 계속 진행하기 전에 Kubernetes Engine API를 사용할 수 있게 준비되는 동안 몇 분 정도 기다려야 할 수 있습니다. @@ -93,7 +93,7 @@ https://pixabay.com/photos/new-york-cab-cabs-taxi-urban-city-2087998/ --> 2. **중요** *다음 Cloud API에 대한 액세스 허용* 상자를 선택 표시합니다. (이 클러스터가 프로젝트의 다른 부분에 액세스하는 데 필요합니다. 이 단계를 놓치면 나중에 수정하기가 약간 까다롭습니다.) - + 3. **새 클러스터 만들기**를 클릭하고 클러스터가 생성될 때까지 몇 분 정도 기다립니다. 이 작업은 몇 분 정도 걸립니다. 완료되면 다음과 같은 메시지가 표시됩니다. @@ -113,7 +113,7 @@ https://pixabay.com/photos/new-york-cab-cabs-taxi-urban-city-2087998/ --> 3. TensorFlow Enterprise 2.7(또는 그 이상)이 설치된 **새 노트북**을 생성합니다. - + 선택 노트북 새 노트북 -> TensorFlow Enterprise 2.7 -> Without GPU @@ -125,7 +125,7 @@ https://pixabay.com/photos/new-york-cab-cabs-taxi-urban-city-2087998/ --> 2. 무료 등급을 유지해야 하는 경우 **머신 구성**에서 vCPU가 1개 또는 2개인 구성을 선택할 수 있습니다. - + 3. 새 노트북이 생성될 때까지 기다린 후 **Notebooks API 사용 설정**을 클릭합니다. @@ -139,15 +139,15 @@ https://pixabay.com/photos/new-york-cab-cabs-taxi-urban-city-2087998/ --> 2. 이 튜토리얼에서 사용중인 클러스터 라인에서 **Open Pipelines Dashboard를** 클릭합니다. - 선택 노트북 + 3. **시작하기** 페이지에서 **Google Cloud에서 Cloud AI Platform 노트북 열기**를 클릭합니다. - 오픈 대시 보드 + 4. 이 튜토리얼에서 사용 중인 노트북 인스턴스를 선택하고 **계속**을 선택한 후 **확인**을 선택합니다. - + ## 5. 노트북에서 계속 작업 diff --git a/site/ko/tfx/tutorials/tfx/components.ipynb b/site/ko/tfx/tutorials/tfx/components.ipynb index dfc6b3a636..abd6ca5df3 100644 --- a/site/ko/tfx/tutorials/tfx/components.ipynb +++ b/site/ko/tfx/tutorials/tfx/components.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "c2jyGuiG1gHr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -131,7 +133,9 @@ "metadata": { "id": "tFhBChv4J_PD" }, - "outputs": [], + "outputs": [ + + ], "source": [ "try:\n", " import colab\n", @@ -157,7 +161,9 @@ "metadata": { "id": "S4SQA7Q5nej3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install tfx" ] @@ -179,7 +185,9 @@ "metadata": { "id": "Y8hwtlmbktkV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip uninstall shapely -y" ] @@ -212,7 +220,9 @@ "metadata": { "id": "YIqpWK9efviJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import os\n", "import pprint\n", @@ -246,7 +256,9 @@ "metadata": { "id": "eZ4K18_DN2D8" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print('TensorFlow version: {}'.format(tf.__version__))\n", "print('TFX version: {}'.format(tfx.__version__))" @@ -267,7 +279,9 @@ "metadata": { "id": "ad5JLpKbf6sN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# This is the root directory for your TFX pip package installation.\n", "_tfx_root = tfx.__path__[0]\n", @@ -337,7 +351,9 @@ "metadata": { "id": "BywX6OUEhAqn" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_data_root = tempfile.mkdtemp(prefix='tfx-data')\n", "DATA_PATH = 'https://raw.githubusercontent.com/tensorflow/tfx/master/tfx/examples/chicago_taxi_pipeline/data/simple/data.csv'\n", @@ -360,7 +376,9 @@ "metadata": { "id": "c5YPeLPFOXaD" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!head {_data_filepath}" ] @@ -391,7 +409,9 @@ "metadata": { "id": "0Rh6K5sUf9dd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Here, we create an InteractiveContext using default parameters. This will\n", "# use a temporary directory with an ephemeral ML Metadata database instance.\n", @@ -438,7 +458,9 @@ "metadata": { "id": "PyXjuMt8f-9u" }, - "outputs": [], + "outputs": [ + + ], "source": [ "example_gen = tfx.components.CsvExampleGen(input_base=_data_root)\n", "context.run(example_gen)" @@ -459,7 +481,9 @@ "metadata": { "id": "880KkTAkPeUg" }, - "outputs": [], + "outputs": [ + + ], "source": [ "artifact = example_gen.outputs['examples'].get()[0]\n", "print(artifact.split_names, artifact.uri)" @@ -480,7 +504,9 @@ "metadata": { "id": "H4XIXjiCPwzQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Get the URI of the output artifact representing the training examples, which is a directory\n", "train_uri = os.path.join(example_gen.outputs['examples'].get()[0].uri, 'Split-train')\n", @@ -528,7 +554,9 @@ "metadata": { "id": "MAscCCYWgA-9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "statistics_gen = tfx.components.StatisticsGen(examples=example_gen.outputs['examples'])\n", "context.run(statistics_gen)" @@ -549,7 +577,9 @@ "metadata": { "id": "tLjXy7K6Tp_G" }, - "outputs": [], + "outputs": [ + + ], "source": [ "context.show(statistics_gen.outputs['statistics'])" ] @@ -573,7 +603,9 @@ "metadata": { "id": "ygQvZ6hsiQ_J" }, - "outputs": [], + "outputs": [ + + ], "source": [ "schema_gen = tfx.components.SchemaGen(\n", " statistics=statistics_gen.outputs['statistics'],\n", @@ -596,7 +628,9 @@ "metadata": { "id": "Ec9vqDXpXeMb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "context.show(schema_gen.outputs['schema'])" ] @@ -631,7 +665,9 @@ "metadata": { "id": "XRlRUuGgiXks" }, - "outputs": [], + "outputs": [ + + ], "source": [ "example_validator = tfx.components.ExampleValidator(\n", " statistics=statistics_gen.outputs['statistics'],\n", @@ -654,7 +690,9 @@ "metadata": { "id": "TDyAAozQcrk3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "context.show(example_validator.outputs['anomalies'])" ] @@ -691,7 +729,9 @@ "metadata": { "id": "PuNSiUKb4YJf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_taxi_constants_module_file = 'taxi_constants.py'" ] @@ -702,7 +742,9 @@ "metadata": { "id": "HPjhXuIF4YJh" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%writefile {_taxi_constants_module_file}\n", "\n", @@ -756,7 +798,9 @@ "metadata": { "id": "4AJ9hBs94YJm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_taxi_transform_module_file = 'taxi_transform.py'" ] @@ -767,7 +811,9 @@ "metadata": { "id": "MYmxxx9A4YJn" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%writefile {_taxi_transform_module_file}\n", "\n", @@ -862,7 +908,9 @@ "metadata": { "id": "jHfhth_GiZI9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "transform = tfx.components.Transform(\n", " examples=example_gen.outputs['examples'],\n", @@ -889,7 +937,9 @@ "metadata": { "id": "SClrAaEGR1O5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "transform.outputs" ] @@ -909,7 +959,9 @@ "metadata": { "id": "5tRw4DneR3i7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_uri = transform.outputs['transform_graph'].get()[0].uri\n", "os.listdir(train_uri)" @@ -932,7 +984,9 @@ "metadata": { "id": "pwbW2zPKR_S4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Get the URI of the output artifact representing the transformed examples, which is a directory\n", "train_uri = os.path.join(transform.outputs['transformed_examples'].get()[0].uri, 'Split-train')\n", @@ -982,7 +1036,9 @@ "metadata": { "id": "N1376oq04YJt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_taxi_trainer_module_file = 'taxi_trainer.py'" ] @@ -993,7 +1049,9 @@ "metadata": { "id": "nf9UuNng4YJu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%writefile {_taxi_trainer_module_file}\n", "\n", @@ -1238,7 +1296,9 @@ "metadata": { "id": "429-vvCWibO0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "from tfx.components.trainer.executor import Executor\n", "from tfx.dsl.components.base import executor_spec\n", @@ -1271,7 +1331,9 @@ "metadata": { "id": "bXe62WE0S0Ek" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Get the URI of the output artifact representing the training logs, which is a directory\n", "model_run_dir = trainer.outputs['model_run'].get()[0].uri\n", @@ -1299,7 +1361,9 @@ "metadata": { "id": "fVhfzzh9PDEx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "eval_config = tfma.EvalConfig(\n", " model_specs=[\n", @@ -1356,7 +1420,9 @@ "metadata": { "id": "Zjcx8g6mihSt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Use TFMA to compute a evaluation statistics over features of a model and\n", "# validate them against a baseline.\n", @@ -1395,7 +1461,9 @@ "metadata": { "id": "k4GghePOTJxL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "evaluator.outputs" ] @@ -1415,7 +1483,9 @@ "metadata": { "id": "U729j5X5QQUQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "context.show(evaluator.outputs['evaluation'])" ] @@ -1435,7 +1505,9 @@ "metadata": { "id": "pyis6iy0HLdi" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow_model_analysis as tfma\n", "\n", @@ -1474,7 +1546,9 @@ "metadata": { "id": "FZmiRtg6TKtR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "blessing_uri = evaluator.outputs['blessing'].get()[0].uri\n", "!ls -l {blessing_uri}" @@ -1495,7 +1569,9 @@ "metadata": { "id": "lxa5G08bSJ8a" }, - "outputs": [], + "outputs": [ + + ], "source": [ "PATH_TO_RESULT = evaluator.outputs['evaluation'].get()[0].uri\n", "print(tfma.load_validation_result(PATH_TO_RESULT))" @@ -1518,7 +1594,9 @@ "metadata": { "id": "r45nQ69eikc9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "pusher = tfx.components.Pusher(\n", " model=trainer.outputs['model'],\n", @@ -1544,7 +1622,9 @@ "metadata": { "id": "pRkWo-MzTSss" }, - "outputs": [], + "outputs": [ + + ], "source": [ "pusher.outputs" ] @@ -1564,7 +1644,9 @@ "metadata": { "id": "4zyIqWl9TSdG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "push_uri = pusher.outputs['pushed_model'].get()[0].uri\n", "model = tf.saved_model.load(push_uri)\n", diff --git a/site/ko/tfx/tutorials/tfx/components_keras.ipynb b/site/ko/tfx/tutorials/tfx/components_keras.ipynb index 550c6cd3b9..3f26458e07 100644 --- a/site/ko/tfx/tutorials/tfx/components_keras.ipynb +++ b/site/ko/tfx/tutorials/tfx/components_keras.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "c2jyGuiG1gHr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -122,7 +124,9 @@ "metadata": { "id": "as4OTe2ukSqm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import sys\n", "if 'google.colab' in sys.modules:\n", @@ -146,7 +150,9 @@ "metadata": { "id": "S4SQA7Q5nej3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install tfx" ] @@ -168,7 +174,9 @@ "metadata": { "id": "7kp0dFH9kgza" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip uninstall shapely -y" ] @@ -201,7 +209,9 @@ "metadata": { "id": "YIqpWK9efviJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import os\n", "import pprint\n", @@ -235,7 +245,9 @@ "metadata": { "id": "eZ4K18_DN2D8" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print('TensorFlow version: {}'.format(tf.__version__))\n", "print('TFX version: {}'.format(tfx.__version__))" @@ -256,7 +268,9 @@ "metadata": { "id": "ad5JLpKbf6sN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# This is the root directory for your TFX pip package installation.\n", "_tfx_root = tfx.__path__[0]\n", @@ -326,7 +340,9 @@ "metadata": { "id": "BywX6OUEhAqn" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_data_root = tempfile.mkdtemp(prefix='tfx-data')\n", "DATA_PATH = 'https://raw.githubusercontent.com/tensorflow/tfx/master/tfx/examples/chicago_taxi_pipeline/data/simple/data.csv'\n", @@ -349,7 +365,9 @@ "metadata": { "id": "c5YPeLPFOXaD" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!head {_data_filepath}" ] @@ -380,7 +398,9 @@ "metadata": { "id": "0Rh6K5sUf9dd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Here, we create an InteractiveContext using default parameters. This will\n", "# use a temporary directory with an ephemeral ML Metadata database instance.\n", @@ -431,7 +451,9 @@ "metadata": { "id": "PyXjuMt8f-9u" }, - "outputs": [], + "outputs": [ + + ], "source": [ "example_gen = tfx.components.CsvExampleGen(input_base=_data_root)\n", "context.run(example_gen, enable_cache=True)" @@ -452,7 +474,9 @@ "metadata": { "id": "880KkTAkPeUg" }, - "outputs": [], + "outputs": [ + + ], "source": [ "artifact = example_gen.outputs['examples'].get()[0]\n", "print(artifact.split_names, artifact.uri)" @@ -473,7 +497,9 @@ "metadata": { "id": "H4XIXjiCPwzQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Get the URI of the output artifact representing the training examples, which is a directory\n", "train_uri = os.path.join(example_gen.outputs['examples'].get()[0].uri, 'Split-train')\n", @@ -521,7 +547,9 @@ "metadata": { "id": "MAscCCYWgA-9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "statistics_gen = tfx.components.StatisticsGen(\n", " examples=example_gen.outputs['examples'])\n", @@ -543,7 +571,9 @@ "metadata": { "id": "tLjXy7K6Tp_G" }, - "outputs": [], + "outputs": [ + + ], "source": [ "context.show(statistics_gen.outputs['statistics'])" ] @@ -569,7 +599,9 @@ "metadata": { "id": "ygQvZ6hsiQ_J" }, - "outputs": [], + "outputs": [ + + ], "source": [ "schema_gen = tfx.components.SchemaGen(\n", " statistics=statistics_gen.outputs['statistics'],\n", @@ -592,7 +624,9 @@ "metadata": { "id": "Ec9vqDXpXeMb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "context.show(schema_gen.outputs['schema'])" ] @@ -627,7 +661,9 @@ "metadata": { "id": "XRlRUuGgiXks" }, - "outputs": [], + "outputs": [ + + ], "source": [ "example_validator = tfx.components.ExampleValidator(\n", " statistics=statistics_gen.outputs['statistics'],\n", @@ -650,7 +686,9 @@ "metadata": { "id": "TDyAAozQcrk3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "context.show(example_validator.outputs['anomalies'])" ] @@ -687,7 +725,9 @@ "metadata": { "id": "PuNSiUKb4YJf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_taxi_constants_module_file = 'taxi_constants.py'" ] @@ -698,7 +738,9 @@ "metadata": { "id": "HPjhXuIF4YJh" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%writefile {_taxi_constants_module_file}\n", "\n", @@ -759,7 +801,9 @@ "metadata": { "id": "4AJ9hBs94YJm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_taxi_transform_module_file = 'taxi_transform.py'" ] @@ -770,7 +814,9 @@ "metadata": { "id": "MYmxxx9A4YJn" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%writefile {_taxi_transform_module_file}\n", "\n", @@ -893,7 +939,9 @@ "metadata": { "id": "jHfhth_GiZI9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "transform = tfx.components.Transform(\n", " examples=example_gen.outputs['examples'],\n", @@ -920,7 +968,9 @@ "metadata": { "id": "SClrAaEGR1O5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "transform.outputs" ] @@ -940,7 +990,9 @@ "metadata": { "id": "5tRw4DneR3i7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_uri = transform.outputs['transform_graph'].get()[0].uri\n", "os.listdir(train_uri)" @@ -963,7 +1015,9 @@ "metadata": { "id": "pwbW2zPKR_S4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Get the URI of the output artifact representing the transformed examples, which is a directory\n", "train_uri = os.path.join(transform.outputs['transformed_examples'].get()[0].uri, 'Split-train')\n", @@ -1013,7 +1067,9 @@ "metadata": { "id": "N1376oq04YJt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_taxi_trainer_module_file = 'taxi_trainer.py'" ] @@ -1024,7 +1080,9 @@ "metadata": { "id": "nf9UuNng4YJu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%writefile {_taxi_trainer_module_file}\n", "\n", @@ -1233,7 +1291,9 @@ "metadata": { "id": "429-vvCWibO0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "trainer = tfx.components.Trainer(\n", " module_file=os.path.abspath(_taxi_trainer_module_file),\n", @@ -1262,7 +1322,9 @@ "metadata": { "id": "bXe62WE0S0Ek" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model_artifact_dir = trainer.outputs['model'].get()[0].uri\n", "pp.pprint(os.listdir(model_artifact_dir))\n", @@ -1285,7 +1347,9 @@ "metadata": { "id": "-APzqz2NeAyj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model_run_artifact_dir = trainer.outputs['model_run'].get()[0].uri\n", "\n", @@ -1312,7 +1376,9 @@ "metadata": { "id": "fVhfzzh9PDEx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Imported files such as taxi_constants are normally cached, so changes are\n", "# not honored after the first import. Normally this is good for efficiency, but\n", @@ -1383,7 +1449,9 @@ "metadata": { "id": "Zjcx8g6mihSt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Use TFMA to compute a evaluation statistics over features of a model and\n", "# validate them against a baseline.\n", @@ -1423,7 +1491,9 @@ "metadata": { "id": "k4GghePOTJxL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "evaluator.outputs" ] @@ -1443,7 +1513,9 @@ "metadata": { "id": "U729j5X5QQUQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "context.show(evaluator.outputs['evaluation'])" ] @@ -1463,7 +1535,9 @@ "metadata": { "id": "pyis6iy0HLdi" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow_model_analysis as tfma\n", "\n", @@ -1502,7 +1576,9 @@ "metadata": { "id": "FZmiRtg6TKtR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "blessing_uri = evaluator.outputs['blessing'].get()[0].uri\n", "!ls -l {blessing_uri}" @@ -1523,7 +1599,9 @@ "metadata": { "id": "lxa5G08bSJ8a" }, - "outputs": [], + "outputs": [ + + ], "source": [ "PATH_TO_RESULT = evaluator.outputs['evaluation'].get()[0].uri\n", "print(tfma.load_validation_result(PATH_TO_RESULT))" @@ -1546,7 +1624,9 @@ "metadata": { "id": "r45nQ69eikc9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "pusher = tfx.components.Pusher(\n", " model=trainer.outputs['model'],\n", @@ -1572,7 +1652,9 @@ "metadata": { "id": "pRkWo-MzTSss" }, - "outputs": [], + "outputs": [ + + ], "source": [ "pusher.outputs" ] @@ -1592,7 +1674,9 @@ "metadata": { "id": "4zyIqWl9TSdG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "push_uri = pusher.outputs['pushed_model'].get()[0].uri\n", "model = tf.saved_model.load(push_uri)\n", diff --git a/site/ko/tfx/tutorials/tfx/gcp/vertex_pipelines_bq.ipynb b/site/ko/tfx/tutorials/tfx/gcp/vertex_pipelines_bq.ipynb index b5f4f5ab6f..b49dc94b8b 100644 --- a/site/ko/tfx/tutorials/tfx/gcp/vertex_pipelines_bq.ipynb +++ b/site/ko/tfx/tutorials/tfx/gcp/vertex_pipelines_bq.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "SoFqANDE222Y" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -107,7 +109,9 @@ "metadata": { "id": "osJJdvmIrPgP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Use the latest version of pip.\n", "!pip install --upgrade pip\n", @@ -131,7 +135,9 @@ "metadata": { "id": "kOK-jepulVUU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip uninstall shapely -y" ] @@ -162,7 +168,9 @@ "metadata": { "id": "JYKpuhamrPgQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# docs_infra: no_execute\n", "import sys\n", @@ -190,7 +198,9 @@ "metadata": { "id": "FY8IqqnmrPgQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import sys\n", "if 'google.colab' in sys.modules:\n", @@ -228,7 +238,9 @@ "metadata": { "id": "mvZS3XW2rPgR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "print('TensorFlow version: {}'.format(tf.__version__))\n", @@ -261,7 +273,9 @@ "metadata": { "id": "EcUseqJaE2XN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "GOOGLE_CLOUD_PROJECT = '' # <--- ENTER THIS\n", "GOOGLE_CLOUD_PROJECT_NUMBER = '' # <--- ENTER THIS\n", @@ -288,7 +302,9 @@ "metadata": { "id": "VkWdxe4TXRHk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!gcloud config set project {GOOGLE_CLOUD_PROJECT}" ] @@ -299,7 +315,9 @@ "metadata": { "id": "CPN6UL5CazNy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "PIPELINE_NAME = 'penguin-bigquery'\n", "\n", @@ -336,7 +354,9 @@ "metadata": { "id": "4aii8K3dJEyj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!gcloud projects add-iam-policy-binding {GOOGLE_CLOUD_PROJECT} \\\n", " --member=serviceAccount:{GOOGLE_CLOUD_PROJECT_NUMBER}-compute@developer.gserviceaccount.com \\\n", @@ -382,7 +402,9 @@ "metadata": { "id": "Mb_Kj1U8pBhZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# docs_infra: no_execute\n", "%%bigquery --project {GOOGLE_CLOUD_PROJECT}\n", @@ -408,7 +430,9 @@ "metadata": { "id": "7AwysGAVnfJA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "QUERY = \"SELECT * FROM `tfx-oss-public.palmer_penguins.palmer_penguins`\"" ] @@ -430,7 +454,9 @@ "metadata": { "id": "aES7Hv5QTDK3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_trainer_module_file = 'penguin_trainer.py'" ] @@ -441,7 +467,9 @@ "metadata": { "id": "Gnc67uQNTDfW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%writefile {_trainer_module_file}\n", "\n", @@ -581,7 +609,9 @@ "metadata": { "id": "rMMs5wuNYAbc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!gsutil cp {_trainer_module_file} {MODULE_ROOT}/" ] @@ -603,7 +633,9 @@ "metadata": { "id": "M49yYVNBTPd4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "from typing import List, Optional\n", "\n", @@ -671,7 +703,9 @@ "metadata": { "id": "fAtfOZTYWJu-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# docs_infra: no_execute\n", "import os\n", @@ -713,7 +747,9 @@ "metadata": { "id": "tI71jlEvWMV7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# docs_infra: no_execute\n", "from google.cloud import aiplatform\n", diff --git a/site/ko/tfx/tutorials/tfx/gcp/vertex_pipelines_simple.ipynb b/site/ko/tfx/tutorials/tfx/gcp/vertex_pipelines_simple.ipynb index 9d03a6d5b5..4b30bb0a65 100644 --- a/site/ko/tfx/tutorials/tfx/gcp/vertex_pipelines_simple.ipynb +++ b/site/ko/tfx/tutorials/tfx/gcp/vertex_pipelines_simple.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "SoFqANDE222Y" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -109,7 +111,9 @@ "metadata": { "id": "iyQtljP-qPHY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Use the latest version of pip.\n", "!pip install --upgrade pip\n", @@ -133,7 +137,9 @@ "metadata": { "id": "lVkGjRNQkKFe" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip uninstall shapely -y" ] @@ -164,7 +170,9 @@ "metadata": { "id": "KHTSzMygoBF6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# docs_infra: no_execute\n", "import sys\n", @@ -192,7 +200,9 @@ "metadata": { "id": "kZQA0KrfXCvU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import sys\n", "if 'google.colab' in sys.modules:\n", @@ -230,7 +240,9 @@ "metadata": { "id": "Xd-iP9wEaENu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "print('TensorFlow version: {}'.format(tf.__version__))\n", @@ -263,7 +275,9 @@ "metadata": { "id": "EcUseqJaE2XN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "GOOGLE_CLOUD_PROJECT = '' # <--- ENTER THIS\n", "GOOGLE_CLOUD_REGION = '' # <--- ENTER THIS\n", @@ -289,7 +303,9 @@ "metadata": { "id": "VkWdxe4TXRHk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!gcloud config set project {GOOGLE_CLOUD_PROJECT}" ] @@ -300,7 +316,9 @@ "metadata": { "id": "CPN6UL5CazNy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "PIPELINE_NAME = 'penguin-vertex-pipelines'\n", "\n", @@ -350,7 +368,9 @@ "metadata": { "id": "4fxMs6u86acP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!gsutil cp gs://download.tensorflow.org/data/palmer_penguins/penguins_processed.csv {DATA_ROOT}/" ] @@ -370,7 +390,9 @@ "metadata": { "id": "-eSz28UDSnlG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!gsutil cat {DATA_ROOT}/penguins_processed.csv | head" ] @@ -407,7 +429,9 @@ "metadata": { "id": "aES7Hv5QTDK3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_trainer_module_file = 'penguin_trainer.py'" ] @@ -418,7 +442,9 @@ "metadata": { "id": "Gnc67uQNTDfW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%writefile {_trainer_module_file}\n", "\n", @@ -559,7 +585,9 @@ "metadata": { "id": "rMMs5wuNYAbc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!gsutil cp {_trainer_module_file} {MODULE_ROOT}/" ] @@ -581,7 +609,9 @@ "metadata": { "id": "M49yYVNBTPd4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Copied from https://www.tensorflow.org/tfx/tutorials/tfx/penguin_simple and\n", "# slightly modified because we don't need `metadata_path` argument.\n", @@ -646,7 +676,9 @@ "metadata": { "id": "fAtfOZTYWJu-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# docs_infra: no_execute\n", "import os\n", @@ -681,7 +713,9 @@ "metadata": { "id": "tI71jlEvWMV7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# docs_infra: no_execute\n", "from google.cloud import aiplatform\n", diff --git a/site/ko/tfx/tutorials/tfx/gcp/vertex_pipelines_vertex_training.ipynb b/site/ko/tfx/tutorials/tfx/gcp/vertex_pipelines_vertex_training.ipynb index 304639890f..74837ab74a 100644 --- a/site/ko/tfx/tutorials/tfx/gcp/vertex_pipelines_vertex_training.ipynb +++ b/site/ko/tfx/tutorials/tfx/gcp/vertex_pipelines_vertex_training.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "SoFqANDE222Y" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -109,7 +111,9 @@ "metadata": { "id": "iyQtljP-qPHY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Use the latest version of pip.\n", "!pip install --upgrade pip\n", @@ -133,7 +137,9 @@ "metadata": { "id": "wzBCmlXBiXgX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip uninstall shapely -y" ] @@ -164,7 +170,9 @@ "metadata": { "id": "KHTSzMygoBF6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# docs_infra: no_execute\n", "import sys\n", @@ -192,7 +200,9 @@ "metadata": { "id": "kZQA0KrfXCvU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import sys\n", "if 'google.colab' in sys.modules:\n", @@ -230,7 +240,9 @@ "metadata": { "id": "Xd-iP9wEaENu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "print('TensorFlow version: {}'.format(tf.__version__))\n", @@ -263,7 +275,9 @@ "metadata": { "id": "EcUseqJaE2XN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "GOOGLE_CLOUD_PROJECT = '' # <--- ENTER THIS\n", "GOOGLE_CLOUD_REGION = '' # <--- ENTER THIS\n", @@ -289,7 +303,9 @@ "metadata": { "id": "VkWdxe4TXRHk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!gcloud config set project {GOOGLE_CLOUD_PROJECT}" ] @@ -300,7 +316,9 @@ "metadata": { "id": "CPN6UL5CazNy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "PIPELINE_NAME = 'penguin-vertex-training'\n", "\n", @@ -347,7 +365,9 @@ "metadata": { "id": "4fxMs6u86acP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!gsutil cp gs://download.tensorflow.org/data/palmer_penguins/penguins_processed.csv {DATA_ROOT}/" ] @@ -367,7 +387,9 @@ "metadata": { "id": "-eSz28UDSnlG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!gsutil cat {DATA_ROOT}/penguins_processed.csv | head" ] @@ -408,7 +430,9 @@ "metadata": { "id": "aES7Hv5QTDK3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_trainer_module_file = 'penguin_trainer.py'" ] @@ -419,7 +443,9 @@ "metadata": { "id": "Gnc67uQNTDfW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%writefile {_trainer_module_file}\n", "\n", @@ -574,7 +600,9 @@ "metadata": { "id": "rMMs5wuNYAbc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!gsutil cp {_trainer_module_file} {MODULE_ROOT}/" ] @@ -600,7 +628,9 @@ "metadata": { "id": "M49yYVNBTPd4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def _create_pipeline(pipeline_name: str, pipeline_root: str, data_root: str,\n", " module_file: str, endpoint_name: str, project_id: str,\n", @@ -718,7 +748,9 @@ "metadata": { "id": "fAtfOZTYWJu-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# docs_infra: no_execute\n", "import os\n", @@ -756,7 +788,9 @@ "metadata": { "id": "tI71jlEvWMV7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# docs_infra: no_execute\n", "from google.cloud import aiplatform\n", @@ -799,7 +833,9 @@ "metadata": { "id": "51EWzkj8Wdly" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ENDPOINT_ID='' # <--- ENTER THIS\n", "if not ENDPOINT_ID:\n", @@ -824,7 +860,9 @@ "metadata": { "id": "Gdzxst2_OoXH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# docs_infra: no_execute\n", "import numpy as np\n", @@ -896,7 +934,9 @@ "metadata": { "id": "1TwX6bcsLo_g" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# docs_infra: no_execute\n", "runner.run(\n", diff --git a/site/ko/tfx/tutorials/tfx/neural_structured_learning.ipynb b/site/ko/tfx/tutorials/tfx/neural_structured_learning.ipynb index dd42f00320..91fd99b9ef 100644 --- a/site/ko/tfx/tutorials/tfx/neural_structured_learning.ipynb +++ b/site/ko/tfx/tutorials/tfx/neural_structured_learning.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "ioaprt5q5US7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -109,7 +111,9 @@ "metadata": { "id": "-UmVrHUfkUA2" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import sys\n", "if 'google.colab' in sys.modules:\n", @@ -131,7 +135,9 @@ "metadata": { "id": "yDUe7gk_ztZ-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install -q \\\n", " tfx \\\n", @@ -166,7 +172,9 @@ "metadata": { "id": "2ew7HTbPpCJH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import apache_beam as beam\n", "import gzip as gzip_lib\n", @@ -263,7 +271,9 @@ "metadata": { "id": "__cZi2Ic48KL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_set, eval_set = tfds.load(\n", " \"imdb_reviews:1.0.0\",\n", @@ -286,7 +296,9 @@ "metadata": { "id": "LsnHde8T67Jz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for tfrecord in train_set.take(4):\n", " print(\"Review: {}\".format(tfrecord[\"text\"].numpy().decode(\"utf-8\")[:300]))\n", @@ -299,7 +311,9 @@ "metadata": { "id": "0wG7v3rk-Cwo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def _dict_to_example(instance):\n", " \"\"\"Decoded CSV to tf example.\"\"\"\n", @@ -350,7 +364,9 @@ "metadata": { "id": "4aVuXUil7hil" }, - "outputs": [], + "outputs": [ + + ], "source": [ "context = InteractiveContext()" ] @@ -374,7 +390,9 @@ "metadata": { "id": "WdH4ql3Y7pT4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "input_config = example_gen_pb2.Input(splits=[\n", " example_gen_pb2.Input.Split(name='train', pattern='train.tfrecord'),\n", @@ -392,7 +410,9 @@ "metadata": { "id": "IeUp6xCCrxsS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for artifact in example_gen.outputs['examples'].get():\n", " print(artifact)\n", @@ -432,7 +452,9 @@ "metadata": { "id": "XHCUzXA5qeWe" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def make_example_with_unique_id(example, id_feature_name):\n", " \"\"\"Adds a unique ID to the given `tf.train.Example` proto.\n", @@ -501,7 +523,9 @@ "metadata": { "id": "ZtLxNWHPO0je" }, - "outputs": [], + "outputs": [ + + ], "source": [ "identify_examples = IdentifyExamples(\n", " orig_examples=example_gen.outputs['examples'],\n", @@ -529,7 +553,9 @@ "metadata": { "id": "MAscCCYWgA-9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Computes statistics over data for visualization and example validation.\n", "statistics_gen = StatisticsGen(\n", @@ -556,7 +582,9 @@ "metadata": { "id": "ygQvZ6hsiQ_J" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Generates schema based on statistics files.\n", "schema_gen = SchemaGen(\n", @@ -579,7 +607,9 @@ "metadata": { "id": "L6-tgKi6A_gK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_uri = schema_gen.outputs['schema'].get()[0].uri\n", "schema_filename = os.path.join(train_uri, 'schema.pbtxt')\n", @@ -602,7 +632,9 @@ "metadata": { "id": "gycOsJIQFhi3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tfdv.display_schema(schema)" ] @@ -626,7 +658,9 @@ "metadata": { "id": "XRlRUuGgiXks" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Performs anomaly detection based on statistics and data schema.\n", "validate_stats = ExampleValidator(\n", @@ -688,7 +722,9 @@ "metadata": { "id": "2bAttbhgPa4V" }, - "outputs": [], + "outputs": [ + + ], "source": [ "swivel_url = 'https://tfhub.dev/google/tf2-preview/gnews-swivel-20dim/1'\n", "hub_layer = hub.KerasLayer(swivel_url, input_shape=[], dtype=tf.string)\n", @@ -759,7 +795,9 @@ "metadata": { "id": "ITkf2SLg1TG7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "\"\"\"Custom Artifact type\"\"\"\n", "\n", @@ -808,7 +846,9 @@ "metadata": { "id": "H0ZkHvJMA-0G" }, - "outputs": [], + "outputs": [ + + ], "source": [ "synthesize_graph = SynthesizeGraph(\n", " identified_examples=identify_examples.outputs['identified_examples'],\n", @@ -823,7 +863,9 @@ "metadata": { "id": "o54M-0Q11FcS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_uri = synthesize_graph.outputs[\"synthesized_graph\"].get()[0].uri\n", "os.listdir(train_uri)" @@ -835,7 +877,9 @@ "metadata": { "id": "IRK_rS_q1UcZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "graph_path = os.path.join(train_uri, \"Split-train\", \"graph.tsv\")\n", "print(\"node 1\\t\\t\\t\\t\\tnode 2\\t\\t\\t\\t\\tsimilarity\")\n", @@ -850,7 +894,9 @@ "metadata": { "id": "uybqyWztvCGm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!wc -l {graph_path}" ] @@ -896,7 +942,9 @@ "metadata": { "id": "7uuWiQbOG9ki" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_transform_module_file = 'imdb_transform.py'" ] @@ -907,7 +955,9 @@ "metadata": { "id": "v3EIuVQnBfH7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%writefile {_transform_module_file}\n", "\n", @@ -989,7 +1039,9 @@ "metadata": { "id": "jHfhth_GiZI9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Performs transformations and feature engineering in training and serving.\n", "transform = Transform(\n", @@ -1017,7 +1069,9 @@ "metadata": { "id": "j4UjersvAC7p" }, - "outputs": [], + "outputs": [ + + ], "source": [ "transform.outputs" ] @@ -1037,7 +1091,9 @@ "metadata": { "id": "E4I-cqfQQvaW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_uri = transform.outputs['transform_graph'].get()[0].uri\n", "os.listdir(train_uri)" @@ -1060,7 +1116,9 @@ "metadata": { "id": "-QPONyzDTswf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def pprint_examples(artifact, n_examples=3):\n", " print(\"artifact:\", artifact)\n", @@ -1081,7 +1139,9 @@ "metadata": { "id": "2zIepQhSQoPa" }, - "outputs": [], + "outputs": [ + + ], "source": [ "pprint_examples(transform.outputs['transformed_examples'].get()[0])" ] @@ -1105,7 +1165,9 @@ "metadata": { "id": "gI6P_-AXGm04" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def split_train_and_unsup(input_uri):\n", " 'Separate the labeled and unlabeled instances.'\n", @@ -1196,7 +1258,9 @@ "metadata": { "id": "r9MIEVDiOANe" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Augments training data with graph neighbors.\n", "graph_augmentation = GraphAugmentation(\n", @@ -1213,7 +1277,9 @@ "metadata": { "id": "gpSLs3Hx8viI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "pprint_examples(graph_augmentation.outputs['augmented_examples'].get()[0], 6)" ] @@ -1237,7 +1303,9 @@ "metadata": { "id": "5ajvClE6b2pd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Setup paths.\n", "_trainer_module_file = 'imdb_trainer.py'" @@ -1249,7 +1317,9 @@ "metadata": { "id": "_dh6AejVk2Oq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%writefile {_trainer_module_file}\n", "\n", @@ -1730,7 +1800,9 @@ "metadata": { "id": "MWLQI6t0b2pg" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Uses user-provided Python function that implements a model using TensorFlow's\n", "# Estimators API.\n", @@ -1761,7 +1833,9 @@ "metadata": { "id": "qDBZG9Oso-BD" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_uri = trainer.outputs['model'].get()[0].uri\n", "serving_model_path = os.path.join(train_uri, 'Format-Serving')\n", @@ -1774,7 +1848,9 @@ "metadata": { "id": "KyT3ZVGCZWsj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "exported_model.graph.get_operations()[:10] + [\"...\"]" ] @@ -1794,7 +1870,9 @@ "metadata": { "id": "rnKeqLmcGqHH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#docs_infra: no_execute\n", "\n", diff --git a/site/ko/tfx/tutorials/tfx/penguin_simple.ipynb b/site/ko/tfx/tutorials/tfx/penguin_simple.ipynb index 0621655b2e..b9e0985769 100644 --- a/site/ko/tfx/tutorials/tfx/penguin_simple.ipynb +++ b/site/ko/tfx/tutorials/tfx/penguin_simple.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "SpNWyqewk8fE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -52,11 +54,9 @@ "\n", "" ] }, @@ -92,7 +92,9 @@ "metadata": { "id": "as4OTe2ukSqm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "try:\n", " import colab\n", @@ -116,7 +118,9 @@ "metadata": { "id": "iyQtljP-qPHY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install -U tfx" ] @@ -138,7 +142,9 @@ "metadata": { "id": "mYn4k-r-k3qN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip uninstall shapely -y" ] @@ -169,7 +175,9 @@ "metadata": { "id": "6jh7vKSRqPHb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "print('TensorFlow version: {}'.format(tf.__version__))\n", @@ -194,7 +202,9 @@ "metadata": { "id": "EcUseqJaE2XN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import os\n", "\n", @@ -246,7 +256,9 @@ "metadata": { "id": "4fxMs6u86acP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import urllib.request\n", "import tempfile\n", @@ -272,7 +284,9 @@ "metadata": { "id": "-eSz28UDSnlG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!head {_data_filepath}" ] @@ -322,7 +336,9 @@ "metadata": { "id": "aES7Hv5QTDK3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_trainer_module_file = 'penguin_trainer.py'" ] @@ -333,7 +349,9 @@ "metadata": { "id": "Gnc67uQNTDfW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%writefile {_trainer_module_file}\n", "\n", @@ -479,7 +497,9 @@ "metadata": { "id": "M49yYVNBTPd4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def _create_pipeline(pipeline_name: str, pipeline_root: str, data_root: str,\n", " module_file: str, serving_model_dir: str,\n", @@ -549,7 +569,9 @@ "metadata": { "id": "fAtfOZTYWJu-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tfx.orchestration.LocalDagRunner().run(\n", " _create_pipeline(\n", @@ -578,7 +600,9 @@ "metadata": { "id": "NTHROkqX6yHx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# List files in created model directory.\n", "!find {SERVING_MODEL_DIR}" diff --git a/site/ko/tfx/tutorials/tfx/penguin_tfdv.ipynb b/site/ko/tfx/tutorials/tfx/penguin_tfdv.ipynb index 36af04215d..516177435f 100644 --- a/site/ko/tfx/tutorials/tfx/penguin_tfdv.ipynb +++ b/site/ko/tfx/tutorials/tfx/penguin_tfdv.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "SpNWyqewk8fE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -102,7 +104,9 @@ "metadata": { "id": "as4OTe2ukSqm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "try:\n", " import colab\n", @@ -126,7 +130,9 @@ "metadata": { "id": "iyQtljP-qPHY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install -U tfx" ] @@ -148,7 +154,9 @@ "metadata": { "id": "6NxAIvvg_V-8" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip uninstall shapely -y" ] @@ -179,7 +187,9 @@ "metadata": { "id": "6jh7vKSRqPHb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "print('TensorFlow version: {}'.format(tf.__version__))\n", @@ -204,7 +214,9 @@ "metadata": { "id": "EcUseqJaE2XN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import os\n", "\n", @@ -262,7 +274,9 @@ "metadata": { "id": "ZSfs6qFgdzO1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import urllib.request\n", "import tempfile\n", @@ -288,7 +302,9 @@ "metadata": { "id": "nLn9ith2dzO1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!head {_data_filepath}" ] @@ -337,7 +353,9 @@ "metadata": { "id": "GfQ6FAk9gxJ2" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def _create_schema_pipeline(pipeline_name: str,\n", " pipeline_root: str,\n", @@ -386,7 +404,9 @@ "metadata": { "id": "BQspf0ajg9AO" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tfx.orchestration.LocalDagRunner().run(\n", " _create_schema_pipeline(\n", @@ -433,7 +453,9 @@ "metadata": { "id": "K0i_jTvOI8mv" }, - "outputs": [], + "outputs": [ + + ], "source": [ "from ml_metadata.proto import metadata_store_pb2\n", "# Non-public APIs, just for showcase.\n", @@ -480,7 +502,9 @@ "metadata": { "id": "hRKSjXzsiqh0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Non-public APIs, just for showcase.\n", "from tfx.orchestration.metadata import Metadata\n", @@ -526,7 +550,9 @@ "metadata": { "id": "3StnKm04iqh-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# docs-infra: no-execute\n", "visualize_artifacts(stats_artifacts)" @@ -566,7 +592,9 @@ "metadata": { "id": "MVmlot5ziqh_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "visualize_artifacts(schema_artifacts)" ] @@ -597,7 +625,9 @@ "metadata": { "id": "0Pyi0oaKmRTg" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import shutil\n", "\n", @@ -626,7 +656,9 @@ "metadata": { "id": "uwHO7-HfnlWs" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(f'Schema at {SCHEMA_PATH}-----')\n", "!cat {SCHEMA_PATH}/*" @@ -673,7 +705,9 @@ "metadata": { "id": "aES7Hv5QTDK3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_trainer_module_file = 'penguin_trainer.py'" ] @@ -684,7 +718,9 @@ "metadata": { "id": "Gnc67uQNTDfW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%writefile {_trainer_module_file}\n", "\n", @@ -820,7 +856,9 @@ "metadata": { "id": "M49yYVNBTPd4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def _create_pipeline(pipeline_name: str, pipeline_root: str, data_root: str,\n", " schema_path: str, module_file: str, serving_model_dir: str,\n", @@ -894,7 +932,9 @@ "metadata": { "id": "fAtfOZTYWJu-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tfx.orchestration.LocalDagRunner().run(\n", " _create_pipeline(\n", @@ -933,7 +973,9 @@ "metadata": { "id": "TtsrZEUB1-J4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "metadata_connection_config = tfx.orchestration.metadata.sqlite_metadata_connection_config(\n", " METADATA_PATH)\n", @@ -959,7 +1001,9 @@ "metadata": { "id": "F-4oAjGR-IR0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "visualize_artifacts(anomalies_artifacts)" ] diff --git a/site/ko/tfx/tutorials/tfx/penguin_tfma.ipynb b/site/ko/tfx/tutorials/tfx/penguin_tfma.ipynb index 4b7d125756..83236247a6 100644 --- a/site/ko/tfx/tutorials/tfx/penguin_tfma.ipynb +++ b/site/ko/tfx/tutorials/tfx/penguin_tfma.ipynb @@ -16,19 +16,21 @@ "cellView": "form", "id": "SpNWyqewk8fE" }, - "outputs": [], + "outputs": [ + + ], "source": [ - "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", - "# you may not use this file except in compliance with the License.\n", - "# You may obtain a copy of the License at\n", + "# Apache License, 버전 2.0(\"라이선스\")에 따라서만 라이선스가 허여되며, \n", + "# 라이선스를 준수하는 경우에 한해 이 파일을 사용할 수 있습니다. \n", + "# 라이선스 사본은 다음에서 받을 수 있습니다.\n", "#\n", - "# https://www.apache.org/licenses/LICENSE-2.0\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", "#\n", - "# Unless required by applicable law or agreed to in writing, software\n", - "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", - "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", - "# See the License for the specific language governing permissions and\n", - "# limitations under the License." + "# 이 코드는 묵시적 보증이나 소유권, \n", + "# 특정 목적에의 적합성 또는 비침해성을 포함하되 그에 한정하지 않고\n", + "# 어떠한 종류의 명시적 또는 묵시적 보증도 없이 있는 그대로 제공됩니다.\n", + "# 라이선스에 따른 허가 및 제한에 적용되는 특정 언어는\n", + "# License를 참조하십시오. " ] }, { @@ -94,7 +96,9 @@ "metadata": { "id": "as4OTe2ukSqm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "try:\n", " import colab\n", @@ -118,7 +122,9 @@ "metadata": { "id": "iyQtljP-qPHY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install -U tfx" ] @@ -140,7 +146,9 @@ "metadata": { "id": "RhieH4y1_d3n" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip uninstall shapely -y" ] @@ -171,7 +179,9 @@ "metadata": { "id": "6jh7vKSRqPHb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "print('TensorFlow version: {}'.format(tf.__version__))\n", @@ -196,7 +206,9 @@ "metadata": { "id": "EcUseqJaE2XN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import os\n", "\n", @@ -241,7 +253,9 @@ "metadata": { "id": "4fxMs6u86acP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import urllib.request\n", "import tempfile\n", @@ -284,7 +298,9 @@ "metadata": { "id": "aES7Hv5QTDK3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_trainer_module_file = 'penguin_trainer.py'" ] @@ -295,7 +311,9 @@ "metadata": { "id": "Gnc67uQNTDfW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%writefile {_trainer_module_file}\n", "\n", @@ -435,7 +453,9 @@ "metadata": { "id": "M49yYVNBTPd4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow_model_analysis as tfma\n", "\n", @@ -568,7 +588,9 @@ "metadata": { "id": "fAtfOZTYWJu-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tfx.orchestration.LocalDagRunner().run(\n", " _create_pipeline(\n", @@ -643,7 +665,9 @@ "metadata": { "id": "aiK6zbeAg3X5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "from ml_metadata.proto import metadata_store_pb2\n", "# Non-public APIs, just for showcase.\n", @@ -676,7 +700,9 @@ "metadata": { "id": "4FOo6PV5g5Mm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Non-public APIs, just for showcase.\n", "from tfx.orchestration.metadata import Metadata\n", @@ -707,7 +733,9 @@ "metadata": { "id": "wTaKoEHrj0Gs" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow_model_analysis as tfma\n", "\n", diff --git a/site/ko/tfx/tutorials/tfx/penguin_transform.ipynb b/site/ko/tfx/tutorials/tfx/penguin_transform.ipynb new file mode 100644 index 0000000000..6ec6875d17 --- /dev/null +++ b/site/ko/tfx/tutorials/tfx/penguin_transform.ipynb @@ -0,0 +1,890 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "DjUA6S30k52h" + }, + "source": [ + "##### Copyright 2021 The TensorFlow Authors." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "id": "SpNWyqewk8fE" + }, + "outputs": [ + + ], + "source": [ + "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# https://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6x1ypzczQCwy" + }, + "source": [ + "# TFX 파이프라인 및 TensorFlow Transform을 사용한 특성 엔지니어링\n", + "\n", + "***TFX 파이프라인을 사용하여 입력 데이터를 변환하고 모델을 훈련합니다.***" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HU9YYythm0dx" + }, + "source": [ + "참고: 설정이 필요하지 않은 Colab 노트북에서 이 튜토리얼을 실행하는 것이 좋습니다! \"Google Colab에서 실행\"을 클릭하기만 하면 됩니다.\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_VuwrlnvQJ5k" + }, + "source": [ + "이 노트북 기반 튜토리얼에서는 TFX 파이프라인을 생성 및 실행하여 원시 입력 데이터를 수집하고 ML 훈련에 알맞게 전처리합니다. 이 노트북은 [TFX 파이프라인 및 TensorFlow 데이터 검증 튜토리얼을 사용하는 데이터 검증](https://www.tensorflow.org/tfx/tutorials/tfx/penguin_tfdv)에서 구축한 TFX 파이프라인을 기반으로 합니다. 해당 내용을 아직 읽지 않았다면 이 노트북을 계속 진행하기 전에 읽어야 합니다.\n", + "\n", + "특성 엔지니어링으로 데이터의 예측 품질을 높이거나 차원을 낮출 수 있습니다. TFX 사용의 이점 중 하나는 변환 코드를 한 번 작성하면 훈련/적용 불일치를 피할 수 있도록 변환 결과가 훈련과 적용 간에 일관성 있게 된다는 것입니다.\n", + "\n", + "파이프라인에 `Transform` 구성 요소를 추가합니다. Transform 구성 요소는 [tf.transform](https://www.tensorflow.org/tfx/transform/get_started) 라이브러리를 사용하여 구현됩니다.\n", + "\n", + "TFX의 다양한 개념에 대해 자세히 알아보려면 [TFX 파이프라인 이해하기](https://www.tensorflow.org/tfx/guide/understanding_tfx_pipelines)를 참조하세요." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Fmgi8ZvQkScg" + }, + "source": [ + "## 설정하기\n", + "\n", + "먼저 TFX Python 패키지를 설치하고 모델에 사용할 데이터세트를 다운로드해야 합니다.\n", + "\n", + "### Pip 업그레이드\n", + "\n", + "로컬에서 실행할 때 시스템에서 Pip을 업그레이드하지 않으려면 Colab에서 실행 중인지 확인해야 합니다. 물론 로컬 시스템은 별도로 업그레이드할 수 있습니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "as4OTe2ukSqm" + }, + "outputs": [ + + ], + "source": [ + "try:\n", + " import colab\n", + " !pip install --upgrade pip\n", + "except:\n", + " pass" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MZOYTt1RW4TK" + }, + "source": [ + "### TFX 설치\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "iyQtljP-qPHY" + }, + "outputs": [ + + ], + "source": [ + "!pip install -U tfx" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "wQnYqtqOlA5l" + }, + "source": [ + "### shapely 설치 제거하기\n", + "\n", + "TODO(b/263441833) ImportError를 피하는 임시 솔루션입니다. 다른 추가 종속성을 제거하는 대신 최신 버전의 Bigquery를 지원하여 처리하는 것이 이상적입니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "3e8hUMPrlFXJ" + }, + "outputs": [ + + ], + "source": [ + "!pip uninstall shapely -y" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "EwT0nov5QO1M" + }, + "source": [ + "### 런타임을 다시 시작했습니까?\n", + "\n", + "Google Colab을 사용하는 경우, \"런타임 다시 시작\" 버튼을 클릭하거나 \"런타임 > 런타임 다시 시작...\" 메뉴를 사용하여 런타임을 다시 시작해야 합니다. 이는 Colab이 패키지를 로드하는 방식 때문입니다." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "BDnPgN8UJtzN" + }, + "source": [ + "TensorFlow 및 TFX 버전을 확인합니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "6jh7vKSRqPHb" + }, + "outputs": [ + + ], + "source": [ + "import tensorflow as tf\n", + "print('TensorFlow version: {}'.format(tf.__version__))\n", + "from tfx import v1 as tfx\n", + "print('TFX version: {}'.format(tfx.__version__))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "aDtLdSkvqPHe" + }, + "source": [ + "### 변수 설정하기\n", + "\n", + "파이프라인을 정의하는 데 사용되는 변수가 몇 가지 있습니다. 이러한 변수를 원하는 대로 사용자 정의할 수 있습니다. 기본적으로 파이프라인의 모든 출력은 현재 디렉터리 아래에 생성됩니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "EcUseqJaE2XN" + }, + "outputs": [ + + ], + "source": [ + "import os\n", + "\n", + "PIPELINE_NAME = \"penguin-transform\"\n", + "\n", + "# Output directory to store artifacts generated from the pipeline.\n", + "PIPELINE_ROOT = os.path.join('pipelines', PIPELINE_NAME)\n", + "# Path to a SQLite DB file to use as an MLMD storage.\n", + "METADATA_PATH = os.path.join('metadata', PIPELINE_NAME, 'metadata.db')\n", + "# Output directory where created models from the pipeline will be exported.\n", + "SERVING_MODEL_DIR = os.path.join('serving_model', PIPELINE_NAME)\n", + "\n", + "from absl import logging\n", + "logging.set_verbosity(logging.INFO) # Set default logging level." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qsO0l5F3dzOr" + }, + "source": [ + "### 예제 데이터 준비하기\n", + "\n", + "TFX 파이프라인에서 사용할 예제 데이터세트를 다운로드합니다. 사용하는 데이터세트는 [Palmer Penguins 데이터세트](https://allisonhorst.github.io/palmerpenguins/articles/intro.html)입니다.\n", + "\n", + "다만 미리 전처리한 데이터세트를 사용한 이전 튜토리얼과는 달리 이번에는 **원시** Palmer Penguins 데이터세트를 사용합니다.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "11J7XiCq6AFP" + }, + "source": [ + "TFX ExampleGen 구성 요소는 디렉터리로부터 입력을 읽기 때문에 디렉터리를 생성한 후 데이터세트를 디렉터리에 복사해야 합니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "4fxMs6u86acP" + }, + "outputs": [ + + ], + "source": [ + "import urllib.request\n", + "import tempfile\n", + "\n", + "DATA_ROOT = tempfile.mkdtemp(prefix='tfx-data') # Create a temporary directory.\n", + "_data_path = 'https://storage.googleapis.com/download.tensorflow.org/data/palmer_penguins/penguins_size.csv'\n", + "_data_filepath = os.path.join(DATA_ROOT, \"data.csv\")\n", + "urllib.request.urlretrieve(_data_path, _data_filepath)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ASpoNmxKSQjI" + }, + "source": [ + "빠르게 원시 데이터의 형태를 살펴봅니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "-eSz28UDSnlG" + }, + "outputs": [ + + ], + "source": [ + "!head {_data_filepath}" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "OTtQNq1DdVvG" + }, + "source": [ + "`NA`로 표시되는 누락된 값이 있는 입력 항목이 있습니다. 이 튜토리얼에서는 해당 입력 항목만 삭제합니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "fQhpoaqff9ca" + }, + "outputs": [ + + ], + "source": [ + "!sed -i '/\\bNA\\b/d' {_data_filepath}\n", + "!head {_data_filepath}" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "z8EOfCy1dzO2" + }, + "source": [ + "펭귄을 묘사하는 7가지 특성을 볼 수 있어야 합니다. 이전 튜토리얼과 동일한 특성 세트('culmen_length_mm', 'culmen_depth_mm', 'flipper_length_mm', 'body_mass_g')를 사용하고 펭귄의 '종'을 예측할 것입니다.\n", + "\n", + "**유일한 차이점은 입력 데이터를 전처리하지 않는다는 것입니다.** 이 튜토리얼에서는 '섬' 또는 '성별'과 같은 다른 특성을 사용하지 않습니다." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Jtbrkjjc-IKA" + }, + "source": [ + "### 스키마 파일 준비하기\n", + "\n", + "[TFX 파이프라인 및 TensorFlow 데이터 검증을 사용한 데이터 검증](https://www.tensorflow.org/tfx/tutorials/tfx/penguin_tfdv)에 설명된 대로 데이터세트용 스키마 파일이 필요합니다. 데이터세트가 이전 튜토리얼과 다르기 때문에 다시 생성해야 합니다. 이 튜토리얼에서는 이러한 단계를 건너뛰고 준비된 스키마 파일만 사용합니다.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "EDoB97m8B9nG" + }, + "outputs": [ + + ], + "source": [ + "import shutil\n", + "\n", + "SCHEMA_PATH = 'schema'\n", + "\n", + "_schema_uri = 'https://raw.githubusercontent.com/tensorflow/tfx/master/tfx/examples/penguin/schema/raw/schema.pbtxt'\n", + "_schema_filename = 'schema.pbtxt'\n", + "_schema_filepath = os.path.join(SCHEMA_PATH, _schema_filename)\n", + "\n", + "os.makedirs(SCHEMA_PATH, exist_ok=True)\n", + "urllib.request.urlretrieve(_schema_uri, _schema_filepath)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gKJ_HDJQB94b" + }, + "source": [ + "이 스키마 파일은 수동 변경한 사항이 없이 이전 튜토리얼과 동일한 파이프라인을 사용하여 생성되었습니다." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nH6gizcpSwWV" + }, + "source": [ + "## 파이프라인 생성하기\n", + "\n", + "TFX 파이프라인은 Python API를 사용하여 정의합니다. [데이터 검증 튜토리얼](https://www.tensorflow.org/tfx/tutorials/tfx/penguin_tfdv)에서 생성한 파이프라인에 `Transform` 구성요소를 추가합니다.\n", + "\n", + "변환 구성 요소는 `ExampleGen` 구성 요소의 입력 데이터와 `SchemaGen` 구성 요소의 스키마를 필요로 하며 \"변환 그래프\"를 생성합니다. 출력 결과는 `Trainer` 구성 요소에서 사용합니다. 변환은 선택적으로 변환 후 구체화된 데이터인 \"변환된 데이터\"를 추가로 생성할 수 있습니다. 그러나 이 튜토리얼에서는 중간 변환 데이터를 구체화하지 않고 훈련 중에 데이터를 변환합니다.\n", + "\n", + "한 가지 주의할 점은 입력 데이터를 변환하는 방법을 설명하기 위해 Python 함수인 `preprocessing_fn`을 정의해야 한다는 것입니다. 이는 모델 정의를 위해 사용자 코드도 필요로 하는 Trainer 구성 요소와 유사합니다.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lOjDv93eS5xV" + }, + "source": [ + "### 전처리 및 학습 코드 작성하기\n", + "\n", + "두 개의 Python 함수를 정의해야 합니다. 하나는 Transform이고 다른 하나는 Trainer입니다.\n", + "\n", + "#### preprocessing_fn\n", + "\n", + "Transform 구성 요소는 `Trainer` 구성 요소에서 수행한 작업과 같이 지정한 모듈 파일에서 `preprocessing_fn`이라는 함수를 찾습니다. Transform 구성 요소의 `preprocessing_fn` 매개변수를 사용하여 특정 함수를 지정할 수도 있습니다.\n", + "\n", + "이 예제에서는 두 종류의 변환을 수행합니다. `culmen_length_mm`과 `body_mass_g`와 같은 연속 숫자 특성의 경우 [tft.scale_to_z_score](https://www.tensorflow.org/tfx/transform/api_docs/python/tft/scale_to_z_score) 함수를 사용하여 이러한 값을 정규화합니다. 레이블 특성의 경우 문자열 레이블을 숫자 인덱스 값으로 변환해야 합니다. 변환에는 [`tf.lookup.StaticHashTable`](https://www.tensorflow.org/api_docs/python/tf/lookup/StaticHashTable)을 사용합니다.\n", + "\n", + "변환한 필드를 쉽게 식별하기 위해 변환한 특성 이름에 `_xf` 접미사를 추가합니다.\n", + "\n", + "#### run_fn\n", + "\n", + "모델 자체는 이전 튜토리얼과 거의 동일하지만 이번에는 Transform 구성 요소의 변환 그래프를 사용하여 입력 데이터를 변환합니다.\n", + "\n", + "이전 튜토리얼과 비교하여 한 가지 더 중요한 차이점은 이제는 모델의 계산 그래프뿐만 아니라 Transform 구성 요소에서 생성한 전처리용 변환 그래프를 포함하는 적용 모델도 내보낸다는 것입니다. 수신하는 요청을 적용하는 데 사용할 별도의 함수를 정의해야 합니다. 훈련 데이터와 적용 요청 모두에 동일한 함수 `_apply_preprocessing`이 사용되었음을 알 수 있습니다.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "aES7Hv5QTDK3" + }, + "outputs": [ + + ], + "source": [ + "_module_file = 'penguin_utils.py'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Gnc67uQNTDfW" + }, + "outputs": [ + + ], + "source": [ + "%%writefile {_module_file}\n", + "\n", + "\n", + "from typing import List, Text\n", + "from absl import logging\n", + "import tensorflow as tf\n", + "from tensorflow import keras\n", + "from tensorflow_metadata.proto.v0 import schema_pb2\n", + "import tensorflow_transform as tft\n", + "from tensorflow_transform.tf_metadata import schema_utils\n", + "\n", + "from tfx import v1 as tfx\n", + "from tfx_bsl.public import tfxio\n", + "\n", + "# Specify features that we will use.\n", + "_FEATURE_KEYS = [\n", + " 'culmen_length_mm', 'culmen_depth_mm', 'flipper_length_mm', 'body_mass_g'\n", + "]\n", + "_LABEL_KEY = 'species'\n", + "\n", + "_TRAIN_BATCH_SIZE = 20\n", + "_EVAL_BATCH_SIZE = 10\n", + "\n", + "\n", + "# NEW: TFX Transform will call this function.\n", + "def preprocessing_fn(inputs):\n", + " \"\"\"tf.transform's callback function for preprocessing inputs.\n", + "\n", + " Args:\n", + " inputs: map from feature keys to raw not-yet-transformed features.\n", + "\n", + " Returns:\n", + " Map from string feature key to transformed feature.\n", + " \"\"\"\n", + " outputs = {}\n", + "\n", + " # Uses features defined in _FEATURE_KEYS only.\n", + " for key in _FEATURE_KEYS:\n", + " # tft.scale_to_z_score computes the mean and variance of the given feature\n", + " # and scales the output based on the result.\n", + " outputs[key] = tft.scale_to_z_score(inputs[key])\n", + "\n", + " # For the label column we provide the mapping from string to index.\n", + " # We could instead use `tft.compute_and_apply_vocabulary()` in order to\n", + " # compute the vocabulary dynamically and perform a lookup.\n", + " # Since in this example there are only 3 possible values, we use a hard-coded\n", + " # table for simplicity.\n", + " table_keys = ['Adelie', 'Chinstrap', 'Gentoo']\n", + " initializer = tf.lookup.KeyValueTensorInitializer(\n", + " keys=table_keys,\n", + " values=tf.cast(tf.range(len(table_keys)), tf.int64),\n", + " key_dtype=tf.string,\n", + " value_dtype=tf.int64)\n", + " table = tf.lookup.StaticHashTable(initializer, default_value=-1)\n", + " outputs[_LABEL_KEY] = table.lookup(inputs[_LABEL_KEY])\n", + "\n", + " return outputs\n", + "\n", + "\n", + "# NEW: This function will apply the same transform operation to training data\n", + "# and serving requests.\n", + "def _apply_preprocessing(raw_features, tft_layer):\n", + " transformed_features = tft_layer(raw_features)\n", + " if _LABEL_KEY in raw_features:\n", + " transformed_label = transformed_features.pop(_LABEL_KEY)\n", + " return transformed_features, transformed_label\n", + " else:\n", + " return transformed_features, None\n", + "\n", + "\n", + "# NEW: This function will create a handler function which gets a serialized\n", + "# tf.example, preprocess and run an inference with it.\n", + "def _get_serve_tf_examples_fn(model, tf_transform_output):\n", + " # We must save the tft_layer to the model to ensure its assets are kept and\n", + " # tracked.\n", + " model.tft_layer = tf_transform_output.transform_features_layer()\n", + "\n", + " @tf.function(input_signature=[\n", + " tf.TensorSpec(shape=[None], dtype=tf.string, name='examples')\n", + " ])\n", + " def serve_tf_examples_fn(serialized_tf_examples):\n", + " # Expected input is a string which is serialized tf.Example format.\n", + " feature_spec = tf_transform_output.raw_feature_spec()\n", + " # Because input schema includes unnecessary fields like 'species' and\n", + " # 'island', we filter feature_spec to include required keys only.\n", + " required_feature_spec = {\n", + " k: v for k, v in feature_spec.items() if k in _FEATURE_KEYS\n", + " }\n", + " parsed_features = tf.io.parse_example(serialized_tf_examples,\n", + " required_feature_spec)\n", + "\n", + " # Preprocess parsed input with transform operation defined in\n", + " # preprocessing_fn().\n", + " transformed_features, _ = _apply_preprocessing(parsed_features,\n", + " model.tft_layer)\n", + " # Run inference with ML model.\n", + " return model(transformed_features)\n", + "\n", + " return serve_tf_examples_fn\n", + "\n", + "\n", + "def _input_fn(file_pattern: List[Text],\n", + " data_accessor: tfx.components.DataAccessor,\n", + " tf_transform_output: tft.TFTransformOutput,\n", + " batch_size: int = 200) -> tf.data.Dataset:\n", + " \"\"\"Generates features and label for tuning/training.\n", + "\n", + " Args:\n", + " file_pattern: List of paths or patterns of input tfrecord files.\n", + " data_accessor: DataAccessor for converting input to RecordBatch.\n", + " tf_transform_output: A TFTransformOutput.\n", + " batch_size: representing the number of consecutive elements of returned\n", + " dataset to combine in a single batch\n", + "\n", + " Returns:\n", + " A dataset that contains (features, indices) tuple where features is a\n", + " dictionary of Tensors, and indices is a single Tensor of label indices.\n", + " \"\"\"\n", + " dataset = data_accessor.tf_dataset_factory(\n", + " file_pattern,\n", + " tfxio.TensorFlowDatasetOptions(batch_size=batch_size),\n", + " schema=tf_transform_output.raw_metadata.schema)\n", + "\n", + " transform_layer = tf_transform_output.transform_features_layer()\n", + " def apply_transform(raw_features):\n", + " return _apply_preprocessing(raw_features, transform_layer)\n", + "\n", + " return dataset.map(apply_transform).repeat()\n", + "\n", + "\n", + "def _build_keras_model() -> tf.keras.Model:\n", + " \"\"\"Creates a DNN Keras model for classifying penguin data.\n", + "\n", + " Returns:\n", + " A Keras Model.\n", + " \"\"\"\n", + " # The model below is built with Functional API, please refer to\n", + " # https://www.tensorflow.org/guide/keras/overview for all API options.\n", + " inputs = [\n", + " keras.layers.Input(shape=(1,), name=key)\n", + " for key in _FEATURE_KEYS\n", + " ]\n", + " d = keras.layers.concatenate(inputs)\n", + " for _ in range(2):\n", + " d = keras.layers.Dense(8, activation='relu')(d)\n", + " outputs = keras.layers.Dense(3)(d)\n", + "\n", + " model = keras.Model(inputs=inputs, outputs=outputs)\n", + " model.compile(\n", + " optimizer=keras.optimizers.Adam(1e-2),\n", + " loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n", + " metrics=[keras.metrics.SparseCategoricalAccuracy()])\n", + "\n", + " model.summary(print_fn=logging.info)\n", + " return model\n", + "\n", + "\n", + "# TFX Trainer will call this function.\n", + "def run_fn(fn_args: tfx.components.FnArgs):\n", + " \"\"\"Train the model based on given args.\n", + "\n", + " Args:\n", + " fn_args: Holds args used to train the model as name/value pairs.\n", + " \"\"\"\n", + " tf_transform_output = tft.TFTransformOutput(fn_args.transform_output)\n", + "\n", + " train_dataset = _input_fn(\n", + " fn_args.train_files,\n", + " fn_args.data_accessor,\n", + " tf_transform_output,\n", + " batch_size=_TRAIN_BATCH_SIZE)\n", + " eval_dataset = _input_fn(\n", + " fn_args.eval_files,\n", + " fn_args.data_accessor,\n", + " tf_transform_output,\n", + " batch_size=_EVAL_BATCH_SIZE)\n", + "\n", + " model = _build_keras_model()\n", + " model.fit(\n", + " train_dataset,\n", + " steps_per_epoch=fn_args.train_steps,\n", + " validation_data=eval_dataset,\n", + " validation_steps=fn_args.eval_steps)\n", + "\n", + " # NEW: Save a computation graph including transform layer.\n", + " signatures = {\n", + " 'serving_default': _get_serve_tf_examples_fn(model, tf_transform_output),\n", + " }\n", + " model.save(fn_args.serving_model_dir, save_format='tf', signatures=signatures)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "blaw0rs-emEf" + }, + "source": [ + "이제 TFX 파이프라인 구축에 필요한 모든 준비 단계를 완료했습니다." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "w3OkNz3gTLwM" + }, + "source": [ + "### 파이프라인 정의 작성하기\n", + "\n", + "TFX 파이프라인을 생성하는 함수를 정의합니다. `Pipeline` 객체는 TFX가 지원하는 파이프라인 오케스트레이션 시스템 중 하나를 사용하여 실행할 수 있는 TFX 파이프라인을 나타냅니다.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "M49yYVNBTPd4" + }, + "outputs": [ + + ], + "source": [ + "def _create_pipeline(pipeline_name: str, pipeline_root: str, data_root: str,\n", + " schema_path: str, module_file: str, serving_model_dir: str,\n", + " metadata_path: str) -> tfx.dsl.Pipeline:\n", + " \"\"\"Implements the penguin pipeline with TFX.\"\"\"\n", + " # Brings data into the pipeline or otherwise joins/converts training data.\n", + " example_gen = tfx.components.CsvExampleGen(input_base=data_root)\n", + "\n", + " # Computes statistics over data for visualization and example validation.\n", + " statistics_gen = tfx.components.StatisticsGen(\n", + " examples=example_gen.outputs['examples'])\n", + "\n", + " # Import the schema.\n", + " schema_importer = tfx.dsl.Importer(\n", + " source_uri=schema_path,\n", + " artifact_type=tfx.types.standard_artifacts.Schema).with_id(\n", + " 'schema_importer')\n", + "\n", + " # Performs anomaly detection based on statistics and data schema.\n", + " example_validator = tfx.components.ExampleValidator(\n", + " statistics=statistics_gen.outputs['statistics'],\n", + " schema=schema_importer.outputs['result'])\n", + "\n", + " # NEW: Transforms input data using preprocessing_fn in the 'module_file'.\n", + " transform = tfx.components.Transform(\n", + " examples=example_gen.outputs['examples'],\n", + " schema=schema_importer.outputs['result'],\n", + " materialize=False,\n", + " module_file=module_file)\n", + "\n", + " # Uses user-provided Python function that trains a model.\n", + " trainer = tfx.components.Trainer(\n", + " module_file=module_file,\n", + " examples=example_gen.outputs['examples'],\n", + "\n", + " # NEW: Pass transform_graph to the trainer.\n", + " transform_graph=transform.outputs['transform_graph'],\n", + "\n", + " train_args=tfx.proto.TrainArgs(num_steps=100),\n", + " eval_args=tfx.proto.EvalArgs(num_steps=5))\n", + "\n", + " # Pushes the model to a filesystem destination.\n", + " pusher = tfx.components.Pusher(\n", + " model=trainer.outputs['model'],\n", + " push_destination=tfx.proto.PushDestination(\n", + " filesystem=tfx.proto.PushDestination.Filesystem(\n", + " base_directory=serving_model_dir)))\n", + "\n", + " components = [\n", + " example_gen,\n", + " statistics_gen,\n", + " schema_importer,\n", + " example_validator,\n", + "\n", + " transform, # NEW: Transform component was added to the pipeline.\n", + "\n", + " trainer,\n", + " pusher,\n", + " ]\n", + "\n", + " return tfx.dsl.Pipeline(\n", + " pipeline_name=pipeline_name,\n", + " pipeline_root=pipeline_root,\n", + " metadata_connection_config=tfx.orchestration.metadata\n", + " .sqlite_metadata_connection_config(metadata_path),\n", + " components=components)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "mJbq07THU2GV" + }, + "source": [ + "## 파이프라인 실행하기\n", + "\n", + "이전 튜토리얼과 같이 `LocalDagRunner`를 사용합니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "fAtfOZTYWJu-" + }, + "outputs": [ + + ], + "source": [ + "tfx.orchestration.LocalDagRunner().run(\n", + " _create_pipeline(\n", + " pipeline_name=PIPELINE_NAME,\n", + " pipeline_root=PIPELINE_ROOT,\n", + " data_root=DATA_ROOT,\n", + " schema_path=SCHEMA_PATH,\n", + " module_file=_module_file,\n", + " serving_model_dir=SERVING_MODEL_DIR,\n", + " metadata_path=METADATA_PATH))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ppERq0Mj6xvW" + }, + "source": [ + "파이프라인이 성공적으로 완료되면 \"INFO:absl:Component Pusher is finished.\" 메시지가 표시됩니다.\n", + "\n", + "이전 단계에서 변수를 변경하지 않은 경우 푸셔 구성 요소는 훈련한 모델을 `serving_model/penguin-transform` 디렉터리인 `SERVING_MODEL_DIR`로 푸시합니다. Colab의 왼쪽 패널에서 혹은 다음 명령을 사용하여 파일 브라우저에서 결과를 볼 수 있습니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "NTHROkqX6yHx" + }, + "outputs": [ + + ], + "source": [ + "# List files in created model directory.\n", + "!find {SERVING_MODEL_DIR}" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "VTqM-WiZkPbt" + }, + "source": [ + "[`saved_model_cli` 도구](https://www.tensorflow.org/guide/saved_model#show_command)를 사용하여 생성한 모델의 서명을 확인할 수도 있습니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "YBfUzD_OkOq_" + }, + "outputs": [ + + ], + "source": [ + "!saved_model_cli show --dir {SERVING_MODEL_DIR}/$(ls -1 {SERVING_MODEL_DIR} | sort -nr | head -1) --tag_set serve --signature_def serving_default" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "DkAxFs_QszoZ" + }, + "source": [ + "자체 `serve_tf_examples_fn` 함수로 `serving_default`를 정의했기 때문에 서명이 단일 문자열을 사용하는 것으로 표시됩니다. 이 문자열은 tf.Examples의 직렬화된 문자열이며 앞에서 정의했듯이 [tf.io.parse_example()](https://www.tensorflow.org/api_docs/python/tf/io/parse_example) 함수를 사용하여 구문 분석됩니다(tf.Examples에 대한 자세한 내용은 [여기](https://www.tensorflow.org/tutorials/load_data/tfrecord)를 참조).\n", + "\n", + "내보내기를 수행한 모델을 로드하고 몇 개의 예제를 통해 추론을 일부 시도할 수 있습니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Z1Yw5yYdvqKf" + }, + "outputs": [ + + ], + "source": [ + "# Find a model with the latest timestamp.\n", + "model_dirs = (item for item in os.scandir(SERVING_MODEL_DIR) if item.is_dir())\n", + "model_path = max(model_dirs, key=lambda i: int(i.name)).path\n", + "\n", + "loaded_model = tf.keras.models.load_model(model_path)\n", + "inference_fn = loaded_model.signatures['serving_default']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "xrOHIvnIv0-4" + }, + "outputs": [ + + ], + "source": [ + "# Prepare an example and run inference.\n", + "features = {\n", + " 'culmen_length_mm': tf.train.Feature(float_list=tf.train.FloatList(value=[49.9])),\n", + " 'culmen_depth_mm': tf.train.Feature(float_list=tf.train.FloatList(value=[16.1])),\n", + " 'flipper_length_mm': tf.train.Feature(int64_list=tf.train.Int64List(value=[213])),\n", + " 'body_mass_g': tf.train.Feature(int64_list=tf.train.Int64List(value=[5400])),\n", + "}\n", + "example_proto = tf.train.Example(features=tf.train.Features(feature=features))\n", + "examples = example_proto.SerializeToString()\n", + "\n", + "result = inference_fn(examples=tf.constant([examples]))\n", + "print(result['output_0'].numpy())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "cri3mTgZ0SQ2" + }, + "source": [ + "'Gentoo'(젠투 펭귄) 종에 해당하는 세 번째 요소의 값이 셋 중에서 가장 클 것으로 예상됩니다." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "08R8qvweThRf" + }, + "source": [ + "## 다음 단계\n", + "\n", + "변환 구성 요소에 대해 자세히 알아보려면 [Transform 구성 요소 가이드](https://www.tensorflow.org/tfx/guide/transform)를 참조하세요. https://www.tensorflow.org/tfx/tutorials에서 더 많은 리소스를 확인할 수 있습니다.\n", + "\n", + "TFX의 다양한 개념에 대해 자세히 알아보려면 [TFX 파이프라인 이해하기](https://www.tensorflow.org/tfx/guide/understanding_tfx_pipelines)를 참조하세요.\n" + ] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [ + "DjUA6S30k52h" + ], + "name": "penguin_tft.ipynb", + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/site/ko/tfx/tutorials/tfx/python_function_component.ipynb b/site/ko/tfx/tutorials/tfx/python_function_component.ipynb index 8e24d8fc32..9bd390f693 100644 --- a/site/ko/tfx/tutorials/tfx/python_function_component.ipynb +++ b/site/ko/tfx/tutorials/tfx/python_function_component.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "SpNWyqewk8fE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -93,7 +95,9 @@ "metadata": { "id": "PQ-QwavmqPHP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import sys\n", "sys.version" @@ -116,7 +120,9 @@ "metadata": { "id": "UHvIH-wORCuV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "try:\n", " import colab\n", @@ -142,7 +148,9 @@ "metadata": { "id": "wGpQOmYIVlSV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install tfx" ] @@ -164,7 +172,9 @@ "metadata": { "id": "akSWlt-Bij9w" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip uninstall shapely -y" ] @@ -197,7 +207,9 @@ "metadata": { "id": "bRY0RFJ0VlSV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Check version\n", "from tfx import v1 as tfx\n", @@ -234,7 +246,9 @@ "metadata": { "id": "cHNtKTuiqPH4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%writefile my_generator.py\n", "\n", @@ -271,7 +285,9 @@ "metadata": { "id": "27ZEf2xQqPH7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%writefile my_consumer.py\n", "\n", @@ -321,7 +337,9 @@ "metadata": { "id": "j43snQpRqPII" }, - "outputs": [], + "outputs": [ + + ], "source": [ "from my_generator import MyGenerator\n", "from my_consumer import MyConsumer" @@ -342,7 +360,9 @@ "metadata": { "id": "dEXGvLLmKviI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Here, we create an InteractiveContext using default parameters. This will\n", "# use a temporary directory with an ephemeral ML Metadata database instance.\n", @@ -371,7 +391,9 @@ "metadata": { "id": "kfNmI5qULlSA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "generator = MyGenerator()\n", "context.run(generator)" @@ -383,7 +405,9 @@ "metadata": { "id": "cRxVZIfFLsL4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "consumer = MyConsumer(\n", " data=generator.outputs['data'],\n", @@ -406,7 +430,9 @@ "metadata": { "id": "h4P3Mx_CT0mP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!tail -v {consumer.outputs['hash'].get()[0].uri}" ] @@ -448,7 +474,9 @@ "metadata": { "id": "NpkQ805-LyJu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import os\n", "import tempfile\n", @@ -497,7 +525,9 @@ "metadata": { "id": "PLtGO2PkMQbO" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tfx.orchestration.LocalDagRunner().run(my_pipeline)" ] @@ -517,7 +547,9 @@ "metadata": { "id": "fyvYTsx8Mp1N" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!find {PIPELINE_ROOT}" ] diff --git a/site/ko/tfx/tutorials/tfx/recommenders.ipynb b/site/ko/tfx/tutorials/tfx/recommenders.ipynb index fc90be9b0a..54cc0dba5f 100644 --- a/site/ko/tfx/tutorials/tfx/recommenders.ipynb +++ b/site/ko/tfx/tutorials/tfx/recommenders.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "bB8gHCR3FVC0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -123,7 +125,9 @@ "metadata": { "id": "GtR3txiwrT9w" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install -Uq tfx\n", "!pip install -Uq tensorflow-recommenders\n", @@ -147,7 +151,9 @@ "metadata": { "id": "w90AGSpJhz8X" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip uninstall shapely -y" ] @@ -169,7 +175,9 @@ "metadata": { "id": "SZGYDaF-m5wZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import os\n", "import absl\n", @@ -236,7 +244,9 @@ "metadata": { "id": "rcVgf7rLsv70" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@beam.ptransform_fn\n", "@beam.typehints.with_input_types(beam.Pipeline)\n", @@ -282,7 +292,9 @@ "metadata": { "id": "sM-46D40tW_V" }, - "outputs": [], + "outputs": [ + + ], "source": [ "context = InteractiveContext()" ] @@ -304,7 +316,9 @@ "metadata": { "id": "aaQhqcLGP0jL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Ratings data.\n", "ratings_example_gen = FileBasedExampleGen(\n", @@ -320,7 +334,9 @@ "metadata": { "id": "qlUFANrRvKDW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Features of all the available movies.\n", "movies_example_gen = FileBasedExampleGen(\n", @@ -347,7 +363,9 @@ "metadata": { "id": "_1-KQV2ynMdh" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def inspect_examples(component,\n", " channel_name='examples',\n", @@ -392,7 +410,9 @@ "metadata": { "id": "kHLsIHhw_x1d" }, - "outputs": [], + "outputs": [ + + ], "source": [ "inspect_examples(movies_example_gen)" ] @@ -425,7 +445,9 @@ "metadata": { "id": "X7-ZI8IsKT2P" }, - "outputs": [], + "outputs": [ + + ], "source": [ "movies_stats_gen = tfx.components.StatisticsGen(\n", " examples=movies_example_gen.outputs['examples'])\n", @@ -438,7 +460,9 @@ "metadata": { "id": "zlKLrrgnKzIe" }, - "outputs": [], + "outputs": [ + + ], "source": [ "context.show(movies_stats_gen.outputs['statistics'])" ] @@ -449,7 +473,9 @@ "metadata": { "id": "hmTThijxKmhA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ratings_stats_gen = tfx.components.StatisticsGen(\n", " examples=ratings_example_gen.outputs['examples'])\n", @@ -462,7 +488,9 @@ "metadata": { "id": "UoRcgChqK62O" }, - "outputs": [], + "outputs": [ + + ], "source": [ "context.show(ratings_stats_gen.outputs['statistics'])" ] @@ -484,7 +512,9 @@ "metadata": { "id": "vL85CAcILJiw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "movies_schema_gen = tfx.components.SchemaGen(\n", " statistics=movies_stats_gen.outputs['statistics'],\n", @@ -498,7 +528,9 @@ "metadata": { "id": "9eMtN1U1Lha1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "context.show(movies_schema_gen.outputs['schema'])" ] @@ -509,7 +541,9 @@ "metadata": { "id": "q-DkVUOeLmvX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ratings_schema_gen = tfx.components.SchemaGen(\n", " statistics=ratings_stats_gen.outputs['statistics'],\n", @@ -523,7 +557,9 @@ "metadata": { "id": "SxD9oAhZLt_Z" }, - "outputs": [], + "outputs": [ + + ], "source": [ "context.show(ratings_schema_gen.outputs['schema'])" ] @@ -551,7 +587,9 @@ "metadata": { "id": "3Oqzx5mSI8zm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_movies_transform_module_file = 'movies_transform_module.py'" ] @@ -562,7 +600,9 @@ "metadata": { "id": "MKROCiPo_5LJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%writefile {_movies_transform_module_file}\n", "\n", @@ -580,7 +620,9 @@ "metadata": { "id": "qQcQBN9SIzIa" }, - "outputs": [], + "outputs": [ + + ], "source": [ "movies_transform = tfx.components.Transform(\n", " examples=movies_example_gen.outputs['examples'],\n", @@ -595,7 +637,9 @@ "metadata": { "id": "D5oai0TlNWlv" }, - "outputs": [], + "outputs": [ + + ], "source": [ "context.show(movies_transform.outputs['post_transform_schema'])" ] @@ -606,7 +650,9 @@ "metadata": { "id": "RWahQqCiBXqA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "inspect_examples(movies_transform, channel_name='transformed_examples')" ] @@ -617,7 +663,9 @@ "metadata": { "id": "X4PmR-a8O-mD" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_ratings_transform_module_file = 'ratings_transform_module.py'" ] @@ -628,7 +676,9 @@ "metadata": { "id": "EWXuBqivPDuK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%writefile {_ratings_transform_module_file}\n", "\n", @@ -665,7 +715,9 @@ "metadata": { "id": "_4NgpBOkPXsj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ratings_transform = tfx.components.Transform(\n", " examples=ratings_example_gen.outputs['examples'],\n", @@ -680,7 +732,9 @@ "metadata": { "id": "n9Vqby34Dvzd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "context.show(ratings_transform.outputs['post_transform_schema'])" ] @@ -691,7 +745,9 @@ "metadata": { "id": "m_ec39jiaMG-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "inspect_examples(ratings_transform, channel_name='transformed_examples')" ] @@ -717,7 +773,9 @@ "metadata": { "id": "k_mmYhjAJP4g" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# We're now going to create the module file for Trainer, which will include the\n", "# code above with some modifications for TFX.\n", @@ -731,7 +789,9 @@ "metadata": { "id": "kHQZJEhXP93N" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%writefile {_trainer_module_file}\n", "\n", @@ -1018,7 +1078,9 @@ "metadata": { "id": "hsWC8UpVrngY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "trainer = tfx.components.Trainer(\n", " module_file=os.path.abspath(_trainer_module_file),\n", @@ -1055,7 +1117,9 @@ "metadata": { "id": "1hXlzwMTRkaj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_serving_model_dir = os.path.join(tempfile.mkdtemp(), 'serving_model/tfrs_retrieval')\n", "\n", @@ -1084,7 +1148,9 @@ "metadata": { "id": "MUwd9QoGRkaj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "loaded = tf.saved_model.load(pusher.outputs['pushed_model'].get()[0].uri)\n", "scores, titles = loaded([\"42\"])\n", diff --git a/site/ko/tfx/tutorials/tfx/template_beam.ipynb b/site/ko/tfx/tutorials/tfx/template_beam.ipynb index 86592f4f89..65a41cc894 100644 --- a/site/ko/tfx/tutorials/tfx/template_beam.ipynb +++ b/site/ko/tfx/tutorials/tfx/template_beam.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "SpNWyqewk8fE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -48,10 +50,10 @@ "source": [ "" ] @@ -109,7 +111,9 @@ "metadata": { "id": "llKzIjr442w1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import sys\n", "!{sys.executable} -m pip install --upgrade \"tfx<2\"" @@ -134,7 +138,9 @@ "metadata": { "id": "m6-DrWm042w4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Set `PATH` to include user python binary directory.\n", "HOME=%env HOME\n", @@ -161,7 +167,9 @@ "metadata": { "id": "sBLyQWYF42w6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!python3 -c \"from tfx import version ; print('TFX version: {}'.format(version.__version__))\"" ] @@ -199,7 +207,9 @@ "metadata": { "id": "IYGyT4ib42xG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "PIPELINE_NAME=\"my_pipeline\"\n", "import os\n", @@ -231,7 +241,9 @@ "metadata": { "id": "3PmXatBD42xI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!tfx template copy \\\n", " --pipeline_name={PIPELINE_NAME} \\\n", @@ -258,7 +270,9 @@ "metadata": { "id": "y9e_g5rc42xL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%cd {PROJECT_DIR}" ] @@ -318,7 +332,9 @@ "metadata": { "id": "H0DzGg-642xQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!{sys.executable} -m models.features_test\n", "!{sys.executable} -m models.keras.model_test\n" @@ -345,7 +361,9 @@ "metadata": { "id": "D5YikNik42xX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!tfx pipeline create --engine=local --pipeline_path=local_runner.py" ] @@ -369,7 +387,9 @@ "metadata": { "id": "SnTC_Rql42xZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!tfx run create --engine=local --pipeline_name={PIPELINE_NAME}" ] @@ -419,7 +439,9 @@ "metadata": { "id": "wMsT-5EX42xc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Update the pipeline\n", "!tfx pipeline update --engine=local --pipeline_path=local_runner.py\n", @@ -462,7 +484,9 @@ "metadata": { "id": "Ik8JbnRq42xf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!tfx pipeline update --engine=local --pipeline_path=local_runner.py\n", "!tfx run create --engine local --pipeline_name {PIPELINE_NAME}" @@ -505,7 +529,9 @@ "metadata": { "id": "2K7nuHZ4uNXc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "if 'google.colab' in sys.modules:\n", " from google.colab import auth\n", @@ -532,7 +558,9 @@ "metadata": { "id": "Vvpw_lGByxSx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Set your project name below.\n", "# WARNING! ENTER your project name before running this cell.\n", @@ -562,7 +590,9 @@ "metadata": { "id": "w8rOdC3r42xi" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!tfx pipeline update --engine=local --pipeline_path=local_runner.py\n", "!tfx run create --engine local --pipeline_name {PIPELINE_NAME}" @@ -592,8 +622,10 @@ ], "metadata": { "colab": { - "collapsed_sections": [], - "name": "template_beam.ipynb", + "collapsed_sections": [ + + ], + "name": "template_local.ipynb", "toc_visible": true }, "kernelspec": { diff --git a/site/ko/tfx/tutorials/transform/census.ipynb b/site/ko/tfx/tutorials/transform/census.ipynb index 5f18255fa0..9d5c544e3b 100644 --- a/site/ko/tfx/tutorials/transform/census.ipynb +++ b/site/ko/tfx/tutorials/transform/census.ipynb @@ -7,12 +7,10 @@ }, "source": [ "" ] }, @@ -32,7 +30,9 @@ "cellView": "form", "id": "rSGJWC5biBiG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -62,7 +62,7 @@ "TensorFlow Transform은 훈련 데이터세트에 대한 전체 전달이 필요한 특성 생성을 포함하여 TensorFlow에 대한 입력 데이터를 전처리하기 위한 라이브러리입니다. 예를 들어 TensorFlow Transform을 사용하여 다음을 수행할 수 있습니다.\n", "\n", "- 평균과 표준 편차를 이용하여 입력값 정규화\n", - "- 모든 입력 값에 대해 어휘를 생성하여 문자열을 정수로 변환\n", + "- 모든 입력값에 대해 어휘를 생성하여 문자열을 정수로 변환\n", "- 관찰된 데이터 분포를 기반으로 부동 소수점을 버킷에 할당하여 정수로 변환\n", "\n", "TensorFlow는 단일 예제 또는 예제 배치에 대한 조작을 기본적으로 지원합니다. `tf.Transform`은 이러한 기능을 확장하여 전체 훈련 데이터세트에 대한 전체 전달을 지원합니다.\n", @@ -84,7 +84,7 @@ "\n", "핵심 포인트: 모델러 및 개발자로서 이 데이터가 어떻게 사용되는지, 그리고 모델의 예측이 초래할 수 있는 잠재적인 이점과 피해에 대해 생각해보세요. 이와 같은 모델은 사회적 편견과 불균형을 강화시킬 수 있습니다. 기능이 해결하려는 문제와 관련이 있습니까? 아니면 편견을 유발합니까? 자세한 내용은 ML 공정성에 대해 읽어보세요.\n", "\n", - "참고: TensorFlow 모델 분석은 모델이 사회적 편견과 격차를 강화할 수 있는 방법을 이해하는 것을 포함하여 모델이 데이터의 다양한 세그먼트에 대해 예측을 얼마나 잘 수행하는지 이해하기 위한 강력한 도구입니다." + "참고: TensorFlow 모델 분석은 모델이 사회적 바이어스와 격차를 강화할 수 있는 방법을 이해하는 것을 포함하여 모델이 데이터의 다양한 세그먼트에 대해 예측을 얼마나 잘 수행하는지 이해하기 위한 강력한 도구입니다." ] }, { @@ -102,7 +102,9 @@ "metadata": { "id": "9Ak6XDO5mT3m" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install tensorflow-transform" ] @@ -113,7 +115,9 @@ "metadata": { "id": "R0mXLOJR_-dv" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# This cell is only necessary because packages were installed while python was\n", "# running. It avoids the need to restart the runtime when running in Colab.\n", @@ -140,7 +144,9 @@ "metadata": { "id": "K4QXVIM7iglN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import math\n", "import os\n", @@ -178,7 +184,9 @@ "metadata": { "id": "mKEYRl2g_vzl" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!wget https://storage.googleapis.com/artifacts.tfx-oss-public.appspot.com/datasets/census/adult.data\n", "!wget https://storage.googleapis.com/artifacts.tfx-oss-public.appspot.com/datasets/census/adult.test\n", @@ -204,7 +212,9 @@ "metadata": { "id": "-bsr1nLHqyg_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "CATEGORICAL_FEATURE_KEYS = [\n", " 'workclass',\n", @@ -249,7 +259,9 @@ "metadata": { "id": "312cQ5vwGjOu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "pandas_train = pd.read_csv(train_path, header=None, names=ORDERED_CSV_COLUMNS)\n", "\n", @@ -262,7 +274,9 @@ "metadata": { "id": "zzjzjR3351j0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "one_row = dict(pandas_train.loc[0])" ] @@ -273,7 +287,9 @@ "metadata": { "id": "zk2b8IPd4uPr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "COLUMN_DEFAULTS = [\n", " '' if isinstance(v, str) else 0.0\n", @@ -295,7 +311,9 @@ "metadata": { "id": "RasgDIUKHCpV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "pandas_test = pd.read_csv(test_path, header=1, names=ORDERED_CSV_COLUMNS)\n", "\n", @@ -308,7 +326,9 @@ "metadata": { "id": "s9aH5ZnDdD_z" }, - "outputs": [], + "outputs": [ + + ], "source": [ "testing = os.getenv(\"WEB_TEST_BROWSER\", False)\n", "if testing:\n", @@ -331,7 +351,9 @@ "metadata": { "id": "5oS2RfyCrzMr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "RAW_DATA_FEATURE_SPEC = dict(\n", " [(name, tf.io.FixedLenFeature([], tf.string))\n", @@ -370,7 +392,9 @@ "metadata": { "id": "Wbhndy7uWqYp" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title\n", "def encode_example(input_features):\n", @@ -415,7 +439,9 @@ "metadata": { "id": "sWd95yxJceXy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf_example = encode_example(pandas_train.loc[0])\n", "tf_example.features.feature['age']" @@ -427,7 +453,9 @@ "metadata": { "id": "EutF2aPXbAUd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "serialized_example_batch = tf.constant([\n", " encode_example(pandas_train.loc[i]).SerializeToString()\n", @@ -452,7 +480,9 @@ "metadata": { "id": "jXlrur1vc4n_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "decoded_tensors = tf.io.parse_example(\n", " serialized_example_batch,\n", @@ -475,7 +505,9 @@ "metadata": { "id": "EEt3nPr_o59f" }, - "outputs": [], + "outputs": [ + + ], "source": [ "features_dict = dict(pandas_train.loc[0])\n", "features_dict.pop(LABEL_KEY)\n", @@ -498,7 +530,9 @@ "metadata": { "id": "7N5FMXO7dRzM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "no_label_example = encode_example(features_dict)\n", "\n", @@ -522,7 +556,9 @@ "metadata": { "id": "8WHyOkC9uL71" }, - "outputs": [], + "outputs": [ + + ], "source": [ "NUM_OOV_BUCKETS = 1\n", "\n", @@ -548,7 +584,9 @@ "metadata": { "id": "lG2uO-88c6R9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "if testing:\n", " TRAIN_NUM_EPOCHS = 1" @@ -599,7 +637,9 @@ "metadata": { "id": "LDrzuYH0WFc2" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def preprocessing_fn(inputs):\n", " \"\"\"Preprocess input columns into transformed columns.\"\"\"\n", @@ -660,7 +700,7 @@ "result = pass_this | 'name this step' >> to_this_call\n", "```\n", "\n", - "to_this_call 메서드는 pass_this라는 개체를 호출 및 전달하고 이 연산을 스택 추적에서 name this step이라고 합니다. to_this_call에 대한 호출의 결과는 result에서 반환됩니다. 다음과 같이 함께 연결된 파이프라인의 단계를 종종 볼 수 있습니다.\n", + "`to_this_call` 메서드는 `pass_this`라는 개체를 호출 및 전달하고 이 연산을 스택 추적에서 name this step이라고 합니다. `to_this_call`에 대한 호출의 결과는 `result`에서 반환됩니다. 다음과 같이 함께 연결된 파이프라인의 단계를 종종 볼 수 있습니다.\n", "\n", "```\n", "result = apache_beam.Pipeline() | 'first step' >> do_this_first() | 'second step' >> do_this_last()\n", @@ -694,7 +734,9 @@ "metadata": { "id": "PCeYucVoRRfo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def transform_data(train_data_file, test_data_file, working_dir):\n", " \"\"\"Transform the data and write out as a TFRecord of Example protos.\n", @@ -812,7 +854,9 @@ "metadata": { "id": "pjC7eDWFyA8K" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tempfile\n", "import pathlib\n", @@ -838,7 +882,9 @@ "metadata": { "id": "FXd4Mgj6sAGB" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf_transform_output = tft.TFTransformOutput(output_dir)" ] @@ -849,7 +895,9 @@ "metadata": { "id": "59hNe7oY9vqG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf_transform_output.transformed_feature_spec()" ] @@ -875,7 +923,9 @@ "metadata": { "id": "NG6nrHEP2L65" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!ls -l {output_dir}" ] @@ -888,7 +938,7 @@ "source": [ "##전처리된 데이터를 사용하여 tf.keras로 모델 훈련하기\n", "\n", - "훈련과 제공 모두에 동일한 코드를 사용하여 왜곡을 방지하는 데 `tf.Transform`이 어떻게 이용되는지 보여주기 위해 모델을 훈련할 것입니다. 모델을 훈련하고 훈련된 모델을 프로덕션에 적합하게 준비하려면 입력 함수를 생성해야 합니다. 훈련 입력 함수와 제공 입력 함수의 주된 차이점은 훈련 데이터에는 레이블이 포함되고 프로덕션 데이터에는 포함되지 않는다는 것입니다. 인수와 반환도 약간 다릅니다." + "훈련과 적용 모두에 동일한 코드를 사용하여 왜곡을 방지하는 데 `tf.Transform`이 어떻게 이용되는지 보여주기 위해 모델을 훈련할 것입니다. 모델을 훈련하고 훈련된 모델을 운영에 적합하게 준비하려면 입력 함수를 생성해야 합니다. 훈련 입력 함수와 적용 입력 함수의 주된 차이점은 훈련 데이터에는 레이블이 포함되고 운영 데이터에는 포함되지 않는다는 것입니다. 인수와 반환도 약간 다릅니다." ] }, { @@ -917,7 +967,9 @@ "metadata": { "id": "775Y7BTpHBmb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def _make_training_input_fn(tf_transform_output, train_file_pattern,\n", " batch_size):\n", @@ -949,7 +1001,9 @@ "metadata": { "id": "-b8BgvBvkCnX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_file_pattern = pathlib.Path(output_dir)/f'{TRANSFORMED_TRAIN_DATA_FILEBASE}*'\n", "\n", @@ -975,7 +1029,9 @@ "metadata": { "id": "SpiS26IWlD-1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for example, label in input_fn().take(1):\n", " break\n", @@ -989,7 +1045,9 @@ "metadata": { "id": "yaMzMnij88_v" }, - "outputs": [], + "outputs": [ + + ], "source": [ "label" ] @@ -1018,7 +1076,9 @@ "metadata": { "id": "uK4brUuDTAJ4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def build_keras_model(working_dir):\n", " inputs = build_keras_inputs(working_dir)\n", @@ -1040,7 +1100,9 @@ "metadata": { "id": "6fJwIbdCRFER" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def build_keras_inputs(working_dir):\n", " tf_transform_output = tft.TFTransformOutput(working_dir)\n", @@ -1069,7 +1131,9 @@ "metadata": { "id": "9dHD5SoqRqOh" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def encode_inputs(inputs):\n", " encoded_inputs = {}\n", @@ -1093,7 +1157,9 @@ "metadata": { "id": "5xNhSq8lTTx3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = build_keras_model(output_dir)\n", "\n", @@ -1115,7 +1181,9 @@ "metadata": { "id": "afi3NOC0OMUa" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def get_dataset(working_dir, filebase):\n", " tf_transform_output = tft.TFTransformOutput(working_dir)\n", @@ -1149,7 +1217,9 @@ "metadata": { "id": "6i_lhWH8IZrk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def train_and_evaluate(\n", " model,\n", @@ -1183,7 +1253,9 @@ "metadata": { "id": "rcVsByIsViRy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def train_model(model, train_dataset, validation_dataset):\n", " model.compile(optimizer='adam',\n", @@ -1203,7 +1275,9 @@ "metadata": { "id": "f5xoioogYTle" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model, history, metric_values = train_and_evaluate(model, output_dir)" ] @@ -1214,7 +1288,9 @@ "metadata": { "id": "gQCbdPIQeXeZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plt.plot(history.history['loss'], label='Train')\n", "plt.plot(history.history['val_loss'], label='Eval')\n", @@ -1235,7 +1311,7 @@ "\n", "새 데이터에서 작업하려면 `tft_beam.WriteTransformFn`에 의해 저장된 `preprocessing_fn`의 최종 버전을 로드해야 합니다.\n", "\n", - "`TFTransformOutput.transform_features_layer` 메서드는 출력 디렉터리에서 `preprocessing_fn` 저장 모델을 로드합니다." + "`TFTransformOutput.transform_features_layer` 메서드는 출력 디렉터리에서 `preprocessing_fn` SavedModel을 로드합니다." ] }, { @@ -1253,7 +1329,9 @@ "metadata": { "id": "tMHDZhp82ZjM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def read_csv(file_name, batch_size):\n", " return tf.data.experimental.make_csv_dataset(\n", @@ -1271,7 +1349,9 @@ "metadata": { "id": "AradAjmW2vyd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for ex in read_csv(test_path, batch_size=5):\n", " break\n", @@ -1294,7 +1374,9 @@ "metadata": { "id": "nma2Bzi--11x" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ex2 = ex.copy()\n", "ex2.pop('fnlwgt')\n", @@ -1321,7 +1403,9 @@ "metadata": { "id": "swEPuZsR0Y5S" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ex2 = pd.DataFrame(ex)[['education', 'hours-per-week']]\n", "ex2" @@ -1333,7 +1417,9 @@ "metadata": { "id": "_s4SxutV1DTI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "pd.DataFrame(tft_layer(dict(ex2)))" ] @@ -1353,7 +1439,9 @@ "metadata": { "id": "hdMKDnafJh64" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class Transform(tf.Module):\n", " def __init__(self, working_dir):\n", @@ -1389,7 +1477,9 @@ "metadata": { "id": "mm5HI578Ku1B" }, - "outputs": [], + "outputs": [ + + ], "source": [ "transform = Transform(output_dir)" ] @@ -1400,7 +1490,9 @@ "metadata": { "id": "4jeenwN_3ZRj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "t_ex, t_label = transform(ex)" ] @@ -1411,7 +1503,9 @@ "metadata": { "id": "yIavZAqALO8H" }, - "outputs": [], + "outputs": [ + + ], "source": [ "pd.DataFrame(t_ex)" ] @@ -1431,7 +1525,9 @@ "metadata": { "id": "VN3IO6u1Mk83" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.evaluate(\n", " read_csv(test_path, batch_size=5).map(transform),\n", @@ -1457,7 +1553,9 @@ "metadata": { "id": "AZ2WICuwEwqC" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class ServingModel(tf.Module):\n", " def __init__(self, model, working_dir):\n", @@ -1517,7 +1615,9 @@ "metadata": { "id": "u2mSC1UMGAwJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "serving_model = ServingModel(model, output_dir)\n", "\n", @@ -1530,7 +1630,7 @@ "id": "BWhighof3AK8" }, "source": [ - "모델을 저장된 모델로 내보냅니다." + "모델을 SavedModel로 내보냅니다." ] }, { @@ -1539,7 +1639,9 @@ "metadata": { "id": "kodDWTJIEr77" }, - "outputs": [], + "outputs": [ + + ], "source": [ "saved_model_dir = serving_model.export(output_dir)\n", "saved_model_dir" @@ -1560,7 +1662,9 @@ "metadata": { "id": "nShh6GqcEr78" }, - "outputs": [], + "outputs": [ + + ], "source": [ "reloaded = tf.saved_model.load(str(saved_model_dir))\n", "run_model = reloaded.signatures['serving_default']" @@ -1572,7 +1676,9 @@ "metadata": { "id": "UiYJhQySEr78" }, - "outputs": [], + "outputs": [ + + ], "source": [ "run_model(serialized_example_batch)" ] @@ -1583,7 +1689,7 @@ "id": "ICqetCnSjwp1" }, "source": [ - "##우리가 수행한 작업. 이 예제에서는 `tf.Transform`을 사용하여 인구 조사 데이터의 데이터세트를 사전 처리하고 정리 및 변환된 데이터로 모델을 훈련했습니다. 또한 추론을 수행하기 위해 프로덕션 환경에 훈련된 모델을 배포할 때 사용할 수 있는 입력 함수를 만들었습니다. 훈련과 추론 모두에 동일한 코드를 사용함으로써 데이터 왜곡 문제를 피할 수 있습니다. 그 과정에서 데이터 정리에 필요한 변환을 수행하기 위해 Apache Beam 변환을 생성하는 방법을 배웠습니다. 또한 이 변환 데이터를 이용해 `tf.keras`로 모델을 훈련하는 방법도 보았습니다. 이것은 TensorFlow Transform으로 수행할 수 있는 작업의 일부일 뿐입니다! tf.Transform을 더욱 자세히 살펴보고 이것으로 무엇을 할 수 있는지 알아보기 바랍니다." + "##우리가 수행한 작업. 이 예제에서는 `tf.Transform`을 사용하여 인구 조사 데이터의 데이터세트를 전처리하고 정리 및 변환된 데이터로 모델을 훈련했습니다. 또한 추론을 수행하기 위해 운영 환경에 훈련된 모델을 배포할 때 사용할 수 있는 입력 함수를 만들었습니다. 훈련과 추론 모두에 동일한 코드를 사용함으로써 데이터 기울이기 문제를 피할 수 있습니다. 그 과정에서 데이터 정리에 필요한 변환을 수행하기 위해 Apache Beam 변환을 생성하는 방법을 배웠습니다. 또한 이 변환 데이터를 이용해 `tf.keras`로 모델을 훈련하는 방법도 보았습니다. 이것은 TensorFlow Transform으로 수행할 수 있는 작업의 일부일 뿐입니다! `tf.Transform`을 더욱 자세히 살펴보고 이것으로 무엇을 할 수 있는지 알아보기 바랍니다." ] }, { @@ -1615,7 +1721,9 @@ "metadata": { "id": "kFO0MeWQ228a" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def _make_training_input_fn(tf_transform_output, transformed_examples,\n", " batch_size):\n", @@ -1668,7 +1776,9 @@ "cellView": "code", "id": "NN5FVg343Jea" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def _make_serving_input_fn(tf_transform_output):\n", " \"\"\"Creates an input function reading from raw data.\n", @@ -1720,7 +1830,9 @@ "metadata": { "id": "6qOFOvBk7oJX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def get_feature_columns(tf_transform_output):\n", " \"\"\"Returns the FeatureColumns for the model.\n", @@ -1763,7 +1875,9 @@ "metadata": { "id": "8iGQ0jeq8IWr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def train_and_evaluate(working_dir, num_train_instances=NUM_TRAIN_INSTANCES,\n", " num_test_instances=NUM_TEST_INSTANCES):\n", @@ -1827,7 +1941,9 @@ "metadata": { "id": "P_1_2dB6pdc2" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tempfile\n", "temp = temp = os.path.join(tempfile.mkdtemp(),'estimator')\n", @@ -1842,7 +1958,9 @@ "metadata": { "id": "O_IqGL90GCIq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "pprint.pprint(results)" ] diff --git a/site/ko/tfx/tutorials/transform/data_preprocessing_with_cloud.md b/site/ko/tfx/tutorials/transform/data_preprocessing_with_cloud.md index d1e8bef394..c8d0483023 100644 --- a/site/ko/tfx/tutorials/transform/data_preprocessing_with_cloud.md +++ b/site/ko/tfx/tutorials/transform/data_preprocessing_with_cloud.md @@ -24,7 +24,7 @@ -이 튜토리얼을 실행하는 비용을 추정하려면 하루 종일 모든 리소스를 사용한다고 가정하고 미리 구성된 [가격 계산기](/products/calculator/#id=fad4d8-dd68-45b8-954e-5a56a5d148){: .external }를 사용하세요. +이 튜토리얼을 실행하는 비용을 추정하려면 하루 종일 모든 리소스를 사용한다고 가정하고 미리 구성된 [가격 계산기](/products/calculator/#id=fad4d8-dd68-45b8-954e-5a56a5d){: .external }를 사용하세요. ## 시작하기 전에 @@ -42,7 +42,7 @@ 다음 Jupyter 노트북은 구현 예제를 보여줍니다. -- [Notebook 1](https://github.com/GoogleCloudPlatform/training-data-analyst/blob/master/blogs/babyweight_tft/babyweight_tft_keras_01.ipynb){: .external }은 데이터 전처리에 대한 내용을 다룹니다. 자세한 내용은 나중에 [Apache Beam 파이프라인 구현하기](#implement-the-apache-beam-pipeline) 섹션에서 제공됩니다. +- [Notebook 1](https://github.com/GoogleCloudPlatform/training-data-analyst/blob/master/blogs/babyweight_tft/babyweight_tft_keras_.ipynb){: .external }은 데이터 전처리에 대한 내용을 다룹니다. 자세한 내용은 나중에 [Apache Beam 파이프라인 구현하기](#implement-the-apache-beam-pipeline) 섹션에서 제공됩니다. - [Notebook 2](https://github.com/GoogleCloudPlatform/training-data-analyst/blob/master/blogs/babyweight_tft/babyweight_tft_keras_02.ipynb){: .external }는 모델 훈련에 대한 내용을 다룹니다. 자세한 내용은 나중에 [TensorFlow 모델 구현하기](#implement-the-tensorflow-model) 섹션에서 제공됩니다. 다음 섹션에서는 이러한 노트북을 복제하고 노트북을 실행하여 구현 예제가 작동하는 방식을 알아봅니다. @@ -372,8 +372,7 @@ def preprocess_fn(input_features): tfidf 텍스트 특성 - -x의 용어를 해당 용어 빈도 * 역 문서 빈도에 매핑 + x의 용어를 해당 용어 빈도 * 역 문서 빈도에 매핑 compute_and_apply_vocabulary diff --git a/site/ko/tfx/tutorials/transform/simple.ipynb b/site/ko/tfx/tutorials/transform/simple.ipynb index 5a301a4bd8..343f3791fd 100644 --- a/site/ko/tfx/tutorials/transform/simple.ipynb +++ b/site/ko/tfx/tutorials/transform/simple.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "rSGJWC5biBiG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -94,7 +96,9 @@ "metadata": { "id": "EmiQXNLZm8z-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "try:\n", " import colab\n", @@ -118,7 +122,9 @@ "metadata": { "id": "j2CTKbMNm9I4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install -q -U tensorflow_transform" ] @@ -129,7 +135,9 @@ "metadata": { "id": "R0mXLOJR_-dv" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# This cell is only necessary because packages were installed while python was\n", "# running. It avoids the need to restart the runtime when running in Colab.\n", @@ -154,7 +162,9 @@ "metadata": { "id": "K4QXVIM7iglN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import pathlib\n", "import pprint\n", @@ -188,7 +198,9 @@ "metadata": { "id": "-R236Tkf_ON3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "raw_data = [\n", " {'x': 1, 'y': 1, 's': 'hello'},\n", @@ -235,7 +247,9 @@ "metadata": { "id": "H2wANNF_2dCR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def preprocessing_fn(inputs):\n", " \"\"\"Preprocess input columns into transformed columns.\"\"\"\n", @@ -304,7 +318,9 @@ "metadata": { "id": "mAF9w7RTZU7c" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def main(output_dir):\n", " # Ignore the warnings\n", @@ -329,7 +345,9 @@ "metadata": { "id": "zZPQl0X19ni2" }, - "outputs": [], + "outputs": [ + + ], "source": [ "output_dir = pathlib.Path(tempfile.mkdtemp())\n", "\n", @@ -377,7 +395,9 @@ "metadata": { "id": "We4Mafrq8id6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!ls -l {output_dir}" ] @@ -399,7 +419,9 @@ "metadata": { "id": "cz8dqFW6ANJQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "loaded = tf.saved_model.load(str(output_dir/'transform_fn'))\n", "loaded.signatures['serving_default']" @@ -420,7 +442,9 @@ "metadata": { "id": "HNd4r2gJ75nx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf_transform_output = tft.TFTransformOutput(output_dir)\n", "\n", @@ -443,7 +467,9 @@ "metadata": { "id": "2nyE1fVj82Gp" }, - "outputs": [], + "outputs": [ + + ], "source": [ "raw_data_batch = {\n", " 's': tf.constant([ex['s'] for ex in raw_data]),\n", @@ -467,7 +493,9 @@ "metadata": { "id": "fIXJYE0Z9Mrs" }, - "outputs": [], + "outputs": [ + + ], "source": [ "transformed_batch = tft_layer(raw_data_batch)\n", "\n", @@ -518,7 +546,9 @@ "metadata": { "id": "xWiEo1ZUzp4x" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class StackDict(tf.keras.layers.Layer):\n", " def call(self, inputs):\n", @@ -534,7 +564,9 @@ "metadata": { "id": "A0QJpoWT1aUD" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class TrainedModel(tf.keras.Model):\n", " def __init__(self):\n", @@ -557,7 +589,9 @@ "metadata": { "id": "DkMwREIx2fkD" }, - "outputs": [], + "outputs": [ + + ], "source": [ "trained_model = TrainedModel()" ] @@ -591,7 +625,9 @@ "metadata": { "id": "d2KJ8nGt228O" }, - "outputs": [], + "outputs": [ + + ], "source": [ "trained_model_output = trained_model(transformed_batch)\n", "trained_model_output.shape" @@ -616,7 +652,9 @@ "metadata": { "id": "Pe-nbN123qUt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class ExportModel(tf.Module):\n", " def __init__(self, trained_model, input_transform):\n", @@ -635,7 +673,9 @@ "metadata": { "id": "iLUIO-Y87AC0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "export_model = ExportModel(trained_model=trained_model,\n", " input_transform=tft_layer)" @@ -656,7 +696,9 @@ "metadata": { "id": "AqwHTex27ILk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "export_model_output = export_model(raw_data_batch)\n", "export_model_output.shape" @@ -668,7 +710,9 @@ "metadata": { "id": "AZQ6_Dfd7xws" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf.reduce_max(abs(export_model_output - trained_model_output)).numpy()" ] @@ -688,7 +732,9 @@ "metadata": { "id": "VK17CShl8F7s" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tempfile\n", "model_dir = tempfile.mkdtemp(suffix='tft')\n", @@ -702,7 +748,9 @@ "metadata": { "id": "RTF-yRnA9yrL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "reloaded = tf.saved_model.load(model_dir)\n", "\n", @@ -716,7 +764,9 @@ "metadata": { "id": "tFx1I6FQ9_mj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf.reduce_max(abs(export_model_output - reloaded_model_output)).numpy()" ] diff --git a/site/ko/tutorials/audio/music_generation.ipynb b/site/ko/tutorials/audio/music_generation.ipynb index 99d002a3ed..f9de61099d 100644 --- a/site/ko/tutorials/audio/music_generation.ipynb +++ b/site/ko/tutorials/audio/music_generation.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "JO1GUwC1_T2x" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -89,7 +91,9 @@ "metadata": { "id": "kahm6Z8v_TqC" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!sudo apt install -y fluidsynth" ] @@ -100,7 +104,9 @@ "metadata": { "id": "M0lAReB7_Vqb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install --upgrade pyfluidsynth" ] @@ -111,7 +117,9 @@ "metadata": { "id": "G46kKoQZmIa8" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install pretty_midi" ] @@ -122,7 +130,9 @@ "metadata": { "id": "GsLFq7nsiqcq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import collections\n", "import datetime\n", @@ -146,7 +156,9 @@ "metadata": { "id": "Efja_OtJNzAM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "seed = 42\n", "tf.random.set_seed(seed)\n", @@ -171,7 +183,9 @@ "metadata": { "id": "mwja4SWmibrL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "data_dir = pathlib.Path('data/maestro-v2.0.0')\n", "if not data_dir.exists():\n", @@ -198,7 +212,9 @@ "metadata": { "id": "72iFI1bPB9o1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "filenames = glob.glob(str(data_dir/'**/*.mid*'))\n", "print('Number of files:', len(filenames))" @@ -228,7 +244,9 @@ "metadata": { "id": "6oSCbHvJNbci" }, - "outputs": [], + "outputs": [ + + ], "source": [ "sample_file = filenames[1]\n", "print(sample_file)" @@ -249,7 +267,9 @@ "metadata": { "id": "1YSQ5DjRI2md" }, - "outputs": [], + "outputs": [ + + ], "source": [ "pm = pretty_midi.PrettyMIDI(sample_file)" ] @@ -269,7 +289,9 @@ "metadata": { "id": "vzoHAaVY_kyY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def display_audio(pm: pretty_midi.PrettyMIDI, seconds=30):\n", " waveform = pm.fluidsynth(fs=_SAMPLING_RATE)\n", @@ -284,7 +306,9 @@ "metadata": { "id": "GOe-3AAi_sRw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "display_audio(pm)" ] @@ -304,7 +328,9 @@ "metadata": { "id": "SIGHYQPZQnRo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print('Number of instruments:', len(pm.instruments))\n", "instrument = pm.instruments[0]\n", @@ -327,7 +353,9 @@ "metadata": { "id": "nYZm_VehYOTZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for i, note in enumerate(instrument.notes[:10]):\n", " note_name = pretty_midi.note_number_to_name(note.pitch)\n", @@ -360,7 +388,9 @@ "metadata": { "id": "Wyp_wdcEPWby" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def midi_to_notes(midi_file: str) -> pd.DataFrame:\n", " pm = pretty_midi.PrettyMIDI(midi_file)\n", @@ -390,7 +420,9 @@ "metadata": { "id": "X0kPjLBlcnY6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "raw_notes = midi_to_notes(sample_file)\n", "raw_notes.head()" @@ -411,7 +443,9 @@ "metadata": { "id": "WE9YXrGZbY2X" }, - "outputs": [], + "outputs": [ + + ], "source": [ "get_note_names = np.vectorize(pretty_midi.note_number_to_name)\n", "sample_note_names = get_note_names(raw_notes['pitch'])\n", @@ -433,7 +467,9 @@ "metadata": { "id": "liD2N7x_WOTp" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def plot_piano_roll(notes: pd.DataFrame, count: Optional[int] = None):\n", " if count:\n", @@ -457,7 +493,9 @@ "metadata": { "id": "vWeUbqmAXjOs" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plot_piano_roll(raw_notes, count=100)" ] @@ -477,7 +515,9 @@ "metadata": { "id": "G7l76hEDZX8Z" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plot_piano_roll(raw_notes)" ] @@ -497,7 +537,9 @@ "metadata": { "id": "Pq9C9XBBaK7W" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def plot_distributions(notes: pd.DataFrame, drop_percentile=2.5):\n", " plt.figure(figsize=[15, 5])\n", @@ -519,7 +561,9 @@ "metadata": { "id": "-Nu2Pw24acFD" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plot_distributions(raw_notes)" ] @@ -541,7 +585,9 @@ "metadata": { "id": "BD5rsMRARYoV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def notes_to_midi(\n", " notes: pd.DataFrame,\n", @@ -579,7 +625,9 @@ "metadata": { "id": "wTazLbuWPIPF" }, - "outputs": [], + "outputs": [ + + ], "source": [ "example_file = 'example.midi'\n", "example_pm = notes_to_midi(\n", @@ -601,7 +649,9 @@ "metadata": { "id": "fGRLs-eR_4uK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "display_audio(example_pm)" ] @@ -639,7 +689,9 @@ "metadata": { "id": "GiaQiTnXSW-T" }, - "outputs": [], + "outputs": [ + + ], "source": [ "num_files = 5\n", "all_notes = []\n", @@ -656,7 +708,9 @@ "metadata": { "id": "F4bMDeRvgWqx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "n_notes = len(all_notes)\n", "print('Number of notes parsed:', n_notes)" @@ -677,7 +731,9 @@ "metadata": { "id": "mvNHCHZdXG2P" }, - "outputs": [], + "outputs": [ + + ], "source": [ "key_order = ['pitch', 'step', 'duration']\n", "train_notes = np.stack([all_notes[key] for key in key_order], axis=1)" @@ -689,7 +745,9 @@ "metadata": { "id": "PLC_19tshyFk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "notes_ds = tf.data.Dataset.from_tensor_slices(train_notes)\n", "notes_ds.element_spec" @@ -712,7 +770,9 @@ "metadata": { "id": "ZkEC-5s6wJJV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def create_sequences(\n", " dataset: tf.data.Dataset, \n", @@ -761,7 +821,9 @@ "metadata": { "id": "fGA3VxcFXZ4T" }, - "outputs": [], + "outputs": [ + + ], "source": [ "seq_length = 25\n", "vocab_size = 128\n", @@ -784,7 +846,9 @@ "metadata": { "id": "ESK9cL7__TF3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for seq, target in seq_ds.take(1):\n", " print('sequence shape:', seq.shape)\n", @@ -808,7 +872,9 @@ "metadata": { "id": "fTpFoiM_AV_Y" }, - "outputs": [], + "outputs": [ + + ], "source": [ "batch_size = 64\n", "buffer_size = n_notes - seq_length # the number of items in the dataset\n", @@ -825,7 +891,9 @@ "metadata": { "id": "LySbjV0GzXQu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_ds.element_spec" ] @@ -854,7 +922,9 @@ "metadata": { "id": "erxLOif08e8v" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def mse_with_positive_pressure(y_true: tf.Tensor, y_pred: tf.Tensor):\n", " mse = (y_true - y_pred) ** 2\n", @@ -868,7 +938,9 @@ "metadata": { "id": "kNaVWcCzAm5V" }, - "outputs": [], + "outputs": [ + + ], "source": [ "input_shape = (seq_length, 3)\n", "learning_rate = 0.005\n", @@ -913,7 +985,9 @@ "metadata": { "id": "BlATt7Rl0XJl" }, - "outputs": [], + "outputs": [ + + ], "source": [ "losses = model.evaluate(train_ds, return_dict=True)\n", "losses" @@ -934,7 +1008,9 @@ "metadata": { "id": "9fQB5SiN3ufX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.compile(\n", " loss=loss,\n", @@ -962,7 +1038,9 @@ "metadata": { "id": "T7CzWmFR38ut" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.evaluate(train_ds, return_dict=True)" ] @@ -982,7 +1060,9 @@ "metadata": { "id": "uQA_rwKEgPjp" }, - "outputs": [], + "outputs": [ + + ], "source": [ "callbacks = [\n", " tf.keras.callbacks.ModelCheckpoint(\n", @@ -1002,7 +1082,9 @@ "metadata": { "id": "aLoYY8-XaPFN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%time\n", "epochs = 50\n", @@ -1020,7 +1102,9 @@ "metadata": { "id": "PYBSjgDWiUfT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plt.plot(history.epoch, history.history['loss'], label='total loss')\n", "plt.show()" @@ -1054,7 +1138,9 @@ "metadata": { "id": "1mil8ZyJNe1w" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def predict_next_note(\n", " notes: np.ndarray, \n", @@ -1100,7 +1186,9 @@ "metadata": { "id": "87fPl4auPdR3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "temperature = 2.0\n", "num_predictions = 120\n", @@ -1134,7 +1222,9 @@ "metadata": { "id": "0MK7HmqLuqka" }, - "outputs": [], + "outputs": [ + + ], "source": [ "generated_notes.head(10)" ] @@ -1145,7 +1235,9 @@ "metadata": { "id": "e9K9KHPaTNnK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "out_file = 'output.mid'\n", "out_pm = notes_to_midi(\n", @@ -1182,7 +1274,9 @@ "metadata": { "id": "NlNsxcnhvbcK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plot_piano_roll(generated_notes)" ] @@ -1202,7 +1296,9 @@ "metadata": { "id": "j5bco2WVRkAa" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plot_distributions(generated_notes)" ] @@ -1233,7 +1329,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "music_generation.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/audio/transfer_learning_audio.ipynb b/site/ko/tutorials/audio/transfer_learning_audio.ipynb index ad8a97b925..afef180d28 100644 --- a/site/ko/tutorials/audio/transfer_learning_audio.ipynb +++ b/site/ko/tutorials/audio/transfer_learning_audio.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "DjZQV2njKJ3U" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -87,7 +89,9 @@ "metadata": { "id": "urBpRWDHTHHU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install -q \"tensorflow==2.11.*\"\n", "# tensorflow_io 0.28 is compatible with TensorFlow 2.11\n", @@ -100,7 +104,9 @@ "metadata": { "id": "7l3nqdWVF-kC" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import os\n", "\n", @@ -149,7 +155,9 @@ "metadata": { "id": "06CWkBV5v3gr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "yamnet_model_handle = 'https://tfhub.dev/google/yamnet/1'\n", "yamnet_model = hub.load(yamnet_model_handle)" @@ -170,7 +178,9 @@ "metadata": { "id": "C5i6xktEq00P" }, - "outputs": [], + "outputs": [ + + ], "source": [ "testing_wav_file_name = tf.keras.utils.get_file('miaow_16k.wav',\n", " 'https://storage.googleapis.com/audioset/miaow_16k.wav',\n", @@ -197,7 +207,9 @@ "metadata": { "id": "Xwc9Wrdg2EtY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Utility functions for loading audio files and making sure the sample rate is correct.\n", "\n", @@ -220,7 +232,9 @@ "metadata": { "id": "FRqpjkwB0Jjw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "testing_wav_data = load_wav_16k_mono(testing_wav_file_name)\n", "\n", @@ -247,7 +261,9 @@ "metadata": { "id": "6Gyj23e_3Mgr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class_map_path = yamnet_model.class_map_path().numpy().decode('utf-8')\n", "class_names =list(pd.read_csv(class_map_path)['display_name'])\n", @@ -274,7 +290,9 @@ "metadata": { "id": "NT0otp-A4Y3u" }, - "outputs": [], + "outputs": [ + + ], "source": [ "scores, embeddings, spectrogram = yamnet_model(testing_wav_data)\n", "class_scores = tf.reduce_mean(scores, axis=0)\n", @@ -313,7 +331,9 @@ "metadata": { "id": "MWobqK8JmZOU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_ = tf.keras.utils.get_file('esc-50.zip',\n", " 'https://github.com/karoldvl/ESC-50/archive/master.zip',\n", @@ -343,7 +363,9 @@ "metadata": { "id": "jwmLygPrMAbH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "esc50_csv = './datasets/ESC-50-master/meta/esc50.csv'\n", "base_data_path = './datasets/ESC-50-master/audio/'\n", @@ -373,7 +395,9 @@ "metadata": { "id": "tFnEoQjgs14I" }, - "outputs": [], + "outputs": [ + + ], "source": [ "my_classes = ['dog', 'cat']\n", "map_class_to_id = {'dog':0, 'cat':1}\n", @@ -419,7 +443,9 @@ "metadata": { "id": "u5Rq3_PyKLtU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "filenames = filtered_pd['filename']\n", "targets = filtered_pd['target']\n", @@ -435,7 +461,9 @@ "metadata": { "id": "rsEfovDVAHGY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def load_wav_for_map(filename, label, fold):\n", " return load_wav_16k_mono(filename), label, fold\n", @@ -450,7 +478,9 @@ "metadata": { "id": "k0tG8DBNAHcE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# applies the embedding extraction model to a wav data\n", "def extract_embedding(wav_data, label, fold):\n", @@ -487,7 +517,9 @@ "metadata": { "id": "1ZYvlFiVsffC" }, - "outputs": [], + "outputs": [ + + ], "source": [ "cached_ds = main_ds.cache()\n", "train_ds = cached_ds.filter(lambda embedding, label, fold: fold < 4)\n", @@ -523,7 +555,9 @@ "metadata": { "id": "JYCE0Fr1GpN3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "my_model = tf.keras.Sequential([\n", " tf.keras.layers.Input(shape=(1024), dtype=tf.float32,\n", @@ -541,7 +575,9 @@ "metadata": { "id": "l1qgH35HY0SE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "my_model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n", " optimizer=\"adam\",\n", @@ -558,7 +594,9 @@ "metadata": { "id": "T3sj84eOZ3pk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "history = my_model.fit(train_ds,\n", " epochs=20,\n", @@ -581,7 +619,9 @@ "metadata": { "id": "H4Nh5nec3Sky" }, - "outputs": [], + "outputs": [ + + ], "source": [ "loss, accuracy = my_model.evaluate(test_ds)\n", "\n", @@ -615,7 +655,9 @@ "metadata": { "id": "79AFpA3_ctCF" }, - "outputs": [], + "outputs": [ + + ], "source": [ "scores, embeddings, spectrogram = yamnet_model(testing_wav_data)\n", "result = my_model(embeddings).numpy()\n", @@ -647,7 +689,9 @@ "metadata": { "id": "QUVCI2Suunpw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class ReduceMeanLayer(tf.keras.layers.Layer):\n", " def __init__(self, axis=0, **kwargs):\n", @@ -664,7 +708,9 @@ "metadata": { "id": "zE_Npm0nzlwc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "saved_model_path = './dogs_and_cats_yamnet'\n", "\n", @@ -684,7 +730,9 @@ "metadata": { "id": "y-0bY5FMme1C" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf.keras.utils.plot_model(serving_model)" ] @@ -704,7 +752,9 @@ "metadata": { "id": "KkYVpJS72WWB" }, - "outputs": [], + "outputs": [ + + ], "source": [ "reloaded_model = tf.saved_model.load(saved_model_path)" ] @@ -724,7 +774,9 @@ "metadata": { "id": "xeXtD5HO28y-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "reloaded_results = reloaded_model(testing_wav_data)\n", "cat_or_dog = my_classes[tf.math.argmax(reloaded_results)]\n", @@ -746,7 +798,9 @@ "metadata": { "id": "ycC8zzDSUG2s" }, - "outputs": [], + "outputs": [ + + ], "source": [ "serving_results = reloaded_model.signatures['serving_default'](testing_wav_data)\n", "cat_or_dog = my_classes[tf.math.argmax(serving_results['classifier'])]\n", @@ -772,7 +826,9 @@ "metadata": { "id": "vDf5MASIIN1z" }, - "outputs": [], + "outputs": [ + + ], "source": [ "test_pd = filtered_pd.loc[filtered_pd['fold'] == 5]\n", "row = test_pd.sample(1)\n", @@ -791,7 +847,9 @@ "metadata": { "id": "eYUzFxYJIcE1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Run the model, check the output.\n", "scores, embeddings, spectrogram = yamnet_model(waveform)\n", @@ -826,7 +884,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "transfer_learning_audio.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/customization/custom_layers.ipynb b/site/ko/tutorials/customization/custom_layers.ipynb index 697848a154..a4e9f7059e 100644 --- a/site/ko/tutorials/customization/custom_layers.ipynb +++ b/site/ko/tutorials/customization/custom_layers.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "JlknJBWQtKkI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -69,7 +71,9 @@ "metadata": { "id": "Py0m-N6VgQFJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf" ] @@ -80,7 +84,9 @@ "metadata": { "id": "TluWFcB_2nP5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(tf.config.list_physical_devices('GPU'))" ] @@ -106,7 +112,9 @@ "metadata": { "id": "8PyXlPl-4TzQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# In the tf.keras.layers package, layers are objects. To construct a layer,\n", "# simply construct the object. Most layers take as a first argument the number\n", @@ -133,7 +141,9 @@ "metadata": { "id": "E3XKNknP5Mhb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# To use a layer, simply call it.\n", "layer(tf.zeros([10, 5]))" @@ -145,7 +155,9 @@ "metadata": { "id": "Wt_Nsv-L5t2s" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Layers have many useful methods. For example, you can inspect all variables\n", "# in a layer using `layer.variables` and trainable variables using\n", @@ -160,7 +172,9 @@ "metadata": { "id": "6ilvKjz8_4MQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# The variables are also accessible through nice accessors\n", "layer.kernel, layer.bias" @@ -189,7 +203,9 @@ "metadata": { "id": "5Byl3n1k5kIy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class MyDenseLayer(tf.keras.layers.Layer):\n", " def __init__(self, num_outputs):\n", @@ -213,7 +229,9 @@ "metadata": { "id": "vrmBsYGOnuGO" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_ = layer(tf.zeros([10, 5])) # Calling the layer `.builds` it." ] @@ -224,7 +242,9 @@ "metadata": { "id": "1bsLjiPfnvat" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print([var.name for var in layer.trainable_variables])" ] @@ -261,7 +281,9 @@ "metadata": { "id": "N30DTXiRASlb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class ResnetIdentityBlock(tf.keras.Model):\n", " def __init__(self, kernel_size, filters):\n", @@ -302,7 +324,9 @@ "metadata": { "id": "7D8ZR5mqtokj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_ = block(tf.zeros([1, 2, 3, 3])) " ] @@ -313,7 +337,9 @@ "metadata": { "id": "MJ8rzFpdoE_m" }, - "outputs": [], + "outputs": [ + + ], "source": [ "block.layers" ] @@ -324,7 +350,9 @@ "metadata": { "id": "dewldLuDvQRM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "len(block.variables)" ] @@ -335,7 +363,9 @@ "metadata": { "id": "FrqIXeSetaYi" }, - "outputs": [], + "outputs": [ + + ], "source": [ "block.summary()" ] @@ -355,7 +385,9 @@ "metadata": { "id": "L9frk7Ur4uvJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "my_seq = tf.keras.Sequential([tf.keras.layers.Conv2D(1, (1, 1),\n", " input_shape=(\n", @@ -375,7 +407,9 @@ "metadata": { "id": "tVAsbFITuScB" }, - "outputs": [], + "outputs": [ + + ], "source": [ "my_seq.summary()" ] @@ -394,7 +428,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "custom_layers.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/distribute/dtensor_keras_tutorial.ipynb b/site/ko/tutorials/distribute/dtensor_keras_tutorial.ipynb index e48e1f4307..0c817dd432 100644 --- a/site/ko/tutorials/distribute/dtensor_keras_tutorial.ipynb +++ b/site/ko/tutorials/distribute/dtensor_keras_tutorial.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "tuOe1ymfHZPu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -90,7 +92,9 @@ "metadata": { "id": "4dHik7NYA5vm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install --quiet --upgrade --pre tensorflow tensorflow-datasets" ] @@ -112,7 +116,9 @@ "metadata": { "id": "CodX6idGBGSm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "import tensorflow_datasets as tfds\n", @@ -125,7 +131,9 @@ "metadata": { "id": "aAtvrpasDpDD" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def configure_virtual_cpus(ncpu):\n", " phy_devices = tf.config.list_physical_devices('CPU')\n", @@ -156,7 +164,9 @@ "metadata": { "id": "9u85YypguL8N" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf.keras.backend.experimental.enable_tf_random_generator()\n", "tf.keras.utils.set_random_seed(1337)" @@ -183,7 +193,9 @@ "metadata": { "id": "6sT6s6z4j9H-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mesh = dtensor.create_mesh([(\"batch\", 8)], devices=devices)" ] @@ -203,7 +215,9 @@ "metadata": { "id": "U8OxvkDKE1Nu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "example_weight_layout = dtensor.Layout([dtensor.UNSHARDED, dtensor.UNSHARDED], mesh) # or\n", "example_weight_layout = dtensor.Layout.replicated(mesh, rank=2)" @@ -224,7 +238,9 @@ "metadata": { "id": "PhYp0EKBFfxt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "example_data_layout = dtensor.Layout(['batch', dtensor.UNSHARDED], mesh) # or\n", "example_data_layout = dtensor.Layout.batch_sharded(mesh, 'batch', rank=2)" @@ -251,7 +267,9 @@ "metadata": { "id": "Koc5GlA1tFXY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "unsharded_layout_2d = dtensor.Layout.replicated(mesh, 2)\n", "unsharded_layout_1d = dtensor.Layout.replicated(mesh, 1)" @@ -263,7 +281,9 @@ "metadata": { "id": "GfOGTIxGs5Ql" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = tf.keras.models.Sequential([\n", " tf.keras.layers.Flatten(input_shape=(28, 28)),\n", @@ -294,7 +314,9 @@ "metadata": { "id": "Z_nqv_VdwcXo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for weight in model.weights:\n", " print(f'Weight name: {weight.name} with layout: {weight.layout}')\n", @@ -318,7 +340,9 @@ "metadata": { "id": "zGt4kwltxOt4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "(ds_train, ds_test), ds_info = tfds.load(\n", " 'mnist',\n", @@ -335,7 +359,9 @@ "metadata": { "id": "HkUaOB_ryaLH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def normalize_img(image, label):\n", " \"\"\"Normalizes images: `uint8` -> `float32`.\"\"\"\n", @@ -348,7 +374,9 @@ "metadata": { "id": "Efm2H1iqydan" }, - "outputs": [], + "outputs": [ + + ], "source": [ "batch_size = 128\n", "\n", @@ -366,7 +394,9 @@ "metadata": { "id": "Lcrg6QAtyis4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ds_test = ds_test.map(\n", " normalize_img, num_parallel_calls=tf.data.AUTOTUNE)\n", @@ -394,7 +424,9 @@ "metadata": { "id": "CAx11gMjzzjs" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function\n", "def train_step(model, x, y, optimizer, metrics):\n", @@ -422,7 +454,9 @@ "metadata": { "id": "maSTWeRemO0P" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function\n", "def eval_step(model, x, y, metrics):\n", @@ -444,7 +478,9 @@ "metadata": { "id": "dt00axcLmvLr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def pack_dtensor_inputs(images, labels, image_layout, label_layout):\n", " num_local_devices = image_layout.mesh.num_local_devices()\n", @@ -476,7 +512,9 @@ "metadata": { "id": "1lu_0mz1sxrl" }, - "outputs": [], + "outputs": [ + + ], "source": [ "optimizer = tf.keras.dtensor.experimental.optimizers.Adam(0.01, mesh=mesh)\n", "metrics = {'accuracy': tf.keras.metrics.SparseCategoricalAccuracy(mesh=mesh)}\n", @@ -502,7 +540,9 @@ "metadata": { "id": "kZW568Dk0vvL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "num_epochs = 3\n", "\n", @@ -581,7 +621,9 @@ "metadata": { "id": "LZ0hRFs8unu0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class SubclassedModel(tf.keras.Model):\n", "\n", @@ -621,7 +663,9 @@ "metadata": { "id": "goVX6iIZw468" }, - "outputs": [], + "outputs": [ + + ], "source": [ "layout_map = tf.keras.dtensor.experimental.LayoutMap(mesh=mesh)\n", "\n", @@ -647,7 +691,9 @@ "metadata": { "id": "c3CbD9l7qUNq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "dtensor_input = dtensor.copy_to_mesh(tf.zeros((16, 16)), layout=unsharded_layout_2d)\n", "# Trigger the weights creation for subclass model\n", @@ -691,7 +737,9 @@ "metadata": { "id": "gXK2EquIRJCC" }, - "outputs": [], + "outputs": [ + + ], "source": [ "layout_map = tf.keras.dtensor.experimental.LayoutMap(mesh=mesh)\n", "\n", @@ -705,7 +753,9 @@ "metadata": { "id": "cBzwJqrg2TH3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "with layout_map.scope():\n", " inputs = tf.keras.Input((16,), batch_size=16)\n", @@ -723,7 +773,9 @@ "metadata": { "id": "pPuh1NlE3-wO" }, - "outputs": [], + "outputs": [ + + ], "source": [ "with layout_map.scope():\n", " model = tf.keras.Sequential([\n", diff --git a/site/ko/tutorials/distribute/dtensor_ml_tutorial.ipynb b/site/ko/tutorials/distribute/dtensor_ml_tutorial.ipynb index 7adbabc566..5e19c36575 100644 --- a/site/ko/tutorials/distribute/dtensor_ml_tutorial.ipynb +++ b/site/ko/tutorials/distribute/dtensor_ml_tutorial.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "tuOe1ymfHZPu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -100,7 +102,9 @@ "metadata": { "id": "-RKXLJN-7Yyb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install --quiet --upgrade --pre tensorflow tensorflow-datasets" ] @@ -122,7 +126,9 @@ "metadata": { "id": "dXcB26oP7dUd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tempfile\n", "import numpy as np\n", @@ -140,7 +146,9 @@ "metadata": { "id": "oHtO6MJLUXlz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def configure_virtual_cpus(ncpu):\n", " phy_devices = tf.config.list_physical_devices('CPU')\n", @@ -171,7 +179,9 @@ "metadata": { "id": "fW4w4QlFVHhx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_data = tfds.load('imdb_reviews', split='train', shuffle_files=True, batch_size=64)\n", "train_data" @@ -201,7 +211,9 @@ "metadata": { "id": "zNpxjku_57Lg" }, - "outputs": [], + "outputs": [ + + ], "source": [ "text_vectorization = tf.keras.layers.TextVectorization(output_mode='tf_idf', max_tokens=1200, output_sequence_length=None)\n", "text_vectorization.adapt(data=train_data.map(lambda x: x['text']))" @@ -213,7 +225,9 @@ "metadata": { "id": "q16bjngoVwQp" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def vectorize(features):\n", " return text_vectorization(features['text']), features['label']\n", @@ -273,7 +287,9 @@ "metadata": { "id": "VpKblz7Yb16G" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class Dense(tf.Module):\n", "\n", @@ -327,7 +343,9 @@ "metadata": { "id": "riBA9pfhlPFq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class BatchNorm(tf.Module):\n", "\n", @@ -357,7 +375,9 @@ "metadata": { "id": "unFcP99zprJj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def make_keras_bn(bn_layout):\n", " return tf.keras.layers.BatchNormalization(gamma_layout=bn_layout,\n", @@ -384,7 +404,8 @@ "id": "udFGAO-NrZw6" }, "source": [ - "\"비분산 \n" + "\n", + "\"비분산 \n" ] }, { @@ -406,7 +427,9 @@ "metadata": { "id": "junyS-965opl" }, - "outputs": [], + "outputs": [ + + ], "source": [ "from typing import Tuple\n", "\n", @@ -443,7 +466,9 @@ "metadata": { "id": "wEZR7UlihsYX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class MLPStricter(tf.Module):\n", "\n", @@ -480,7 +505,9 @@ "metadata": { "id": "zOPuYeQwallh" }, - "outputs": [], + "outputs": [ + + ], "source": [ "WORLD = dtensor.create_mesh([(\"world\", 8)], devices=DEVICES)\n", "\n", @@ -515,7 +542,9 @@ "metadata": { "id": "3t5WvQR4Hvo4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def repack_local_tensor(x, layout):\n", " \"\"\"Repacks a local Tensor-like to a DTensor with layout.\n", @@ -590,7 +619,9 @@ "metadata": { "id": "C0IyOlxmeu4I" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mesh = dtensor.create_mesh([(\"batch\", 8)], devices=DEVICES)\n", "\n", @@ -617,7 +648,9 @@ "metadata": { "id": "8xMYkTpGocY8" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def repack_batch(x, y, mesh):\n", " x = repack_local_tensor(x, layout=dtensor.Layout(['batch', dtensor.UNSHARDED], mesh))\n", @@ -652,7 +685,9 @@ "metadata": { "id": "BwUFzLGDtQT6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Refer to the CTL (custom training loop guide)\n", "@tf.function\n", @@ -694,7 +729,9 @@ "metadata": { "id": "rsInFFJg7x9t" }, - "outputs": [], + "outputs": [ + + ], "source": [ "CHECKPOINT_DIR = tempfile.mkdtemp()\n", "\n", @@ -729,7 +766,9 @@ "metadata": { "id": "UaLn-vGZgqbS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "num_epochs = 2\n", "manager = start_checkpoint_manager(model)\n", @@ -766,7 +805,7 @@ "- 단일 모델 복제본 내의 2개 장치는 복제된 훈련 데이터를 수신합니다.\n", "\n", "\n", - "\"모델 \n" + "\"모델 \n" ] }, { @@ -775,7 +814,9 @@ "metadata": { "id": "5gZE9IT5Dzwl" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mesh = dtensor.create_mesh([(\"batch\", 4), (\"model\", 2)], devices=DEVICES)\n", "model = MLP([dtensor.Layout([dtensor.UNSHARDED, \"model\"], mesh), \n", @@ -797,7 +838,9 @@ "metadata": { "id": "dZf56ynbE_p1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def repack_batch(x, y, mesh):\n", " x = repack_local_tensor(x, layout=dtensor.Layout(['batch', dtensor.UNSHARDED], mesh))\n", @@ -822,7 +865,9 @@ "metadata": { "id": "LLC0wgii7EgA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "num_epochs = 2\n", "manager = start_checkpoint_manager(model)\n", @@ -869,7 +914,9 @@ "metadata": { "id": "jpc9mqURGpmK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mesh = dtensor.create_mesh([(\"batch\", 2), (\"feature\", 2), (\"model\", 2)], devices=DEVICES)\n", "model = MLP([dtensor.Layout([\"feature\", \"model\"], mesh), \n", @@ -891,7 +938,9 @@ "metadata": { "id": "DWR8qF6BGtFL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def repack_batch_for_spt(x, y, mesh):\n", " # Shard data on feature dimension, too\n", @@ -915,7 +964,9 @@ "metadata": { "id": "p3NnpHSKo-hx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "num_epochs = 2\n", "\n", @@ -954,7 +1005,9 @@ "metadata": { "id": "49HfIq_SJZoj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mesh = dtensor.create_mesh([(\"world\", 1)], devices=DEVICES[:1])\n", "mlp = MLP([dtensor.Layout([dtensor.UNSHARDED, dtensor.UNSHARDED], mesh), \n", @@ -991,7 +1044,9 @@ "metadata": { "id": "HG_ASSzR4IWW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "sample_batch = train_data.take(1).get_single_element()\n", "sample_batch" @@ -1003,7 +1058,9 @@ "metadata": { "id": "qW8yKPrhKQ5b" }, - "outputs": [], + "outputs": [ + + ], "source": [ "loaded = tf.saved_model.load(\"/tmp/saved_model\")\n", "\n", @@ -1017,7 +1074,9 @@ "metadata": { "id": "GahGbv0ZmkJb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "np.mean(tf.argmax(result, axis=-1) == sample_batch['label'])" ] @@ -1042,7 +1101,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "dtensor_ml_tutorial.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/distribute/multi_worker_with_estimator.ipynb b/site/ko/tutorials/distribute/multi_worker_with_estimator.ipynb index 32e8f07db2..bbbd8d5c58 100644 --- a/site/ko/tutorials/distribute/multi_worker_with_estimator.ipynb +++ b/site/ko/tutorials/distribute/multi_worker_with_estimator.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "tuOe1ymfHZPu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -88,7 +90,9 @@ "metadata": { "id": "bnYxvfLD-LW-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow_datasets as tfds\n", "import tensorflow as tf\n", @@ -111,7 +115,9 @@ "metadata": { "id": "5dJ6UYrGDsVs" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf.compat.v1.disable_eager_execution()" ] @@ -133,7 +139,9 @@ "metadata": { "id": "dma_wUAxZqo2" }, - "outputs": [], + "outputs": [ + + ], "source": [ "BUFFER_SIZE = 10000\n", "BATCH_SIZE = 64\n", @@ -208,7 +216,9 @@ "metadata": { "id": "WNvOn_OeiUYC" }, - "outputs": [], + "outputs": [ + + ], "source": [ "LEARNING_RATE = 1e-4\n", "def model_fn(features, labels, mode):\n", @@ -266,7 +276,9 @@ "metadata": { "id": "1uFSHCJXMrQ-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "strategy = tf.distribute.experimental.MultiWorkerMirroredStrategy()" ] @@ -288,7 +300,9 @@ "metadata": { "id": "BcsuBYrpgnlS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "config = tf.estimator.RunConfig(train_distribute=strategy)\n", "\n", diff --git a/site/ko/tutorials/distribute/multi_worker_with_keras.ipynb b/site/ko/tutorials/distribute/multi_worker_with_keras.ipynb index e44edbd6d7..c7eec7ac32 100644 --- a/site/ko/tutorials/distribute/multi_worker_with_keras.ipynb +++ b/site/ko/tutorials/distribute/multi_worker_with_keras.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "tuOe1ymfHZPu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -104,7 +106,9 @@ "metadata": { "id": "bnYxvfLD-LW-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import json\n", "import os\n", @@ -128,7 +132,9 @@ "metadata": { "id": "rpEIVI5upIzM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"-1\"" ] @@ -148,7 +154,9 @@ "metadata": { "id": "WEJLYa2_7OZF" }, - "outputs": [], + "outputs": [ + + ], "source": [ "os.environ.pop('TF_CONFIG', None)" ] @@ -168,7 +176,9 @@ "metadata": { "id": "hPBuZUNSZmrQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "if '.' not in sys.path:\n", " sys.path.insert(0, '.')" @@ -189,7 +199,9 @@ "metadata": { "id": "-XqozLfzz30N" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install tf-nightly" ] @@ -209,7 +221,9 @@ "metadata": { "id": "vHNvttzV43sA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf" ] @@ -238,7 +252,9 @@ "metadata": { "id": "dma_wUAxZqo2" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%writefile mnist_setup.py\n", "\n", @@ -289,7 +305,9 @@ "metadata": { "id": "6Qe6iAf5O8iJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import mnist_setup\n", "\n", @@ -333,7 +351,9 @@ "metadata": { "id": "XK1eTYvSZiX7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf_config = {\n", " 'cluster': {\n", @@ -358,7 +378,9 @@ "metadata": { "id": "yY-T0YDQZjbu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "json.dumps(tf_config)" ] @@ -410,7 +432,9 @@ "metadata": { "id": "PH2gHn2_0_U8" }, - "outputs": [], + "outputs": [ + + ], "source": [ "os.environ['GREETINGS'] = 'Hello TensorFlow!'" ] @@ -430,7 +454,9 @@ "metadata": { "id": "pquKO6IA18G5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%bash\n", "echo ${GREETINGS}" @@ -469,7 +495,9 @@ "metadata": { "id": "1uFSHCJXMrQ-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "strategy = tf.distribute.MultiWorkerMirroredStrategy()" ] @@ -498,7 +526,9 @@ "metadata": { "id": "wo6b9wX65glL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "with strategy.scope():\n", " # Model building/compiling need to be within `strategy.scope()`.\n", @@ -531,7 +561,9 @@ "metadata": { "id": "BcsuBYrpgnlS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%writefile main.py\n", "\n", @@ -582,7 +614,9 @@ "metadata": { "id": "bi6x05Sr60O9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%bash\n", "ls *.py" @@ -603,7 +637,9 @@ "metadata": { "id": "9uu3g7vV7Bbt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "os.environ['TF_CONFIG'] = json.dumps(tf_config)" ] @@ -623,7 +659,9 @@ "metadata": { "id": "txMXaq8d8N_S" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# first kill any previous runs\n", "%killbgscripts" @@ -635,7 +673,9 @@ "metadata": { "id": "qnSma_Ck7r-r" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%bash --bg\n", "python main.py &> job_0.log" @@ -663,7 +703,9 @@ "metadata": { "id": "Hm2yrULE9281" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import time\n", "time.sleep(10)" @@ -684,7 +726,9 @@ "metadata": { "id": "vZEOuVgQ9-hn" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%bash\n", "cat job_0.log" @@ -714,7 +758,9 @@ "metadata": { "id": "lAiYkkPu_Jqd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf_config['task']['index'] = 1\n", "os.environ['TF_CONFIG'] = json.dumps(tf_config)" @@ -735,7 +781,9 @@ "metadata": { "id": "_ESVtyQ9_xjx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%bash\n", "python main.py" @@ -756,7 +804,9 @@ "metadata": { "id": "rc6hw3yTBKXX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%bash\n", "cat job_0.log" @@ -777,7 +827,9 @@ "metadata": { "id": "sG5_1UgrgniF" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Delete the `TF_CONFIG`, and kill any background tasks so they don't affect the next section.\n", "os.environ.pop('TF_CONFIG', None)\n", @@ -825,7 +877,9 @@ "metadata": { "id": "JxEtdh1vH-TF" }, - "outputs": [], + "outputs": [ + + ], "source": [ "options = tf.data.Options()\n", "options.experimental_distribute.auto_shard_policy = tf.data.experimental.AutoShardPolicy.OFF\n", @@ -964,7 +1018,9 @@ "metadata": { "id": "XQfGkmg-pfCY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model_path = '/tmp/keras-model'\n", "\n", @@ -1022,7 +1078,9 @@ "metadata": { "id": "J-yA3BYG_vTs" }, - "outputs": [], + "outputs": [ + + ], "source": [ "multi_worker_model.save(write_model_path)" ] @@ -1042,7 +1100,9 @@ "metadata": { "id": "aJTyu-97ABpY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "if not _is_chief(task_type, task_id):\n", " tf.io.gfile.rmtree(os.path.dirname(write_model_path))" @@ -1065,7 +1125,9 @@ "metadata": { "id": "iUZna-JKAOrX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "loaded_model = tf.keras.models.load_model(model_path)\n", "\n", @@ -1092,7 +1154,9 @@ "metadata": { "id": "_1-RYaB5xnNH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "checkpoint_dir = '/tmp/ckpt'\n", "\n", @@ -1117,7 +1181,9 @@ "metadata": { "id": "l1ZXG_GbWzLp" }, - "outputs": [], + "outputs": [ + + ], "source": [ "checkpoint_manager.save()\n", "if not _is_chief(task_type, task_id):\n", @@ -1139,7 +1205,9 @@ "metadata": { "id": "NJW7vtknXFEH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "latest_checkpoint = tf.train.latest_checkpoint(checkpoint_dir)\n", "checkpoint.restore(latest_checkpoint)\n", @@ -1177,7 +1245,9 @@ "metadata": { "id": "CYdzZi4Qs1jz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Multi-worker training with `MultiWorkerMirroredStrategy`\n", "# and the `BackupAndRestore` callback. The training state \n", @@ -1207,7 +1277,9 @@ "metadata": { "id": "rZjQGPsF0aEI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# The training state is backed up at epoch boundaries because `save_freq` is\n", "# set to `epoch`.\n", @@ -1238,7 +1310,9 @@ "metadata": { "id": "bSJUyLSF0moC" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# The training state is backed up at every 30 steps because `save_freq` is set\n", "# to an integer value of `30`.\n", diff --git a/site/ko/tutorials/distribute/save_and_load.ipynb b/site/ko/tutorials/distribute/save_and_load.ipynb index bb2e25d4bb..9f54ab0550 100644 --- a/site/ko/tutorials/distribute/save_and_load.ipynb +++ b/site/ko/tutorials/distribute/save_and_load.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "CPSnXS88KFEo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -84,7 +86,9 @@ "metadata": { "id": "RWG5HchAiOrZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow_datasets as tfds\n", "\n", @@ -106,7 +110,9 @@ "metadata": { "id": "yrYiAf_ziRyw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mirrored_strategy = tf.distribute.MirroredStrategy()\n", "\n", @@ -161,7 +167,9 @@ "metadata": { "id": "zmGurbJmS_vN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = get_model()\n", "train_dataset, eval_dataset = get_data()\n", @@ -206,7 +214,9 @@ "metadata": { "id": "LYOStjV5knTQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "keras_model_path = '/tmp/keras_save.keras'\n", "model.save(keras_model_path)" @@ -227,7 +237,9 @@ "metadata": { "id": "WrXAAVtrzRgv" }, - "outputs": [], + "outputs": [ + + ], "source": [ "restored_keras_model = tf.keras.models.load_model(keras_model_path)\n", "restored_keras_model.fit(train_dataset, epochs=2)" @@ -250,7 +262,9 @@ "metadata": { "id": "wROPrJaAqBQz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "another_strategy = tf.distribute.OneDeviceStrategy('/cpu:0')\n", "with another_strategy.scope():\n", @@ -291,7 +305,9 @@ "metadata": { "id": "4y6T31APuCqK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = get_model() # get a fresh model\n", "saved_model_path = '/tmp/tf_save'\n", @@ -313,7 +329,9 @@ "metadata": { "id": "aaEKqBSPwAuM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "DEFAULT_FUNCTION_KEY = 'serving_default'\n", "loaded = tf.saved_model.load(saved_model_path)\n", @@ -335,7 +353,9 @@ "metadata": { "id": "5Ore5q8-UjW1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "predict_dataset = eval_dataset.map(lambda image, label: image)\n", "for batch in predict_dataset.take(1):\n", @@ -357,7 +377,9 @@ "metadata": { "id": "iDYvu12zYTmT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "another_strategy = tf.distribute.MirroredStrategy()\n", "with another_strategy.scope():\n", @@ -389,7 +411,9 @@ "metadata": { "id": "clfk3hQoyKu6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow_hub as hub\n", "\n", @@ -448,7 +472,9 @@ "metadata": { "id": "Ktwg2GwnXE8v" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = get_model()\n", "\n", @@ -485,7 +511,9 @@ "metadata": { "id": "jFcuzsI94bNA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = get_model()\n", "\n", @@ -525,7 +553,9 @@ "metadata": { "id": "gurSIbDFjOBc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class SubclassedModel(tf.keras.Model):\n", " \"\"\"Example model defined by subclassing `tf.keras.Model`.\"\"\"\n", @@ -564,7 +594,9 @@ "metadata": { "id": "064SE47mYDj8" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf.saved_model.save(my_model, saved_model_path)\n", "x = tf.saved_model.load(saved_model_path)\n", @@ -588,7 +620,9 @@ "metadata": { "id": "xAXise4eR0YJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(my_model.save_spec() is None)" ] @@ -608,7 +642,9 @@ "metadata": { "id": "cv5LTi0zDkKS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "BATCH_SIZE_PER_REPLICA = 4\n", "BATCH_SIZE = BATCH_SIZE_PER_REPLICA * mirrored_strategy.num_replicas_in_sync\n", @@ -628,7 +664,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "save_and_load.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/estimator/keras_model_to_estimator.ipynb b/site/ko/tutorials/estimator/keras_model_to_estimator.ipynb index 23d025c11f..6db6f02885 100644 --- a/site/ko/tutorials/estimator/keras_model_to_estimator.ipynb +++ b/site/ko/tutorials/estimator/keras_model_to_estimator.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "KsOkK8O69PyT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -48,10 +50,10 @@ "source": [ "\n", " \n", - " \n", " \n", - " \n", + " \n", "
TensorFlow.org에서 보기 Google Colab에서 실행하기\n", + " Google Colab에서 실행하기\n", "GitHub에서 소스 보기노트북 다운론드하기노트북 다운론드하기
" ] }, @@ -92,7 +94,9 @@ "metadata": { "id": "Qmq4FzaztASN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "\n", @@ -126,7 +130,9 @@ "metadata": { "id": "p5NSx38itD1a" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = tf.keras.models.Sequential([\n", " tf.keras.layers.Dense(16, activation='relu', input_shape=(4,)),\n", @@ -150,7 +156,9 @@ "metadata": { "id": "nViACuBDtVEC" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n", " optimizer='adam')\n", @@ -176,7 +184,9 @@ "metadata": { "id": "H0DpLEop_x0o" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def input_fn():\n", " split = tfds.Split.TRAIN\n", @@ -201,7 +211,9 @@ "metadata": { "id": "WO94bGYKBKRv" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for features_batch, labels_batch in input_fn().take(1):\n", " print(features_batch)\n", @@ -225,7 +237,9 @@ "metadata": { "id": "roChngg8t7il" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tempfile\n", "model_dir = tempfile.mkdtemp()\n", @@ -248,7 +262,9 @@ "metadata": { "id": "ouIkVtp9uAg5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "keras_estimator.train(input_fn=input_fn, steps=500)\n", "eval_result = keras_estimator.evaluate(input_fn=input_fn, steps=10)\n", @@ -258,7 +274,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "keras_model_to_estimator.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/generative/cvae.ipynb b/site/ko/tutorials/generative/cvae.ipynb index 87d2c70ca9..9d1959b000 100644 --- a/site/ko/tutorials/generative/cvae.ipynb +++ b/site/ko/tutorials/generative/cvae.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "MTKwbguKwT4R" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -80,7 +82,9 @@ "metadata": { "id": "P-JuIu2N_SQf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install tensorflow-probability\n", "\n", @@ -95,7 +99,9 @@ "metadata": { "id": "YfIk2es3hJEd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "from IPython import display\n", "\n", @@ -126,7 +132,9 @@ "metadata": { "id": "a4fYMGxGhrna" }, - "outputs": [], + "outputs": [ + + ], "source": [ "(train_images, _), (test_images, _) = tf.keras.datasets.mnist.load_data()" ] @@ -137,7 +145,9 @@ "metadata": { "id": "NFC2ghIdiZYE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def preprocess_images(images):\n", " images = images.reshape((images.shape[0], 28, 28, 1)) / 255.\n", @@ -153,7 +163,9 @@ "metadata": { "id": "S4PIDhoDLbsZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_size = 60000\n", "batch_size = 32\n", @@ -175,7 +187,9 @@ "metadata": { "id": "-yKCCQOoJ7cn" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_dataset = (tf.data.Dataset.from_tensor_slices(train_images)\n", " .shuffle(train_size).batch(batch_size))\n", @@ -224,7 +238,9 @@ "metadata": { "id": "VGLbvBEmjK0a" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class CVAE(tf.keras.Model):\n", " \"\"\"Convolutional variational autoencoder.\"\"\"\n", @@ -309,7 +325,9 @@ "metadata": { "id": "iWCn_PVdEJZ7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "optimizer = tf.keras.optimizers.Adam(1e-4)\n", "\n", @@ -373,7 +391,9 @@ "metadata": { "id": "NS2GWywBbAWo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "epochs = 10\n", "# set the dimensionality of the latent space to a plane for visualization later\n", @@ -393,7 +413,9 @@ "metadata": { "id": "RmdVsmvhPxyy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def generate_and_save_images(model, epoch, test_sample):\n", " mean, logvar = model.encode(test_sample)\n", @@ -417,7 +439,9 @@ "metadata": { "id": "swCyrbqQQ-Ri" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Pick a sample of the test set for generating output images\n", "assert batch_size >= num_examples_to_generate\n", @@ -431,7 +455,9 @@ "metadata": { "id": "2M7LmLtGEMQJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "generate_and_save_images(model, 0, test_sample)\n", "\n", @@ -466,7 +492,9 @@ "metadata": { "id": "WfO5wCdclHGL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def display_image(epoch_no):\n", " return PIL.Image.open('image_at_epoch_{:04d}.png'.format(epoch_no))" @@ -478,7 +506,9 @@ "metadata": { "id": "5x3q9_Oe5q0A" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plt.imshow(display_image(epoch))\n", "plt.axis('off') # Display images" @@ -499,7 +529,9 @@ "metadata": { "id": "IGKQgENQ8lEI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "anim_file = 'cvae.gif'\n", "\n", @@ -519,7 +551,9 @@ "metadata": { "id": "2ZqAEtdqUmJF" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow_docs.vis.embed as embed\n", "embed.embed_file(anim_file)" @@ -543,7 +577,9 @@ "cellView": "code", "id": "mNcaaYPBS3mj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def plot_latent_images(model, n, digit_size=28):\n", " \"\"\"Plots n x n digit images decoded from the latent space.\"\"\"\n", @@ -575,7 +611,9 @@ "metadata": { "id": "F-ZG69QCZnGY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plot_latent_images(model, 20)" ] @@ -607,7 +645,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "cvae.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/generative/cyclegan.ipynb b/site/ko/tutorials/generative/cyclegan.ipynb index cd0ce2df88..a774bbd596 100644 --- a/site/ko/tutorials/generative/cyclegan.ipynb +++ b/site/ko/tutorials/generative/cyclegan.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "qmkj-80IHxnd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -95,7 +97,9 @@ "metadata": { "id": "bJ1ROiQxJ-vY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install git+https://github.com/tensorflow/examples.git" ] @@ -106,7 +110,9 @@ "metadata": { "id": "lhSsUx9Nyb3t" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf" ] @@ -117,7 +123,9 @@ "metadata": { "id": "YfIk2es3hJEd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow_datasets as tfds\n", "from tensorflow_examples.models.pix2pix import pix2pix\n", @@ -154,7 +162,9 @@ "metadata": { "id": "iuGVPOo7Cce0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "dataset, metadata = tfds.load('cycle_gan/horse2zebra',\n", " with_info=True, as_supervised=True)\n", @@ -169,7 +179,9 @@ "metadata": { "id": "2CbTEt448b4R" }, - "outputs": [], + "outputs": [ + + ], "source": [ "BUFFER_SIZE = 1000\n", "BATCH_SIZE = 1\n", @@ -183,7 +195,9 @@ "metadata": { "id": "Yn3IwqhiIszt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def random_crop(image):\n", " cropped_image = tf.image.random_crop(\n", @@ -198,7 +212,9 @@ "metadata": { "id": "muhR2cgbLKWW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# normalizing the images to [-1, 1]\n", "def normalize(image):\n", @@ -213,7 +229,9 @@ "metadata": { "id": "fVQOjcPVLrUc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def random_jitter(image):\n", " # resizing to 286 x 286 x 3\n", @@ -235,7 +253,9 @@ "metadata": { "id": "tyaP4hLJ8b4W" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def preprocess_image_train(image, label):\n", " image = random_jitter(image)\n", @@ -249,7 +269,9 @@ "metadata": { "id": "VB3Z6D_zKSru" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def preprocess_image_test(image, label):\n", " image = normalize(image)\n", @@ -262,7 +284,9 @@ "metadata": { "id": "RsajGXxd5JkZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_horses = train_horses.cache().map(\n", " preprocess_image_train, num_parallel_calls=AUTOTUNE).shuffle(\n", @@ -287,7 +311,9 @@ "metadata": { "id": "e3MhJ3zVLPan" }, - "outputs": [], + "outputs": [ + + ], "source": [ "sample_horse = next(iter(train_horses))\n", "sample_zebra = next(iter(train_zebras))" @@ -299,7 +325,9 @@ "metadata": { "id": "4pOYjMk_KfIB" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plt.subplot(121)\n", "plt.title('Horse')\n", @@ -316,7 +344,9 @@ "metadata": { "id": "0KJyB9ENLb2y" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plt.subplot(121)\n", "plt.title('Zebra')\n", @@ -365,7 +395,9 @@ "metadata": { "id": "8ju9Wyw87MRW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "OUTPUT_CHANNELS = 3\n", "\n", @@ -382,7 +414,9 @@ "metadata": { "id": "wDaGZ3WpZUyw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "to_zebra = generator_g(sample_horse)\n", "to_horse = generator_f(sample_zebra)\n", @@ -408,7 +442,9 @@ "metadata": { "id": "O5MhJmxyZiy9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plt.figure(figsize=(8, 8))\n", "\n", @@ -449,7 +485,9 @@ "metadata": { "id": "cyhxTuvJyIHV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "LAMBDA = 10" ] @@ -460,7 +498,9 @@ "metadata": { "id": "Q1Xbz5OaLj5C" }, - "outputs": [], + "outputs": [ + + ], "source": [ "loss_obj = tf.keras.losses.BinaryCrossentropy(from_logits=True)" ] @@ -471,7 +511,9 @@ "metadata": { "id": "wkMNfBWlT-PV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def discriminator_loss(real, generated):\n", " real_loss = loss_obj(tf.ones_like(real), real)\n", @@ -489,7 +531,9 @@ "metadata": { "id": "90BIcCKcDMxz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def generator_loss(generated):\n", " return loss_obj(tf.ones_like(generated), generated)" @@ -511,9 +555,9 @@ "\n", "![Cycle loss](images/cycle_loss.png)\n", "\n", - "$$backward\\ cycle\\ consistency\\ loss: Y -> F(Y) -> G(F(Y)) \\sim \\hat{Y}$$\n", + "![주기 손실](images/cycle_loss.png)\n", "\n", - "![주기 손실](images/cycle_loss.png)" + "![Cycle loss](images/cycle_loss.png)" ] }, { @@ -522,7 +566,9 @@ "metadata": { "id": "NMpVGj_sW6Vo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def calc_cycle_loss(real_image, cycled_image):\n", " loss1 = tf.reduce_mean(tf.abs(real_image - cycled_image))\n", @@ -549,7 +595,9 @@ "metadata": { "id": "05ywEH680Aud" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def identity_loss(real_image, same_image):\n", " loss = tf.reduce_mean(tf.abs(real_image - same_image))\n", @@ -571,7 +619,9 @@ "metadata": { "id": "iWCn_PVdEJZ7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "generator_g_optimizer = tf.keras.optimizers.Adam(2e-4, beta_1=0.5)\n", "generator_f_optimizer = tf.keras.optimizers.Adam(2e-4, beta_1=0.5)\n", @@ -595,7 +645,9 @@ "metadata": { "id": "WJnftd5sQsv6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "checkpoint_path = \"./checkpoints/train\"\n", "\n", @@ -633,7 +685,9 @@ "metadata": { "id": "NS2GWywBbAWo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "EPOCHS = 10" ] @@ -644,7 +698,9 @@ "metadata": { "id": "RmdVsmvhPxyy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def generate_images(model, test_input):\n", " prediction = model(test_input)\n", @@ -683,7 +739,9 @@ "metadata": { "id": "KBKUV2sKXDbY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function\n", "def train_step(real_x, real_y):\n", @@ -753,7 +811,9 @@ "metadata": { "id": "2M7LmLtGEMQJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for epoch in range(EPOCHS):\n", " start = time.time()\n", @@ -794,7 +854,9 @@ "metadata": { "id": "KUgSnmy2nqSP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Run the trained model on the test dataset\n", "for inp in test_horses.take(5):\n", @@ -818,7 +880,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "cyclegan.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/generative/dcgan.ipynb b/site/ko/tutorials/generative/dcgan.ipynb index dafdfbf860..ba3a546f8d 100644 --- a/site/ko/tutorials/generative/dcgan.ipynb +++ b/site/ko/tutorials/generative/dcgan.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "V_sgB_5dx1f1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -101,7 +103,9 @@ "metadata": { "id": "WZKbyU2-AiY-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf" ] @@ -112,7 +116,9 @@ "metadata": { "id": "wx-zNbLqB4K8" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf.__version__" ] @@ -123,7 +129,9 @@ "metadata": { "id": "YzTlj4YdCip_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# To generate GIFs\n", "!pip install imageio\n", @@ -136,7 +144,9 @@ "metadata": { "id": "YfIk2es3hJEd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import glob\n", "import imageio\n", @@ -167,7 +177,9 @@ "metadata": { "id": "a4fYMGxGhrna" }, - "outputs": [], + "outputs": [ + + ], "source": [ "(train_images, train_labels), (_, _) = tf.keras.datasets.mnist.load_data()" ] @@ -178,7 +190,9 @@ "metadata": { "id": "NFC2ghIdiZYE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_images = train_images.reshape(train_images.shape[0], 28, 28, 1).astype('float32')\n", "train_images = (train_images - 127.5) / 127.5 # Normalize the images to [-1, 1]" @@ -190,7 +204,9 @@ "metadata": { "id": "S4PIDhoDLbsZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "BUFFER_SIZE = 60000\n", "BATCH_SIZE = 256" @@ -202,7 +218,9 @@ "metadata": { "id": "-yKCCQOoJ7cn" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Batch and shuffle the data\n", "train_dataset = tf.data.Dataset.from_tensor_slices(train_images).shuffle(BUFFER_SIZE).batch(BATCH_SIZE)" @@ -236,7 +254,9 @@ "metadata": { "id": "6bpTcDqoLWjY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def make_generator_model():\n", " model = tf.keras.Sequential()\n", @@ -278,7 +298,9 @@ "metadata": { "id": "gl7jcC7TdPTG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "generator = make_generator_model()\n", "\n", @@ -305,7 +327,9 @@ "metadata": { "id": "dw2tPLmk2pEP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def make_discriminator_model():\n", " model = tf.keras.Sequential()\n", @@ -339,7 +363,9 @@ "metadata": { "id": "gDkA05NE6QMs" }, - "outputs": [], + "outputs": [ + + ], "source": [ "discriminator = make_discriminator_model()\n", "decision = discriminator(generated_image)\n", @@ -363,7 +389,9 @@ "metadata": { "id": "psQfmXxYKU3X" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# This method returns a helper function to compute cross entropy loss\n", "cross_entropy = tf.keras.losses.BinaryCrossentropy(from_logits=True)" @@ -386,7 +414,9 @@ "metadata": { "id": "wkMNfBWlT-PV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def discriminator_loss(real_output, fake_output):\n", " real_loss = cross_entropy(tf.ones_like(real_output), real_output)\n", @@ -412,7 +442,9 @@ "metadata": { "id": "90BIcCKcDMxz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def generator_loss(fake_output):\n", " return cross_entropy(tf.ones_like(fake_output), fake_output)" @@ -433,7 +465,9 @@ "metadata": { "id": "iWCn_PVdEJZ7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "generator_optimizer = tf.keras.optimizers.Adam(1e-4)\n", "discriminator_optimizer = tf.keras.optimizers.Adam(1e-4)" @@ -456,7 +490,9 @@ "metadata": { "id": "CA1w-7s2POEy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "checkpoint_dir = './training_checkpoints'\n", "checkpoint_prefix = os.path.join(checkpoint_dir, \"ckpt\")\n", @@ -481,7 +517,9 @@ "metadata": { "id": "NS2GWywBbAWo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "EPOCHS = 50\n", "noise_dim = 100\n", @@ -507,7 +545,9 @@ "metadata": { "id": "3t5ibNo05jCB" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Notice the use of `tf.function`\n", "# This annotation causes the function to be \"compiled\".\n", @@ -537,7 +577,9 @@ "metadata": { "id": "2M7LmLtGEMQJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def train(dataset, epochs):\n", " for epoch in range(epochs):\n", @@ -580,7 +622,9 @@ "metadata": { "id": "RmdVsmvhPxyy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def generate_and_save_images(model, epoch, test_input):\n", " # Notice `training` is set to False.\n", @@ -617,7 +661,9 @@ "metadata": { "id": "Ly3UN0SLLY2l" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train(train_dataset, EPOCHS)" ] @@ -637,7 +683,9 @@ "metadata": { "id": "XhXsd0srPo8c" }, - "outputs": [], + "outputs": [ + + ], "source": [ "checkpoint.restore(tf.train.latest_checkpoint(checkpoint_dir))" ] @@ -657,7 +705,9 @@ "metadata": { "id": "WfO5wCdclHGL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Display a single image using the epoch number\n", "def display_image(epoch_no):\n", @@ -670,7 +720,9 @@ "metadata": { "id": "5x3q9_Oe5q0A" }, - "outputs": [], + "outputs": [ + + ], "source": [ "display_image(EPOCHS)" ] @@ -690,7 +742,9 @@ "metadata": { "id": "IGKQgENQ8lEI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "anim_file = 'dcgan.gif'\n", "\n", @@ -710,7 +764,9 @@ "metadata": { "id": "ZBwyU6t2Wf3g" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow_docs.vis.embed as embed\n", "embed.embed_file(anim_file)" @@ -738,7 +794,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "dcgan.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/generative/deepdream.ipynb b/site/ko/tutorials/generative/deepdream.ipynb index 353a56e176..03165036c4 100644 --- a/site/ko/tutorials/generative/deepdream.ipynb +++ b/site/ko/tutorials/generative/deepdream.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "k7gifg92NbG9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -50,8 +52,7 @@ " TensorFlow.org에서 보기 \n", " Google Colab에서 실행\n", " GitHub에서 소그 보기\n", - " 노트북 다운로드하기\n", - "\n", + " 노트북 다운로드하기 \n", "" ] }, @@ -78,7 +79,9 @@ "metadata": { "id": "Sc5Yq_Rgxreb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf" ] @@ -89,7 +92,9 @@ "metadata": { "id": "g_Qp173_NbG5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import numpy as np\n", "\n", @@ -123,7 +128,9 @@ "metadata": { "id": "0lclzk9sNbG2" }, - "outputs": [], + "outputs": [ + + ], "source": [ "url = 'https://storage.googleapis.com/download.tensorflow.org/example_images/YellowLabradorLooking_new.jpg'" ] @@ -134,7 +141,9 @@ "metadata": { "id": "Y5BPgc8NNbG0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Download an image and read it into a NumPy array.\n", "def download(url, max_dim=None):\n", @@ -185,7 +194,9 @@ "metadata": { "id": "GlLi48GKNbGy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "base_model = tf.keras.applications.InceptionV3(include_top=False, weights='imagenet')" ] @@ -214,7 +225,9 @@ "metadata": { "id": "08KB502ONbGt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Maximize the activations of these layers\n", "names = ['mixed3', 'mixed5']\n", @@ -241,7 +254,9 @@ "metadata": { "id": "8MhfSweXXiuq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def calc_loss(img, model):\n", " # Pass forward the image through the model to retrieve the activations.\n", @@ -280,7 +295,9 @@ "metadata": { "id": "qRScWg_VNqvj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class DeepDream(tf.Module):\n", " def __init__(self, model):\n", @@ -322,7 +339,9 @@ "metadata": { "id": "yB9pTqn6xfuK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "deepdream = DeepDream(dream_model)" ] @@ -342,7 +361,9 @@ "metadata": { "id": "9vHEcy7dTysi" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def run_deep_dream_simple(img, steps=100, step_size=0.01):\n", " # Convert from uint8 to the range expected by the model.\n", @@ -379,7 +400,9 @@ "metadata": { "id": "tEfd00rr0j8Z" }, - "outputs": [], + "outputs": [ + + ], "source": [ "dream_img = run_deep_dream_simple(img=original_img, \n", " steps=100, step_size=0.01)" @@ -410,7 +433,9 @@ "metadata": { "id": "0eGDSdatLT-8" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import time\n", "start = time.time()\n", @@ -460,7 +485,9 @@ "metadata": { "id": "oGgLHk7o80ac" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def random_roll(img, maxroll):\n", " # Randomly shift the image to avoid tiled boundaries.\n", @@ -475,7 +502,9 @@ "metadata": { "id": "sKsiqWfA9H41" }, - "outputs": [], + "outputs": [ + + ], "source": [ "shift, img_rolled = random_roll(np.array(original_img), 512)\n", "show(img_rolled)" @@ -496,7 +525,9 @@ "metadata": { "id": "x__TZ0uqNbGm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class TiledGradients(tf.Module):\n", " def __init__(self, model):\n", @@ -552,7 +583,9 @@ "metadata": { "id": "Vcq4GubA2e5J" }, - "outputs": [], + "outputs": [ + + ], "source": [ "get_tiled_gradients = TiledGradients(dream_model)" ] @@ -572,7 +605,9 @@ "metadata": { "id": "gA-15DM4NbGk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def run_deep_dream_with_octaves(img, steps_per_octave=100, step_size=0.01, \n", " octaves=range(-2,3), octave_scale=1.3):\n", @@ -608,7 +643,9 @@ "metadata": { "id": "T7PbRLV74RrU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "img = run_deep_dream_with_octaves(img=original_img, step_size=0.01)\n", "\n", @@ -633,7 +670,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "deepdream.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/generative/style_transfer.ipynb b/site/ko/tutorials/generative/style_transfer.ipynb index b7313a32ad..832a42c71b 100644 --- a/site/ko/tutorials/generative/style_transfer.ipynb +++ b/site/ko/tutorials/generative/style_transfer.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "2pHVBk_seED1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -98,7 +100,7 @@ "이제 Kandinsky가 이 스타일로만 이 개의 그림을 그리기로 결정했다면 어떤 모습이 될까요? 이렇지 않을까요?\n", "\n", "\n", - " " + " " ] }, { @@ -125,7 +127,9 @@ "metadata": { "id": "NyftRTSMuwue" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import os\n", "import tensorflow as tf\n", @@ -139,7 +143,9 @@ "metadata": { "id": "sc1OLbOWhPCO" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import IPython.display as display\n", "\n", @@ -160,7 +166,9 @@ "metadata": { "id": "GM6VEGrGLh62" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def tensor_to_image(tensor):\n", " tensor = tensor*255\n", @@ -186,7 +194,9 @@ "metadata": { "id": "wqc0OJHwyFAk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "content_path = tf.keras.utils.get_file('YellowLabradorLooking_new.jpg', 'https://storage.googleapis.com/download.tensorflow.org/example_images/YellowLabradorLooking_new.jpg')\n", "style_path = tf.keras.utils.get_file('kandinsky5.jpg','https://storage.googleapis.com/download.tensorflow.org/example_images/Vassily_Kandinsky%2C_1913_-_Composition_7.jpg')" @@ -216,7 +226,9 @@ "metadata": { "id": "3TLljcwv5qZs" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def load_img(path_to_img):\n", " max_dim = 512\n", @@ -250,7 +262,9 @@ "metadata": { "id": "cBX-eNT8PAK_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def imshow(image, title=None):\n", " if len(image.shape) > 3:\n", @@ -267,7 +281,9 @@ "metadata": { "id": "_UWQmeEaiKkP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "content_image = load_img(content_path)\n", "style_image = load_img(style_path)\n", @@ -296,7 +312,9 @@ "metadata": { "id": "iYSLexgRKSh-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow_hub as hub\n", "hub_model = hub.load('https://tfhub.dev/google/magenta/arbitrary-image-stylization-v1-256/2')\n", @@ -330,7 +348,9 @@ "metadata": { "id": "fMbzrr7BCTq0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "x = tf.keras.applications.vgg19.preprocess_input(content_image*255)\n", "x = tf.image.resize(x, (224, 224))\n", @@ -345,7 +365,9 @@ "metadata": { "id": "1_FyCm0dYnvl" }, - "outputs": [], + "outputs": [ + + ], "source": [ "predicted_top_5 = tf.keras.applications.vgg19.decode_predictions(prediction_probabilities.numpy())[0]\n", "[(class_name, prob) for (number, class_name, prob) in predicted_top_5]" @@ -366,7 +388,9 @@ "metadata": { "id": "Yh_AV6220ebD" }, - "outputs": [], + "outputs": [ + + ], "source": [ "vgg = tf.keras.applications.VGG19(include_top=False, weights='imagenet')\n", "\n", @@ -390,7 +414,9 @@ "metadata": { "id": "ArfX_6iA0WAX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "content_layers = ['block5_conv2'] \n", "\n", @@ -442,7 +468,9 @@ "metadata": { "id": "nfec6MuMAbPx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def vgg_layers(layer_names):\n", " \"\"\" Creates a VGG model that returns a list of intermediate output values.\"\"\"\n", @@ -471,7 +499,9 @@ "metadata": { "id": "LkyvPpBHSfVi" }, - "outputs": [], + "outputs": [ + + ], "source": [ "style_extractor = vgg_layers(style_layers)\n", "style_outputs = style_extractor(style_image*255)\n", @@ -509,7 +539,9 @@ "metadata": { "id": "HAy1iGPdoEpZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def gram_matrix(input_tensor):\n", " result = tf.linalg.einsum('bijc,bijd->bcd', input_tensor, input_tensor)\n", @@ -542,7 +574,9 @@ "metadata": { "id": "Sr6QALY-I1ja" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class StyleContentModel(tf.keras.models.Model):\n", " def __init__(self, style_layers, content_layers):\n", @@ -590,7 +624,9 @@ "metadata": { "id": "rkjO-DoNDU0A" }, - "outputs": [], + "outputs": [ + + ], "source": [ "extractor = StyleContentModel(style_layers, content_layers)\n", "\n", @@ -633,7 +669,9 @@ "metadata": { "id": "PgkNOnGUFcKa" }, - "outputs": [], + "outputs": [ + + ], "source": [ "style_targets = extractor(style_image)['style']\n", "content_targets = extractor(content_image)['content']" @@ -654,7 +692,9 @@ "metadata": { "id": "J0vKxF8ZO6G8" }, - "outputs": [], + "outputs": [ + + ], "source": [ "image = tf.Variable(content_image)" ] @@ -674,7 +714,9 @@ "metadata": { "id": "kdgpTJwL_vE2" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def clip_0_1(image):\n", " return tf.clip_by_value(image, clip_value_min=0.0, clip_value_max=1.0)" @@ -695,7 +737,9 @@ "metadata": { "id": "r4XZjqUk_5Eu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "opt = tf.keras.optimizers.Adam(learning_rate=0.02, beta_1=0.99, epsilon=1e-1)" ] @@ -715,7 +759,9 @@ "metadata": { "id": "Dt4pxarvA4I4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "style_weight=1e-2\n", "content_weight=1e4" @@ -727,7 +773,9 @@ "metadata": { "id": "0ggx2Na8oROH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def style_content_loss(outputs):\n", " style_outputs = outputs['style']\n", @@ -758,7 +806,9 @@ "metadata": { "id": "0t0umkajFIuh" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function()\n", "def train_step(image):\n", @@ -786,7 +836,9 @@ "metadata": { "id": "Y542mxi-O2a2" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_step(image)\n", "train_step(image)\n", @@ -809,7 +861,9 @@ "metadata": { "id": "rQW1tXYoLbUS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import time\n", "start = time.time()\n", @@ -848,7 +902,9 @@ "metadata": { "id": "7szUUybCQMB3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def high_pass_x_y(image):\n", " x_var = image[:, :, 1:, :] - image[:, :, :-1, :]\n", @@ -863,7 +919,9 @@ "metadata": { "id": "Atc2oL29PXu_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "x_deltas, y_deltas = high_pass_x_y(content_image)\n", "\n", @@ -900,7 +958,9 @@ "metadata": { "id": "HyvqCiywiUfL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plt.figure(figsize=(14, 10))\n", "\n", @@ -926,7 +986,9 @@ "metadata": { "id": "mP-92lXMIYPn" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def total_variation_loss(image):\n", " x_deltas, y_deltas = high_pass_x_y(image)\n", @@ -939,7 +1001,9 @@ "metadata": { "id": "s4OYBUX2KQ25" }, - "outputs": [], + "outputs": [ + + ], "source": [ "total_variation_loss(image).numpy()" ] @@ -959,7 +1023,9 @@ "metadata": { "id": "YQjWW04NKLfJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf.image.total_variation(image).numpy()" ] @@ -981,7 +1047,9 @@ "metadata": { "id": "tGeRLD4GoAd4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "total_variation_weight=30" ] @@ -1001,7 +1069,9 @@ "metadata": { "id": "BzmfcyyYUyWq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "@tf.function()\n", "def train_step(image):\n", @@ -1030,7 +1100,9 @@ "metadata": { "id": "a-dPRr8BqexB" }, - "outputs": [], + "outputs": [ + + ], "source": [ "opt = tf.keras.optimizers.Adam(learning_rate=0.02, beta_1=0.99, epsilon=1e-1)\n", "image = tf.Variable(content_image)" @@ -1051,7 +1123,9 @@ "metadata": { "id": "q3Cc3bLtoOWy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import time\n", "start = time.time()\n", @@ -1088,7 +1162,9 @@ "metadata": { "id": "SSH6OpyyQn7w" }, - "outputs": [], + "outputs": [ + + ], "source": [ "file_name = 'stylized-image.png'\n", "tensor_to_image(image).save(file_name)\n", @@ -1116,7 +1192,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "style_transfer.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/images/classification.ipynb b/site/ko/tutorials/images/classification.ipynb index 5601fd3ba2..496000b489 100644 --- a/site/ko/tutorials/images/classification.ipynb +++ b/site/ko/tutorials/images/classification.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "1z4xy2gTUc4a" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -94,7 +96,9 @@ "metadata": { "id": "L1WtoaOHVrVh" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", @@ -139,7 +143,9 @@ "metadata": { "id": "57CcilYSG0zv" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import pathlib\n", "\n", @@ -163,7 +169,9 @@ "metadata": { "id": "SbtTDYhOHZb6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "image_count = len(list(data_dir.glob('*/*.jpg')))\n", "print(image_count)" @@ -184,7 +192,9 @@ "metadata": { "id": "N1loMlbYHeiJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "roses = list(data_dir.glob('roses/*'))\n", "PIL.Image.open(str(roses[0]))" @@ -196,7 +206,9 @@ "metadata": { "id": "RQbZBOTLHiUP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "PIL.Image.open(str(roses[1]))" ] @@ -216,7 +228,9 @@ "metadata": { "id": "HyQkfPGdHilw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tulips = list(data_dir.glob('tulips/*'))\n", "PIL.Image.open(str(tulips[0]))" @@ -228,7 +242,9 @@ "metadata": { "id": "wtlhWJPAHivf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "PIL.Image.open(str(tulips[1]))" ] @@ -268,7 +284,9 @@ "metadata": { "id": "H74l2DoDI2XD" }, - "outputs": [], + "outputs": [ + + ], "source": [ "batch_size = 32\n", "img_height = 180\n", @@ -290,7 +308,9 @@ "metadata": { "id": "fIR0kRZiI_AT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_ds = tf.keras.utils.image_dataset_from_directory(\n", " data_dir,\n", @@ -307,7 +327,9 @@ "metadata": { "id": "iscU3UoVJBXj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "val_ds = tf.keras.utils.image_dataset_from_directory(\n", " data_dir,\n", @@ -333,7 +355,9 @@ "metadata": { "id": "ZHAxkHX5JD3k" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class_names = train_ds.class_names\n", "print(class_names)" @@ -356,7 +380,9 @@ "metadata": { "id": "wBmEA9c0JYes" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import matplotlib.pyplot as plt\n", "\n", @@ -384,7 +410,9 @@ "metadata": { "id": "2-MfMoenJi8s" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for image_batch, labels_batch in train_ds:\n", " print(image_batch.shape)\n", @@ -425,7 +453,9 @@ "metadata": { "id": "nOjJSm7DKoZA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "AUTOTUNE = tf.data.AUTOTUNE\n", "\n", @@ -459,7 +489,9 @@ "metadata": { "id": "PEYxo2CTJvY9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "normalization_layer = layers.Rescaling(1./255)" ] @@ -479,7 +511,9 @@ "metadata": { "id": "X9o9ESaJJ502" }, - "outputs": [], + "outputs": [ + + ], "source": [ "normalized_ds = train_ds.map(lambda x, y: (normalization_layer(x), y))\n", "image_batch, labels_batch = next(iter(normalized_ds))\n", @@ -525,7 +559,9 @@ "metadata": { "id": "QR6argA1K074" }, - "outputs": [], + "outputs": [ + + ], "source": [ "num_classes = len(class_names)\n", "\n", @@ -560,7 +596,9 @@ "metadata": { "id": "jloGNS1MLx3A" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.compile(optimizer='adam',\n", " loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n", @@ -584,7 +622,9 @@ "metadata": { "id": "llLYH-BXL7Xe" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.summary()" ] @@ -613,7 +653,9 @@ "metadata": { "id": "5fWToCqYMErH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "epochs=10\n", "history = model.fit(\n", @@ -647,7 +689,9 @@ "metadata": { "id": "jWnopEChMMCn" }, - "outputs": [], + "outputs": [ + + ], "source": [ "acc = history.history['accuracy']\n", "val_acc = history.history['val_accuracy']\n", @@ -731,7 +775,9 @@ "metadata": { "id": "9J80BAbIMs21" }, - "outputs": [], + "outputs": [ + + ], "source": [ "data_augmentation = keras.Sequential(\n", " [\n", @@ -760,7 +806,9 @@ "metadata": { "id": "7Z90k539S838" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plt.figure(figsize=(10, 10))\n", "for images, _ in train_ds.take(1):\n", @@ -801,7 +849,9 @@ "metadata": { "id": "2Zeg8zsqXCsm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = Sequential([\n", " data_augmentation,\n", @@ -834,7 +884,9 @@ "metadata": { "id": "EvyAINs9ZOmJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.compile(optimizer='adam',\n", " loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n", @@ -847,7 +899,9 @@ "metadata": { "id": "wWLkKoKjZSoC" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.summary()" ] @@ -858,7 +912,9 @@ "metadata": { "id": "LWS-vvNaZDag" }, - "outputs": [], + "outputs": [ + + ], "source": [ "epochs = 15\n", "history = model.fit(\n", @@ -885,7 +941,9 @@ "metadata": { "id": "dduoLfKsZVIA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "acc = history.history['accuracy']\n", "val_acc = history.history['val_accuracy']\n", @@ -943,7 +1001,9 @@ "metadata": { "id": "dC40sRITBSsQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "sunflower_url = \"https://storage.googleapis.com/download.tensorflow.org/example_images/592px-Red_sunflower.jpg\"\n", "sunflower_path = tf.keras.utils.get_file('Red_sunflower', origin=sunflower_url)\n", @@ -993,7 +1053,9 @@ "metadata": { "id": "mXo6ftuL2ufx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Convert the model.\n", "converter = tf.lite.TFLiteConverter.from_keras_model(model)\n", @@ -1032,7 +1094,9 @@ "metadata": { "id": "cHYcip_FOaHq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "TF_MODEL_FILE_PATH = 'model.tflite' # The default path to the saved TensorFlow Lite model\n", "\n", @@ -1054,7 +1118,9 @@ "metadata": { "id": "ZdDl00E2OaHq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "interpreter.get_signature_list()" ] @@ -1076,7 +1142,9 @@ "metadata": { "id": "yFoT_7W_OaHq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "classify_lite = interpreter.get_signature_runner('serving_default')\n", "classify_lite" @@ -1099,7 +1167,9 @@ "metadata": { "id": "sEqR27YcnFvc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "predictions_lite = classify_lite(sequential_1_input=img_array)['outputs']\n", "score_lite = tf.nn.softmax(predictions_lite)" @@ -1111,7 +1181,9 @@ "metadata": { "id": "ZKP_GFeKUWb5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(\n", " \"This image most likely belongs to {} with a {:.2f} percent confidence.\"\n", @@ -1134,7 +1206,9 @@ "metadata": { "id": "InXXDJL8UYC1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(np.max(np.abs(predictions - predictions_lite)))" ] @@ -1165,7 +1239,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "classification.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/images/cnn.ipynb b/site/ko/tutorials/images/cnn.ipynb index f92617f460..3abc1e02ac 100644 --- a/site/ko/tutorials/images/cnn.ipynb +++ b/site/ko/tutorials/images/cnn.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "679Lmwt3l1Bk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -78,7 +80,9 @@ "metadata": { "id": "iAve6DCL4JH4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "\n", @@ -103,7 +107,9 @@ "metadata": { "id": "JWoEqyMuXFF4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()\n", "\n", @@ -128,7 +134,9 @@ "metadata": { "id": "K3PAELE2eSU9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',\n", " 'dog', 'frog', 'horse', 'ship', 'truck']\n", @@ -172,7 +180,9 @@ "metadata": { "id": "L9YmGQBQPrdn" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = models.Sequential()\n", "model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))\n", @@ -197,7 +207,9 @@ "metadata": { "id": "8-C4XBg4UTJy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.summary()" ] @@ -228,7 +240,9 @@ "metadata": { "id": "mRs95d6LUVEi" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.add(layers.Flatten())\n", "model.add(layers.Dense(64, activation='relu'))\n", @@ -250,7 +264,9 @@ "metadata": { "id": "8Yu_m-TZUWGX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.summary()" ] @@ -279,7 +295,9 @@ "metadata": { "id": "MdDzI75PUXrG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.compile(optimizer='adam',\n", " loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n", @@ -304,7 +322,9 @@ "metadata": { "id": "gtyDF0MKUcM7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plt.plot(history.history['accuracy'], label='accuracy')\n", "plt.plot(history.history['val_accuracy'], label = 'val_accuracy')\n", @@ -322,7 +342,9 @@ "metadata": { "id": "0LvwaKhtUdOo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(test_acc)" ] @@ -340,7 +362,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "cnn.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/images/data_augmentation.ipynb b/site/ko/tutorials/images/data_augmentation.ipynb index ad6ee5e477..88e73dae84 100644 --- a/site/ko/tutorials/images/data_augmentation.ipynb +++ b/site/ko/tutorials/images/data_augmentation.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "pkTRazeVRwDe" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -85,7 +87,9 @@ "metadata": { "id": "C2Q5rPenTAJP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", @@ -112,7 +116,9 @@ "metadata": { "id": "ytHhsYmO52zy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "(train_ds, val_ds, test_ds), metadata = tfds.load(\n", " 'tf_flowers',\n", @@ -137,7 +143,9 @@ "metadata": { "id": "wKwx7vQuspxz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "num_classes = metadata.features['label'].num_classes\n", "print(num_classes)" @@ -158,7 +166,9 @@ "metadata": { "id": "kXlx1lCr5Bip" }, - "outputs": [], + "outputs": [ + + ], "source": [ "get_label_name = metadata.features['label'].int2str\n", "\n", @@ -200,7 +210,9 @@ "metadata": { "id": "jMM3b85e3yhd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "IMG_SIZE = 180\n", "\n", @@ -234,7 +246,9 @@ "metadata": { "id": "X9OLuR1bC1Pd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "result = resize_and_rescale(image)\n", "_ = plt.imshow(result)" @@ -255,7 +269,9 @@ "metadata": { "id": "DPTB8IQmSeKM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(\"Min and max pixel values:\", result.numpy().min(), result.numpy().max())" ] @@ -293,7 +309,9 @@ "metadata": { "id": "Svu_5yfa_Jb7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "data_augmentation = tf.keras.Sequential([\n", " layers.RandomFlip(\"horizontal_and_vertical\"),\n", @@ -307,7 +325,9 @@ "metadata": { "id": "kfzEuaNg69iU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Add the image to a batch.\n", "image = tf.cast(tf.expand_dims(image, 0), tf.float32)" @@ -319,7 +339,9 @@ "metadata": { "id": "eR4wwi5Q_UZK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plt.figure(figsize=(10, 10))\n", "for i in range(9):\n", @@ -364,7 +386,9 @@ "metadata": { "id": "ULGJQjP6hHvu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = tf.keras.Sequential([\n", " # Add the preprocessing layers you created earlier.\n", @@ -413,7 +437,9 @@ "metadata": { "id": "r1Bt7w5VhVDY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "aug_ds = train_ds.map(\n", " lambda x, y: (resize_and_rescale(x, training=True), y))" @@ -473,7 +499,9 @@ "metadata": { "id": "R5fGVMqlFxF7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "batch_size = 32\n", "AUTOTUNE = tf.data.AUTOTUNE\n", @@ -504,7 +532,9 @@ "metadata": { "id": "N86SFGMBHcx-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_ds = prepare(train_ds, shuffle=True, augment=True)\n", "val_ds = prepare(val_ds)\n", @@ -530,7 +560,9 @@ "metadata": { "id": "IODSymGhq9N6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = tf.keras.Sequential([\n", " layers.Conv2D(16, 3, padding='same', activation='relu'),\n", @@ -560,7 +592,9 @@ "metadata": { "id": "ZnRJr95WY68k" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.compile(optimizer='adam',\n", " loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n", @@ -582,7 +616,9 @@ "metadata": { "id": "i_sDl9uZY9Mh" }, - "outputs": [], + "outputs": [ + + ], "source": [ "epochs=5\n", "history = model.fit(\n", @@ -598,7 +634,9 @@ "metadata": { "id": "V9PSf4qgiQJG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "loss, acc = model.evaluate(test_ds)\n", "print(\"Accuracy\", acc)" @@ -628,7 +666,9 @@ "metadata": { "id": "nMxEhIVXmAH0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def random_invert_img(x, p=0.5):\n", " if tf.random.uniform([]) < p:\n", @@ -644,7 +684,9 @@ "metadata": { "id": "C0huNpxdmDKu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def random_invert(factor=0.5):\n", " return layers.Lambda(lambda x: random_invert_img(x, factor))\n", @@ -658,7 +700,9 @@ "metadata": { "id": "wAcOluP0TNG6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plt.figure(figsize=(10, 10))\n", "for i in range(9):\n", @@ -683,7 +727,9 @@ "metadata": { "id": "d11eExc-Ke-7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class RandomInvert(layers.Layer):\n", " def __init__(self, factor=0.5, **kwargs):\n", @@ -700,7 +746,9 @@ "metadata": { "id": "qX-VQgkRL6fc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_ = plt.imshow(RandomInvert()(image)[0])" ] @@ -747,7 +795,9 @@ "metadata": { "id": "JB-lAS0z9ZJY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "(train_ds, val_ds, test_ds), metadata = tfds.load(\n", " 'tf_flowers',\n", @@ -772,7 +822,9 @@ "metadata": { "id": "dDsPaAi8de_j" }, - "outputs": [], + "outputs": [ + + ], "source": [ "image, label = next(iter(train_ds))\n", "_ = plt.imshow(image)\n", @@ -794,7 +846,9 @@ "metadata": { "id": "sN1ykjJCHikc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def visualize(original, augmented):\n", " fig = plt.figure()\n", @@ -833,7 +887,9 @@ "metadata": { "id": "1ZjVI24nIH0S" }, - "outputs": [], + "outputs": [ + + ], "source": [ "flipped = tf.image.flip_left_right(image)\n", "visualize(image, flipped)" @@ -856,7 +912,9 @@ "metadata": { "id": "ikaMj0guIRtL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "grayscaled = tf.image.rgb_to_grayscale(image)\n", "visualize(image, tf.squeeze(grayscaled))\n", @@ -880,7 +938,9 @@ "metadata": { "id": "PHz-NosiInmz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "saturated = tf.image.adjust_saturation(image, 3)\n", "visualize(image, saturated)" @@ -903,7 +963,9 @@ "metadata": { "id": "1hdG-j46I0nJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "bright = tf.image.adjust_brightness(image, 0.4)\n", "visualize(image, bright)" @@ -926,7 +988,9 @@ "metadata": { "id": "RWkK5GFHJUKT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "cropped = tf.image.central_crop(image, central_fraction=0.5)\n", "visualize(image, cropped)" @@ -949,7 +1013,9 @@ "metadata": { "id": "b19KuAhkJKR-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "rotated = tf.image.rot90(image)\n", "visualize(image, rotated)" @@ -1003,7 +1069,9 @@ "metadata": { "id": "-fFd1kh7Fr-_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for i in range(3):\n", " seed = (i, 0) # tuple of size (2,)\n", @@ -1029,7 +1097,9 @@ "metadata": { "id": "GmcYoQHaUoke" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for i in range(3):\n", " seed = (i, 0) # tuple of size (2,)\n", @@ -1055,7 +1125,9 @@ "metadata": { "id": "vtZQbUw0VOm5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for i in range(3):\n", " seed = (i, 0) # tuple of size (2,)\n", @@ -1081,7 +1153,9 @@ "metadata": { "id": "xC80NQP809Uo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "(train_datasets, val_ds, test_ds), metadata = tfds.load(\n", " 'tf_flowers',\n", @@ -1106,7 +1180,9 @@ "metadata": { "id": "1JKmx06lfcFr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def resize_and_rescale(image, label):\n", " image = tf.cast(image, tf.float32)\n", @@ -1130,7 +1206,9 @@ "metadata": { "id": "KitLdvlpVxPa" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def augment(image_label, seed):\n", " image, label = image_label\n", @@ -1165,7 +1243,9 @@ "metadata": { "id": "SZ6Qq0IWznfi" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Create a `Counter` object and `Dataset.zip` it together with the training set.\n", "counter = tf.data.experimental.Counter()\n", @@ -1187,7 +1267,9 @@ "metadata": { "id": "wQK9BDKk1_3N" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_ds = (\n", " train_ds\n", @@ -1204,7 +1286,9 @@ "metadata": { "id": "3AQoyA-k3ELk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "val_ds = (\n", " val_ds\n", @@ -1220,7 +1304,9 @@ "metadata": { "id": "p2IQN3NN3G_M" }, - "outputs": [], + "outputs": [ + + ], "source": [ "test_ds = (\n", " test_ds\n", @@ -1239,7 +1325,7 @@ "#### 옵션 2: `tf.random.Generator` 사용\n", "\n", "- 초기 `seed` 값으로 `tf.random.Generator` 객체를 생성합니다. 동일한 생성기 객체에서 `make_seeds` 함수를 호출하면 항상 새롭고 고유한 `seed` 값이 반환됩니다.\n", - "- 1) `make_seeds` 함수를 호출하고 2) 새로 생성된 `seed` 값을 무작위 변환을 위한 `augment` 함수에 전달하는 래퍼 함수를 정의합니다.\n", + "- 다음을 수행하는 래퍼 함수를 ​​정의합니다 1) `make_seeds` 함수를 호출하고 2) 새로 생성된 `seed` 값을 무작위 변환을 위한 `augment` 함수에 전달하는 래퍼 함수를 정의합니다.\n", "\n", "참고: `tf.random.Generator` 객체는 `tf.Variable`에 RNG 상태를 저장합니다. 즉, [체크포인트](../../guide/checkpoint.ipynb)로 저장하거나 [SavedModel](../../guide/saved_model.ipynb)에 저장할 수 있습니다. 자세한 내용은 [난수 생성](../../guide/random_numbers.ipynb)을 참조하세요." ] @@ -1250,7 +1336,9 @@ "metadata": { "id": "BQDvedZ33eAy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Create a generator.\n", "rng = tf.random.Generator.from_seed(123, alg='philox')" @@ -1262,7 +1350,9 @@ "metadata": { "id": "eDEkO1nt2ta0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Create a wrapper function for updating seeds.\n", "def f(x, y):\n", @@ -1286,7 +1376,9 @@ "metadata": { "id": "Pu2uB7k12xKw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_ds = (\n", " train_datasets\n", @@ -1303,7 +1395,9 @@ "metadata": { "id": "e6caldPi2HAP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "val_ds = (\n", " val_ds\n", @@ -1319,7 +1413,9 @@ "metadata": { "id": "ceaCdJnh2I-r" }, - "outputs": [], + "outputs": [ + + ], "source": [ "test_ds = (\n", " test_ds\n", @@ -1357,7 +1453,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "data_augmentation.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/images/segmentation.ipynb b/site/ko/tutorials/images/segmentation.ipynb index e9b7868c82..f640ea7e43 100644 --- a/site/ko/tutorials/images/segmentation.ipynb +++ b/site/ko/tutorials/images/segmentation.ipynb @@ -18,7 +18,9 @@ "cellView": "form", "id": "JOgMcEajtkmg" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -81,7 +83,9 @@ "metadata": { "id": "MQmKthrSBCld" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install git+https://github.com/tensorflow/examples.git" ] @@ -92,7 +96,9 @@ "metadata": { "id": "YQX7R4bhZy5h" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "\n", @@ -105,7 +111,9 @@ "metadata": { "id": "g87--n2AtyO_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "from tensorflow_examples.models.pix2pix import pix2pix\n", "\n", @@ -130,7 +138,9 @@ "metadata": { "id": "40ITeStwDwZb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "dataset, info = tfds.load('oxford_iiit_pet:3.*.*', with_info=True)" ] @@ -150,7 +160,9 @@ "metadata": { "id": "FD60EbcAQqov" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def normalize(input_image, input_mask):\n", " input_image = tf.cast(input_image, tf.float32) / 255.0\n", @@ -164,7 +176,9 @@ "metadata": { "id": "Zf0S67hJRp3D" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def load_image(datapoint):\n", " input_image = tf.image.resize(datapoint['image'], (128, 128))\n", @@ -194,7 +208,9 @@ "metadata": { "id": "yHwj2-8SaQli" }, - "outputs": [], + "outputs": [ + + ], "source": [ "TRAIN_LENGTH = info.splits['train'].num_examples\n", "BATCH_SIZE = 64\n", @@ -208,7 +224,9 @@ "metadata": { "id": "39fYScNz9lmo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_images = dataset['train'].map(load_image, num_parallel_calls=tf.data.AUTOTUNE)\n", "test_images = dataset['test'].map(load_image, num_parallel_calls=tf.data.AUTOTUNE)" @@ -229,7 +247,9 @@ "metadata": { "id": "fUWdDJRTL0PP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class Augment(tf.keras.layers.Layer):\n", " def __init__(self, seed=42):\n", @@ -259,7 +279,9 @@ "metadata": { "id": "VPscskQcNCx4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_batches = (\n", " train_images\n", @@ -288,7 +310,9 @@ "metadata": { "id": "3N2RPAAW9q4W" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def display(display_list):\n", " plt.figure(figsize=(15, 15))\n", @@ -309,7 +333,9 @@ "metadata": { "id": "a6u_Rblkteqb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for images, masks in train_batches.take(2):\n", " sample_image, sample_mask = images[0], masks[0]\n", @@ -342,7 +368,9 @@ "metadata": { "id": "liCeLH0ctjq7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "base_model = tf.keras.applications.MobileNetV2(input_shape=[128, 128, 3], include_top=False)\n", "\n", @@ -377,7 +405,9 @@ "metadata": { "id": "p0ZbfywEbZpJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "up_stack = [\n", " pix2pix.upsample(512, 3), # 4x4 -> 8x8\n", @@ -393,7 +423,9 @@ "metadata": { "id": "45HByxpVtrPF" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def unet_model(output_channels:int):\n", " inputs = tf.keras.layers.Input(shape=[128, 128, 3])\n", @@ -449,7 +481,9 @@ "metadata": { "id": "6he36HK5uKAc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "OUTPUT_CLASSES = 3\n", "\n", @@ -474,7 +508,9 @@ "metadata": { "id": "sw82qF1Gcovr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf.keras.utils.plot_model(model, show_shapes=True)" ] @@ -494,7 +530,9 @@ "metadata": { "id": "UwvIKLZPtxV_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def create_mask(pred_mask):\n", " pred_mask = tf.math.argmax(pred_mask, axis=-1)\n", @@ -508,7 +546,9 @@ "metadata": { "id": "YLNsrynNtx4d" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def show_predictions(dataset=None, num=1):\n", " if dataset:\n", @@ -526,7 +566,9 @@ "metadata": { "id": "X_1CC0T4dho3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "show_predictions()" ] @@ -546,7 +588,9 @@ "metadata": { "id": "wHrHsqijdmL6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class DisplayCallback(tf.keras.callbacks.Callback):\n", " def on_epoch_end(self, epoch, logs=None):\n", @@ -561,7 +605,9 @@ "metadata": { "id": "StKDH_B9t4SD" }, - "outputs": [], + "outputs": [ + + ], "source": [ "EPOCHS = 20\n", "VAL_SUBSPLITS = 5\n", @@ -580,7 +626,9 @@ "metadata": { "id": "P_mu0SAbt40Q" }, - "outputs": [], + "outputs": [ + + ], "source": [ "loss = model_history.history['loss']\n", "val_loss = model_history.history['val_loss']\n", @@ -620,7 +668,9 @@ "metadata": { "id": "ikrzoG24qwf5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "show_predictions(test_batches, 3)" ] @@ -651,7 +701,9 @@ "metadata": { "id": "aHt90UEQsZDn" }, - "outputs": [], + "outputs": [ + + ], "source": [ "try:\n", " model_history = model.fit(train_batches, epochs=EPOCHS,\n", @@ -679,7 +731,9 @@ "metadata": { "id": "EmHtImJn5Kk-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "label = [0,0]\n", "prediction = [[-3., 0], [-3, 0]] \n", @@ -707,7 +761,9 @@ "metadata": { "id": "DlG-n2Ugo8Jc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def add_sample_weights(image, label):\n", " # The weights for each class, with the constraint that:\n", @@ -737,7 +793,9 @@ "metadata": { "id": "SE_ezRSFRCnE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_batches.map(add_sample_weights).element_spec" ] @@ -757,7 +815,9 @@ "metadata": { "id": "QDWipedAoOQe" }, - "outputs": [], + "outputs": [ + + ], "source": [ "weighted_model = unet_model(OUTPUT_CLASSES)\n", "weighted_model.compile(\n", @@ -772,7 +832,9 @@ "metadata": { "id": "btEFKc1xodGR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "weighted_model.fit(\n", " train_batches.map(add_sample_weights),\n", @@ -797,7 +859,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "segmentation.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/images/transfer_learning_with_hub.ipynb b/site/ko/tutorials/images/transfer_learning_with_hub.ipynb index b3054ac943..8024c63611 100644 --- a/site/ko/tutorials/images/transfer_learning_with_hub.ipynb +++ b/site/ko/tutorials/images/transfer_learning_with_hub.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "0O_LFhwSBCjm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -78,7 +80,9 @@ "metadata": { "id": "OGNpmn43C0O6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import numpy as np\n", "import time\n", @@ -122,7 +126,9 @@ "metadata": { "id": "feiXojVXAbI9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "classifier_url =\"https://tfhub.dev/google/tf2-preview/mobilenet_v2/classification/2\" #@param {type:\"string\"}" ] @@ -133,7 +139,9 @@ "metadata": { "id": "y_6bGjoPtzau" }, - "outputs": [], + "outputs": [ + + ], "source": [ "IMAGE_SHAPE = (224, 224)\n", "\n", @@ -166,7 +174,9 @@ "metadata": { "id": "w5wDjXNjuXGD" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import numpy as np\n", "import PIL.Image as Image\n", @@ -182,7 +192,9 @@ "metadata": { "id": "BEmmBnGbLxPp" }, - "outputs": [], + "outputs": [ + + ], "source": [ "grace_hopper = np.array(grace_hopper)/255.0\n", "grace_hopper.shape" @@ -203,7 +215,9 @@ "metadata": { "id": "EMquyn29v8q3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "result = classifier.predict(grace_hopper[np.newaxis, ...])\n", "result.shape" @@ -226,7 +240,9 @@ "metadata": { "id": "rgXb44vt6goJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "predicted_class = tf.math.argmax(result[0], axis=-1)\n", "predicted_class" @@ -249,7 +265,9 @@ "metadata": { "id": "ij6SrDxcxzry" }, - "outputs": [], + "outputs": [ + + ], "source": [ "labels_path = tf.keras.utils.get_file('ImageNetLabels.txt','https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt')\n", "imagenet_labels = np.array(open(labels_path).read().splitlines())" @@ -261,7 +279,9 @@ "metadata": { "id": "uzziRK3Z2VQo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plt.imshow(grace_hopper)\n", "plt.axis('off')\n", @@ -309,7 +329,9 @@ "metadata": { "id": "DrIUV3V0xDL_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import pathlib\n", "\n", @@ -337,7 +359,9 @@ "metadata": { "id": "mqnsczfLgcwv" }, - "outputs": [], + "outputs": [ + + ], "source": [ "batch_size = 32\n", "img_height = 224\n", @@ -367,7 +391,9 @@ "metadata": { "id": "AFgDHs6VEFRD" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class_names = np.array(train_ds.class_names)\n", "print(class_names)" @@ -397,7 +423,9 @@ "metadata": { "id": "8NzDDWEMCL20" }, - "outputs": [], + "outputs": [ + + ], "source": [ "normalization_layer = tf.keras.layers.Rescaling(1./255)\n", "train_ds = train_ds.map(lambda x, y: (normalization_layer(x), y)) # Where x—images, y—labels.\n", @@ -421,7 +449,9 @@ "metadata": { "id": "ZmJMKFw7C4ki" }, - "outputs": [], + "outputs": [ + + ], "source": [ "AUTOTUNE = tf.data.AUTOTUNE\n", "train_ds = train_ds.cache().prefetch(buffer_size=AUTOTUNE)\n", @@ -434,7 +464,9 @@ "metadata": { "id": "m0JyiEZ0imgf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for image_batch, labels_batch in train_ds:\n", " print(image_batch.shape)\n", @@ -466,7 +498,9 @@ "metadata": { "id": "pcFeNcrehEue" }, - "outputs": [], + "outputs": [ + + ], "source": [ "result_batch = classifier.predict(train_ds)" ] @@ -477,7 +511,9 @@ "metadata": { "id": "-wK2ky45hlyS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "predicted_class_names = imagenet_labels[tf.math.argmax(result_batch, axis=-1)]\n", "predicted_class_names" @@ -498,7 +534,9 @@ "metadata": { "id": "IXTB22SpxDLP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plt.figure(figsize=(10,9))\n", "plt.subplots_adjust(hspace=0.5)\n", @@ -540,7 +578,9 @@ "metadata": { "id": "4bw8Jf94DSnP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mobilenet_v2 = \"https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4\"\n", "inception_v3 = \"https://tfhub.dev/google/tf2-preview/inception_v3/feature_vector/4\"\n", @@ -563,7 +603,9 @@ "metadata": { "id": "5wB030nezBwI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "feature_extractor_layer = hub.KerasLayer(\n", " feature_extractor_model,\n", @@ -586,7 +628,9 @@ "metadata": { "id": "Of7i-35F09ls" }, - "outputs": [], + "outputs": [ + + ], "source": [ "feature_batch = feature_extractor_layer(image_batch)\n", "print(feature_batch.shape)" @@ -609,7 +653,9 @@ "metadata": { "id": "vQq_kCWzlqSu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "num_classes = len(class_names)\n", "\n", @@ -627,7 +673,9 @@ "metadata": { "id": "IyhX4VCFmzVS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "predictions = model(image_batch)" ] @@ -638,7 +686,9 @@ "metadata": { "id": "FQdUaTkzm3jQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "predictions.shape" ] @@ -660,7 +710,9 @@ "metadata": { "id": "4xRx8Rjzm67O" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.compile(\n", " optimizer=tf.keras.optimizers.Adam(),\n", @@ -690,7 +742,9 @@ "metadata": { "id": "JI0yAKd-nARd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "steps_per_epoch = np.ceil(image_data.samples/image_data.batch_size)\n", "\n", @@ -716,7 +770,9 @@ "metadata": { "id": "-yVJar0MiT2t" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%tensorboard --logdir logs/fit" ] @@ -747,7 +803,9 @@ "metadata": { "id": "JGbEf5l1I4jz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class_names = sorted(image_data.class_indices.items(), key=lambda pair:pair[1])\n", "class_names = np.array([key.title() for key, value in class_names])\n", @@ -769,7 +827,9 @@ "metadata": { "id": "hW3Ic_ZlwtrZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plt.figure(figsize=(10,9))\n", "plt.subplots_adjust(hspace=0.5)\n", @@ -799,7 +859,9 @@ "metadata": { "id": "PLcqg-RmsLno" }, - "outputs": [], + "outputs": [ + + ], "source": [ "t = time.time()\n", "\n", @@ -824,7 +886,9 @@ "metadata": { "id": "7nI5fvkAQvbS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "reloaded = tf.keras.models.load_model(export_path)" ] @@ -835,7 +899,9 @@ "metadata": { "id": "dnZO14taYPH6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "abs(reloaded_result_batch - result_batch).max()" ] @@ -846,7 +912,9 @@ "metadata": { "id": "wtjsIPjQnPyM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "abs(reloaded_result_batch - result_batch).max()" ] @@ -857,7 +925,9 @@ "metadata": { "id": "jor83-LqI8xW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "result_batch = model.predict(image_batch)\n", "reloaded_result_batch = reloaded.predict(image_batch)" @@ -869,7 +939,9 @@ "metadata": { "id": "RkQIBksVkxPO" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plt.figure(figsize=(10,9))\n", "plt.subplots_adjust(hspace=0.5)\n", diff --git a/site/ko/tutorials/keras/keras_tuner.ipynb b/site/ko/tutorials/keras/keras_tuner.ipynb index 2c635187cf..7e60285137 100644 --- a/site/ko/tutorials/keras/keras_tuner.ipynb +++ b/site/ko/tutorials/keras/keras_tuner.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "tuOe1ymfHZPu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -87,7 +89,9 @@ "metadata": { "id": "IqR2PQG4ZaZ0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "from tensorflow import keras" @@ -108,7 +112,9 @@ "metadata": { "id": "hpMLpbt9jcO6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install -q -U keras-tuner" ] @@ -119,7 +125,9 @@ "metadata": { "id": "_leAIdFKAxAD" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import keras_tuner as kt" ] @@ -150,7 +158,9 @@ "metadata": { "id": "OHlHs9Wj_PUM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "(img_train, label_train), (img_test, label_test) = keras.datasets.fashion_mnist.load_data()" ] @@ -161,7 +171,9 @@ "metadata": { "id": "bLVhXs3xrUD0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Normalize pixel values between 0 and 1\n", "img_train = img_train.astype('float32') / 255.0\n", @@ -194,7 +206,9 @@ "metadata": { "id": "ZQKodC-jtsva" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def model_builder(hp):\n", " model = keras.Sequential()\n", @@ -236,7 +250,9 @@ "metadata": { "id": "oichQFly6Y46" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tuner = kt.Hyperband(model_builder,\n", " objective='val_accuracy',\n", @@ -270,7 +286,9 @@ "metadata": { "id": "WT9IkS9NEjLc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class ClearTrainingOutput(tf.keras.callbacks.Callback):\n", " def on_train_end(*args, **kwargs):\n", @@ -292,7 +310,9 @@ "metadata": { "id": "dSBQcTHF9cKt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tuner.search(img_train, label_train, epochs=50, validation_split=0.2, callbacks=[stop_early])\n", "\n", @@ -323,7 +343,9 @@ "metadata": { "id": "McO82AXOuxXh" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Build the model with the optimal hyperparameters and train it on the data for 50 epochs\n", "model = tuner.hypermodel.build(best_hps)\n", @@ -349,7 +371,9 @@ "metadata": { "id": "NoiPUEHmMhCe" }, - "outputs": [], + "outputs": [ + + ], "source": [ "hypermodel = tuner.hypermodel.build(best_hps)\n", "\n", @@ -372,7 +396,9 @@ "metadata": { "id": "9E0BTp9Ealjb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "eval_result = hypermodel.evaluate(img_test, label_test)\n", "print(\"[test loss, test accuracy]:\", eval_result)" diff --git a/site/ko/tutorials/keras/overfit_and_underfit.ipynb b/site/ko/tutorials/keras/overfit_and_underfit.ipynb index ce89556bc6..df0b09f5aa 100644 --- a/site/ko/tutorials/keras/overfit_and_underfit.ipynb +++ b/site/ko/tutorials/keras/overfit_and_underfit.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "lzyBOpYMdp3F" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -38,7 +40,9 @@ "cellView": "form", "id": "m_x4KfSJ7Vt7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title MIT License\n", "#\n", @@ -133,7 +137,9 @@ "metadata": { "id": "5pZ8A2liqvgk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "\n", @@ -149,7 +155,9 @@ "metadata": { "id": "QnAtAjqRYVXe" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install git+https://github.com/tensorflow/docs\n", "\n", @@ -164,7 +172,9 @@ "metadata": { "id": "-pnOU-ctX27Q" }, - "outputs": [], + "outputs": [ + + ], "source": [ "from IPython import display\n", "from matplotlib import pyplot as plt\n", @@ -182,7 +192,9 @@ "metadata": { "id": "jj6I4dvTtbUe" }, - "outputs": [], + "outputs": [ + + ], "source": [ "logdir = pathlib.Path(tempfile.mkdtemp())/\"tensorboard_logs\"\n", "shutil.rmtree(logdir, ignore_errors=True)" @@ -205,7 +217,9 @@ "metadata": { "id": "YPjAvwb-6dFd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "gz = tf.keras.utils.get_file('HIGGS.csv.gz', 'http://mlphysics.ics.uci.edu/data/higgs/HIGGS.csv.gz')" ] @@ -216,7 +230,9 @@ "metadata": { "id": "AkiyUdaWIrww" }, - "outputs": [], + "outputs": [ + + ], "source": [ "FEATURES = 28" ] @@ -236,7 +252,9 @@ "metadata": { "id": "QHz4sLVQEVIU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ds = tf.data.experimental.CsvDataset(gz,[float(),]*(FEATURES+1), compression_type=\"GZIP\")" ] @@ -256,7 +274,9 @@ "metadata": { "id": "zPD6ICDlF6Wf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def pack_row(*row):\n", " label = row[0]\n", @@ -281,7 +301,9 @@ "metadata": { "id": "-w-VHTwwGVoZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "packed_ds = ds.batch(10000).map(pack_row).unbatch()" ] @@ -303,7 +325,9 @@ "metadata": { "id": "TfcXuv33Fvka" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for features,label in packed_ds.batch(1000).take(1):\n", " print(features[0])\n", @@ -325,7 +349,9 @@ "metadata": { "id": "hmk49OqZIFZP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "N_VALIDATION = int(1e3)\n", "N_TRAIN = int(1e4)\n", @@ -351,7 +377,9 @@ "metadata": { "id": "H8H_ZzpBOOk-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "validate_ds = packed_ds.take(N_VALIDATION).cache()\n", "train_ds = packed_ds.skip(N_VALIDATION).take(N_TRAIN).cache()" @@ -363,7 +391,9 @@ "metadata": { "id": "9zAOqk2_Px7K" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_ds" ] @@ -383,7 +413,9 @@ "metadata": { "id": "Y7I4J355O223" }, - "outputs": [], + "outputs": [ + + ], "source": [ "validate_ds = validate_ds.batch(BATCH_SIZE)\n", "train_ds = train_ds.shuffle(BUFFER_SIZE).repeat().batch(BATCH_SIZE)" @@ -436,7 +468,9 @@ "metadata": { "id": "LwQp-ERhAD6F" }, - "outputs": [], + "outputs": [ + + ], "source": [ "lr_schedule = tf.keras.optimizers.schedules.InverseTimeDecay(\n", " 0.001,\n", @@ -463,7 +497,9 @@ "metadata": { "id": "HIo_yPjEAFgn" }, - "outputs": [], + "outputs": [ + + ], "source": [ "step = np.linspace(0,100000)\n", "lr = lr_schedule(step)\n", @@ -495,7 +531,9 @@ "metadata": { "id": "vSv8rfw_T85n" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def get_callbacks(name):\n", " return [\n", @@ -520,7 +558,9 @@ "metadata": { "id": "xRCGwU3YH5sT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def compile_and_fit(model, name, optimizer=None, max_epochs=10000):\n", " if optimizer is None:\n", @@ -568,7 +608,9 @@ "metadata": { "id": "EZh-QFjKHb70" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tiny_model = tf.keras.Sequential([\n", " layers.Dense(16, activation='elu', input_shape=(FEATURES,)),\n", @@ -582,7 +624,9 @@ "metadata": { "id": "X72IUdWYipIS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "size_histories = {}" ] @@ -593,7 +637,9 @@ "metadata": { "id": "bdOcJtPGHhJ5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "size_histories['Tiny'] = compile_and_fit(tiny_model, 'sizes/Tiny')" ] @@ -613,7 +659,9 @@ "metadata": { "id": "dkEvb2x5XsjE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plotter = tfdocs.plots.HistoryPlotter(metric = 'binary_crossentropy', smoothing_std=10)\n", "plotter.plot(size_histories)\n", @@ -646,7 +694,9 @@ "metadata": { "id": "QKgdXPx9usBa" }, - "outputs": [], + "outputs": [ + + ], "source": [ "small_model = tf.keras.Sequential([\n", " # `input_shape` is only required here so that `.summary` works.\n", @@ -662,7 +712,9 @@ "metadata": { "id": "LqG3MXF5xSjR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "size_histories['Small'] = compile_and_fit(small_model, 'sizes/Small')" ] @@ -691,7 +743,9 @@ "metadata": { "id": "jksi-XtaxDAh" }, - "outputs": [], + "outputs": [ + + ], "source": [ "medium_model = tf.keras.Sequential([\n", " layers.Dense(64, activation='elu', input_shape=(FEATURES,)),\n", @@ -716,7 +770,9 @@ "metadata": { "id": "Ofn1AwDhx-Fe" }, - "outputs": [], + "outputs": [ + + ], "source": [ "size_histories['Medium'] = compile_and_fit(medium_model, \"sizes/Medium\")" ] @@ -738,7 +794,9 @@ "metadata": { "id": "ghQwwqwqvQM9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "large_model = tf.keras.Sequential([\n", " layers.Dense(512, activation='elu', input_shape=(FEATURES,)),\n", @@ -764,7 +822,9 @@ "metadata": { "id": "U1A99dhqvepf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "size_histories['large'] = compile_and_fit(large_model, \"sizes/large\")" ] @@ -811,7 +871,9 @@ "metadata": { "id": "0XmKDtOWzOpk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plotter.plot(size_histories)\n", "a = plt.xscale('log')\n", @@ -848,7 +910,9 @@ "metadata": { "id": "6oa1lkJddZ-m" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Load the TensorBoard notebook extension\n", "%load_ext tensorboard\n", @@ -890,7 +954,9 @@ "metadata": { "id": "40k1eBtnQzNo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "shutil.rmtree(logdir/'regularizers/Tiny', ignore_errors=True)\n", "shutil.copytree(logdir/'sizes/Tiny', logdir/'regularizers/Tiny')" @@ -902,7 +968,9 @@ "metadata": { "id": "vFWMeFo7jLpN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "regularizer_histories = {}\n", "regularizer_histories['Tiny'] = size_histories['Tiny']" @@ -942,7 +1010,9 @@ "metadata": { "id": "HFGmcwduwVyQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "l2_model = tf.keras.Sequential([\n", " layers.Dense(512, activation='elu',\n", @@ -979,7 +1049,9 @@ "metadata": { "id": "7wkfLyxBZdh_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plotter.plot(regularizer_histories)\n", "plt.ylim([0.5, 0.7])" @@ -1013,7 +1085,9 @@ "metadata": { "id": "apDHQNybjaML" }, - "outputs": [], + "outputs": [ + + ], "source": [ "result = l2_model(features)\n", "regularization_loss=tf.add_n(l2_model.losses)" @@ -1057,7 +1131,9 @@ "metadata": { "id": "OFEYvtrHxSWS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "dropout_model = tf.keras.Sequential([\n", " layers.Dense(512, activation='elu', input_shape=(FEATURES,)),\n", @@ -1080,7 +1156,9 @@ "metadata": { "id": "SPZqwVchx5xp" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plotter.plot(regularizer_histories)\n", "plt.ylim([0.5, 0.7])" @@ -1112,7 +1190,9 @@ "metadata": { "id": "7zfs_qQIw1cz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "combined_model = tf.keras.Sequential([\n", " layers.Dense(512, kernel_regularizer=regularizers.l2(0.0001),\n", @@ -1139,7 +1219,9 @@ "metadata": { "id": "qDqBBxfI0Yd8" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plotter.plot(regularizer_histories)\n", "plt.ylim([0.5, 0.7])" @@ -1173,7 +1255,9 @@ "metadata": { "id": "Op4vLqVWBK_y" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%tensorboard --logdir {logdir}/regularizers" ] diff --git a/site/ko/tutorials/keras/regression.ipynb b/site/ko/tutorials/keras/regression.ipynb index 02ee93e637..ae664b0dfa 100644 --- a/site/ko/tutorials/keras/regression.ipynb +++ b/site/ko/tutorials/keras/regression.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "AwOEIRJC6Une" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -38,7 +40,9 @@ "cellView": "form", "id": "KyPEtTqk6VdG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title MIT License\n", "#\n", @@ -105,7 +109,9 @@ "metadata": { "id": "moB4tpEHxKB3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Use seaborn for pairplot.\n", "!pip install -q seaborn" @@ -117,7 +123,9 @@ "metadata": { "id": "1rRo8oNqZ-Rj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", @@ -134,7 +142,9 @@ "metadata": { "id": "9xQKvCJ85kCQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "\n", @@ -172,7 +182,9 @@ "metadata": { "id": "CiX2FI4gZtTt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data'\n", "column_names = ['MPG', 'Cylinders', 'Displacement', 'Horsepower', 'Weight',\n", @@ -189,7 +201,9 @@ "metadata": { "id": "2oY3pMPagJrO" }, - "outputs": [], + "outputs": [ + + ], "source": [ "dataset = raw_dataset.copy()\n", "dataset.tail()" @@ -212,7 +226,9 @@ "metadata": { "id": "JEJHhN65a2VV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "dataset.isna().sum()" ] @@ -232,7 +248,9 @@ "metadata": { "id": "4ZUDosChC1UN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "dataset = dataset.dropna()" ] @@ -254,7 +272,9 @@ "metadata": { "id": "gWNTD2QjBWFJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "dataset['Origin'] = dataset['Origin'].map({1: 'USA', 2: 'Europe', 3: 'Japan'})" ] @@ -265,7 +285,9 @@ "metadata": { "id": "ulXz4J7PAUzk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "dataset = pd.get_dummies(dataset, columns=['Origin'], prefix='', prefix_sep='')\n", "dataset.tail()" @@ -288,7 +310,9 @@ "metadata": { "id": "qn-IGhUE7_1H" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_dataset = dataset.sample(frac=0.8, random_state=0)\n", "test_dataset = dataset.drop(train_dataset.index)" @@ -313,7 +337,9 @@ "metadata": { "id": "oRKO_x8gWKv-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "sns.pairplot(train_dataset[['MPG', 'Cylinders', 'Displacement', 'Weight']], diag_kind='kde')" ] @@ -333,7 +359,9 @@ "metadata": { "id": "yi2FzC3T21jR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_dataset.describe().transpose()" ] @@ -355,7 +383,9 @@ "metadata": { "id": "t2sluJdCW7jN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_features = train_dataset.copy()\n", "test_features = test_dataset.copy()\n", @@ -381,7 +411,9 @@ "metadata": { "id": "IcmY6lKKbkw8" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_dataset.describe().transpose()[['mean', 'std']]" ] @@ -420,7 +452,9 @@ "metadata": { "id": "JlC5ooJrgjQF" }, - "outputs": [], + "outputs": [ + + ], "source": [ "normalizer = tf.keras.layers.Normalization(axis=-1)" ] @@ -440,7 +474,9 @@ "metadata": { "id": "CrBbbjbwV91f" }, - "outputs": [], + "outputs": [ + + ], "source": [ "normalizer.adapt(np.array(train_features))" ] @@ -460,7 +496,9 @@ "metadata": { "id": "GGn-ukwxSPtx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(normalizer.mean.numpy())" ] @@ -480,7 +518,9 @@ "metadata": { "id": "2l7zFL_XWIRu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "first = np.array(train_features[:1])\n", "\n", @@ -536,7 +576,9 @@ "metadata": { "id": "1gJAy0fKs1TS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "horsepower = np.array(train_features['Horsepower'])\n", "\n", @@ -559,7 +601,9 @@ "metadata": { "id": "c0sXM7qLlKfZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "horsepower_model = tf.keras.Sequential([\n", " horsepower_normalizer,\n", @@ -586,7 +630,9 @@ "metadata": { "id": "UfV1HS6bns-s" }, - "outputs": [], + "outputs": [ + + ], "source": [ "horsepower_model.predict(horsepower[:10])" ] @@ -606,7 +652,9 @@ "metadata": { "id": "JxA_3lpOm-SK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "horsepower_model.compile(\n", " optimizer=tf.keras.optimizers.Adam(learning_rate=0.1),\n", @@ -628,7 +676,9 @@ "metadata": { "id": "-iSrNy59nRAp" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%time\n", "history = horsepower_model.fit(\n", @@ -656,7 +706,9 @@ "metadata": { "id": "YCAwD_y4AdC3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "hist = pd.DataFrame(history.history)\n", "hist['epoch'] = history.epoch\n", @@ -669,7 +721,9 @@ "metadata": { "id": "9E54UoZunqhc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def plot_loss(history):\n", " plt.plot(history.history['loss'], label='loss')\n", @@ -687,7 +741,9 @@ "metadata": { "id": "yYsQYrIZyqjz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plot_loss(history)" ] @@ -707,7 +763,9 @@ "metadata": { "id": "kDZ8EvNYrDtx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "test_results = {}\n", "\n", @@ -731,7 +789,9 @@ "metadata": { "id": "xDS2JEtOn9Jn" }, - "outputs": [], + "outputs": [ + + ], "source": [ "x = tf.linspace(0.0, 250, 251)\n", "y = horsepower_model.predict(x)" @@ -743,7 +803,9 @@ "metadata": { "id": "rttFCTU8czsI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def plot_horsepower(x, y):\n", " plt.scatter(train_features['Horsepower'], train_labels, label='Data')\n", @@ -759,7 +821,9 @@ "metadata": { "id": "7l9ZiAOEUNBL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plot_horsepower(x, y)" ] @@ -790,7 +854,9 @@ "metadata": { "id": "ssnVcKg7oMe6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "linear_model = tf.keras.Sequential([\n", " normalizer,\n", @@ -813,7 +879,9 @@ "metadata": { "id": "DynfJV18WiuT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "linear_model.predict(train_features[:10])" ] @@ -833,7 +901,9 @@ "metadata": { "id": "DwJ4Fq0RXBQf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "linear_model.layers[1].kernel" ] @@ -853,7 +923,9 @@ "metadata": { "id": "A0Sv_Ybr0szp" }, - "outputs": [], + "outputs": [ + + ], "source": [ "linear_model.compile(\n", " optimizer=tf.keras.optimizers.Adam(learning_rate=0.1),\n", @@ -866,7 +938,9 @@ "metadata": { "id": "EZoOYORvoTSe" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%time\n", "history = linear_model.fit(\n", @@ -894,7 +968,9 @@ "metadata": { "id": "4sWO3W0koYgu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plot_loss(history)" ] @@ -914,7 +990,9 @@ "metadata": { "id": "jNC3D1DGsGgK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "test_results['linear_model'] = linear_model.evaluate(\n", " test_features, test_labels, verbose=0)" @@ -963,7 +1041,9 @@ "metadata": { "id": "c26juK7ZG8j-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def build_and_compile_model(norm):\n", " model = keras.Sequential([\n", @@ -1002,7 +1082,9 @@ "metadata": { "id": "cGbPb-PHGbhs" }, - "outputs": [], + "outputs": [ + + ], "source": [ "dnn_horsepower_model = build_and_compile_model(horsepower_normalizer)" ] @@ -1022,7 +1104,9 @@ "metadata": { "id": "ReAD0n6MsFK-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "dnn_horsepower_model.summary()" ] @@ -1042,7 +1126,9 @@ "metadata": { "id": "sD7qHCmNIOY0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%time\n", "history = dnn_horsepower_model.fit(\n", @@ -1067,7 +1153,9 @@ "metadata": { "id": "NcF6UWjdCU8T" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plot_loss(history)" ] @@ -1087,7 +1175,9 @@ "metadata": { "id": "hPF53Rem14NS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "x = tf.linspace(0.0, 250, 251)\n", "y = dnn_horsepower_model.predict(x)" @@ -1099,7 +1189,9 @@ "metadata": { "id": "rsf9rD8I17Wq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plot_horsepower(x, y)" ] @@ -1119,7 +1211,9 @@ "metadata": { "id": "bJjM0dU52XtN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "test_results['dnn_horsepower_model'] = dnn_horsepower_model.evaluate(\n", " test_features['Horsepower'], test_labels,\n", @@ -1150,7 +1244,9 @@ "metadata": { "id": "c0mhscXh2k36" }, - "outputs": [], + "outputs": [ + + ], "source": [ "dnn_model = build_and_compile_model(normalizer)\n", "dnn_model.summary()" @@ -1162,7 +1258,9 @@ "metadata": { "id": "CXDENACl2tuW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%time\n", "history = dnn_model.fit(\n", @@ -1178,7 +1276,9 @@ "metadata": { "id": "-9Dbj0fX23RQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plot_loss(history)" ] @@ -1198,7 +1298,9 @@ "metadata": { "id": "-bZIa96W3c7K" }, - "outputs": [], + "outputs": [ + + ], "source": [ "test_results['dnn_model'] = dnn_model.evaluate(test_features, test_labels, verbose=0)" ] @@ -1227,7 +1329,9 @@ "metadata": { "id": "e5_ooufM5iH2" }, - "outputs": [], + "outputs": [ + + ], "source": [ "pd.DataFrame(test_results, index=['Mean absolute error [MPG]']).T" ] @@ -1258,7 +1362,9 @@ "metadata": { "id": "Xe7RXH3N3CWU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "test_predictions = dnn_model.predict(test_features).flatten()\n", "\n", @@ -1289,7 +1395,9 @@ "metadata": { "id": "f-OHX4DiXd8x" }, - "outputs": [], + "outputs": [ + + ], "source": [ "error = test_predictions - test_labels\n", "plt.hist(error, bins=25)\n", @@ -1312,7 +1420,9 @@ "metadata": { "id": "4-WwLlmfT-mb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "dnn_model.save('dnn_model.keras')" ] @@ -1332,7 +1442,9 @@ "metadata": { "id": "dyyyj2zVT-mf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "reloaded = tf.keras.models.load_model('dnn_model.keras')\n", "\n", @@ -1346,7 +1458,9 @@ "metadata": { "id": "f_GchJ2tg-2o" }, - "outputs": [], + "outputs": [ + + ], "source": [ "pd.DataFrame(test_results, index=['Mean absolute error [MPG]']).T" ] @@ -1370,7 +1484,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "regression.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/keras/save_and_load.ipynb b/site/ko/tutorials/keras/save_and_load.ipynb index 32d7baf36f..035feb1a47 100644 --- a/site/ko/tutorials/keras/save_and_load.ipynb +++ b/site/ko/tutorials/keras/save_and_load.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "2pHVBk_seED1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -38,7 +40,9 @@ "cellView": "form", "id": "N_fMsQ-N8I7j" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title MIT License\n", "#\n", @@ -132,7 +136,9 @@ "metadata": { "id": "RzIOVSdnMYyO" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install pyyaml h5py # Required to save models in HDF5 format" ] @@ -143,7 +149,9 @@ "metadata": { "id": "7Nm7Tyb-gRt-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import os\n", "\n", @@ -170,7 +178,9 @@ "metadata": { "id": "9rGfFwE9XVwz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()\n", "\n", @@ -205,7 +215,9 @@ "metadata": { "id": "0HZbJIjxyX1S" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Define a simple sequential model\n", "def create_model():\n", @@ -256,7 +268,9 @@ "metadata": { "id": "IFPuhwntH8VH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "checkpoint_path = \"training_1/cp.ckpt\"\n", "checkpoint_dir = os.path.dirname(checkpoint_path)\n", @@ -293,7 +307,9 @@ "metadata": { "id": "gXG5FVKFOVQ3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "os.listdir(checkpoint_dir)" ] @@ -315,7 +331,9 @@ "metadata": { "id": "Fp5gbuiaPqCT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Create a basic model instance\n", "model = create_model()\n", @@ -340,7 +358,9 @@ "metadata": { "id": "2IZxbwiRRSD2" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Loads the weights\n", "model.load_weights(checkpoint_path)\n", @@ -369,7 +389,9 @@ "metadata": { "id": "mQF_dlgIVOvq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Include the epoch in the file name (uses `str.format`)\n", "checkpoint_path = \"training_2/cp-{epoch:04d}.ckpt\"\n", @@ -420,7 +442,9 @@ "metadata": { "id": "p64q3-V4sXt0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "os.listdir(checkpoint_dir)" ] @@ -431,7 +455,9 @@ "metadata": { "id": "1AN_fnuyR41H" }, - "outputs": [], + "outputs": [ + + ], "source": [ "latest = tf.train.latest_checkpoint(checkpoint_dir)\n", "latest" @@ -454,7 +480,9 @@ "metadata": { "id": "3M04jyK-H3QK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Create a new model instance\n", "model = create_model()\n", @@ -507,7 +535,9 @@ "metadata": { "id": "R7W5plyZ-u9X" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Save the weights\n", "model.save_weights('./checkpoints/my_checkpoint')\n", @@ -578,7 +608,9 @@ "metadata": { "id": "3f55mAXwukUX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Create and train a new model instance.\n", "model = create_model()\n", @@ -603,7 +635,9 @@ "metadata": { "id": "HyfUMOZwux_-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "new_model = tf.keras.models.load_model('my_model.keras')\n", "\n", @@ -626,7 +660,9 @@ "metadata": { "id": "8BT4mHNIvMdW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Evaluate the restored model\n", "loss, acc = new_model.evaluate(test_images, test_labels, verbose=2)\n", @@ -659,7 +695,9 @@ "metadata": { "id": "sI1YvCDFzpl3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Create and train a new model instance.\n", "model = create_model()\n", @@ -685,7 +723,9 @@ "metadata": { "id": "sq8fPglI1RWA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# my_model directory\n", "!ls saved_model\n", @@ -709,7 +749,9 @@ "metadata": { "id": "0YofwHdN0pxa" }, - "outputs": [], + "outputs": [ + + ], "source": [ "new_model = tf.keras.models.load_model('saved_model/my_model')\n", "\n", @@ -732,7 +774,9 @@ "metadata": { "id": "Yh5Mu0yOgE5J" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Evaluate the restored model\n", "loss, acc = new_model.evaluate(test_images, test_labels, verbose=2)\n", @@ -758,7 +802,9 @@ "metadata": { "id": "m2dkmJVCGUia" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Create and train a new model instance.\n", "model = create_model()\n", @@ -784,7 +830,9 @@ "metadata": { "id": "5NDMO_7kS6Do" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Recreate the exact same model, including its weights and the optimizer\n", "new_model = tf.keras.models.load_model('my_model.h5')\n", @@ -808,7 +856,9 @@ "metadata": { "id": "jwEaj9DnTCVA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "loss, acc = new_model.evaluate(test_images, test_labels, verbose=2)\n", "print('Restored model, accuracy: {:5.2f}%'.format(100 * acc))" @@ -857,7 +907,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "save_and_load.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/keras/text_classification.ipynb b/site/ko/tutorials/keras/text_classification.ipynb index 74b14fda01..d40fa708f4 100644 --- a/site/ko/tutorials/keras/text_classification.ipynb +++ b/site/ko/tutorials/keras/text_classification.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "ioaprt5q5US7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -38,7 +40,9 @@ "cellView": "form", "id": "yCl0eTNH5RS3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title MIT License\n", "#\n", @@ -101,7 +105,9 @@ "metadata": { "id": "8RZOuS9LWQvv" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import matplotlib.pyplot as plt\n", "import os\n", @@ -120,7 +126,9 @@ "metadata": { "id": "6-tTFS04dChr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(tf.__version__)" ] @@ -155,7 +163,9 @@ "metadata": { "id": "k7ZYnuajVlFN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "url = \"https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz\"\n", "\n", @@ -172,7 +182,9 @@ "metadata": { "id": "355CfOvsV1pl" }, - "outputs": [], + "outputs": [ + + ], "source": [ "os.listdir(dataset_dir)" ] @@ -183,7 +195,9 @@ "metadata": { "id": "7ASND15oXpF1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_dir = os.path.join(dataset_dir, 'train')\n", "os.listdir(train_dir)" @@ -204,7 +218,9 @@ "metadata": { "id": "R7g8hFvzWLIZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "sample_file = os.path.join(train_dir, 'pos/1181_9.txt')\n", "with open(sample_file) as f:\n", @@ -247,7 +263,9 @@ "metadata": { "id": "VhejsClzaWfl" }, - "outputs": [], + "outputs": [ + + ], "source": [ "remove_dir = os.path.join(train_dir, 'unsup')\n", "shutil.rmtree(remove_dir)" @@ -272,7 +290,9 @@ "metadata": { "id": "nOrK-MTYaw3C" }, - "outputs": [], + "outputs": [ + + ], "source": [ "batch_size = 32\n", "seed = 42\n", @@ -300,7 +320,9 @@ "metadata": { "id": "51wNaPPApk1K" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for text_batch, label_batch in raw_train_ds.take(1):\n", " for i in range(3):\n", @@ -325,7 +347,9 @@ "metadata": { "id": "MlICTG8spyO2" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(\"Label 0 corresponds to\", raw_train_ds.class_names[0])\n", "print(\"Label 1 corresponds to\", raw_train_ds.class_names[1])" @@ -355,7 +379,9 @@ "metadata": { "id": "JsMwwhOoqjKF" }, - "outputs": [], + "outputs": [ + + ], "source": [ "raw_val_ds = tf.keras.utils.text_dataset_from_directory(\n", " 'aclImdb/train', \n", @@ -371,7 +397,9 @@ "metadata": { "id": "rdSr0Nt3q_ns" }, - "outputs": [], + "outputs": [ + + ], "source": [ "raw_test_ds = tf.keras.utils.text_dataset_from_directory(\n", " 'aclImdb/test', \n", @@ -408,7 +436,9 @@ "metadata": { "id": "SDRI_s_tX1Hk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def custom_standardization(input_data):\n", " lowercase = tf.strings.lower(input_data)\n", @@ -435,7 +465,9 @@ "metadata": { "id": "-c76RvSzsMnX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "max_features = 10000\n", "sequence_length = 250\n", @@ -471,7 +503,9 @@ "metadata": { "id": "GH4_2ZGJsa_X" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Make a text-only dataset (without labels), then call adapt\n", "train_text = raw_train_ds.map(lambda x, y: x)\n", @@ -493,7 +527,9 @@ "metadata": { "id": "SCIg_T50wOCU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def vectorize_text(text, label):\n", " text = tf.expand_dims(text, -1)\n", @@ -506,7 +542,9 @@ "metadata": { "id": "XULcm6B3xQIO" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# retrieve a batch (of 32 reviews and labels) from the dataset\n", "text_batch, label_batch = next(iter(raw_train_ds))\n", @@ -531,7 +569,9 @@ "metadata": { "id": "kRq9hTQzhVhW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(\"1287 ---> \",vectorize_layer.get_vocabulary()[1287])\n", "print(\" 313 ---> \",vectorize_layer.get_vocabulary()[313])\n", @@ -553,7 +593,9 @@ "metadata": { "id": "2zhmpeViI1iG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_ds = raw_train_ds.map(vectorize_text)\n", "val_ds = raw_val_ds.map(vectorize_text)\n", @@ -583,7 +625,9 @@ "metadata": { "id": "wMcs_H7izm5m" }, - "outputs": [], + "outputs": [ + + ], "source": [ "AUTOTUNE = tf.data.AUTOTUNE\n", "\n", @@ -609,7 +653,9 @@ "metadata": { "id": "dkQP6in8yUBR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "embedding_dim = 16" ] @@ -620,7 +666,9 @@ "metadata": { "id": "xpKOoWgu-llD" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = tf.keras.Sequential([\n", " layers.Embedding(max_features + 1, embedding_dim),\n", @@ -664,7 +712,9 @@ "metadata": { "id": "Mr0GP-cQ-llN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.compile(loss=losses.BinaryCrossentropy(from_logits=True),\n", " optimizer='adam',\n", @@ -688,7 +738,9 @@ "metadata": { "id": "tXSGrjWZ-llW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "epochs = 10\n", "history = model.fit(\n", @@ -714,7 +766,9 @@ "metadata": { "id": "zOMKywn4zReN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "loss, accuracy = model.evaluate(test_ds)\n", "\n", @@ -748,7 +802,9 @@ "metadata": { "id": "-YcvZsdvWfDf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "history_dict = history.history\n", "history_dict.keys()" @@ -769,7 +825,9 @@ "metadata": { "id": "2SEMeQ5YXs8z" }, - "outputs": [], + "outputs": [ + + ], "source": [ "acc = history_dict['binary_accuracy']\n", "val_acc = history_dict['val_binary_accuracy']\n", @@ -796,7 +854,9 @@ "metadata": { "id": "Z3PJemLPXwz_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plt.plot(epochs, acc, 'bo', label='Training acc')\n", "plt.plot(epochs, val_acc, 'b', label='Validation acc')\n", @@ -840,7 +900,9 @@ "metadata": { "id": "FWXsMvryuZuq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "export_model = tf.keras.Sequential([\n", " vectorize_layer,\n", @@ -874,7 +936,9 @@ "metadata": { "id": "QW355HH5L49K" }, - "outputs": [], + "outputs": [ + + ], "source": [ "examples = [\n", " \"The movie was great!\",\n", @@ -960,7 +1024,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "text_classification.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/keras/text_classification_with_hub.ipynb b/site/ko/tutorials/keras/text_classification_with_hub.ipynb index b9fb8a002e..6f51beed71 100644 --- a/site/ko/tutorials/keras/text_classification_with_hub.ipynb +++ b/site/ko/tutorials/keras/text_classification_with_hub.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "ioaprt5q5US7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -38,7 +40,9 @@ "cellView": "form", "id": "yCl0eTNH5RS3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title MIT License\n", "#\n", @@ -108,7 +112,9 @@ "metadata": { "id": "IHTzYqKZ7auw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install tensorflow-hub\n", "!pip install tensorflow-datasets" @@ -120,7 +126,9 @@ "metadata": { "id": "2ew7HTbPpCJH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import os\n", "import numpy as np\n", @@ -152,7 +160,9 @@ "metadata": { "id": "zXXx5Oc3pOmN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Split the training set into 60% and 40% to end up with 15,000 examples\n", "# for training, 10,000 examples for validation and 25,000 examples for testing.\n", @@ -181,7 +191,9 @@ "metadata": { "id": "QtTS4kpEpjbi" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_examples_batch, train_labels_batch = next(iter(train_data.batch(10)))\n", "train_examples_batch" @@ -202,7 +214,9 @@ "metadata": { "id": "tvAjVXOWc6Mj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_labels_batch" ] @@ -255,7 +269,9 @@ "metadata": { "id": "_NUbzVeYkgcO" }, - "outputs": [], + "outputs": [ + + ], "source": [ "embedding = \"https://tfhub.dev/google/nnlm-en-dim50/2\"\n", "hub_layer = hub.KerasLayer(embedding, input_shape=[], \n", @@ -278,7 +294,9 @@ "metadata": { "id": "xpKOoWgu-llD" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = tf.keras.Sequential()\n", "model.add(hub_layer)\n", @@ -326,7 +344,9 @@ "metadata": { "id": "Mr0GP-cQ-llN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.compile(optimizer='adam',\n", " loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),\n", @@ -350,7 +370,9 @@ "metadata": { "id": "tXSGrjWZ-llW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "history = model.fit(train_data.shuffle(10000).batch(512),\n", " epochs=10,\n", @@ -375,7 +397,9 @@ "metadata": { "id": "zOMKywn4zReN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "results = model.evaluate(test_data.batch(512), verbose=2)\n", "\n", @@ -407,7 +431,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "text_classification_with_hub.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/load_data/images.ipynb b/site/ko/tutorials/load_data/images.ipynb index 858a2d67e6..ab72bde225 100644 --- a/site/ko/tutorials/load_data/images.ipynb +++ b/site/ko/tutorials/load_data/images.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "ufPx7EiCiqgR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -47,8 +49,7 @@ }, "source": [ "\n", - " \n", + " \n", " \n", " \n", " \n", @@ -83,7 +84,9 @@ "metadata": { "id": "3vhAMaIOBIee" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import numpy as np\n", "import os\n", @@ -99,7 +102,9 @@ "metadata": { "id": "Qnp9Z2sT5dWj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(tf.__version__)" ] @@ -139,7 +144,9 @@ "metadata": { "id": "rN-Pc6Zd6awg" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import pathlib\n", "dataset_url = \"https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz\"\n", @@ -162,7 +169,9 @@ "metadata": { "id": "QhewYCxhXQBX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "image_count = len(list(data_dir.glob('*/*.jpg')))\n", "print(image_count)" @@ -183,7 +192,9 @@ "metadata": { "id": "crs7ZjEp60Ot" }, - "outputs": [], + "outputs": [ + + ], "source": [ "roses = list(data_dir.glob('roses/*'))\n", "PIL.Image.open(str(roses[0]))" @@ -195,7 +206,9 @@ "metadata": { "id": "oV9PtjdKKWyI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "roses = list(data_dir.glob('roses/*'))\n", "PIL.Image.open(str(roses[1]))" @@ -236,7 +249,9 @@ "metadata": { "id": "qJdpyqK541ty" }, - "outputs": [], + "outputs": [ + + ], "source": [ "batch_size = 32\n", "img_height = 180\n", @@ -258,7 +273,9 @@ "metadata": { "id": "chqakIP14PDm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_ds = tf.keras.utils.image_dataset_from_directory(\n", " data_dir,\n", @@ -275,7 +292,9 @@ "metadata": { "id": "pb2Af2lsUShk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "val_ds = tf.keras.utils.image_dataset_from_directory(\n", " data_dir,\n", @@ -301,7 +320,9 @@ "metadata": { "id": "R7z2yKt7VDPJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class_names = train_ds.class_names\n", "print(class_names)" @@ -324,7 +345,9 @@ "metadata": { "id": "AAY3LJN28Kuy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import matplotlib.pyplot as plt\n", "\n", @@ -352,7 +375,9 @@ "metadata": { "id": "BdPHeHXt9sjA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for image_batch, labels_batch in train_ds:\n", " print(image_batch.shape)\n", @@ -397,7 +422,9 @@ "metadata": { "id": "16yNdZXdExyM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "normalization_layer = tf.keras.layers.Rescaling(1./255)" ] @@ -417,7 +444,9 @@ "metadata": { "id": "QgOnza-U_z5Y" }, - "outputs": [], + "outputs": [ + + ], "source": [ "normalized_ds = train_ds.map(lambda x, y: (normalization_layer(x), y))\n", "image_batch, labels_batch = next(iter(normalized_ds))\n", @@ -475,7 +504,9 @@ "metadata": { "id": "Ea3kbMe-pGDw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "AUTOTUNE = tf.data.AUTOTUNE\n", "\n", @@ -502,7 +533,9 @@ "metadata": { "id": "LdR0BzCcqxw0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "num_classes = 5\n", "\n", @@ -535,7 +568,9 @@ "metadata": { "id": "t_BlmsnmsEr4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.compile(\n", " optimizer='adam',\n", @@ -558,7 +593,9 @@ "metadata": { "id": "S08ZKKODsnGW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.fit(\n", " train_ds,\n", @@ -611,7 +648,9 @@ "metadata": { "id": "lAkQp5uxoINu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "list_ds = tf.data.Dataset.list_files(str(data_dir/'*/*'), shuffle=False)\n", "list_ds = list_ds.shuffle(image_count, reshuffle_each_iteration=False)" @@ -623,7 +662,9 @@ "metadata": { "id": "coORvEH-NGwc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for f in list_ds.take(5):\n", " print(f.numpy())" @@ -644,7 +685,9 @@ "metadata": { "id": "uRPHzDGhKACK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class_names = np.array(sorted([item.name for item in data_dir.glob('*') if item.name != \"LICENSE.txt\"]))\n", "print(class_names)" @@ -665,7 +708,9 @@ "metadata": { "id": "GWHNPzXclpVr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "val_size = int(image_count * 0.2)\n", "train_ds = list_ds.skip(val_size)\n", @@ -687,7 +732,9 @@ "metadata": { "id": "SiKQrb9ppS-7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(tf.data.experimental.cardinality(train_ds).numpy())\n", "print(tf.data.experimental.cardinality(val_ds).numpy())" @@ -708,7 +755,9 @@ "metadata": { "id": "arSQzIey-4D4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def get_label(file_path):\n", " # Convert the path to a list of path components\n", @@ -725,7 +774,9 @@ "metadata": { "id": "MGlq4IP4Aktb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def decode_img(img):\n", " # Convert the compressed string to a 3D uint8 tensor\n", @@ -740,7 +791,9 @@ "metadata": { "id": "-xhBRgvNqRRe" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def process_path(file_path):\n", " label = get_label(file_path)\n", @@ -765,7 +818,9 @@ "metadata": { "id": "3SDhbo8lOBQv" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Set `num_parallel_calls` so multiple images are loaded/processed in parallel.\n", "train_ds = train_ds.map(process_path, num_parallel_calls=AUTOTUNE)\n", @@ -778,7 +833,9 @@ "metadata": { "id": "kxrl0lGdnpRz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for image, label in train_ds.take(1):\n", " print(\"Image shape: \", image.numpy().shape)\n", @@ -815,7 +872,9 @@ "metadata": { "id": "uZmZJx8ePw_5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def configure_for_performance(ds):\n", " ds = ds.cache()\n", @@ -845,7 +904,9 @@ "metadata": { "id": "UN_Dnl72YNIj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "image_batch, label_batch = next(iter(train_ds))\n", "\n", @@ -875,7 +936,9 @@ "metadata": { "id": "Vm_bi7NKXOzW" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.fit(\n", " train_ds,\n", @@ -912,7 +975,9 @@ "metadata": { "id": "NTQ-53DNwv8o" }, - "outputs": [], + "outputs": [ + + ], "source": [ "(train_ds, val_ds, test_ds), metadata = tfds.load(\n", " 'tf_flowers',\n", @@ -937,7 +1002,9 @@ "metadata": { "id": "kJvt6qzF1i4L" }, - "outputs": [], + "outputs": [ + + ], "source": [ "num_classes = metadata.features['label'].num_classes\n", "print(num_classes)" @@ -958,7 +1025,9 @@ "metadata": { "id": "1lF3IUAO1ogi" }, - "outputs": [], + "outputs": [ + + ], "source": [ "get_label_name = metadata.features['label'].int2str\n", "\n", @@ -982,7 +1051,9 @@ "metadata": { "id": "AMV6GtZiwfGP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_ds = configure_for_performance(train_ds)\n", "val_ds = configure_for_performance(val_ds)\n", @@ -1018,7 +1089,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "images.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/load_data/text.ipynb b/site/ko/tutorials/load_data/text.ipynb index 870495dcf9..e86993431a 100644 --- a/site/ko/tutorials/load_data/text.ipynb +++ b/site/ko/tutorials/load_data/text.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "AVV2e0XKbJeX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -72,7 +74,9 @@ "metadata": { "id": "sa6IKWvADqH7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install \"tensorflow-text==2.11.*\"" ] @@ -83,7 +87,9 @@ "metadata": { "id": "baYFZMW_bJHh" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import collections\n", "import pathlib\n", @@ -127,7 +133,9 @@ "metadata": { "id": "8ELgzA6SHTuV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "data_url = 'https://storage.googleapis.com/download.tensorflow.org/data/stack_overflow_16k.tar.gz'\n", "\n", @@ -146,7 +154,9 @@ "metadata": { "id": "jIrPl5fUH2gb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "list(dataset_dir.iterdir())" ] @@ -157,7 +167,9 @@ "metadata": { "id": "fEoV7YByJoWQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_dir = dataset_dir/'train'\n", "list(train_dir.iterdir())" @@ -180,7 +192,9 @@ "metadata": { "id": "Go1vTSGdJu08" }, - "outputs": [], + "outputs": [ + + ], "source": [ "sample_file = train_dir/'python/1755.txt'\n", "\n", @@ -236,7 +250,9 @@ "metadata": { "id": "qqyliMw8N-az" }, - "outputs": [], + "outputs": [ + + ], "source": [ "batch_size = 32\n", "seed = 42\n", @@ -268,7 +284,9 @@ "metadata": { "id": "_JMTyZ6Glt_C" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for text_batch, label_batch in raw_train_ds.take(1):\n", " for i in range(10):\n", @@ -291,7 +309,9 @@ "metadata": { "id": "gIpCS7YjmGkj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for i, label in enumerate(raw_train_ds.class_names):\n", " print(\"Label\", i, \"corresponds to\", label)" @@ -314,7 +334,9 @@ "metadata": { "id": "x7m6sCWJQuYt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Create a validation set.\n", "raw_val_ds = utils.text_dataset_from_directory(\n", @@ -331,7 +353,9 @@ "metadata": { "id": "BXMZc7fMQwKE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "test_dir = dataset_dir/'test'\n", "\n", @@ -382,7 +406,9 @@ "metadata": { "id": "voaC43rZR0jc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "VOCAB_SIZE = 10000\n", "\n", @@ -406,7 +432,9 @@ "metadata": { "id": "XWsY01Zl2aRe" }, - "outputs": [], + "outputs": [ + + ], "source": [ "MAX_SEQUENCE_LENGTH = 250\n", "\n", @@ -433,7 +461,9 @@ "metadata": { "id": "yTXsdDEqSf9e" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Make a text-only dataset (without labels), then call `TextVectorization.adapt`.\n", "train_text = raw_train_ds.map(lambda text, labels: text)\n", @@ -456,7 +486,9 @@ "metadata": { "id": "RngfPyArSsvM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def binary_vectorize_text(text, label):\n", " text = tf.expand_dims(text, -1)\n", @@ -469,7 +501,9 @@ "metadata": { "id": "_1W54wf0LhQ0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def int_vectorize_text(text, label):\n", " text = tf.expand_dims(text, -1)\n", @@ -482,7 +516,9 @@ "metadata": { "id": "Vi_sElMiSmXe" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Retrieve a batch (of 32 reviews and labels) from the dataset.\n", "text_batch, label_batch = next(iter(raw_train_ds))\n", @@ -497,7 +533,9 @@ "metadata": { "id": "UGukZoYv2v3v" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(\"'binary' vectorized question:\",\n", " binary_vectorize_text(first_question, first_label)[0])" @@ -509,7 +547,9 @@ "metadata": { "id": "Lu07FsIw2yH5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(\"'int' vectorized question:\",\n", " int_vectorize_text(first_question, first_label)[0])" @@ -532,7 +572,9 @@ "metadata": { "id": "WpBnTZilS8wt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(\"1289 ---> \", int_vectorize_layer.get_vocabulary()[1289])\n", "print(\"313 ---> \", int_vectorize_layer.get_vocabulary()[313])\n", @@ -556,7 +598,9 @@ "metadata": { "id": "46LeHmnD55wJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "binary_train_ds = raw_train_ds.map(binary_vectorize_text)\n", "binary_val_ds = raw_val_ds.map(binary_vectorize_text)\n", @@ -589,7 +633,9 @@ "metadata": { "id": "PabA9DFIfSz7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "AUTOTUNE = tf.data.AUTOTUNE\n", "\n", @@ -603,7 +649,9 @@ "metadata": { "id": "J8GcJLvb3JH0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "binary_train_ds = configure_dataset(binary_train_ds)\n", "binary_val_ds = configure_dataset(binary_val_ds)\n", @@ -633,7 +681,9 @@ "metadata": { "id": "2q8iAU-VMzaN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "binary_model = tf.keras.Sequential([layers.Dense(4)])\n", "\n", @@ -661,7 +711,9 @@ "metadata": { "id": "5ztw2XH_LbVz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def create_model(vocab_size, num_labels):\n", " model = tf.keras.Sequential([\n", @@ -679,7 +731,9 @@ "metadata": { "id": "s9rG1cFRL31Z" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# `vocab_size` is `VOCAB_SIZE + 1` since `0` is used additionally for padding.\n", "int_model = create_model(vocab_size=VOCAB_SIZE + 1, num_labels=4)\n", @@ -705,7 +759,9 @@ "metadata": { "id": "N8ViDXw99v_u" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(\"Linear model on binary vectorized data:\")\n", "print(binary_model.summary())" @@ -717,7 +773,9 @@ "metadata": { "id": "P9BOeoCwborD" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(\"ConvNet model on int vectorized data:\")\n", "print(int_model.summary())" @@ -738,7 +796,9 @@ "metadata": { "id": "5dTc4nZqf7fK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "binary_loss, binary_accuracy = binary_model.evaluate(binary_test_ds)\n", "int_loss, int_accuracy = int_model.evaluate(int_test_ds)\n", @@ -775,7 +835,9 @@ "metadata": { "id": "_bRe3KX8gRCX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "export_model = tf.keras.Sequential(\n", " [binary_vectorize_layer, binary_model,\n", @@ -806,7 +868,9 @@ "metadata": { "id": "GU53uRXz45iO" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def get_string_labels(predicted_scores_batch):\n", " predicted_int_labels = tf.math.argmax(predicted_scores_batch, axis=1)\n", @@ -829,7 +893,9 @@ "metadata": { "id": "BOR2MupW1_zS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "inputs = [\n", " \"how do I extract keys from a dict into a list?\", # 'python'\n", @@ -898,7 +964,9 @@ "metadata": { "id": "4YlKQthEYlFw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "DIRECTORY_URL = 'https://storage.googleapis.com/download.tensorflow.org/data/illiad/'\n", "FILE_NAMES = ['cowper.txt', 'derby.txt', 'butler.txt']\n", @@ -929,7 +997,9 @@ "metadata": { "id": "YIIWIdPXgk7I" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def labeler(example, index):\n", " return example, tf.cast(index, tf.int64)" @@ -941,7 +1011,9 @@ "metadata": { "id": "8Ajx7AmZnEg3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "labeled_data_sets = []\n", "\n", @@ -966,7 +1038,9 @@ "metadata": { "id": "6jAeYkTIi9-2" }, - "outputs": [], + "outputs": [ + + ], "source": [ "BUFFER_SIZE = 50000\n", "BATCH_SIZE = 64\n", @@ -979,7 +1053,9 @@ "metadata": { "id": "Qd544E-Sh63L" }, - "outputs": [], + "outputs": [ + + ], "source": [ "all_labeled_data = labeled_data_sets[0]\n", "for labeled_dataset in labeled_data_sets[1:]:\n", @@ -1004,7 +1080,9 @@ "metadata": { "id": "gywKlN0xh6u5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for text, label in all_labeled_data.take(10):\n", " print(\"Sentence: \", text.numpy())\n", @@ -1033,7 +1111,9 @@ "metadata": { "id": "v4DpQW-Y12rm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tokenizer = tf_text.UnicodeScriptTokenizer()" ] @@ -1044,7 +1124,9 @@ "metadata": { "id": "pz8xEj0ugu51" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def tokenize(text, unused_label):\n", " lower_case = tf_text.case_fold_utf8(text)\n", @@ -1057,7 +1139,9 @@ "metadata": { "id": "vzUrAzOq31QL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tokenized_ds = all_labeled_data.map(tokenize)" ] @@ -1077,7 +1161,9 @@ "metadata": { "id": "g2mkWri7LiGq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for text_batch in tokenized_ds.take(5):\n", " print(\"Tokens: \", text_batch.numpy())" @@ -1098,7 +1184,9 @@ "metadata": { "id": "YkHtbGnDh6mg" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tokenized_ds = configure_dataset(tokenized_ds)\n", "\n", @@ -1130,7 +1218,9 @@ "metadata": { "id": "kCBo2yFHD7y6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "keys = vocab\n", "values = range(2, len(vocab) + 2) # Reserve `0` for padding, `1` for OOV tokens.\n", @@ -1157,7 +1247,9 @@ "metadata": { "id": "HcIQ7LOTh6eT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def preprocess_text(text, label):\n", " standardized = tf_text.case_fold_utf8(text)\n", @@ -1181,7 +1273,9 @@ "metadata": { "id": "jgxPZaxUuTbk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "example_text, example_label = next(iter(all_labeled_data))\n", "print(\"Sentence: \", example_text.numpy())\n", @@ -1204,7 +1298,9 @@ "metadata": { "id": "KmQVsAgJ-RM0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "all_encoded_data = all_labeled_data.map(preprocess_text)" ] @@ -1235,7 +1331,9 @@ "metadata": { "id": "r-rmbijQh6bf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_data = all_encoded_data.skip(VALIDATION_SIZE).shuffle(BUFFER_SIZE)\n", "validation_data = all_encoded_data.take(VALIDATION_SIZE)" @@ -1247,7 +1345,9 @@ "metadata": { "id": "qTP0IwHBCn0Q" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_data = train_data.padded_batch(BATCH_SIZE)\n", "validation_data = validation_data.padded_batch(BATCH_SIZE)" @@ -1270,7 +1370,9 @@ "metadata": { "id": "kMslWfuwoqpB" }, - "outputs": [], + "outputs": [ + + ], "source": [ "sample_text, sample_labels = next(iter(validation_data))\n", "print(\"Text batch shape: \", sample_text.shape)\n", @@ -1294,7 +1396,9 @@ "metadata": { "id": "u21LlkO8QGRX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "vocab_size += 2" ] @@ -1314,7 +1418,9 @@ "metadata": { "id": "BpT0b_7mYRXV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_data = configure_dataset(train_data)\n", "validation_data = configure_dataset(validation_data)" @@ -1337,7 +1443,9 @@ "metadata": { "id": "QJgI1pow2YR9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = create_model(vocab_size=vocab_size, num_labels=3)\n", "\n", @@ -1355,7 +1463,9 @@ "metadata": { "id": "KTPCYf_Jh6TH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "loss, accuracy = model.evaluate(validation_data)\n", "\n", @@ -1387,7 +1497,9 @@ "metadata": { "id": "_ODkRXbk6aHb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "preprocess_layer = TextVectorization(\n", " max_tokens=vocab_size,\n", @@ -1405,7 +1517,9 @@ "metadata": { "id": "G-Cvd27y4qwt" }, - "outputs": [], + "outputs": [ + + ], "source": [ "export_model = tf.keras.Sequential(\n", " [preprocess_layer, model,\n", @@ -1423,7 +1537,9 @@ "metadata": { "id": "Pyg0B4zsc-UD" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Create a test dataset of raw strings.\n", "test_ds = all_labeled_data.take(VALIDATION_SIZE).batch(BATCH_SIZE)\n", @@ -1459,7 +1575,9 @@ "metadata": { "id": "-w1fQGJPD2Yh" }, - "outputs": [], + "outputs": [ + + ], "source": [ "inputs = [\n", " \"Join'd to th' Ionians with their flowing robes,\", # Label: 1\n", @@ -1501,7 +1619,9 @@ "metadata": { "id": "NzC65LOaVw0B" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Training set.\n", "train_ds = tfds.load(\n", @@ -1518,7 +1638,9 @@ "metadata": { "id": "XKGkgPBkFh0k" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Validation set.\n", "val_ds = tfds.load(\n", @@ -1544,7 +1666,9 @@ "metadata": { "id": "Bq1w8MnfWt2C" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for review_batch, label_batch in val_ds.take(1):\n", " for i in range(5):\n", @@ -1578,7 +1702,9 @@ "metadata": { "id": "UzT_t9ihZLH4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "vectorize_layer = TextVectorization(\n", " max_tokens=VOCAB_SIZE,\n", @@ -1596,7 +1722,9 @@ "metadata": { "id": "zz-Xrd_ZZ4tB" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def vectorize_text(text, label):\n", " text = tf.expand_dims(text, -1)\n", @@ -1609,7 +1737,9 @@ "metadata": { "id": "ycn0Itd6g5aF" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_ds = train_ds.map(vectorize_text)\n", "val_ds = val_ds.map(vectorize_text)" @@ -1621,7 +1751,9 @@ "metadata": { "id": "jc11jQTlZ5lj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Configure datasets for performance as before.\n", "train_ds = configure_dataset(train_ds)\n", @@ -1643,7 +1775,9 @@ "metadata": { "id": "B9IOTLkyZ-a7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = create_model(vocab_size=VOCAB_SIZE + 1, num_labels=1)\n", "model.summary()" @@ -1655,7 +1789,9 @@ "metadata": { "id": "xLnDs5dhaBAk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.compile(\n", " loss=losses.BinaryCrossentropy(from_logits=True),\n", @@ -1669,7 +1805,9 @@ "metadata": { "id": "rq59QpNzaDMa" }, - "outputs": [], + "outputs": [ + + ], "source": [ "history = model.fit(train_ds, validation_data=val_ds, epochs=3)" ] @@ -1680,7 +1818,9 @@ "metadata": { "id": "gCMWCEtyaEbR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "loss, accuracy = model.evaluate(val_ds)\n", "\n", @@ -1703,7 +1843,9 @@ "metadata": { "id": "yE9WZARZaZr1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "export_model = tf.keras.Sequential(\n", " [vectorize_layer, model,\n", @@ -1721,7 +1863,9 @@ "metadata": { "id": "bhF8tDH-afoC" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# 0 --> negative review\n", "# 1 --> positive review\n", @@ -1761,7 +1905,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "text.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/load_data/tfrecord.ipynb b/site/ko/tutorials/load_data/tfrecord.ipynb index fea7666f55..2b408b67f5 100644 --- a/site/ko/tutorials/load_data/tfrecord.ipynb +++ b/site/ko/tutorials/load_data/tfrecord.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "uBDvXpYzYnGj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -90,7 +92,9 @@ "metadata": { "id": "Ja7sezsmnXph" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "\n", @@ -161,7 +165,9 @@ "metadata": { "id": "mbsPOUpVtYxA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# The following functions can be used to convert a value to a type compatible\n", "# with tf.train.Example.\n", @@ -205,7 +211,9 @@ "metadata": { "id": "hZzyLGr0u73y" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(_bytes_feature(b'test_string'))\n", "print(_bytes_feature(u'test_bytes'.encode('utf-8')))\n", @@ -231,7 +239,9 @@ "metadata": { "id": "5afZkORT5pjm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "feature = _float_feature(np.exp(1))\n", "\n", @@ -286,7 +296,9 @@ "metadata": { "id": "CnrguFAy3YQv" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# The number of observations in the dataset.\n", "n_observations = int(1e4)\n", @@ -320,7 +332,9 @@ "metadata": { "id": "RTCS49Ij_kUw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def serialize_example(feature0, feature1, feature2, feature3):\n", " \"\"\"\n", @@ -356,7 +370,9 @@ "metadata": { "id": "N8BtSx2RjYcb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# This is an example observation from the dataset.\n", "\n", @@ -381,7 +397,9 @@ "metadata": { "id": "dGim-mEm6vit" }, - "outputs": [], + "outputs": [ + + ], "source": [ "example_proto = tf.train.Example.FromString(serialized_example)\n", "example_proto" @@ -461,7 +479,9 @@ "metadata": { "id": "mXeaukvwu5_-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf.data.Dataset.from_tensor_slices(feature1)" ] @@ -481,7 +501,9 @@ "metadata": { "id": "H5sWyu1kxnvg" }, - "outputs": [], + "outputs": [ + + ], "source": [ "features_dataset = tf.data.Dataset.from_tensor_slices((feature0, feature1, feature2, feature3))\n", "features_dataset" @@ -493,7 +515,9 @@ "metadata": { "id": "m1C-t71Nywze" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Use `take(1)` to only pull one example from the dataset.\n", "for f0,f1,f2,f3 in features_dataset.take(1):\n", @@ -522,7 +546,9 @@ "metadata": { "id": "apB5KYrJzjPI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def tf_serialize_example(f0,f1,f2,f3):\n", " tf_string = tf.py_function(\n", @@ -538,7 +564,9 @@ "metadata": { "id": "lHFjW4u4Npz9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf_serialize_example(f0, f1, f2, f3)" ] @@ -558,7 +586,9 @@ "metadata": { "id": "VDeqYVbW3ww9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "serialized_features_dataset = features_dataset.map(tf_serialize_example)\n", "serialized_features_dataset" @@ -570,7 +600,9 @@ "metadata": { "id": "DlDfuh46bRf6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def generator():\n", " for features in features_dataset:\n", @@ -583,7 +615,9 @@ "metadata": { "id": "iv9oXKrcbhvX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "serialized_features_dataset = tf.data.Dataset.from_generator(\n", " generator, output_types=tf.string, output_shapes=())" @@ -595,7 +629,9 @@ "metadata": { "id": "Dqz8C4D5cIj9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "serialized_features_dataset" ] @@ -615,7 +651,9 @@ "metadata": { "id": "vP1VgTO44UIE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "filename = 'test.tfrecord'\n", "writer = tf.data.experimental.TFRecordWriter(filename)\n", @@ -650,7 +688,9 @@ "metadata": { "id": "6OjX6UZl-bHC" }, - "outputs": [], + "outputs": [ + + ], "source": [ "filenames = [filename]\n", "raw_dataset = tf.data.TFRecordDataset(filenames)\n", @@ -676,7 +716,9 @@ "metadata": { "id": "hxVXpLz_AJlm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for raw_record in raw_dataset.take(10):\n", " print(repr(raw_record))" @@ -697,7 +739,9 @@ "metadata": { "id": "zQjbIR1nleiy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Create a description of the features.\n", "feature_description = {\n", @@ -727,7 +771,9 @@ "metadata": { "id": "6Ob7D-zmBm1w" }, - "outputs": [], + "outputs": [ + + ], "source": [ "parsed_dataset = raw_dataset.map(_parse_function)\n", "parsed_dataset" @@ -748,7 +794,9 @@ "metadata": { "id": "x2LT2JCqhoD_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for parsed_record in parsed_dataset.take(10):\n", " print(repr(parsed_record))" @@ -805,7 +853,9 @@ "metadata": { "id": "MKPHzoGv7q44" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Write the `tf.train.Example` observations to the file.\n", "with tf.io.TFRecordWriter(filename) as writer:\n", @@ -820,7 +870,9 @@ "metadata": { "id": "EjdFHHJMpUUo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!du -sh {filename}" ] @@ -842,7 +894,9 @@ "metadata": { "id": "U3tnd3LerOtV" }, - "outputs": [], + "outputs": [ + + ], "source": [ "filenames = [filename]\n", "raw_dataset = tf.data.TFRecordDataset(filenames)\n", @@ -855,7 +909,9 @@ "metadata": { "id": "nsEAACHcnm3f" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for raw_record in raw_dataset.take(1):\n", " example = tf.train.Example()\n", @@ -887,7 +943,9 @@ "metadata": { "id": "Ziv9tiNE1l6J" }, - "outputs": [], + "outputs": [ + + ], "source": [ "result = {}\n", "# example.features.feature is the dictionary\n", @@ -938,7 +996,9 @@ "metadata": { "id": "3a0fmwg8lHdF" }, - "outputs": [], + "outputs": [ + + ], "source": [ "cat_in_snow = tf.keras.utils.get_file(\n", " '320px-Felis_catus-cat_on_snow.jpg',\n", @@ -955,7 +1015,9 @@ "metadata": { "id": "7aJJh7vENeE4" }, - "outputs": [], + "outputs": [ + + ], "source": [ "display.display(display.Image(filename=cat_in_snow))\n", "display.display(display.HTML('Image cc-by: Von.grzanka'))" @@ -967,7 +1029,9 @@ "metadata": { "id": "KkW0uuhcXZqA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "display.display(display.Image(filename=williamsburg_bridge))\n", "display.display(display.HTML('From Wikimedia'))" @@ -997,7 +1061,9 @@ "metadata": { "id": "kC4TS1ZEONHr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "image_labels = {\n", " cat_in_snow : 0,\n", @@ -1011,7 +1077,9 @@ "metadata": { "id": "c5njMSYNEhNZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# This is an example, just using the cat image.\n", "image_string = open(cat_in_snow, 'rb').read()\n", @@ -1052,7 +1120,9 @@ "metadata": { "id": "qcw06lQCOCZU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Write the raw image files to `images.tfrecords`.\n", "# First, process the two images into `tf.train.Example` messages.\n", @@ -1071,7 +1141,9 @@ "metadata": { "id": "yJrTe6tHPCfs" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!du -sh {record_file}" ] @@ -1093,7 +1165,9 @@ "metadata": { "id": "M6Cnfd3cTKHN" }, - "outputs": [], + "outputs": [ + + ], "source": [ "raw_image_dataset = tf.data.TFRecordDataset('images.tfrecords')\n", "\n", @@ -1129,7 +1203,9 @@ "metadata": { "id": "yZf8jOyEIjSF" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for image_features in parsed_image_dataset:\n", " image_raw = image_features['image_raw'].numpy()\n", diff --git a/site/ko/tutorials/quickstart/beginner.ipynb b/site/ko/tutorials/quickstart/beginner.ipynb index c02b711469..8140bd2f8e 100644 --- a/site/ko/tutorials/quickstart/beginner.ipynb +++ b/site/ko/tutorials/quickstart/beginner.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "BZSlp3DAjdYf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -99,7 +101,9 @@ "metadata": { "id": "0trJmd6DjqBZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "print(\"TensorFlow version:\", tf.__version__)" @@ -126,7 +130,9 @@ "metadata": { "id": "7FP5258xjs-v" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mnist = tf.keras.datasets.mnist\n", "\n", @@ -151,7 +157,9 @@ "metadata": { "id": "h3IKyzTCDNGo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = tf.keras.models.Sequential([\n", " tf.keras.layers.Flatten(input_shape=(28, 28)),\n", @@ -182,7 +190,9 @@ "metadata": { "id": "OeOrNdnkEEcR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "predictions = model(x_train[:1]).numpy()\n", "predictions" @@ -203,7 +213,9 @@ "metadata": { "id": "zWSRnQ0WI5eq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf.nn.softmax(predictions).numpy()" ] @@ -232,7 +244,9 @@ "metadata": { "id": "RSkzdv8MD0tT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)" ] @@ -254,7 +268,9 @@ "metadata": { "id": "NJWqEVrrJ7ZB" }, - "outputs": [], + "outputs": [ + + ], "source": [ "loss_fn(y_train[:1], predictions).numpy()" ] @@ -274,7 +290,9 @@ "metadata": { "id": "9foNKHzTD2Vo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.compile(optimizer='adam',\n", " loss=loss_fn,\n", @@ -298,7 +316,9 @@ "metadata": { "id": "y7suUbJXVLqP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.fit(x_train, y_train, epochs=5)" ] @@ -318,7 +338,9 @@ "metadata": { "id": "F7dTAzgHDUh7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.fit(x_train, y_train, epochs=5)\n", "\n", @@ -349,7 +371,9 @@ "metadata": { "id": "rYb6DrEH0GMv" }, - "outputs": [], + "outputs": [ + + ], "source": [ "probability_model = tf.keras.Sequential([\n", " model,\n", @@ -363,7 +387,9 @@ "metadata": { "id": "cnqOZtUp1YR_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "probability_model(x_test[:5])" ] diff --git a/site/ko/tutorials/reinforcement_learning/actor_critic.ipynb b/site/ko/tutorials/reinforcement_learning/actor_critic.ipynb index 668e54bdc2..5540914230 100644 --- a/site/ko/tutorials/reinforcement_learning/actor_critic.ipynb +++ b/site/ko/tutorials/reinforcement_learning/actor_critic.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "V_sgB_5dx1f1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -126,7 +128,9 @@ "metadata": { "id": "13l6BbxKhCKp" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install gym[classic_control]\n", "!pip install pyglet" @@ -138,7 +142,9 @@ "metadata": { "id": "WBeQhPi2S4m5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%bash\n", "# Install additional packages for visualization\n", @@ -152,7 +158,9 @@ "metadata": { "id": "tT4N3qYviUJr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import collections\n", "import gym\n", @@ -201,7 +209,9 @@ "metadata": { "id": "aXKbbMC-kmuv" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class ActorCritic(tf.keras.Model):\n", " \"\"\"Combined actor-critic network.\"\"\"\n", @@ -228,7 +238,9 @@ "metadata": { "id": "nWyxJgjLn68c" }, - "outputs": [], + "outputs": [ + + ], "source": [ "num_actions = env.action_space.n # 2\n", "num_hidden_units = 128\n", @@ -276,7 +288,9 @@ "metadata": { "id": "5URrbGlDSAGx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Wrap Gym's `env.step` call as an operation in a TensorFlow function.\n", "# This would allow it to be included in a callable TensorFlow graph.\n", @@ -301,7 +315,9 @@ "metadata": { "id": "a4qVRV063Cl9" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def run_episode(\n", " initial_state: tf.Tensor, \n", @@ -375,7 +391,9 @@ "metadata": { "id": "jpEwFyl315dl" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def get_expected_return(\n", " rewards: tf.Tensor, \n", @@ -484,7 +502,9 @@ "metadata": { "id": "9EXwbEez6n9m" }, - "outputs": [], + "outputs": [ + + ], "source": [ "huber_loss = tf.keras.losses.Huber(reduction=tf.keras.losses.Reduction.SUM)\n", "\n", @@ -527,7 +547,9 @@ "metadata": { "id": "QoccrkF3IFCg" }, - "outputs": [], + "outputs": [ + + ], "source": [ "optimizer = tf.keras.optimizers.Adam(learning_rate=0.01)\n", "\n", @@ -589,7 +611,9 @@ "metadata": { "id": "kbmBxnzLiUJx" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%%time\n", "\n", @@ -649,7 +673,9 @@ "metadata": { "id": "qbIMMkfmRHyC" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Render an episode and save as a GIF file\n", "\n", @@ -697,7 +723,9 @@ "metadata": { "id": "TLd720SejKmf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow_docs.vis.embed as embed\n", "embed.embed_file(image_file)" diff --git a/site/ko/tutorials/structured_data/preprocessing_layers.ipynb b/site/ko/tutorials/structured_data/preprocessing_layers.ipynb index 67e682c9d5..3181ba4345 100644 --- a/site/ko/tutorials/structured_data/preprocessing_layers.ipynb +++ b/site/ko/tutorials/structured_data/preprocessing_layers.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "2mapZ9afGJ69" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -126,7 +128,9 @@ "metadata": { "id": "LklnLlt6yEqf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import numpy as np\n", "import pandas as pd\n", @@ -141,7 +145,9 @@ "metadata": { "id": "TKU7RyoQGVKB" }, - "outputs": [], + "outputs": [ + + ], "source": [ "tf.__version__" ] @@ -163,7 +169,9 @@ "metadata": { "id": "qJ4Ajn-YyEqj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "dataset_url = 'http://storage.googleapis.com/download.tensorflow.org/data/petfinder-mini.zip'\n", "csv_file = 'datasets/petfinder-mini/petfinder-mini.csv'\n", @@ -188,7 +196,9 @@ "metadata": { "id": "3uiq4hoIGyXI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "dataframe.head()" ] @@ -214,7 +224,9 @@ "metadata": { "id": "wmMDc46-yEqq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# In the original dataset, `'AdoptionSpeed'` of `4` indicates\n", "# a pet was not adopted.\n", @@ -241,7 +253,9 @@ "metadata": { "id": "XvSinthO8oMj" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train, val, test = np.split(dataframe.sample(frac=1), [int(0.8*len(dataframe)), int(0.9*len(dataframe))])" ] @@ -252,7 +266,9 @@ "metadata": { "id": "U02Q1moWoPwQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(len(train), 'training examples')\n", "print(len(val), 'validation examples')\n", @@ -278,7 +294,9 @@ "metadata": { "id": "7r4j-1lRyEqw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def df_to_dataset(dataframe, shuffle=True, batch_size=32):\n", " df = dataframe.copy()\n", @@ -307,7 +325,9 @@ "metadata": { "id": "tYiNH-QI96Jo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "batch_size = 5\n", "train_ds = df_to_dataset(train, batch_size=batch_size)" @@ -319,7 +339,9 @@ "metadata": { "id": "nFYir6S8HgIJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "[(train_features, label_batch)] = train_ds.take(1)\n", "print('Every feature:', list(train_features.keys()))\n", @@ -378,7 +400,9 @@ "metadata": { "id": "D6OuEKMMyEq1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def get_normalization_layer(name, dataset):\n", " # Create a Normalization layer for the feature.\n", @@ -408,7 +432,9 @@ "metadata": { "id": "MpKgUDyk69bM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "photo_count_col = train_features['PhotoAmt']\n", "layer = get_normalization_layer('PhotoAmt', train_ds)\n", @@ -443,7 +469,9 @@ "metadata": { "id": "GmgaeRjlDoUO" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def get_category_encoding_layer(name, dataset, dtype, max_tokens=None):\n", " # Create a layer that turns strings into integer indices.\n", @@ -482,7 +510,9 @@ "metadata": { "id": "X2t2ff9K8PcT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "test_type_col = train_features['Type']\n", "test_type_layer = get_category_encoding_layer(name='Type',\n", @@ -506,7 +536,9 @@ "metadata": { "id": "7FjBioQ38oNE" }, - "outputs": [], + "outputs": [ + + ], "source": [ "test_age_col = train_features['Age']\n", "test_age_layer = get_category_encoding_layer(name='Age',\n", @@ -549,7 +581,9 @@ "metadata": { "id": "Rcv2kQTTo23h" }, - "outputs": [], + "outputs": [ + + ], "source": [ "batch_size = 256\n", "train_ds = df_to_dataset(train, batch_size=batch_size)\n", @@ -572,7 +606,9 @@ "metadata": { "id": "Q3RBa51VkaAn" }, - "outputs": [], + "outputs": [ + + ], "source": [ "all_inputs = []\n", "encoded_features = []\n", @@ -601,7 +637,9 @@ "metadata": { "id": "1FOMGfZflhoA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "age_col = tf.keras.Input(shape=(1,), name='Age', dtype='int64')\n", "\n", @@ -629,7 +667,9 @@ "metadata": { "id": "K8C8xyiXm-Ie" }, - "outputs": [], + "outputs": [ + + ], "source": [ "categorical_cols = ['Type', 'Color1', 'Color2', 'Gender', 'MaturitySize',\n", " 'FurLength', 'Vaccinated', 'Sterilized', 'Health', 'Breed1']\n", @@ -669,7 +709,9 @@ "metadata": { "id": "6Yrj-_pr6jyL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "all_features = tf.keras.layers.concatenate(encoded_features)\n", "x = tf.keras.layers.Dense(32, activation=\"relu\")(all_features)\n", @@ -694,7 +736,9 @@ "metadata": { "id": "GZDb_lJdelSg" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.compile(optimizer='adam',\n", " loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),\n", @@ -716,7 +760,9 @@ "metadata": { "id": "Y7Bkx4c7yEq5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Use `rankdir='LR'` to make the graph horizontal.\n", "tf.keras.utils.plot_model(model, show_shapes=True, rankdir=\"LR\")" @@ -737,7 +783,9 @@ "metadata": { "id": "OQfE3PC6yEq8" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.fit(train_ds, epochs=10, validation_data=val_ds)" ] @@ -748,7 +796,9 @@ "metadata": { "id": "T8N2uAdU2Cni" }, - "outputs": [], + "outputs": [ + + ], "source": [ "loss, accuracy = model.evaluate(test_ds)\n", "print(\"Accuracy\", accuracy)" @@ -773,7 +823,9 @@ "metadata": { "id": "QH9Zy1sBvwOH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.save('my_pet_classifier.keras')\n", "reloaded_model = tf.keras.models.load_model('my_pet_classifier.keras')" @@ -797,7 +849,9 @@ "metadata": { "id": "rKq4pxtdDa7i" }, - "outputs": [], + "outputs": [ + + ], "source": [ "sample = {\n", " 'Type': 'Cat',\n", @@ -854,7 +908,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "preprocessing_layers.ipynb", "toc_visible": true }, diff --git a/site/ko/xla/tutorials/autoclustering_xla.ipynb b/site/ko/xla/tutorials/autoclustering_xla.ipynb index cd95e59d21..7ec775f996 100644 --- a/site/ko/xla/tutorials/autoclustering_xla.ipynb +++ b/site/ko/xla/tutorials/autoclustering_xla.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "vamNSA0vEP-m" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -47,10 +49,8 @@ }, "source": [ "
TensorFlow.org에서 보기\n", - " TensorFlow.org에서 보기 Google Colab에서 실행하기 GitHub에서소스 보기노트북 다운론드하기
\n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
TensorFlow.org에서 보기\n", - " Google Colab에서 실행\n", - " TensorFlow.org에서 보기 Google Colab에서 실행 GitHub에서소스 보기 노트북 다운로드하기
" @@ -73,7 +73,9 @@ "metadata": { "id": "R4xtYyOf78e3" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install -U -q tensorflow tensorflow_datasets" ] @@ -84,7 +86,9 @@ "metadata": { "id": "PH2HbLW65tmo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "import tensorflow_datasets as tfds" @@ -96,7 +100,9 @@ "metadata": { "id": "7vm2QsMisCxI" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Check that GPU is available: cf. https://colab.research.google.com/notebooks/gpu.ipynb\n", "assert(tf.test.gpu_device_name())\n", @@ -135,7 +141,9 @@ "metadata": { "id": "3ZRQSwoRsKM_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def generate_model():\n", " return tf.keras.models.Sequential([\n", @@ -179,7 +187,9 @@ "metadata": { "id": "UKCmrhF0tiMa" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def compile_model(model):\n", " opt = tf.keras.optimizers.RMSprop(learning_rate=0.0001)\n", @@ -222,7 +232,9 @@ "metadata": { "id": "jxU-Tzy4SX7p" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# We need to clear the session to enable JIT in the middle of the program.\n", "tf.keras.backend.clear_session()\n", @@ -247,7 +259,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "autoclustering_xla.ipynb", "toc_visible": true }, From 4ab0a4eaa5aeca7db3296ba1dbef7bacee9c3b5b Mon Sep 17 00:00:00 2001 From: ilyaspiridonov Date: Sat, 4 Nov 2023 21:52:33 +0300 Subject: [PATCH 2/5] nbfmt, nblint --- .../average_optimizers_callback.ipynb | 56 +-- site/ko/addons/tutorials/image_ops.ipynb | 56 +-- .../tutorials/networks_seq2seq_nmt.ipynb | 72 +--- site/ko/datasets/dataset_collections.ipynb | 60 +-- site/ko/datasets/overview.ipynb | 92 ++--- site/ko/datasets/tfless_tfds.ipynb | 64 +--- ...our_own_federated_learning_algorithm.ipynb | 156 ++------ site/ko/guide/core/matrix_core.ipynb | 100 ++--- site/ko/guide/core/optimizers_core.ipynb | 64 +--- site/ko/guide/core/quickstart_core.ipynb | 68 +--- site/ko/guide/dtensor_overview.ipynb | 133 ++----- site/ko/guide/migrate/tf1_vs_tf2.ipynb | 68 +--- .../guide/migrate/validate_correctness.ipynb | 172 +++------ site/ko/guide/ragged_tensor.ipynb | 344 +++++------------- site/ko/io/tutorials/azure.ipynb | 8 +- site/ko/io/tutorials/dicom.ipynb | 36 +- site/ko/io/tutorials/postgresql.ipynb | 28 +- site/ko/io/tutorials/prometheus.ipynb | 32 +- .../lattice/tutorials/shape_constraints.ipynb | 88 ++--- .../on_device_training/overview.ipynb | 71 +--- site/ko/lite/guide/model_analyzer.ipynb | 24 +- site/ko/lite/guide/signatures.ipynb | 32 +- .../model_maker/image_classification.ipynb | 108 ++---- .../modify/model_maker/object_detection.ipynb | 56 +-- .../modify/model_maker/question_answer.ipynb | 56 +-- .../model_maker/text_classification.ipynb | 120 ++---- .../modify/model_maker/text_searcher.ipynb | 44 +-- .../lite/models/style_transfer/overview.ipynb | 44 +-- .../post_training_float16_quant.ipynb | 76 +--- .../lite/tutorials/pose_classification.ipynb | 124 ++----- .../clustering_comprehensive_guide.ipynb | 32 +- .../guide/clustering/clustering_example.ipynb | 64 +--- .../guide/combine/cqat_example.ipynb | 76 +--- .../guide/combine/pcqat_example.ipynb | 78 ++-- .../guide/combine/pqat_example.ipynb | 82 ++--- .../combine/sparse_clustering_example.ipynb | 74 +--- .../guide/pruning/comprehensive_guide.ipynb | 56 +-- .../pruning_for_on_device_inference.ipynb | 54 +-- .../pruning_with_sparsity_2_by_4.ipynb | 86 ++--- .../adversarial_keras_cnn_mnist.ipynb | 76 +--- .../A_Tour_of_TensorFlow_Probability.ipynb | 112 ++---- .../Bayesian_Gaussian_Mixture_Model.ipynb | 56 +-- .../Distributed_Inference_with_JAX.ipynb | 120 ++---- .../Gaussian_Process_Regression_In_TFP.ipynb | 52 +-- .../probability/examples/HLM_TFP_R_Stan.ipynb | 164 +++------ ...ibutionAutoBatched_A_Gentle_Tutorial.ipynb | 128 ++----- ..._Effects_Model_Variational_Inference.ipynb | 92 ++--- .../Linear_Mixed_Effects_Models.ipynb | 52 +-- .../Modeling_with_JointDistribution.ipynb | 340 +++++------------ .../examples/Multilevel_Modeling_Primer.ipynb | 229 ++++-------- ...tection_and_Bayesian_model_selection.ipynb | 80 +--- ...Optimizers_in_TensorFlow_Probability.ipynb | 20 +- .../examples/Probabilistic_Layers_VAE.ipynb | 72 +--- ...odels_with_non_Gaussian_observations.ipynb | 104 ++---- .../TFP_Release_Notebook_0_11_0.ipynb | 108 ++---- .../TFP_Release_Notebook_0_12_1.ipynb | 128 ++----- .../TFP_Release_Notebook_0_13_0.ipynb | 76 +--- .../TensorFlow_Distributions_Tutorial.ipynb | 168 +++------ ...ity_Case_Study_Covariance_Estimation.ipynb | 160 ++------ .../TensorFlow_Probability_on_JAX.ipynb | 112 ++---- ...ding_TensorFlow_Distributions_Shapes.ipynb | 112 ++---- ...l_Inference_with_Multipart_Bijectors.ipynb | 116 ++---- .../quantum/tutorials/hello_many_worlds.ipynb | 152 ++------ site/ko/quantum/tutorials/mnist.ipynb | 148 ++------ .../quantum_reinforcement_learning.ipynb | 128 ++----- site/ko/tensorboard/get_started.ipynb | 56 +-- site/ko/tensorboard/graphs.ipynb | 42 +-- .../hyperparameter_tuning_with_hparams.ipynb | 44 +-- site/ko/tensorboard/image_summaries.ipynb | 48 +-- site/ko/tensorboard/migrate.ipynb | 46 +-- site/ko/tensorboard/scalars_and_keras.ipynb | 66 +--- .../tensorboard/tbdev_getting_started.ipynb | 32 +- .../tensorboard_profiling_keras.ipynb | 64 +--- site/ko/tensorboard/text_summaries.ipynb | 46 +-- .../data_validation/tfdv_basic.ipynb | 78 ++-- .../tfx/tutorials/serving/rest_simple.ipynb | 72 +--- site/ko/tfx/tutorials/tfx/components.ipynb | 164 +++------ .../tfx/tutorials/tfx/components_keras.ipynb | 168 +++------ .../tfx/gcp/vertex_pipelines_bq.ipynb | 72 +--- .../tfx/gcp/vertex_pipelines_simple.ipynb | 68 +--- .../vertex_pipelines_vertex_training.ipynb | 80 +--- .../tfx/neural_structured_learning.ipynb | 156 ++------ .../ko/tfx/tutorials/tfx/penguin_simple.ipynb | 52 +-- site/ko/tfx/tutorials/tfx/penguin_tfdv.ipynb | 88 ++--- site/ko/tfx/tutorials/tfx/penguin_tfma.ipynb | 56 +-- .../tfx/tutorials/tfx/penguin_transform.ipynb | 80 ++-- .../tfx/python_function_component.ipynb | 64 +--- site/ko/tfx/tutorials/tfx/recommenders.ipynb | 132 ++----- site/ko/tfx/tutorials/tfx/template_beam.ipynb | 72 +--- site/ko/tfx/tutorials/transform/census.ipynb | 246 ++++--------- site/ko/tfx/tutorials/transform/simple.ipynb | 100 ++--- .../ko/tutorials/audio/music_generation.ipynb | 196 +++------- .../audio/transfer_learning_audio.ipynb | 120 ++---- .../customization/custom_layers.ipynb | 72 +--- .../distribute/dtensor_keras_tutorial.ipynb | 104 ++---- .../distribute/dtensor_ml_tutorial.ipynb | 121 ++---- .../multi_worker_with_estimator.ipynb | 28 +- .../distribute/multi_worker_with_keras.ipynb | 148 ++------ .../tutorials/distribute/save_and_load.ipynb | 76 +--- .../estimator/keras_model_to_estimator.ipynb | 40 +- site/ko/tutorials/generative/cvae.ipynb | 80 +--- site/ko/tutorials/generative/cyclegan.ipynb | 128 ++----- site/ko/tutorials/generative/dcgan.ipynb | 116 ++---- site/ko/tutorials/generative/deepdream.ipynb | 80 +--- .../tutorials/generative/style_transfer.ipynb | 156 ++------ site/ko/tutorials/images/classification.ipynb | 152 ++------ site/ko/tutorials/images/cnn.ipynb | 48 +-- .../tutorials/images/data_augmentation.ipynb | 196 +++------- site/ko/tutorials/images/segmentation.ipynb | 128 ++----- .../images/transfer_learning_with_hub.ipynb | 144 ++------ site/ko/tutorials/keras/keras_tuner.ipynb | 52 +-- .../keras/overfit_and_underfit.ipynb | 168 +++------ site/ko/tutorials/keras/regression.ipynb | 232 +++--------- site/ko/tutorials/keras/save_and_load.ipynb | 104 ++---- .../tutorials/keras/text_classification.ipynb | 132 ++----- .../keras/text_classification_with_hub.ipynb | 52 +-- site/ko/tutorials/load_data/images.ipynb | 148 ++------ site/ko/tutorials/load_data/text.ipynb | 292 ++++----------- site/ko/tutorials/load_data/tfrecord.ipynb | 152 ++------ site/ko/tutorials/quickstart/beginner.ipynb | 52 +-- .../reinforcement_learning/actor_critic.ipynb | 56 +-- .../preprocessing_layers.ipynb | 112 ++---- .../ko/xla/tutorials/autoclustering_xla.ipynb | 32 +- 123 files changed, 3060 insertions(+), 9008 deletions(-) diff --git a/site/ko/addons/tutorials/average_optimizers_callback.ipynb b/site/ko/addons/tutorials/average_optimizers_callback.ipynb index 86ad71cce9..d5e99bc117 100644 --- a/site/ko/addons/tutorials/average_optimizers_callback.ipynb +++ b/site/ko/addons/tutorials/average_optimizers_callback.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "tuOe1ymfHZPu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -97,9 +95,7 @@ "metadata": { "id": "sXEOqj5cIgyW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install -U tensorflow-addons" ] @@ -110,9 +106,7 @@ "metadata": { "id": "IqR2PQG4ZaZ0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "import tensorflow_addons as tfa" @@ -124,9 +118,7 @@ "metadata": { "id": "4hnJ2rDpI38-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import numpy as np\n", "import os" @@ -147,9 +139,7 @@ "metadata": { "id": "KtylpxOmceaC" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def create_model(opt):\n", " model = tf.keras.models.Sequential([\n", @@ -181,9 +171,7 @@ "metadata": { "id": "mMOeXVmbdilM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#Load Fashion MNIST dataset\n", "train, test = tf.keras.datasets.fashion_mnist.load_data()\n", @@ -219,9 +207,7 @@ "metadata": { "id": "_Q76K1fNk7Va" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#Optimizers \n", "sgd = tf.keras.optimizers.SGD(0.01)\n", @@ -244,9 +230,7 @@ "metadata": { "id": "SnvZjt34qEHY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#Callback \n", "checkpoint_path = \"./training/cp-{epoch:04d}.ckpt\"\n", @@ -283,9 +267,7 @@ "metadata": { "id": "Xy8W4LYppadJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#Build Model\n", "model = create_model(sgd)\n", @@ -300,9 +282,7 @@ "metadata": { "id": "uU2iQ6HAZ6-E" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#Evalute results\n", "model.load_weights(checkpoint_dir)\n", @@ -326,9 +306,7 @@ "metadata": { "id": "--NIjBp-mhVb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#Build Model\n", "model = create_model(moving_avg_sgd)\n", @@ -343,9 +321,7 @@ "metadata": { "id": "zRAym9EBmnW9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#Evalute results\n", "model.load_weights(checkpoint_dir)\n", @@ -369,9 +345,7 @@ "metadata": { "id": "Ia7ALKefnXWQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#Build Model\n", "model = create_model(stocastic_avg_sgd)\n", @@ -386,9 +360,7 @@ "metadata": { "id": "EOT2E9NBoeHI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#Evalute results\n", "model.load_weights(checkpoint_dir)\n", diff --git a/site/ko/addons/tutorials/image_ops.ipynb b/site/ko/addons/tutorials/image_ops.ipynb index a0cf15f074..eb75c749eb 100644 --- a/site/ko/addons/tutorials/image_ops.ipynb +++ b/site/ko/addons/tutorials/image_ops.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "l-m8KQ-nxK5l" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -91,9 +89,7 @@ "metadata": { "id": "o_QTX_vHGbj7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install -U tensorflow-addons" ] @@ -104,9 +100,7 @@ "metadata": { "id": "5hVIKCrhWh4a" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "import numpy as np\n", @@ -138,9 +132,7 @@ "metadata": { "id": "IgUsVhBQ6dSg" }, - "outputs": [ - - ], + "outputs": [], "source": [ "img_path = tf.keras.utils.get_file('tensorflow.png','https://tensorflow.org/images/tf_logo.png')" ] @@ -169,9 +161,7 @@ "metadata": { "id": "NRlvNQdm1YI8" }, - "outputs": [ - - ], + "outputs": [], "source": [ "img_raw = tf.io.read_file(img_path)\n", "img = tf.io.decode_image(img_raw)\n", @@ -197,9 +187,7 @@ "metadata": { "id": "tbaIkUCS2eNv" }, - "outputs": [ - - ], + "outputs": [], "source": [ "bw_img = 1.0 - tf.image.rgb_to_grayscale(img)\n", "\n", @@ -233,9 +221,7 @@ "metadata": { "id": "SutWnbRoHl6i" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mean = tfa.image.mean_filter2d(img, filter_shape=11)\n", "_ = plt.imshow(mean)" @@ -258,9 +244,7 @@ "metadata": { "id": "9kxUES9sM8Jl" }, - "outputs": [ - - ], + "outputs": [], "source": [ "rotate = tfa.image.rotate(img, tf.constant(np.pi/8))\n", "_ = plt.imshow(rotate)" @@ -283,9 +267,7 @@ "metadata": { "id": "HTh1Qpps8Rg5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "transform = tfa.image.transform(img, [1.0, 1.0, -250, 0.0, 1.0, 0.0, 0.0, 0.0])\n", "_ = plt.imshow(transform)" @@ -308,9 +290,7 @@ "metadata": { "id": "zZBI-9XvBSuh" }, - "outputs": [ - - ], + "outputs": [], "source": [ "delta = 0.5\n", "lower_saturation = 0.1\n", @@ -338,9 +318,7 @@ "metadata": { "id": "vbCdwGtYChnQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "delta = 0.5\n", "saturation = 0.3\n", @@ -366,9 +344,7 @@ "metadata": { "id": "dG557eQDDtSK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "input_img = tf.image.convert_image_dtype(tf.expand_dims(img, 0), tf.dtypes.float32)\n", "\n", @@ -398,9 +374,7 @@ "metadata": { "id": "-OMh6oeRQaYQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "gray = tf.image.convert_image_dtype(bw_img,tf.uint8)\n", "# The op expects a batch of images, so add a batch dimension\n", @@ -414,9 +388,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "image_ops.ipynb", "toc_visible": true }, diff --git a/site/ko/addons/tutorials/networks_seq2seq_nmt.ipynb b/site/ko/addons/tutorials/networks_seq2seq_nmt.ipynb index 54b605df75..cf3ec3158e 100644 --- a/site/ko/addons/tutorials/networks_seq2seq_nmt.ipynb +++ b/site/ko/addons/tutorials/networks_seq2seq_nmt.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "wmYJlt6LWVOU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -109,9 +107,7 @@ "metadata": { "id": "tnxXKDjq3jEL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "import tensorflow_addons as tfa\n", @@ -160,9 +156,7 @@ "metadata": { "id": "PvRnGWnvXm6l" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def download_nmt():\n", " path_to_zip = tf.keras.utils.get_file(\n", @@ -193,9 +187,7 @@ "metadata": { "id": "JMAHz7kJXc5N" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class NMTDataset:\n", " def __init__(self, problem_type='en-spa'):\n", @@ -283,9 +275,7 @@ "metadata": { "id": "EIW4NVBmJ25k" }, - "outputs": [ - - ], + "outputs": [], "source": [ "BUFFER_SIZE = 32000\n", "BATCH_SIZE = 64\n", @@ -311,9 +301,7 @@ }, "execution_count": 7, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -338,9 +326,7 @@ "metadata": { "id": "TqHsArVZ3jFS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "vocab_inp_size = len(inp_lang.word_index)+1\n", "vocab_tar_size = len(targ_lang.word_index)+1\n", @@ -374,9 +360,7 @@ }, "execution_count": 9, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -392,9 +376,7 @@ "metadata": { "id": "nZ2rI24i3jFg" }, - "outputs": [ - - ], + "outputs": [], "source": [ "##### \n", "\n", @@ -459,9 +441,7 @@ "metadata": { "id": "yJ_B3mhW3jFk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class Decoder(tf.keras.Model):\n", " def __init__(self, vocab_size, embedding_dim, dec_units, batch_sz, attention_type='luong'):\n", @@ -568,9 +548,7 @@ "metadata": { "id": "WmTHr5iV3jFr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "optimizer = tf.keras.optimizers.Adam()\n", "\n", @@ -602,9 +580,7 @@ "metadata": { "id": "Zj8bXQTgNwrF" }, - "outputs": [ - - ], + "outputs": [], "source": [ "checkpoint_dir = './training_checkpoints'\n", "checkpoint_prefix = os.path.join(checkpoint_dir, \"ckpt\")\n", @@ -628,9 +604,7 @@ "metadata": { "id": "sC9ArXSsVfqn" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function\n", "def train_step(inp, targ, enc_hidden):\n", @@ -794,9 +768,7 @@ "metadata": { "id": "EbQpyYs13jF_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def evaluate_sentence(sentence):\n", " sentence = dataset_creator.preprocess_sentence(sentence)\n", @@ -870,9 +842,7 @@ }, "execution_count": 20, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -982,9 +952,7 @@ "metadata": { "id": "AJ-RTQ0hsJNL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def beam_evaluate_sentence(sentence, beam_width=3):\n", " sentence = dataset_creator.preprocess_sentence(sentence)\n", @@ -1049,9 +1017,7 @@ "metadata": { "id": "g_LvXGvX8X-O" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def beam_translate(sentence):\n", " result, beam_scores = beam_evaluate_sentence(sentence)\n", @@ -1120,9 +1086,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "networks_seq2seq_nmt.ipynb", "toc_visible": true }, diff --git a/site/ko/datasets/dataset_collections.ipynb b/site/ko/datasets/dataset_collections.ipynb index da93a4ea9a..a087c182e3 100644 --- a/site/ko/datasets/dataset_collections.ipynb +++ b/site/ko/datasets/dataset_collections.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "n25wrPRbfCGc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -86,9 +84,7 @@ "metadata": { "id": "1AnxnW65I_FC" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Use tfds-nightly to ensure access to the latest features.\n", "!pip install -q tfds-nightly tensorflow\n", @@ -110,9 +106,7 @@ "metadata": { "id": "-hxMPT0wIu3f" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import pprint\n", "\n", @@ -150,9 +144,7 @@ "metadata": { "id": "R14uGGzKItDz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tfds.list_dataset_collections()" ] @@ -174,9 +166,7 @@ "metadata": { "id": "leIwyl9aI3WA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "collection_loader = tfds.dataset_collection('xtreme')" ] @@ -196,9 +186,7 @@ "metadata": { "id": "pyILkuYJY6ts" }, - "outputs": [ - - ], + "outputs": [], "source": [ "collection_loader = tfds.dataset_collection('xtreme:1.0.0')" ] @@ -218,9 +206,7 @@ "metadata": { "id": "kwk4PVDoKEAC" }, - "outputs": [ - - ], + "outputs": [], "source": [ "collection_loader.print_info()" ] @@ -240,9 +226,7 @@ "metadata": { "id": "IxNJEie6K55T" }, - "outputs": [ - - ], + "outputs": [], "source": [ "collection_loader.print_datasets()" ] @@ -266,9 +250,7 @@ "metadata": { "id": "UP1nRj4ILwb6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "splits = collection_loader.load_dataset(\"ner\")\n", "\n", @@ -306,9 +288,7 @@ "metadata": { "id": "sEG5744Oh2vQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "datasets = collection_loader.load_datasets(['xnli', 'bucc'])\n", "\n", @@ -330,9 +310,7 @@ "metadata": { "id": "QX-M3xcjiM35" }, - "outputs": [ - - ], + "outputs": [], "source": [ "all_datasets = collection_loader.load_all_datasets()\n", "\n", @@ -370,9 +348,7 @@ "metadata": { "id": "TjgZSIlvfcSP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "collection_loader = tfds.dataset_collection('xtreme', loader_kwargs=dict(split='train', batch_size=10, try_gcs=False))" ] @@ -392,9 +368,7 @@ "metadata": { "id": "zrysflp-k1d3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "collection_loader.set_loader_kwargs(dict(split='train', batch_size=10, try_gcs=False))" ] @@ -414,9 +388,7 @@ "metadata": { "id": "rHSu-8GnlGTk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "dataset = collection_loader.load_dataset('ner', loader_kwargs=dict(split='train', batch_size=10, try_gcs=False))" ] @@ -435,9 +407,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "dataset_collections.ipynb", "toc_visible": true }, diff --git a/site/ko/datasets/overview.ipynb b/site/ko/datasets/overview.ipynb index 67c67921ed..310fa63738 100644 --- a/site/ko/datasets/overview.ipynb +++ b/site/ko/datasets/overview.ipynb @@ -61,9 +61,7 @@ "cellView": "both", "id": "boeZp0sYbO41" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install -q tfds-nightly tensorflow matplotlib" ] @@ -74,9 +72,7 @@ "metadata": { "id": "TTBSvHcSLBzc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", @@ -102,9 +98,7 @@ "metadata": { "id": "FAvbSVzjLCIb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tfds.list_builders()" ] @@ -131,9 +125,7 @@ "metadata": { "id": "dCou80mnLLPV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ds = tfds.load('mnist', split='train', shuffle_files=True)\n", "assert isinstance(ds, tf.data.Dataset)\n", @@ -172,9 +164,7 @@ "metadata": { "id": "2zN_jQ2ER40W" }, - "outputs": [ - - ], + "outputs": [], "source": [ "builder = tfds.builder('mnist')\n", "# 1. Create the tfrecord files (no-op if already exists)\n", @@ -220,9 +210,7 @@ "metadata": { "id": "JAGjXdk_bIYQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ds = tfds.load('mnist', split='train')\n", "ds = ds.take(1) # Only take a single example\n", @@ -260,9 +248,7 @@ "metadata": { "id": "nJ4O0xy3djfV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ds = tfds.load('mnist', split='train', as_supervised=True)\n", "ds = ds.take(1)\n", @@ -291,9 +277,7 @@ "metadata": { "id": "tzQTCUkAfe9R" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ds = tfds.load('mnist', split='train', as_supervised=True)\n", "ds = ds.take(1)\n", @@ -321,9 +305,7 @@ "metadata": { "id": "Gg8BNsv-UzFl" }, - "outputs": [ - - ], + "outputs": [], "source": [ "image, label = tfds.as_numpy(tfds.load(\n", " 'mnist',\n", @@ -361,9 +343,7 @@ "metadata": { "id": "ZyQzZ98bX3dM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ds = tfds.load('mnist', split='train')\n", "ds = ds.batch(32).prefetch(1)\n", @@ -420,9 +400,7 @@ "metadata": { "id": "FKouwN_yVSGQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ds, info = tfds.load('mnist', split='train', with_info=True)\n", "\n", @@ -446,9 +424,7 @@ "metadata": { "id": "DpE2FD56cSQR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ds, info = tfds.load('mnist', split='train', with_info=True)\n", "\n", @@ -476,9 +452,7 @@ "metadata": { "id": "UgLgtcd1ljzt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ds, info = tfds.load('mnist', with_info=True)" ] @@ -498,9 +472,7 @@ "metadata": { "id": "nmq97QkilxeL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "builder = tfds.builder('mnist')\n", "info = builder.info" @@ -521,9 +493,7 @@ "metadata": { "id": "O-wLIKD-mZQT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(info)" ] @@ -545,9 +515,7 @@ "metadata": { "id": "RcyZXncqoFab" }, - "outputs": [ - - ], + "outputs": [], "source": [ "info.features" ] @@ -567,9 +535,7 @@ "metadata": { "id": "HhfzBH6qowpz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(info.features[\"label\"].num_classes)\n", "print(info.features[\"label\"].names)\n", @@ -592,9 +558,7 @@ "metadata": { "id": "SergV_wQowLY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(info.features.shape)\n", "print(info.features.dtype)\n", @@ -619,9 +583,7 @@ "metadata": { "id": "FBbfwA8Sp4ax" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(info.splits)" ] @@ -641,9 +603,7 @@ "metadata": { "id": "fRBieOOquDzX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(list(info.splits.keys()))" ] @@ -663,9 +623,7 @@ "metadata": { "id": "-h_OSpRsqKpP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(info.splits['train'].num_examples)\n", "print(info.splits['train'].filenames)\n", @@ -687,9 +645,7 @@ "metadata": { "id": "HO5irBZ3uIzQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(info.splits['train[15%:75%]'].num_examples)\n", "print(info.splits['train[15%:75%]'].file_instructions)" @@ -753,9 +709,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "overview.ipynb", "toc_visible": true }, diff --git a/site/ko/datasets/tfless_tfds.ipynb b/site/ko/datasets/tfless_tfds.ipynb index 7d5661ea48..5d2a1d044d 100644 --- a/site/ko/datasets/tfless_tfds.ipynb +++ b/site/ko/datasets/tfless_tfds.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "2pHVBk_seED1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -130,9 +128,7 @@ "metadata": { "id": "c4COEsqIdvYH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install array_record\n", "!pip install tfds-nightly\n", @@ -179,9 +175,7 @@ "metadata": { "id": "9Tslzx0_eEWx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ds = tfds.data_source('fashion_mnist')" ] @@ -201,9 +195,7 @@ "metadata": { "id": "duHDKzXReIKB" }, - "outputs": [ - - ], + "outputs": [], "source": [ "builder = tfds.builder('fashion_mnist', file_format='array_record')\n", "builder.download_and_prepare()\n", @@ -236,9 +228,7 @@ "metadata": { "id": "mTfSzvaQkSd9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip uninstall -y tensorflow" ] @@ -249,9 +239,7 @@ "metadata": { "id": "3sT5AN7neNT9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%writefile no_tensorflow.py\n", "import os\n", @@ -276,9 +264,7 @@ "metadata": { "id": "FxohFdb3kSxh" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!python no_tensorflow.py" ] @@ -300,9 +286,7 @@ "metadata": { "id": "qtfl17SQeQ7F" }, - "outputs": [ - - ], + "outputs": [], "source": [ "len(ds['train'])" ] @@ -322,9 +306,7 @@ "metadata": { "id": "tFvT2Sx2eToh" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%timeit\n", "ds['train'][0]" @@ -345,9 +327,7 @@ "metadata": { "id": "cPJFa6aIeWcY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%timeit\n", "ds['train'][1000]" @@ -368,9 +348,7 @@ "metadata": { "id": "q7x5AEEaeZja" }, - "outputs": [ - - ], + "outputs": [], "source": [ "features = tfds.builder('fashion_mnist').info.features" ] @@ -390,9 +368,7 @@ "metadata": { "id": "Xk8Vc-y0edlb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "shape = features['image'].shape\n", "num_classes = features['label'].num_classes" @@ -415,9 +391,7 @@ "metadata": { "id": "ULjO-JDVefNf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for example in ds['train']:\n", " print(example)\n", @@ -464,9 +438,7 @@ "metadata": { "id": "3aKol1fDeyoK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install torch\n", "\n", @@ -489,9 +461,7 @@ "metadata": { "id": "_4P2JIrie23f" }, - "outputs": [ - - ], + "outputs": [], "source": [ "batch_size = 128\n", "train_sampler = torch.utils.data.RandomSampler(ds['train'], num_samples=5_000)\n", @@ -522,9 +492,7 @@ "metadata": { "id": "HcAmvMa-e42p" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class LinearClassifier(torch.nn.Module):\n", " def __init__(self, shape, num_classes):\n", diff --git a/site/ko/federated/tutorials/building_your_own_federated_learning_algorithm.ipynb b/site/ko/federated/tutorials/building_your_own_federated_learning_algorithm.ipynb index e031aa7bf2..83100506fa 100644 --- a/site/ko/federated/tutorials/building_your_own_federated_learning_algorithm.ipynb +++ b/site/ko/federated/tutorials/building_your_own_federated_learning_algorithm.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "0asMuNro71hA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -41,9 +39,9 @@ "source": [ "\n", " \n", - " \n", - " \n", " \n", "
TensorFlow.org에서 보기 Google Colab에서 실행\n", + " Google Colab에서 실행\n", " GitHub에서 소스 보기\n", + " GitHub에서 소스 보기\n", "노트북 다운로드
" @@ -66,9 +64,7 @@ "metadata": { "id": "ZrGitA_KnRO0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@test {\"skip\": true}\n", "!pip install --quiet --upgrade tensorflow-federated" @@ -80,9 +76,7 @@ "metadata": { "id": "HGTM6tWOLo8M" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "import tensorflow_federated as tff" @@ -135,9 +129,7 @@ "metadata": { "id": "-WdnFluLLo8P" }, - "outputs": [ - - ], + "outputs": [], "source": [ "emnist_train, emnist_test = tff.simulation.datasets.emnist.load_data()" ] @@ -157,9 +149,7 @@ "metadata": { "id": "Blrh8zJgLo8R" }, - "outputs": [ - - ], + "outputs": [], "source": [ "NUM_CLIENTS = 10\n", "BATCH_SIZE = 20\n", @@ -189,9 +179,7 @@ "metadata": { "id": "-vYM_IT7Lo8W" }, - "outputs": [ - - ], + "outputs": [], "source": [ "client_ids = sorted(emnist_train.client_ids)[:NUM_CLIENTS]\n", "federated_train_data = [preprocess(emnist_train.create_tf_dataset_for_client(x))\n", @@ -223,9 +211,7 @@ "metadata": { "id": "Yfld4oFNLo8Y" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def create_keras_model():\n", " initializer = tf.keras.initializers.GlorotNormal(seed=0)\n", @@ -251,9 +237,7 @@ "metadata": { "id": "SPwbipTNLo8a" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def model_fn():\n", " keras_model = create_keras_model()\n", @@ -320,9 +304,7 @@ "metadata": { "id": "ylLpRa7T5DDh" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def initialize_fn():\n", " model = model_fn()\n", @@ -346,9 +328,7 @@ "metadata": { "id": "IeHN-XLZfMso" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def next_fn(server_weights, federated_dataset):\n", " # Broadcast the server weights to the clients.\n", @@ -401,9 +381,7 @@ "metadata": { "id": "c5rHPKreLo8g" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function\n", "def client_update(model, dataset, server_weights, client_optimizer):\n", @@ -447,9 +425,7 @@ "metadata": { "id": "rYxErLvHLo8i" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function\n", "def server_update(model, mean_client_weights):\n", @@ -517,9 +493,7 @@ "metadata": { "id": "7EJY0MHpLo8l" }, - "outputs": [ - - ], + "outputs": [], "source": [ "federated_float_on_clients = tff.FederatedType(tf.float32, tff.CLIENTS)" ] @@ -551,9 +525,7 @@ }, "execution_count": 12, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -599,9 +571,7 @@ "metadata": { "id": "IfwXDNR1Lo8p" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tff.federated_computation(tff.FederatedType(tf.float32, tff.CLIENTS))\n", "def get_average_temperature(client_temperatures):\n", @@ -637,9 +607,7 @@ }, "execution_count": 14, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -674,9 +642,7 @@ }, "execution_count": 15, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -711,9 +677,7 @@ "metadata": { "id": "huz3mNmMLo8w" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tff.tf_computation(tf.float32)\n", "def add_half(x):\n", @@ -747,9 +711,7 @@ }, "execution_count": 17, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -775,9 +737,7 @@ "metadata": { "id": "pG6nw3wiLo80" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tff.federated_computation(tff.FederatedType(tf.float32, tff.CLIENTS))\n", "def add_half_on_clients(x):\n", @@ -811,9 +771,7 @@ }, "execution_count": 19, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -876,9 +834,7 @@ "metadata": { "id": "jJY9xUBZLo84" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tff.tf_computation\n", "def server_init():\n", @@ -901,9 +857,7 @@ "metadata": { "id": "m2hinzuRLo86" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tff.federated_computation\n", "def initialize_fn():\n", @@ -929,9 +883,7 @@ "metadata": { "id": "ph_noHN2Lo88" }, - "outputs": [ - - ], + "outputs": [], "source": [ "whimsy_model = model_fn()\n", "tf_dataset_type = tff.SequenceType(whimsy_model.input_spec)" @@ -964,9 +916,7 @@ }, "execution_count": 23, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -990,9 +940,7 @@ "metadata": { "id": "4yx6CExMLo8-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model_weights_type = server_init.type_signature.result" ] @@ -1024,9 +972,7 @@ }, "execution_count": 25, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1050,9 +996,7 @@ "metadata": { "id": "Q0W05pMWLo9A" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tff.tf_computation(tf_dataset_type, model_weights_type)\n", "def client_update_fn(tf_dataset, server_weights):\n", @@ -1076,9 +1020,7 @@ "metadata": { "id": "F4WvQtVzLo9B" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tff.tf_computation(model_weights_type)\n", "def server_update_fn(mean_client_weights):\n", @@ -1103,9 +1045,7 @@ "metadata": { "id": "ekPsA8AsLo9D" }, - "outputs": [ - - ], + "outputs": [], "source": [ "federated_server_type = tff.FederatedType(model_weights_type, tff.SERVER)\n", "federated_dataset_type = tff.FederatedType(tf_dataset_type, tff.CLIENTS)" @@ -1133,9 +1073,7 @@ "metadata": { "id": "Epc7MwfELo9G" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tff.federated_computation(federated_server_type, federated_dataset_type)\n", "def next_fn(server_weights, federated_dataset):\n", @@ -1170,9 +1108,7 @@ "metadata": { "id": "GxdWgEddLo9I" }, - "outputs": [ - - ], + "outputs": [], "source": [ "federated_algorithm = tff.templates.IterativeProcess(\n", " initialize_fn=initialize_fn,\n", @@ -1207,9 +1143,7 @@ }, "execution_count": 31, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1245,9 +1179,7 @@ }, "execution_count": 32, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1291,9 +1223,7 @@ "metadata": { "id": "EdNgYoIwLo9P" }, - "outputs": [ - - ], + "outputs": [], "source": [ "central_emnist_test = emnist_test.create_tf_dataset_from_all_clients()\n", "central_emnist_test = preprocess(central_emnist_test)" @@ -1314,9 +1244,7 @@ "metadata": { "id": "I5UEX4EWLo9Q" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def evaluate(server_state):\n", " keras_model = create_keras_model()\n", @@ -1372,9 +1300,7 @@ "metadata": { "id": "v1zBlzFILo9U" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for round in range(15):\n", " server_state = federated_algorithm.next(server_state, federated_train_data)" @@ -1446,9 +1372,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "building_your_own_federated_learning_algorithm.ipynb", "toc_visible": true }, diff --git a/site/ko/guide/core/matrix_core.ipynb b/site/ko/guide/core/matrix_core.ipynb index a6455e104b..72f2254200 100644 --- a/site/ko/guide/core/matrix_core.ipynb +++ b/site/ko/guide/core/matrix_core.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "AwOEIRJC6Une" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -93,9 +91,7 @@ "metadata": { "id": "1rRo8oNqZ-Rj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import matplotlib\n", "from matplotlib.image import imread\n", @@ -111,9 +107,7 @@ "metadata": { "id": "9xQKvCJ85kCQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "print(tf.__version__)" @@ -165,9 +159,7 @@ "metadata": { "id": "C3QAcgyoeIpv" }, - "outputs": [ - - ], + "outputs": [], "source": [ "A = tf.random.uniform(shape=[40,30])\n", "# Compute the SVD factorization\n", @@ -199,9 +191,7 @@ "metadata": { "id": "TPE6QeMtADUn" }, - "outputs": [ - - ], + "outputs": [], "source": [ "A_svd = tf.einsum('s,us,vs -> uv',s,U,V)\n", "print('\\nReconstructed Matrix, A_svd', A_svd)" @@ -252,9 +242,7 @@ "metadata": { "id": "2oY3pMPagJrO" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def rank_r_approx(s, U, V, r, verbose=False):\n", " # Compute the matrices necessary for a rank-r approximation\n", @@ -284,9 +272,7 @@ "metadata": { "id": "O3ZRkYCkX2FQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(f\"Original Size of A: {tf.size(A)}\")\n", "s, U, V = tf.linalg.svd(A)" @@ -298,9 +284,7 @@ "metadata": { "id": "S1DR83VMX4cM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Rank-15 approximation\n", "A_15, A_15_size = rank_r_approx(s, U, V, 15, verbose = True)\n", @@ -313,9 +297,7 @@ "metadata": { "id": "KgFT70XFX57E" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Rank-3 approximation\n", "A_3, A_3_size = rank_r_approx(s, U, V, 3, verbose = True)\n", @@ -350,9 +332,7 @@ "metadata": { "id": "OVsZOQUAZ2C7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "img_link = \"https://imagen.research.google/main_gallery_images/a-photo-of-a-corgi-dog-riding-a-bike-in-times-square.jpg\"\n", "img_path = requests.get(img_link, stream=True).raw\n", @@ -366,9 +346,7 @@ "metadata": { "id": "Qvs7uftcZ54x" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def show_img(I):\n", " # Display the image in matplotlib\n", @@ -383,9 +361,7 @@ "metadata": { "id": "ZbesXO3HZ6Qs" }, - "outputs": [ - - ], + "outputs": [], "source": [ "show_img(I)" ] @@ -407,9 +383,7 @@ "metadata": { "id": "i7DDp0h7oSIk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def compress_image(I, r, verbose=False):\n", " # Compress an image with the SVD given a rank \n", @@ -452,9 +426,7 @@ "metadata": { "id": "7GlKkVLGDjre" }, - "outputs": [ - - ], + "outputs": [], "source": [ "I_100, I_100_prop = compress_image(I, 100, verbose=True)" ] @@ -465,9 +437,7 @@ "metadata": { "id": "XdvUkF5_E75D" }, - "outputs": [ - - ], + "outputs": [], "source": [ "I_50, I_50_prop = compress_image(I, 50, verbose=True)" ] @@ -478,9 +448,7 @@ "metadata": { "id": "MsCNZ8416Sbk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "I_10, I_10_prop = compress_image(I, 10, verbose=True)" ] @@ -513,9 +481,7 @@ "metadata": { "id": "O1ariNQe6Wbl" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plt.figure(figsize=(11,6))\n", "plt.plot([100, 50, 10], [I_100_prop, I_50_prop, I_10_prop])\n", @@ -557,9 +523,7 @@ "metadata": { "id": "viVO-I60QynI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def compress_image_with_factor(I, compression_factor, verbose=False):\n", " # Returns a compressed image based on a desired compression factor\n", @@ -584,9 +548,7 @@ "metadata": { "id": "HVeeloIwQ1b6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "compression_factor = 0.15\n", "I_r_img = compress_image_with_factor(I, compression_factor, verbose=True)" @@ -609,9 +571,7 @@ "metadata": { "id": "CteJ6VbKlndu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def viz_energy(I):\n", " # Visualize the energy captured based on rank\n", @@ -635,9 +595,7 @@ "metadata": { "id": "Vl9PKow-GgCp" }, - "outputs": [ - - ], + "outputs": [], "source": [ "viz_energy(I)" ] @@ -657,9 +615,7 @@ "metadata": { "id": "fum5Cvm7R5vH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def compress_image_with_energy(I, energy_factor, verbose=False):\n", " # Returns a compressed image based on a desired energy factor\n", @@ -693,9 +649,7 @@ "metadata": { "id": "xDXBaZQ4c5jF" }, - "outputs": [ - - ], + "outputs": [], "source": [ "energy_factor = 0.75\n", "I_r_img = compress_image_with_energy(I, energy_factor, verbose=True)" @@ -722,9 +676,7 @@ "metadata": { "id": "hctOvN8BckiS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "s, U, V = tf.linalg.svd(A)\n", "A_10, A_10_size = rank_r_approx(s, U, V, 10)\n", @@ -754,9 +706,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "matrix_core.ipynb", "toc_visible": true }, diff --git a/site/ko/guide/core/optimizers_core.ipynb b/site/ko/guide/core/optimizers_core.ipynb index db879c1225..54bad645cb 100644 --- a/site/ko/guide/core/optimizers_core.ipynb +++ b/site/ko/guide/core/optimizers_core.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "AwOEIRJC6Une" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -95,9 +93,7 @@ "metadata": { "id": "d9idwpXCltUl" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import matplotlib\n", "from matplotlib import pyplot as plt\n", @@ -111,9 +107,7 @@ "metadata": { "id": "9xQKvCJ85kCQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "print(tf.__version__)\n", @@ -138,9 +132,7 @@ "metadata": { "id": "MWjmUmeOQFFN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class GradientDescent(tf.Module):\n", "\n", @@ -176,9 +168,7 @@ "metadata": { "id": "VCtJaUo6Ry8V" }, - "outputs": [ - - ], + "outputs": [], "source": [ "x_vals = tf.linspace(-2, 2, 201)\n", "x_vals = tf.cast(x_vals, tf.float32)\n", @@ -218,9 +208,7 @@ "metadata": { "id": "SLQTc41ouv0F" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def convergence_test(optimizer, loss_fn, grad_fn=grad, init_val=2., max_iters=2000):\n", " # Function for optimizer convergence test\n", @@ -271,9 +259,7 @@ "metadata": { "id": "lWRn8c91mqB0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "param_map_gd = {}\n", "learning_rates = [1e-3, 1e-2, 1e-1]\n", @@ -297,9 +283,7 @@ "metadata": { "id": "piffzGHI_u5G" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def viz_paths(param_map, x_vals, loss_fn, title, max_iters=2000):\n", " # Creating a controur plot of the loss function\n", @@ -328,9 +312,7 @@ "metadata": { "id": "Ssyj2sO4BcNY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "viz_paths(param_map_gd, x_vals, loss, \"Gradient descent\")" ] @@ -373,9 +355,7 @@ "metadata": { "id": "rOBY8Tz4S0dX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class Momentum(tf.Module):\n", "\n", @@ -409,9 +389,7 @@ "metadata": { "id": "tA6oQL-sW2xg" }, - "outputs": [ - - ], + "outputs": [], "source": [ "param_map_mtm = {}\n", "learning_rates = [1e-3, 1e-2, 1e-1]\n", @@ -436,9 +414,7 @@ "metadata": { "id": "qbW1eEKaX3T9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "viz_paths(param_map_mtm, x_vals, loss, \"Momentum\")" ] @@ -505,9 +481,7 @@ "metadata": { "id": "hm5vffRJRsEc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class Adam(tf.Module):\n", " \n", @@ -561,9 +535,7 @@ "metadata": { "id": "GXHCxtemFBpR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "param_map_adam = {}\n", "learning_rates = [1e-3, 1e-2, 1e-1]\n", @@ -587,9 +559,7 @@ "metadata": { "id": "ctvOUmlzFK8s" }, - "outputs": [ - - ], + "outputs": [], "source": [ "viz_paths(param_map_adam, x_vals, loss, \"Adam\")" ] @@ -620,9 +590,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "optimizers_core.ipynb", "toc_visible": true }, diff --git a/site/ko/guide/core/quickstart_core.ipynb b/site/ko/guide/core/quickstart_core.ipynb index 04ac4359d8..3d06d62e8a 100644 --- a/site/ko/guide/core/quickstart_core.ipynb +++ b/site/ko/guide/core/quickstart_core.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "BZSlp3DAjdYf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -89,9 +87,7 @@ "metadata": { "id": "0trJmd6DjqBZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "import pandas as pd\n", @@ -121,9 +117,7 @@ "metadata": { "id": "HglhDsUfrJ98" }, - "outputs": [ - - ], + "outputs": [], "source": [ "url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data'\n", "column_names = ['MPG', 'Cylinders', 'Displacement', 'Horsepower', 'Weight',\n", @@ -152,9 +146,7 @@ "metadata": { "id": "0mJU4kt6YiAp" }, - "outputs": [ - - ], + "outputs": [], "source": [ "dataset_shuffled = tf.random.shuffle(dataset_tf, seed=22)\n", "train_data, test_data = dataset_shuffled[100:], dataset_shuffled[:100]\n", @@ -177,9 +169,7 @@ "metadata": { "id": "_B8N9IV1i6IV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def onehot_origin(x):\n", " origin = tf.cast(x[:, -1], tf.int32)\n", @@ -207,9 +197,7 @@ "metadata": { "id": "dJJFdvqydhyp" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class Normalize(tf.Module):\n", " def __init__(self, x):\n", @@ -232,9 +220,7 @@ "metadata": { "id": "5BONV6fYYwZb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "norm_x = Normalize(x_train_ohe)\n", "norm_y = Normalize(y_train)\n", @@ -270,9 +256,7 @@ "metadata": { "id": "h3IKyzTCDNGo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class LinearRegression(tf.Module):\n", "\n", @@ -308,9 +292,7 @@ "metadata": { "id": "OeOrNdnkEEcR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "lin_reg = LinearRegression()\n", "prediction = lin_reg(x_train_norm[:1])\n", @@ -346,9 +328,7 @@ "metadata": { "id": "8tYNVUkmw35s" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def mse_loss(y_pred, y):\n", " return tf.reduce_mean(tf.square(y_pred - y))" @@ -371,9 +351,7 @@ "metadata": { "id": "kxST2w_Nq0C5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "batch_size = 64\n", "train_dataset = tf.data.Dataset.from_tensor_slices((x_train_norm, y_train_norm))\n", @@ -399,9 +377,7 @@ "metadata": { "id": "y7suUbJXVLqP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Set training parameters\n", "epochs = 100\n", @@ -459,9 +435,7 @@ "metadata": { "id": "F7dTAzgHDUh7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "matplotlib.rcParams['figure.figsize'] = [9, 6]\n", "\n", @@ -504,9 +478,7 @@ "metadata": { "id": "g-uOrGa9ZehG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class ExportModule(tf.Module):\n", " def __init__(self, model, extract_features, norm_x, norm_y):\n", @@ -532,9 +504,7 @@ "metadata": { "id": "YPYYLQ8EZiU8" }, - "outputs": [ - - ], + "outputs": [], "source": [ "lin_reg_export = ExportModule(model=lin_reg,\n", " extract_features=onehot_origin,\n", @@ -557,9 +527,7 @@ "metadata": { "id": "K1IvMoHbptht" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tempfile\n", "import os\n", @@ -575,9 +543,7 @@ "metadata": { "id": "rYb6DrEH0GMv" }, - "outputs": [ - - ], + "outputs": [], "source": [ "lin_reg_loaded = tf.saved_model.load(save_path)\n", "test_preds = lin_reg_loaded(x_test)\n", diff --git a/site/ko/guide/dtensor_overview.ipynb b/site/ko/guide/dtensor_overview.ipynb index 61374bb6b0..44b39c15f6 100644 --- a/site/ko/guide/dtensor_overview.ipynb +++ b/site/ko/guide/dtensor_overview.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "tuOe1ymfHZPu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -90,9 +88,7 @@ "metadata": { "id": "OKaPw8vwwZAC" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install --quiet --upgrade --pre tensorflow" ] @@ -114,9 +110,7 @@ "metadata": { "id": "Q92lo0zjwej8" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "from tensorflow.experimental import dtensor\n", @@ -182,9 +176,7 @@ "metadata": { "id": "QLH5fgdBmA58" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mesh_1d = dtensor.create_mesh([('x', 6)], devices=DEVICES)\n", "print(mesh_1d)" @@ -207,9 +199,7 @@ "metadata": { "id": "op6TmKUQE-sZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mesh_2d = dtensor.create_mesh([('x', 3), ('y', 2)], devices=DEVICES)\n", "print(mesh_2d)" @@ -258,9 +248,7 @@ "metadata": { "id": "-a3EnmZag6x1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "layout = dtensor.Layout([dtensor.UNSHARDED, dtensor.UNSHARDED], mesh_1d)" ] @@ -283,9 +271,7 @@ "metadata": { "id": "7BgqL0jUvV5a" }, - "outputs": [ - - ], + "outputs": [], "source": [ "layout = dtensor.Layout([dtensor.UNSHARDED, 'x'], mesh_1d)" ] @@ -305,7 +291,6 @@ "id": "Eyp_qOSyvieo" }, "source": [ - "\n", "\"메시 \n" ] }, @@ -315,9 +300,7 @@ "metadata": { "id": "p8OrehEuhPbS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "layout = dtensor.Layout(['y', 'x'], mesh_2d)" ] @@ -340,9 +323,7 @@ "metadata": { "id": "IkWe6mVl7uRb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "layout = dtensor.Layout([\"x\", dtensor.UNSHARDED], mesh_2d)" ] @@ -386,9 +367,7 @@ "metadata": { "id": "s6aws-b8dN9L" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def dtensor_from_array(arr, layout, shape=None, dtype=None):\n", " \"\"\"Convert a DTensor from something that looks like an array or Tensor.\n", @@ -431,9 +410,7 @@ "metadata": { "id": "mQu_nScGUvYH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mesh = dtensor.create_mesh([(\"x\", 6)], devices=DEVICES)\n", "layout = dtensor.Layout([dtensor.UNSHARDED], mesh)\n", @@ -463,9 +440,7 @@ "metadata": { "id": "dCSFyaAjmzGu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(dtensor.fetch_layout(my_first_dtensor))\n", "assert layout == dtensor.fetch_layout(my_first_dtensor)" @@ -492,9 +467,7 @@ "metadata": { "id": "BGbjqVAOnXMk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for component_tensor in dtensor.unpack(my_first_dtensor):\n", " print(\"Device:\", component_tensor.device, \",\", component_tensor)" @@ -526,9 +499,7 @@ "metadata": { "id": "9lT-6qQwxOgf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "packed_dtensor = dtensor.pack(\n", " [[0, 1], [0, 1], [0, 1],\n", @@ -557,9 +528,7 @@ "metadata": { "id": "KWb9Ae0VJ-Rc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mesh = dtensor.create_mesh([(\"x\", 3), (\"y\", 2)], devices=DEVICES)" ] @@ -584,9 +553,7 @@ "metadata": { "id": "ax_ZHouJp1MX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "fully_sharded_dtensor = dtensor_from_array(\n", " tf.reshape(tf.range(6), (3, 2)),\n", @@ -616,9 +583,7 @@ "metadata": { "id": "xmyC6H6Ec90P" }, - "outputs": [ - - ], + "outputs": [], "source": [ "fully_replicated_dtensor = dtensor_from_array(\n", " tf.reshape(tf.range(6), (3, 2)),\n", @@ -655,9 +620,7 @@ "metadata": { "id": "DygnbkQ1Lu42" }, - "outputs": [ - - ], + "outputs": [], "source": [ "hybrid_sharded_dtensor = dtensor_from_array(\n", " tf.reshape(tf.range(6), (3, 2)),\n", @@ -695,9 +658,7 @@ "metadata": { "id": "hNdwmnL0jAXS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(fully_replicated_dtensor.numpy())\n", "\n", @@ -773,9 +734,7 @@ "metadata": { "id": "TiZf2J9JNd2D" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mesh = dtensor.create_mesh([(\"x\", 6)], devices=DEVICES)\n", "layout = dtensor.Layout([dtensor.UNSHARDED, dtensor.UNSHARDED], mesh)\n", @@ -814,9 +773,7 @@ "metadata": { "id": "EyVAUvMePbms" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mesh = dtensor.create_mesh([(\"x\", 3), (\"y\", 2)], devices=DEVICES)\n", "a_layout = dtensor.Layout([dtensor.UNSHARDED, 'x'], mesh)\n", @@ -848,9 +805,7 @@ "metadata": { "id": "0PYqe0neiOpR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mesh = dtensor.create_mesh([(\"x\", 3), (\"y\", 2)], devices=DEVICES)\n", "\n", @@ -888,9 +843,7 @@ "metadata": { "id": "J0jo_8NPtJiO" }, - "outputs": [ - - ], + "outputs": [], "source": [ "help(dtensor.call_with_layout)" ] @@ -923,9 +876,7 @@ "metadata": { "id": "G1CuKYSFtFeM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "help(tf.ones)" ] @@ -936,9 +887,7 @@ "metadata": { "id": "2m_EAwy-ozOh" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mesh = dtensor.create_mesh([(\"x\", 3), (\"y\", 2)], devices=DEVICES)\n", "ones = dtensor.call_with_layout(tf.ones, dtensor.Layout(['x', 'y'], mesh), shape=(6, 4))\n", @@ -962,9 +911,7 @@ "metadata": { "id": "H8BQSTRFtCih" }, - "outputs": [ - - ], + "outputs": [], "source": [ "help(tf.random.stateless_normal)" ] @@ -975,9 +922,7 @@ "metadata": { "id": "TvP81eYopSPm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ones = dtensor.call_with_layout(\n", " tf.function(tf.random.stateless_normal),\n", @@ -1002,9 +947,7 @@ "metadata": { "id": "LbAtKrSkpOaq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ones = dtensor.call_with_layout(\n", " tf.function(tf.ones),\n", @@ -1032,9 +975,7 @@ "metadata": { "id": "awRPuR26P0Sc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mesh = dtensor.create_mesh([(\"x\", 6)], devices=DEVICES)\n", "layout = dtensor.Layout([dtensor.UNSHARDED, dtensor.UNSHARDED], mesh)\n", @@ -1066,9 +1007,7 @@ "metadata": { "id": "adxFw9wJpqQQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "a = dtensor.call_with_layout(tf.ones, layout=layout, shape=(64, 32))\n", "b = v + a # add DVariable and DTensor\n", @@ -1090,9 +1029,7 @@ "metadata": { "id": "oYwfiyw5P94U" }, - "outputs": [ - - ], + "outputs": [], "source": [ "v.assign(a) # assign a DTensor to a DVariable\n", "print(a)" @@ -1113,9 +1050,7 @@ "metadata": { "id": "3pckUugYP_r-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# variable's layout is immutable.\n", "another_mesh = dtensor.create_mesh([(\"x\", 3), (\"y\", 2)], devices=DEVICES)\n", @@ -1142,9 +1077,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "dtensor_overview.ipynb", "toc_visible": true }, diff --git a/site/ko/guide/migrate/tf1_vs_tf2.ipynb b/site/ko/guide/migrate/tf1_vs_tf2.ipynb index 9a276ea682..27659dbf55 100644 --- a/site/ko/guide/migrate/tf1_vs_tf2.ipynb +++ b/site/ko/guide/migrate/tf1_vs_tf2.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "tuOe1ymfHZPu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -721,9 +719,7 @@ "metadata": { "id": "QF4un9UpVTRA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf" ] @@ -734,9 +730,7 @@ "metadata": { "id": "PbpD-kHOZR4A" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Create a shape and choose an index\n", "i = 0\n", @@ -765,9 +759,7 @@ "metadata": { "id": "KuR73QGEeNdH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "value = shape[i]\n", "value" @@ -796,9 +788,7 @@ "metadata": { "id": "y6s0vuuprJfc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for value in shape:\n", " print(value)" @@ -826,9 +816,7 @@ "metadata": { "id": "LpViGEcUZDGX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "other_dim = 16\n", "Dimension = tf.compat.v1.Dimension\n", @@ -846,9 +834,7 @@ "metadata": { "id": "GaiGe36dOdZ_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "shape = tf.TensorShape(None)\n", "\n", @@ -872,9 +858,7 @@ "metadata": { "id": "-Ow1ndKpOnJd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(bool(tf.TensorShape([]))) # Scalar\n", "print(bool(tf.TensorShape([0]))) # 0-length vector\n", @@ -903,9 +887,7 @@ "metadata": { "id": "r18f8JAGsQi6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "try:\n", " # Create a shape and choose an index\n", @@ -922,9 +904,7 @@ "metadata": { "id": "t9flHru1uIdT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "try:\n", " # Create a shape and choose an index\n", @@ -965,9 +945,7 @@ "metadata": { "id": "dkGPGpEZ5DI-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf.compat.v1.disable_tensor_equality()\n", "x = tf.Variable(0.0)\n", @@ -991,9 +969,7 @@ "metadata": { "id": "V5P_Rwy-zxVE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf.compat.v1.enable_tensor_equality()\n", "x = tf.Variable(0.0)\n", @@ -1017,9 +993,7 @@ "metadata": { "id": "iEjXVxlu4uxo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf.compat.v1.enable_tensor_equality()\n", "x = tf.Variable(0.0)\n", @@ -1052,9 +1026,7 @@ "metadata": { "id": "-TR1KfJu462w" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf.compat.v1.enable_tensor_equality()\n", "x = tf.Variable(0.0)\n", @@ -1081,9 +1053,7 @@ "metadata": { "id": "p-1kVPs01ZuU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf.compat.v1.enable_tensor_equality()\n", "x = tf.Variable(0.0)\n", @@ -1109,9 +1079,7 @@ "metadata": { "id": "DwRZMYV06M7q" }, - "outputs": [ - - ], + "outputs": [], "source": [ "referenced_var = x.ref().deref()\n", "assert referenced_var is x\n", @@ -1133,9 +1101,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "tf1_vs_tf2.ipynb", "toc_visible": true }, diff --git a/site/ko/guide/migrate/validate_correctness.ipynb b/site/ko/guide/migrate/validate_correctness.ipynb index 6c96e60ce9..054607d943 100644 --- a/site/ko/guide/migrate/validate_correctness.ipynb +++ b/site/ko/guide/migrate/validate_correctness.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "FlUw7tSKbtg4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -87,9 +85,7 @@ "metadata": { "id": "FkHX044DzVsd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip uninstall -y -q tensorflow" ] @@ -100,9 +96,7 @@ "metadata": { "id": "M1ZgieHtyzKI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Install tf-nightly as the DeterministicRandomTestTool is available only in\n", "# Tensorflow 2.8\n", @@ -115,9 +109,7 @@ "metadata": { "id": "ohYETq4NCX4J" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install -q tf_slim" ] @@ -128,9 +120,7 @@ "metadata": { "id": "MFey2HxcktP6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "import tensorflow.compat.v1 as v1\n", @@ -149,9 +139,7 @@ "metadata": { "id": "OriidSSAmRtW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!git clone --depth=1 https://github.com/tensorflow/models.git\n", "import models.research.slim.nets.inception_resnet_v2 as inception" @@ -172,9 +160,7 @@ "metadata": { "id": "IijQZtxeaErg" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# TF1 Inception resnet v2 forward pass based on slim layers\n", "def inception_resnet_v2(inputs, num_classes, is_training):\n", @@ -189,9 +175,7 @@ "metadata": { "id": "Z_-Oxg9OlSd4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class InceptionResnetV2(tf.keras.layers.Layer):\n", " \"\"\"Slim InceptionResnetV2 forward pass as a Keras layer\"\"\"\n", @@ -245,9 +229,7 @@ "metadata": { "id": "VMTfTXC0zW97" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@contextmanager\n", "def assert_no_variable_creations():\n", @@ -292,9 +274,7 @@ "metadata": { "id": "O9FAGotiuLbK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = InceptionResnetV2(1000)\n", "height, width = 299, 299\n", @@ -326,9 +306,7 @@ "metadata": { "id": "gXqhPQWWtMAw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class BrokenScalingLayer(tf.keras.layers.Layer):\n", " \"\"\"Scaling layer that incorrectly creates new weights each time:\"\"\"\n", @@ -346,9 +324,7 @@ "metadata": { "id": "ztUKlMdGvHSq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = BrokenScalingLayer()\n", "inputs = tf.ones( (1, height, width, 3))\n", @@ -368,9 +344,7 @@ "metadata": { "id": "6VyfMJ50vZqZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = BrokenScalingLayer()\n", "inputs = tf.ones( (1, height, width, 3))\n", @@ -398,9 +372,7 @@ "metadata": { "id": "FN1Oa10iviv8" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class FixedScalingLayer(tf.keras.layers.Layer):\n", " \"\"\"Scaling layer that incorrectly creates new weights each time:\"\"\"\n", @@ -460,9 +432,7 @@ "metadata": { "id": "m_aqag5fpun5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Build the forward pass inside a TF1.x graph, and \n", "# get the counts, shapes, and names of the variables\n", @@ -494,9 +464,7 @@ "metadata": { "id": "S7ND-lBSqmnE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "height, width = 299, 299\n", "num_classes = 1000\n", @@ -523,9 +491,7 @@ "metadata": { "id": "pY2P_4wqsOYw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Verify that the variable counts, names, and shapes all match:\n", "assert num_tf1_variables == num_tf2_variables\n", @@ -580,9 +546,7 @@ "metadata": { "id": "kL4PzD2Cxzmp" }, - "outputs": [ - - ], + "outputs": [], "source": [ "graph = tf.Graph()\n", "with graph.as_default(), tf.compat.v1.Session(graph=graph) as sess:\n", @@ -621,9 +585,7 @@ "metadata": { "id": "kb086gJwzsNo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "height, width = 299, 299\n", "num_classes = 1000\n", @@ -652,9 +614,7 @@ "metadata": { "id": "CUfWqlgIK6ej" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Create a dict of tolerance values\n", "tol_dict={'rtol':1e-06, 'atol':1e-05}" @@ -666,9 +626,7 @@ "metadata": { "id": "R-C07eTo0WTr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Verify that the regularization loss and output both match\n", "# when we fix the weights and avoid randomness by running inference:\n", @@ -744,9 +702,7 @@ "metadata": { "id": "DDFfjrbXEWED" }, - "outputs": [ - - ], + "outputs": [], "source": [ "random_tool = v1.keras.utils.DeterministicRandomTestTool()\n", "with random_tool.scope():\n", @@ -769,9 +725,7 @@ "metadata": { "id": "o9bkdPuTFpYr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "random_tool = v1.keras.utils.DeterministicRandomTestTool()\n", "with random_tool.scope():\n", @@ -791,9 +745,7 @@ "metadata": { "id": "qRJYFydsGIbF" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Demonstrate that the generated random numbers match\n", "np.testing.assert_allclose(graph_a, a.numpy(), **tol_dict)\n", @@ -816,9 +768,7 @@ "metadata": { "id": "IdxV89q2WPid" }, - "outputs": [ - - ], + "outputs": [], "source": [ "np.testing.assert_allclose(b.numpy(), c.numpy(), **tol_dict)" ] @@ -840,9 +790,7 @@ "metadata": { "id": "L-AeD148VygJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "random_tool = v1.keras.utils.DeterministicRandomTestTool(mode='num_random_ops')\n", "with random_tool.scope():\n", @@ -865,9 +813,7 @@ "metadata": { "id": "CedD41NuVygK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "random_tool = v1.keras.utils.DeterministicRandomTestTool(mode='num_random_ops')\n", "with random_tool.scope():\n", @@ -887,9 +833,7 @@ "metadata": { "id": "5We2xSnLVygL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Demonstrate that the generated random numbers match\n", "np.testing.assert_allclose(graph_a, a.numpy(), **tol_dict)\n", @@ -903,9 +847,7 @@ "metadata": { "id": "BBFG1xehWneM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Demonstrate that with the 'num_random_ops' mode,\n", "# b & c took on different values even though\n", @@ -928,9 +870,7 @@ "metadata": { "id": "cZt__ElEIDl_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "random_tool = v1.keras.utils.DeterministicRandomTestTool(mode='num_random_ops')\n", "with random_tool.scope():\n", @@ -965,9 +905,7 @@ "metadata": { "id": "33RCSICuJEyV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "random_tool = v1.keras.utils.DeterministicRandomTestTool(mode='num_random_ops')\n", "with random_tool.scope():\n", @@ -995,9 +933,7 @@ "metadata": { "id": "6W4sS_wOM8CH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "random_tool = v1.keras.utils.DeterministicRandomTestTool(mode='num_random_ops')\n", "with random_tool.scope():\n", @@ -1036,9 +972,7 @@ "metadata": { "id": "GmBgg5hzNa5H" }, - "outputs": [ - - ], + "outputs": [], "source": [ "random_tool = v1.keras.utils.DeterministicRandomTestTool(mode='num_random_ops')\n", "with random_tool.scope():\n", @@ -1074,9 +1008,7 @@ "metadata": { "id": "8TWOrflkPa7T" }, - "outputs": [ - - ], + "outputs": [], "source": [ "random_tool = v1.keras.utils.DeterministicRandomTestTool(mode='num_random_ops')\n", "with random_tool.scope():\n", @@ -1105,9 +1037,7 @@ "metadata": { "id": "Qcx6ur4KPMI1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "height, width = 299, 299\n", "num_classes = 1000\n", @@ -1131,9 +1061,7 @@ "metadata": { "id": "m_SS2b6qPFl1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Verify that the regularization loss and output both match\n", "# when using the DeterministicRandomTestTool:\n", @@ -1158,9 +1086,7 @@ "metadata": { "id": "nMBFVa1kQTJH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "random_tool = v1.keras.utils.DeterministicRandomTestTool(mode='num_random_ops')\n", "with random_tool.scope():\n", @@ -1189,9 +1115,7 @@ "metadata": { "id": "-jlBkwI5QTJI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "height, width = 299, 299\n", "num_classes = 1000\n", @@ -1215,9 +1139,7 @@ "metadata": { "id": "IL9mjTLnQTJJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Verify that the regularization loss and output both match\n", "# when using the DeterministicRandomTestTool\n", @@ -1255,9 +1177,7 @@ "metadata": { "id": "0dSR4ZNvYNYm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "random_tool = v1.keras.utils.DeterministicRandomTestTool()\n", "with random_tool.scope():\n", @@ -1286,9 +1206,7 @@ "metadata": { "id": "iMPMMnPtYUY7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "height, width = 299, 299\n", "num_classes = 1000\n", @@ -1314,9 +1232,7 @@ "metadata": { "id": "jf46KUVyYUY8" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Verify that the regularization loss and output both match\n", "# when using the DeterministicRandomTestTool\n", @@ -1355,9 +1271,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "validate_correctness.ipynb", "toc_visible": true }, diff --git a/site/ko/guide/ragged_tensor.ipynb b/site/ko/guide/ragged_tensor.ipynb index dd0892faef..c94967ba05 100644 --- a/site/ko/guide/ragged_tensor.ipynb +++ b/site/ko/guide/ragged_tensor.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "tXAbWHtqs1Y2" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -73,9 +71,7 @@ "metadata": { "id": "KKvdSorS-pDD" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install --pre -U tensorflow\n", "import math\n", @@ -115,9 +111,7 @@ "metadata": { "id": "vGmJGSf_-PVB" }, - "outputs": [ - - ], + "outputs": [], "source": [ "digits = tf.ragged.constant([[3, 1, 4, 1], [], [5, 9, 2], [6], []])\n", "words = tf.ragged.constant([[\"So\", \"long\"], [\"thanks\", \"for\", \"all\", \"the\", \"fish\"]])\n", @@ -162,9 +156,7 @@ "metadata": { "id": "n8YMKXpI-PVH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(digits[0]) # First row" ] @@ -175,9 +167,7 @@ "metadata": { "id": "Awi8i9q5_DuX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(digits[:, :2]) # First two values in each row." ] @@ -188,9 +178,7 @@ "metadata": { "id": "sXgQtTcgHHMR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(digits[:, -2:]) # Last two values in each row." ] @@ -210,9 +198,7 @@ "metadata": { "id": "2tdUEtb7-PVL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(digits + 3)" ] @@ -223,9 +209,7 @@ "metadata": { "id": "X-bxG0nc_Nmf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(digits + tf.ragged.constant([[1, 2, 3, 4], [], [5, 6, 7], [8], []]))" ] @@ -245,9 +229,7 @@ "metadata": { "id": "pvt5URbdEt-D" }, - "outputs": [ - - ], + "outputs": [], "source": [ "times_two_plus_one = lambda x: x * 2 + 1\n", "print(tf.ragged.map_flat_values(times_two_plus_one, digits))" @@ -268,9 +250,7 @@ "metadata": { "id": "A5NHb8ViA9dt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "digits.to_list()" ] @@ -281,9 +261,7 @@ "metadata": { "id": "2o1wogVyA6Yp" }, - "outputs": [ - - ], + "outputs": [], "source": [ "digits.numpy()" ] @@ -305,9 +283,7 @@ "metadata": { "id": "yhgKMozw-PVP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "sentences = tf.ragged.constant([\n", " [\"Let's\", \"build\", \"some\", \"ragged\", \"tensors\", \"!\"],\n", @@ -321,9 +297,7 @@ "metadata": { "id": "TW1g7eE2ee8M" }, - "outputs": [ - - ], + "outputs": [], "source": [ "paragraphs = tf.ragged.constant([\n", " [['I', 'have', 'a', 'cat'], ['His', 'name', 'is', 'Mat']],\n", @@ -353,9 +327,7 @@ "metadata": { "id": "SEvcPUcl-PVS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(tf.RaggedTensor.from_value_rowids(\n", " values=[3, 1, 4, 1, 5, 9, 2],\n", @@ -381,9 +353,7 @@ "metadata": { "id": "LBY81WXl-PVW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(tf.RaggedTensor.from_row_lengths(\n", " values=[3, 1, 4, 1, 5, 9, 2],\n", @@ -409,9 +379,7 @@ "metadata": { "id": "FwizuqZI-PVb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(tf.RaggedTensor.from_row_splits(\n", " values=[3, 1, 4, 1, 5, 9, 2],\n", @@ -446,9 +414,7 @@ "metadata": { "id": "SqbPBd_w-PVi" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(tf.ragged.constant([[\"Hi\"], [\"How\", \"are\", \"you\"]])) # ok: type=string, rank=2" ] @@ -459,9 +425,7 @@ "metadata": { "id": "83ZCSJnQAWAf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(tf.ragged.constant([[[1, 2], [3]], [[4, 5]]])) # ok: type=int32, rank=3" ] @@ -472,9 +436,7 @@ "metadata": { "id": "ewA3cISdDfmP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "try:\n", " tf.ragged.constant([[\"one\", \"two\"], [3, 4]]) # bad: multiple types\n", @@ -488,9 +450,7 @@ "metadata": { "id": "EOWIlVidDl-n" }, - "outputs": [ - - ], + "outputs": [], "source": [ "try:\n", " tf.ragged.constant([\"A\", [\"B\", \"C\"]]) # bad: multiple nesting depths\n", @@ -515,9 +475,7 @@ "metadata": { "id": "ZBs_V7e--PVr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "queries = tf.ragged.constant([['Who', 'is', 'Dan', 'Smith'],\n", " ['Pause'],\n", @@ -588,9 +546,7 @@ "metadata": { "id": "M2Wzx4JEIvmb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf.ragged.constant([[\"Hi\"], [\"How\", \"are\", \"you\"]]).shape" ] @@ -610,9 +566,7 @@ "metadata": { "id": "5DHaqXHxlWi0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(tf.ragged.constant([[\"Hi\"], [\"How\", \"are\", \"you\"]]).bounding_shape())" ] @@ -641,9 +595,7 @@ "metadata": { "id": "ush7IGUWLXIn" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ragged_x = tf.ragged.constant([[\"John\"], [\"a\", \"big\", \"dog\"], [\"my\", \"cat\"]])\n", "ragged_y = tf.ragged.constant([[\"fell\", \"asleep\"], [\"barked\"], [\"is\", \"fuzzy\"]])\n", @@ -667,9 +619,7 @@ "metadata": { "id": "eTIhGayQL0gI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "sparse_x = ragged_x.to_sparse()\n", "sparse_y = ragged_y.to_sparse()\n", @@ -712,9 +662,7 @@ "metadata": { "id": "pHls7hQVJlk5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Task: predict whether each sentence is a question or not.\n", "sentences = tf.constant(\n", @@ -761,9 +709,7 @@ "metadata": { "id": "xsiglYM7TXGr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import google.protobuf.text_format as pbtext\n", "\n", @@ -804,9 +750,7 @@ "metadata": { "id": "xcdaIbYVT4mo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "feature_specification = {\n", " 'colors': tf.io.RaggedFeature(tf.string),\n", @@ -843,9 +787,7 @@ "metadata": { "id": "fBml1m2G2vO9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Helper function used to print datasets in the examples below.\n", "def print_dictionary_dataset(dataset):\n", @@ -872,9 +814,7 @@ "metadata": { "id": "BuelF_y2mEq9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "dataset = tf.data.Dataset.from_tensor_slices(feature_tensors)\n", "print_dictionary_dataset(dataset)" @@ -906,9 +846,7 @@ "metadata": { "id": "lk62aRz63IZn" }, - "outputs": [ - - ], + "outputs": [], "source": [ "batched_dataset = dataset.batch(2)\n", "print_dictionary_dataset(batched_dataset)" @@ -929,9 +867,7 @@ "metadata": { "id": "CxLlaPw_5Je4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "unbatched_dataset = batched_dataset.unbatch()\n", "print_dictionary_dataset(unbatched_dataset)" @@ -954,9 +890,7 @@ "metadata": { "id": "PYnhERwh3_mf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "non_ragged_dataset = tf.data.Dataset.from_tensor_slices([1, 5, 3, 2, 8])\n", "non_ragged_dataset = non_ragged_dataset.map(tf.range)\n", @@ -983,9 +917,7 @@ "metadata": { "id": "Ios1GuG-pf9U" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def transform_lengths(features):\n", " return {\n", @@ -1012,9 +944,7 @@ "metadata": { "id": "PfyxgVaj_8tl" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function\n", "def make_palindrome(x, axis):\n", @@ -1027,9 +957,7 @@ "metadata": { "id": "vcZdzvEnDEt0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "make_palindrome(tf.constant([[1, 2], [3, 4], [5, 6]]), axis=1)" ] @@ -1040,9 +968,7 @@ "metadata": { "id": "4WfCMIgdDMxj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "make_palindrome(tf.ragged.constant([[1, 2], [3], [4, 5, 6]]), axis=1)" ] @@ -1062,9 +988,7 @@ "metadata": { "id": "k6-hkhdDBk6G" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function(\n", " input_signature=[tf.RaggedTensorSpec(shape=[None, None], dtype=tf.int32)])\n", @@ -1091,9 +1015,7 @@ "metadata": { "id": "yyJeXJ4wFWox" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function\n", "def increment(x):\n", @@ -1130,9 +1052,7 @@ "metadata": { "id": "D-Dg9w7Je5pU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tempfile\n", "\n", @@ -1157,9 +1077,7 @@ "metadata": { "id": "Sfem1ESrdGzX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class CustomModule(tf.Module):\n", " def __init__(self, variable_value):\n", @@ -1209,9 +1127,7 @@ "metadata": { "id": "skScd37P-PVu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "x = tf.ragged.constant([[1, 2], [3], [4, 5, 6]])\n", "y = tf.ragged.constant([[1, 1], [2], [3, 3, 3]])\n", @@ -1233,9 +1149,7 @@ "metadata": { "id": "IYybEEWc-PVx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "x = tf.ragged.constant([[1, 2], [3], [4, 5, 6]])\n", "print(x + 3)" @@ -1278,9 +1192,7 @@ "metadata": { "id": "MbSRZRDz-PV1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "queries = tf.ragged.constant(\n", " [['Who', 'is', 'George', 'Washington'],\n", @@ -1294,9 +1206,7 @@ "metadata": { "id": "2HRs2xhh-vZE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(queries[1]) # A single query" ] @@ -1307,9 +1217,7 @@ "metadata": { "id": "EFfjZV7YA3UH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(queries[1, 2]) # A single word" ] @@ -1320,9 +1228,7 @@ "metadata": { "id": "VISRPQSdA3xn" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(queries[1:]) # Everything but the first row" ] @@ -1333,9 +1239,7 @@ "metadata": { "id": "J1PpSyKQBMng" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(queries[:, :3]) # The first 3 words of each query" ] @@ -1346,9 +1250,7 @@ "metadata": { "id": "ixrhHmJBeidy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(queries[:, -2:]) # The last 2 words of each query" ] @@ -1368,9 +1270,7 @@ "metadata": { "id": "8VbqbKcE-PV6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "rt = tf.ragged.constant([[[1, 2, 3], [4]],\n", " [[5], [], [6]],\n", @@ -1384,9 +1284,7 @@ "metadata": { "id": "f9WPVWf4grVp" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(rt[1]) # Second row (2D RaggedTensor)" ] @@ -1397,9 +1295,7 @@ "metadata": { "id": "ad8FGJoABjQH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(rt[3, 0]) # First element of fourth row (1D Tensor)" ] @@ -1410,9 +1306,7 @@ "metadata": { "id": "MPPr-a-bBjFE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(rt[:, 1:3]) # Items 1-3 of each row (3D RaggedTensor)" ] @@ -1423,9 +1317,7 @@ "metadata": { "id": "6SIDeoIUBi4z" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(rt[:, -1:]) # Last item of each row (3D RaggedTensor)" ] @@ -1456,9 +1348,7 @@ "metadata": { "id": "INnfmZGcBoU_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ragged_sentences = tf.ragged.constant([\n", " ['Hi'], ['Welcome', 'to', 'the', 'fair'], ['Have', 'fun']])" @@ -1470,9 +1360,7 @@ "metadata": { "id": "__iJ4iXtkGOx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# RaggedTensor -> Tensor\n", "print(ragged_sentences.to_tensor(default_value='', shape=[None, 10]))" @@ -1484,9 +1372,7 @@ "metadata": { "id": "-rfiyYqne8QN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Tensor -> RaggedTensor\n", "x = [[1, 3, -1, -1], [2, -1, -1, -1], [4, 5, 8, 9]]\n", @@ -1499,9 +1385,7 @@ "metadata": { "id": "41WAZLXNnbwH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#RaggedTensor -> SparseTensor\n", "print(ragged_sentences.to_sparse())" @@ -1513,9 +1397,7 @@ "metadata": { "id": "S8MkYo2hfVhj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# SparseTensor -> RaggedTensor\n", "st = tf.SparseTensor(indices=[[0, 0], [2, 0], [2, 1]],\n", @@ -1546,9 +1428,7 @@ "metadata": { "id": "uMm1WMkc-PV_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "rt = tf.ragged.constant([[1, 2], [3, 4, 5], [6], [], [7]])\n", "print(\"Python list:\", rt.to_list())\n", @@ -1590,9 +1470,7 @@ "metadata": { "id": "btGDjT4uNgQy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "x = tf.constant([[1, 2], [3, 4], [5, 6]])\n", "x.shape # shape of a tf.tensor" @@ -1604,9 +1482,7 @@ "metadata": { "id": "__OgvmrGPEjq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "rt = tf.ragged.constant([[1], [2, 3], [], [4]])\n", "rt.shape # shape of a tf.RaggedTensor" @@ -1638,9 +1514,7 @@ "metadata": { "id": "kWJ7Cn1EQTD_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "x = tf.constant([['a', 'b'], ['c', 'd'], ['e', 'f']])\n", "tf.shape(x)" @@ -1661,9 +1535,7 @@ "metadata": { "id": "nZc2wqgQQUFU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "rt = tf.ragged.constant([[1], [2, 3, 4], [], [5, 6]])\n", "rt_shape = tf.shape(rt)\n", @@ -1687,9 +1559,7 @@ "metadata": { "id": "pclAODLXT6Gr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(f\"tf.reshape(x, rt_shape) = {tf.reshape(x, rt_shape)}\")\n", "print(f\"tf.zeros(rt_shape) = {tf.zeros(rt_shape)}\")\n", @@ -1714,9 +1584,7 @@ "metadata": { "id": "MzQvPhsxS6HN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "rt_shape[0]" ] @@ -1736,9 +1604,7 @@ "metadata": { "id": "HgGMk0LeTGik" }, - "outputs": [ - - ], + "outputs": [], "source": [ "try:\n", " rt_shape[1]\n", @@ -1761,9 +1627,7 @@ "metadata": { "id": "APT72EaBU70t" }, - "outputs": [ - - ], + "outputs": [], "source": [ "rt_shape[:1]" ] @@ -1801,9 +1665,7 @@ "metadata": { "id": "NSRgD667WwIZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf.experimental.DynamicRaggedShape(\n", " row_partitions=[tf.experimental.RowPartition.from_row_lengths([5, 3, 2])],\n", @@ -1825,9 +1687,7 @@ "metadata": { "id": "gMxCzADUYIjY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf.experimental.DynamicRaggedShape.from_lengths([4, (2, 1, 0, 8), 12])" ] @@ -1873,9 +1733,7 @@ "metadata": { "id": "0n095XdR-PWU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# x (2D ragged): 2 x (num_rows)\n", "# y (scalar)\n", @@ -1891,9 +1749,7 @@ "metadata": { "id": "0SVYk5AP-PWW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# x (2d ragged): 3 x (num_rows)\n", "# y (2d tensor): 3 x 1\n", @@ -1912,9 +1768,7 @@ "metadata": { "id": "MsfBMD80s8Ux" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# x (3d ragged): 2 x (r1) x 2\n", "# y (2d ragged): 1 x 1\n", @@ -1933,9 +1787,7 @@ "metadata": { "id": "rEj5QVfnva0t" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# x (3d ragged): 2 x (r1) x (r2) x 1\n", "# y (1d tensor): 3\n", @@ -1973,9 +1825,7 @@ "metadata": { "id": "UpI0FlfL4Eim" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# x (2d ragged): 3 x (r1)\n", "# y (2d tensor): 3 x 4 # trailing dimensions do not match\n", @@ -1993,9 +1843,7 @@ "metadata": { "id": "qGq1zOT4zMoc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# x (2d ragged): 3 x (r1)\n", "# y (2d ragged): 3 x (r2) # ragged dimensions do not match.\n", @@ -2013,9 +1861,7 @@ "metadata": { "id": "CvLae5vMqeji" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# x (3d ragged): 3 x (r1) x 2\n", "# y (3d ragged): 3 x (r1) x 3 # trailing dimensions do not match\n", @@ -2062,9 +1908,7 @@ "metadata": { "id": "MrLgMu0gPuo-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "rt = tf.RaggedTensor.from_row_splits(\n", " values=[3, 1, 4, 1, 5, 9, 2],\n", @@ -2106,9 +1950,7 @@ "metadata": { "id": "yy3IGT2a-PWb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "rt = tf.RaggedTensor.from_row_splits(\n", " values=tf.RaggedTensor.from_row_splits(\n", @@ -2135,9 +1977,7 @@ "metadata": { "id": "AKYhtFcT-PWd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "rt = tf.RaggedTensor.from_nested_row_splits(\n", " flat_values=[10, 11, 12, 13, 14, 15, 16, 17, 18, 19],\n", @@ -2162,9 +2002,7 @@ "metadata": { "id": "BXp-Tt2bClem" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# shape = [batch, (paragraph), (sentence), (word)]\n", "conversations = tf.ragged.constant(\n", @@ -2182,9 +2020,7 @@ "metadata": { "id": "DZUMrgxXFd5s" }, - "outputs": [ - - ], + "outputs": [], "source": [ "assert conversations.ragged_rank == len(conversations.nested_row_splits)\n", "conversations.ragged_rank # Number of partitioned dimensions." @@ -2196,9 +2032,7 @@ "metadata": { "id": "xXLSNpS0Fdvp" }, - "outputs": [ - - ], + "outputs": [], "source": [ "conversations.flat_values.numpy()" ] @@ -2222,9 +2056,7 @@ "metadata": { "id": "z2sHwHdy-PWg" }, - "outputs": [ - - ], + "outputs": [], "source": [ "rt = tf.RaggedTensor.from_row_splits(\n", " values=[[1, 3], [0, 0], [1, 3], [5, 3], [3, 3], [1, 2]],\n", @@ -2255,9 +2087,7 @@ "metadata": { "id": "70q1aCKwySgS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "rt = tf.RaggedTensor.from_uniform_row_length(\n", " values=tf.RaggedTensor.from_row_splits(\n", @@ -2272,9 +2102,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "ragged_tensor.ipynb", "toc_visible": true }, diff --git a/site/ko/io/tutorials/azure.ipynb b/site/ko/io/tutorials/azure.ipynb index 80b5f0c020..649501fa97 100644 --- a/site/ko/io/tutorials/azure.ipynb +++ b/site/ko/io/tutorials/azure.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "tuOe1ymfHZPu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -259,9 +257,7 @@ "metadata": { "id": "ZIrXoXgYlsj_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import os\n", "import tensorflow as tf\n", diff --git a/site/ko/io/tutorials/dicom.ipynb b/site/ko/io/tutorials/dicom.ipynb index 6affd0a9e8..33338af7f7 100644 --- a/site/ko/io/tutorials/dicom.ipynb +++ b/site/ko/io/tutorials/dicom.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "tuOe1ymfHZPu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -103,9 +101,7 @@ "metadata": { "id": "Tu01THzWcE-J" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!curl -OL https://github.com/tensorflow/io/raw/master/docs/tutorials/dicom/dicom_00000001_000.dcm\n", "!ls -l dicom_00000001_000.dcm" @@ -126,9 +122,7 @@ "metadata": { "id": "NwL3fEMQuZrk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "try:\n", " # Use the Colab's preinstalled TensorFlow 2.x\n", @@ -143,9 +137,7 @@ "metadata": { "id": "uUDYyMZRfkX4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install tensorflow-io" ] @@ -165,9 +157,7 @@ "metadata": { "id": "YUj0878jPyz7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", @@ -181,9 +171,7 @@ "metadata": { "id": "zK7IEukfuUuF" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow_io as tfio\n", "\n", @@ -227,9 +215,7 @@ "metadata": { "id": "OqHkXwF0oI3L" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tag_id = tfio.image.dicom_tags.PatientsAge\n", "tag_value = tfio.image.decode_dicom_data(image_bytes,tag_id)\n", @@ -242,9 +228,7 @@ "metadata": { "id": "J2wZ-7OcoPPs" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(f\"PatientsAge : {tag_value.numpy().decode('UTF-8')}\")" ] @@ -255,9 +239,7 @@ "metadata": { "id": "Ce6ymbskoTOe" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tag_id = tfio.image.dicom_tags.PatientsSex\n", "tag_value = tfio.image.decode_dicom_data(image_bytes,tag_id)\n", diff --git a/site/ko/io/tutorials/postgresql.ipynb b/site/ko/io/tutorials/postgresql.ipynb index 3ebb2fe422..2f2e729879 100644 --- a/site/ko/io/tutorials/postgresql.ipynb +++ b/site/ko/io/tutorials/postgresql.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "tuOe1ymfHZPu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -93,9 +91,7 @@ "metadata": { "id": "uUDYyMZRfkX4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "try:\n", " %tensorflow_version 2.x\n", @@ -126,9 +122,7 @@ "metadata": { "id": "YUj0878jPyz7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Install postgresql server\n", "!sudo apt-get -y -qq update\n", @@ -160,9 +154,7 @@ "metadata": { "id": "0dRotqDMswcK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%env TFIO_DEMO_DATABASE_NAME=tfio_demo\n", "%env TFIO_DEMO_DATABASE_HOST=localhost\n", @@ -226,9 +218,7 @@ "metadata": { "id": "W1eVidg3JrPV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!curl -s -OL https://github.com/tensorflow/io/raw/master/docs/tutorials/postgresql/AirQualityUCI.sql\n", "\n", @@ -252,9 +242,7 @@ "metadata": { "id": "h21RdP7meGzP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import os\n", "import tensorflow_io as tfio\n", @@ -289,9 +277,7 @@ "metadata": { "id": "qCoueXYZOvqZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "dataset = tfio.experimental.IODataset.from_sql(\n", " query=\"SELECT nox, no2 FROM AirQualityUCI;\",\n", diff --git a/site/ko/io/tutorials/prometheus.ipynb b/site/ko/io/tutorials/prometheus.ipynb index 779e11da66..44dadb4820 100644 --- a/site/ko/io/tutorials/prometheus.ipynb +++ b/site/ko/io/tutorials/prometheus.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "tuOe1ymfHZPu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -104,9 +102,7 @@ "metadata": { "id": "48B9eAMMhAgw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import os" ] @@ -193,9 +189,7 @@ "metadata": { "id": "m6KXZuTBWgRm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "from datetime import datetime\n", "\n", @@ -256,9 +250,7 @@ "metadata": { "id": "n9ujlunrWgRx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Run `./coredns` as a background process.\n", "# IPython doesn't recognize `&` in inline bash cells.\n", @@ -318,9 +310,7 @@ "metadata": { "id": "VSJGsQtoWgR7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Run `./prometheus` as a background process.\n", "# IPython doesn't recognize `&` in inline bash cells.\n", @@ -342,9 +332,7 @@ "metadata": { "id": "FN0YNdstBl8M" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!sudo apt-get install -y -qq dnsutils" ] @@ -600,9 +588,7 @@ "metadata": { "id": "fxObBtlvr6n_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "n_steps, n_features = 2, 1\n", "simple_lstm_model = tf.keras.models.Sequential([\n", @@ -656,9 +642,7 @@ }, "execution_count": 16, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } diff --git a/site/ko/lattice/tutorials/shape_constraints.ipynb b/site/ko/lattice/tutorials/shape_constraints.ipynb index d740c3830e..56f907f09a 100644 --- a/site/ko/lattice/tutorials/shape_constraints.ipynb +++ b/site/ko/lattice/tutorials/shape_constraints.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "KsOkK8O69PyT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -93,9 +91,7 @@ "metadata": { "id": "bpXjJKpSd3j4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@test {\"skip\": true}\n", "!pip install tensorflow-lattice tensorflow_decision_forests" @@ -117,9 +113,7 @@ "cellView": "both", "id": "iY6awAl058TV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "import tensorflow_lattice as tfl\n", @@ -152,9 +146,7 @@ "metadata": { "id": "kQHPyPsPUF92" }, - "outputs": [ - - ], + "outputs": [], "source": [ "NUM_EPOCHS = 1000\n", "BATCH_SIZE = 64\n", @@ -193,9 +185,7 @@ "metadata": { "id": "mKovnyv1jATw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def click_through_rate(avg_ratings, num_reviews, dollar_ratings):\n", " dollar_rating_baseline = {\"D\": 3, \"DD\": 2, \"DDD\": 4, \"DDDD\": 4.5}\n", @@ -219,9 +209,7 @@ "metadata": { "id": "KC5qX_XKmc7g" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def color_bar():\n", " bar = matplotlib.cm.ScalarMappable(\n", @@ -302,9 +290,7 @@ "metadata": { "id": "MhqcOPdTT_wj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def sample_restaurants(n):\n", " avg_ratings = np.random.uniform(1.0, 5.0, n)\n", @@ -357,9 +343,7 @@ "metadata": { "id": "jS6WOtXQ8jwX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def sample_dataset(n, testing_set):\n", " (avg_ratings, num_reviews, dollar_ratings, ctr_labels) = sample_restaurants(n)\n", @@ -418,9 +402,7 @@ "metadata": { "id": "DYzRTRR2GKoS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_input_fn = tf.compat.v1.estimator.inputs.pandas_input_fn(\n", " x=data_train,\n", @@ -482,9 +464,7 @@ "metadata": { "id": "SX6rARJWURWl" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def analyze_two_d_estimator(estimator, name):\n", " # Extract validation metrics.\n", @@ -555,9 +535,7 @@ "metadata": { "id": "DnPYlRAo2mnQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "gbt_model = tfdf.keras.GradientBoostedTreesModel(\n", " features=[\n", @@ -617,9 +595,7 @@ "metadata": { "id": "gFUeG6kLDNhO" }, - "outputs": [ - - ], + "outputs": [], "source": [ "feature_columns = [\n", " tf.feature_column.numeric_column(\"num_reviews\"),\n", @@ -682,9 +658,7 @@ "metadata": { "id": "FCm1lOjmwur_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "feature_columns = [\n", " tf.feature_column.numeric_column(\"num_reviews\"),\n", @@ -732,9 +706,7 @@ "cellView": "both", "id": "C0py9Q6OBRBE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def save_and_visualize_lattice(tfl_estimator):\n", " saved_model_path = tfl_estimator.export_saved_model(\n", @@ -779,9 +751,7 @@ "metadata": { "id": "XQrM9BskY-wx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "feature_columns = [\n", " tf.feature_column.numeric_column(\"num_reviews\"),\n", @@ -843,9 +813,7 @@ "metadata": { "id": "OA14j0erm6TJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "feature_columns = [\n", " tf.feature_column.numeric_column(\"num_reviews\"),\n", @@ -900,9 +868,7 @@ "cellView": "both", "id": "RounEQebxxnA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "lat_mesh_n = 12\n", "lat_mesh_x, lat_mesh_y = tfl.test_utils.two_dim_mesh_grid(\n", @@ -943,9 +909,7 @@ "metadata": { "id": "qxFHH3hSpWfq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "feature_columns = [\n", " tf.feature_column.numeric_column(\"num_reviews\"),\n", @@ -1015,9 +979,7 @@ "metadata": { "id": "5tLDKwTmjrLw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def analyze_three_d_estimator(estimator, name):\n", " # Extract validation metrics.\n", @@ -1060,9 +1022,7 @@ "metadata": { "id": "m-w7iGEEpgGt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "feature_columns = [\n", " tf.feature_column.numeric_column(\"num_reviews\"),\n", @@ -1159,9 +1119,7 @@ "metadata": { "id": "k5Sg_gUj_0i4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "feature_columns = [\n", " tf.feature_column.numeric_column(\"num_reviews\"),\n", @@ -1235,9 +1193,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "shape_constraints.ipynb", "toc_visible": true }, diff --git a/site/ko/lite/examples/on_device_training/overview.ipynb b/site/ko/lite/examples/on_device_training/overview.ipynb index c87483f67a..2d5efdf707 100644 --- a/site/ko/lite/examples/on_device_training/overview.ipynb +++ b/site/ko/lite/examples/on_device_training/overview.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "2pHVBk_seED1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -157,9 +155,7 @@ "metadata": { "id": "d8577c80" }, - "outputs": [ - - ], + "outputs": [], "source": [ "IMG_SIZE = 28\n", "\n", @@ -255,9 +251,7 @@ "metadata": { "id": "315b8b4dfc16" }, - "outputs": [ - - ], + "outputs": [], "source": [ "fashion_mnist = tf.keras.datasets.fashion_mnist\n", "(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()" @@ -280,9 +274,7 @@ "metadata": { "id": "g0FqHC0yCg6n" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_images = (train_images / 255.0).astype(np.float32)\n", "test_images = (test_images / 255.0).astype(np.float32)" @@ -303,9 +295,7 @@ "metadata": { "id": "Fmc7EgYO30sw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_labels = tf.keras.utils.to_categorical(train_labels)\n", "test_labels = tf.keras.utils.to_categorical(test_labels)" @@ -371,8 +361,7 @@ ] }, "execution_count": 28, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -413,8 +402,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -452,9 +440,7 @@ "metadata": { "id": "WwsDUEKFMYtq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "SAVED_MODEL_DIR = \"saved_model\"\n", "\n", @@ -499,9 +485,7 @@ "metadata": { "id": "qNX2vqXd2-HM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "interpreter = tf.lite.Interpreter(model_content=tflite_model)\n", "interpreter.allocate_tensors()\n", @@ -524,9 +508,7 @@ "metadata": { "id": "IDdaCmPEtE7P" }, - "outputs": [ - - ], + "outputs": [], "source": [ "logits_original = m.infer(x=train_images[:1])['logits'][0]\n", "logits_lite = infer(x=train_images[:1])['logits'][0]" @@ -546,8 +528,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -730,8 +711,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -778,8 +758,7 @@ ] }, "execution_count": 36, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -832,9 +811,7 @@ "metadata": { "id": "5yIZoLveRZgp" }, - "outputs": [ - - ], + "outputs": [], "source": [ "another_interpreter = tf.lite.Interpreter(model_content=tflite_model)\n", "another_interpreter.allocate_tensors()\n", @@ -857,8 +834,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -932,9 +908,7 @@ "metadata": { "id": "_ROmlpHWS0nX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "infer = another_interpreter.get_signature_runner(\"infer\")\n", "result = infer(x=test_images)\n", @@ -957,8 +931,7 @@ ] }, "execution_count": 40, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -989,8 +962,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1027,8 +999,7 @@ ] }, "execution_count": 42, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -1089,9 +1060,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "overview.ipynb", "toc_visible": true }, diff --git a/site/ko/lite/guide/model_analyzer.ipynb b/site/ko/lite/guide/model_analyzer.ipynb index 68dc4f760a..06e774865c 100644 --- a/site/ko/lite/guide/model_analyzer.ipynb +++ b/site/ko/lite/guide/model_analyzer.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "2pHVBk_seED1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -101,9 +99,7 @@ "metadata": { "id": "_jkg6UNtdz8c" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "\n", @@ -136,9 +132,7 @@ "metadata": { "id": "QFywJ_g56VW5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = tf.keras.applications.MobileNetV3Large()\n", "fb_model = tf.lite.TFLiteConverter.from_keras_model(model).convert()\n", @@ -176,9 +170,7 @@ "metadata": { "id": "9GEg5plIzD-3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "\n", @@ -218,9 +210,7 @@ "metadata": { "id": "85RgG6tQ3ABT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = tf.keras.models.Sequential([\n", " tf.keras.layers.Flatten(input_shape=(128, 128)),\n", @@ -237,9 +227,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "model_analyzer.ipynb", "toc_visible": true }, diff --git a/site/ko/lite/guide/signatures.ipynb b/site/ko/lite/guide/signatures.ipynb index e231dcb163..2e08b9ac98 100644 --- a/site/ko/lite/guide/signatures.ipynb +++ b/site/ko/lite/guide/signatures.ipynb @@ -18,9 +18,7 @@ "cellView": "form", "id": "2pHVBk_seED1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -98,9 +96,7 @@ "metadata": { "id": "9j4MGqyKQEo4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf" ] @@ -124,9 +120,7 @@ "metadata": { "id": "d8577c80" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class Model(tf.Module):\n", "\n", @@ -198,9 +192,7 @@ "metadata": { "id": "96c8fc79" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = Model()\n", "\n", @@ -245,9 +237,7 @@ "metadata": { "id": "71f29229" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Generate a Keras model.\n", "keras_model = tf.keras.Sequential(\n", @@ -286,9 +276,7 @@ "metadata": { "id": "c9e8a742" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = Model()\n", "\n", @@ -415,9 +403,7 @@ "metadata": { "id": "ab7b1963" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Load the TFLite model in TFLite Interpreter\n", "interpreter = tf.lite.Interpreter(model_content=tflite_model)\n", @@ -471,9 +457,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "signatures.ipynb", "toc_visible": true }, diff --git a/site/ko/lite/models/modify/model_maker/image_classification.ipynb b/site/ko/lite/models/modify/model_maker/image_classification.ipynb index 77c9e82c81..edff8c026e 100644 --- a/site/ko/lite/models/modify/model_maker/image_classification.ipynb +++ b/site/ko/lite/models/modify/model_maker/image_classification.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "TUfAcER1oUS6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -85,9 +83,7 @@ "metadata": { "id": "6cv3K3oaksJv" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!sudo apt -y install libportaudio2\n", "!pip install -q tflite-model-maker" @@ -108,9 +104,7 @@ "metadata": { "id": "XtxiUeZEiXpt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import os\n", "\n", @@ -155,9 +149,7 @@ "cellView": "form", "id": "3jz5x0JoskPv" }, - "outputs": [ - - ], + "outputs": [], "source": [ "image_path = tf.keras.utils.get_file(\n", " 'flower_photos.tgz',\n", @@ -212,9 +204,7 @@ "metadata": { "id": "lANoNS_gtdH1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "data = DataLoader.from_folder(image_path)\n", "train_data, test_data = data.split(0.9)" @@ -235,9 +225,7 @@ "metadata": { "id": "yRXMZbrwtyRD" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = image_classifier.create(train_data)" ] @@ -257,9 +245,7 @@ "metadata": { "id": "wQr02VxJt6Cs" }, - "outputs": [ - - ], + "outputs": [], "source": [ "loss, accuracy = model.evaluate(test_data)" ] @@ -283,9 +269,7 @@ "metadata": { "id": "Zb-eIzfluCoa" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.export(export_dir='.')" ] @@ -354,9 +338,7 @@ "metadata": { "id": "7tOfUr2KlgpU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "image_path = tf.keras.utils.get_file(\n", " 'flower_photos.tgz',\n", @@ -382,9 +364,7 @@ "metadata": { "id": "I_fOlZsklmlL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "data = DataLoader.from_folder(image_path)" ] @@ -404,9 +384,7 @@ "metadata": { "id": "cY4UU5SUobtJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_data, rest_data = data.split(0.8)\n", "validation_data, test_data = rest_data.split(0.5)" @@ -427,9 +405,7 @@ "metadata": { "id": "Ih4Wx44I482b" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plt.figure(figsize=(10,10))\n", "for i, (image, label) in enumerate(data.gen_dataset().unbatch().take(25)):\n", @@ -459,9 +435,7 @@ "metadata": { "id": "TvYSUuJY3QxR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = image_classifier.create(train_data, validation_data=validation_data)" ] @@ -481,9 +455,7 @@ "metadata": { "id": "QNXAfjl192dC" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.summary()" ] @@ -505,9 +477,7 @@ "metadata": { "id": "A8c2ZQ0J3Riy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "loss, accuracy = model.evaluate(test_data)" ] @@ -527,9 +497,7 @@ "metadata": { "id": "n9O9Kx7nDQWD" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# A helper function that returns 'red'/'black' depending on if its two input\n", "# parameter matches or not.\n", @@ -587,9 +555,7 @@ "metadata": { "id": "Im6wA9lK3TQB" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.export(export_dir='.')" ] @@ -626,9 +592,7 @@ "metadata": { "id": "BvxWsOTmKG4P" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.export(export_dir='.', export_format=ExportFormat.LABEL)" ] @@ -648,9 +612,7 @@ "metadata": { "id": "S1YoPX5wOK-u" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.evaluate_tflite('model.tflite', test_data)" ] @@ -709,9 +671,7 @@ "metadata": { "id": "k8hL2mstCxQl" }, - "outputs": [ - - ], + "outputs": [], "source": [ "config = QuantizationConfig.for_float16()" ] @@ -731,9 +691,7 @@ "metadata": { "id": "WTJzFQnJFMjr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.export(export_dir='.', tflite_filename='model_fp16.tflite', quantization_config=config)" ] @@ -775,9 +733,7 @@ "metadata": { "id": "7JKsJ6-P6ae1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = image_classifier.create(train_data, model_spec=model_spec.get('mobilenet_v2'), validation_data=validation_data)" ] @@ -797,9 +753,7 @@ "metadata": { "id": "lB2Go3HW8X7_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "loss, accuracy = model.evaluate(test_data)" ] @@ -825,9 +779,7 @@ "metadata": { "id": "xdiMF2WMfAR4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "inception_v3_spec = image_classifier.ModelSpec(\n", " uri='https://tfhub.dev/google/imagenet/inception_v3/feature_vector/1')\n", @@ -899,9 +851,7 @@ "metadata": { "id": "A3k7mhH54QcK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = image_classifier.create(train_data, validation_data=validation_data, epochs=10)" ] @@ -921,9 +871,7 @@ "metadata": { "id": "VafIYpKWD4Sw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "loss, accuracy = model.evaluate(test_data)" ] @@ -947,9 +895,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "image_classification.ipynb", "toc_visible": true }, diff --git a/site/ko/lite/models/modify/model_maker/object_detection.ipynb b/site/ko/lite/models/modify/model_maker/object_detection.ipynb index 713260c2f8..3495d75e02 100644 --- a/site/ko/lite/models/modify/model_maker/object_detection.ipynb +++ b/site/ko/lite/models/modify/model_maker/object_detection.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "TUfAcER1oUS6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -112,9 +110,7 @@ "metadata": { "id": "qhl8lqVamEty" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!sudo apt -y install libportaudio2\n", "!pip install -q --use-deprecated=legacy-resolver tflite-model-maker\n", @@ -138,9 +134,7 @@ "metadata": { "id": "XtxiUeZEiXpt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import numpy as np\n", "import os\n", @@ -241,9 +235,7 @@ "metadata": { "id": "CtdZ-JDwMimd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "spec = model_spec.get('efficientdet_lite0')" ] @@ -271,9 +263,7 @@ "metadata": { "id": "HD5BvzWe6YKa" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_data, validation_data, test_data = object_detector.DataLoader.from_csv('gs://cloud-ml-data/img/openimage/csv/salads_ml_use.csv')" ] @@ -297,9 +287,7 @@ "metadata": { "id": "kwlYdTcg63xy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = object_detector.create(train_data, model_spec=spec, batch_size=8, train_whole_model=True, validation_data=validation_data)" ] @@ -325,9 +313,7 @@ "metadata": { "id": "8xmnl6Yy7ARn" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.evaluate(test_data)" ] @@ -349,9 +335,7 @@ "metadata": { "id": "Hm_UULdW7A9T" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.export(export_dir='.')" ] @@ -378,9 +362,7 @@ "metadata": { "id": "RS3Ell_lqH4e" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.evaluate_tflite('model.tflite', test_data)" ] @@ -423,9 +405,7 @@ "cellView": "form", "id": "XqS0rFCrqM1o" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Load the trained TFLite model and define some visualization functions\n", "\n", @@ -531,9 +511,7 @@ "cellView": "form", "id": "GkXtipXKqXp4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Run object detection and show the detection results\n", "\n", @@ -581,9 +559,7 @@ "metadata": { "id": "Oy3QIn_YqaRP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "! curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -\n", "\n", @@ -622,9 +598,7 @@ "cellView": "form", "id": "LZdonJGCqieU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "NUMBER_OF_TPUS = 1#@param {type:\"number\"}\n", "\n", @@ -855,9 +829,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "object_detection.ipynb", "toc_visible": true }, diff --git a/site/ko/lite/models/modify/model_maker/question_answer.ipynb b/site/ko/lite/models/modify/model_maker/question_answer.ipynb index 069a9708b8..b76c4f8c64 100644 --- a/site/ko/lite/models/modify/model_maker/question_answer.ipynb +++ b/site/ko/lite/models/modify/model_maker/question_answer.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "TUfAcER1oUS6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -162,9 +160,7 @@ "metadata": { "id": "qhl8lqVamEty" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!sudo apt -y install libportaudio2\n", "!pip install -q tflite-model-maker-nightly" @@ -185,9 +181,7 @@ "metadata": { "id": "XtxiUeZEiXpt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import numpy as np\n", "import os\n", @@ -235,9 +229,7 @@ "metadata": { "id": "vEAWuZQ1PFiX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "spec = model_spec.get('mobilebert_qa_squad')" ] @@ -266,9 +258,7 @@ "metadata": { "id": "7tOfUr2KlgpU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_data_path = tf.keras.utils.get_file(\n", " fname='triviaqa-web-train-8000.json',\n", @@ -307,9 +297,7 @@ "metadata": { "id": "I_fOlZsklmlL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_data = DataLoader.from_squad(train_data_path, spec, is_training=True)\n", "validation_data = DataLoader.from_squad(validation_data_path, spec, is_training=False)" @@ -335,9 +323,7 @@ "metadata": { "id": "TvYSUuJY3QxR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = question_answer.create(train_data, model_spec=spec)" ] @@ -357,9 +343,7 @@ "metadata": { "id": "gd7Hs8TF8n3H" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.summary()" ] @@ -381,9 +365,7 @@ "metadata": { "id": "A8c2ZQ0J3Riy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.evaluate(validation_data)" ] @@ -407,9 +389,7 @@ "metadata": { "id": "Im6wA9lK3TQB" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.export(export_dir='.')" ] @@ -444,9 +424,7 @@ "metadata": { "id": "ro2hz4kXVImY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.export(export_dir='.', export_format=ExportFormat.VOCAB)" ] @@ -466,9 +444,7 @@ "metadata": { "id": "ochbq95ZrVFX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.evaluate_tflite('model.tflite', validation_data)" ] @@ -531,9 +507,7 @@ "metadata": { "id": "e9WBN0UTQoMN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "new_spec = model_spec.get('mobilebert_qa')\n", "new_spec.seq_len = 512" @@ -634,9 +608,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "question_answer.ipynb", "toc_visible": true }, diff --git a/site/ko/lite/models/modify/model_maker/text_classification.ipynb b/site/ko/lite/models/modify/model_maker/text_classification.ipynb index c082433f12..19a56a4d7f 100644 --- a/site/ko/lite/models/modify/model_maker/text_classification.ipynb +++ b/site/ko/lite/models/modify/model_maker/text_classification.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "TUfAcER1oUS6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -93,9 +91,7 @@ "metadata": { "id": "qhl8lqVamEty" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!sudo apt -y install libportaudio2\n", "!pip install -q tflite-model-maker\n", @@ -118,9 +114,7 @@ "metadata": { "id": "XtxiUeZEiXpt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import numpy as np\n", "import os\n", @@ -157,9 +151,7 @@ "metadata": { "id": "R2BSkxWg6Rhx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "data_dir = tf.keras.utils.get_file(\n", " fname='SST-2.zip',\n", @@ -195,9 +187,7 @@ "metadata": { "id": "iLNaOXnl3JQB" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import pandas as pd\n", "\n", @@ -242,9 +232,7 @@ "metadata": { "id": "CtdZ-JDwMimd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "spec = model_spec.get('average_word_vec')" ] @@ -277,9 +265,7 @@ "metadata": { "id": "HD5BvzWe6YKa" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_data = DataLoader.from_csv(\n", " filename='train.csv',\n", @@ -312,9 +298,7 @@ "metadata": { "id": "kwlYdTcg63xy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = text_classifier.create(train_data, model_spec=spec, epochs=10)" ] @@ -338,9 +322,7 @@ "metadata": { "id": "8xmnl6Yy7ARn" }, - "outputs": [ - - ], + "outputs": [], "source": [ "loss, acc = model.evaluate(test_data)" ] @@ -362,9 +344,7 @@ "metadata": { "id": "Hm_UULdW7A9T" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.export(export_dir='average_word_vec')" ] @@ -421,9 +401,7 @@ "metadata": { "id": "XWwvHmIltQC2" }, - "outputs": [ - - ], + "outputs": [], "source": [ "sentence_data = pd.read_csv('/content/dev.csv', index_col=0)\n", "sentence_data" @@ -444,9 +422,7 @@ "metadata": { "id": "IAEEs3_3vPz5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Name of the TFLite text classification model.\n", "_MODEL = '/content/average_word_vec/model.tflite'\n", @@ -477,9 +453,7 @@ "metadata": { "id": "Haham4qT8hmV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Initialize the text classification model.\n", "base_options = core.BaseOptions(file_name=_MODEL, use_coral=_ENABLE_EDGETPU, num_threads=_NUM_THREADS)\n", @@ -504,9 +478,7 @@ "metadata": { "id": "pAQDHFs5tTxZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for idx in range(20):\n", " sentence = sentence_data['sentence'].iloc[idx]\n", @@ -546,9 +518,7 @@ "metadata": { "id": "vEAWuZQ1PFiX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mb_spec = model_spec.get('mobilebert_classifier')" ] @@ -586,9 +556,7 @@ "metadata": { "id": "I_fOlZsklmlL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_data = DataLoader.from_csv(\n", " filename='train.csv',\n", @@ -632,9 +600,7 @@ "metadata": { "id": "TvYSUuJY3QxR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = text_classifier.create(train_data, model_spec=mb_spec, epochs=3)" ] @@ -654,9 +620,7 @@ "metadata": { "id": "gd7Hs8TF8n3H" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.summary()" ] @@ -678,9 +642,7 @@ "metadata": { "id": "A8c2ZQ0J3Riy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "loss, acc = model.evaluate(test_data)" ] @@ -704,9 +666,7 @@ "metadata": { "id": "Im6wA9lK3TQB" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.export(export_dir='mobilebert/')" ] @@ -742,9 +702,7 @@ "metadata": { "id": "nbK7nzK_Mfx4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.export(export_dir='mobilebert/', export_format=[ExportFormat.LABEL, ExportFormat.VOCAB])" ] @@ -764,9 +722,7 @@ "metadata": { "id": "ochbq95ZrVFX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "accuracy = model.evaluate_tflite('mobilebert/model.tflite', test_data)\n", "print('TFLite model accuracy: ', accuracy)" @@ -818,9 +774,7 @@ "metadata": { "id": "4tr9BLcjy4Sh" }, - "outputs": [ - - ], + "outputs": [], "source": [ "new_model_spec = model_spec.get('mobilebert_classifier')\n", "new_model_spec.seq_len = 256" @@ -852,9 +806,7 @@ "metadata": { "id": "e9WBN0UTQoMN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "new_model_spec = AverageWordVecSpec(wordvec_dim=32)" ] @@ -874,9 +826,7 @@ "metadata": { "id": "DVZurFBORG3J" }, - "outputs": [ - - ], + "outputs": [], "source": [ "new_train_data = DataLoader.from_csv(\n", " filename='train.csv',\n", @@ -901,9 +851,7 @@ "metadata": { "id": "PzpV246_JGEu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = text_classifier.create(new_train_data, model_spec=new_model_spec)" ] @@ -930,9 +878,7 @@ "metadata": { "id": "rnWFaYZBG6NW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = text_classifier.create(new_train_data, model_spec=new_model_spec, epochs=20)" ] @@ -952,9 +898,7 @@ "metadata": { "id": "BMPi1xflHDSY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "new_test_data = DataLoader.from_csv(\n", " filename='dev.csv',\n", @@ -985,9 +929,7 @@ "metadata": { "id": "QfFCWrwyggrT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "spec = model_spec.get('bert_classifier')" ] @@ -1043,9 +985,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "text_classification.ipynb", "toc_visible": true }, diff --git a/site/ko/lite/models/modify/model_maker/text_searcher.ipynb b/site/ko/lite/models/modify/model_maker/text_searcher.ipynb index 46f073fae5..33ee884183 100644 --- a/site/ko/lite/models/modify/model_maker/text_searcher.ipynb +++ b/site/ko/lite/models/modify/model_maker/text_searcher.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "TUfAcER1oUS6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -126,9 +124,7 @@ "metadata": { "id": "qhl8lqVamEty" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!sudo apt -y install libportaudio2\n", "!pip install -q tflite-model-maker\n", @@ -150,9 +146,7 @@ "metadata": { "id": "XtxiUeZEiXpt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "from tflite_model_maker import searcher" ] @@ -176,9 +170,7 @@ "metadata": { "id": "-P3zxue1T6Iy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!gdown https://drive.google.com/uc?id=0BwmD_VLjROrfTHk4NFg2SndKcjQ\n", "!gdown https://drive.google.com/uc?id=0BwmD_VLjROrfM1BxdkxVaTY2bWs\n", @@ -206,9 +198,7 @@ "cellView": "form", "id": "bA4PsR6NVU69" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Save the highlights and urls to the CSV file\n", "#@markdown Load the highlights from the stories of CNN / Daily Mail, map urls with highlights, and save them to the CSV file.\n", @@ -353,9 +343,7 @@ "metadata": { "id": "1ymHbk0wjHHZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!wget -O universal_sentence_encoder.tflite https://storage.googleapis.com/download.tensorflow.org/models/tflite_support/searcher/text_to_image_blogpost/text_embedder.tflite" ] @@ -389,9 +377,7 @@ "metadata": { "id": "CtdZ-JDwMimd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "data_loader = searcher.TextDataLoader.create(\"universal_sentence_encoder.tflite\", l2_normalize=True)\n", "data_loader.load_from_csv(\"cnn_dailymail.csv\", text_column=\"highlights\", metadata_column=\"urls\")" @@ -429,9 +415,7 @@ "metadata": { "id": "kwlYdTcg63xy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "scann_options = searcher.ScaNNOptions(\n", " distance_measure=\"dot_product\",\n", @@ -472,9 +456,7 @@ "metadata": { "id": "Hm_UULdW7A9T" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.export(\n", " export_filename=\"searcher.tflite\",\n", @@ -499,9 +481,7 @@ "metadata": { "id": "GkXtipXKqXp4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "from tflite_support.task import text\n", "\n", @@ -542,9 +522,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "text_searcher.ipynb", "toc_visible": true }, diff --git a/site/ko/lite/models/style_transfer/overview.ipynb b/site/ko/lite/models/style_transfer/overview.ipynb index 8aa30e03de..6b30c91714 100644 --- a/site/ko/lite/models/style_transfer/overview.ipynb +++ b/site/ko/lite/models/style_transfer/overview.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "2pHVBk_seED1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -129,9 +127,7 @@ "metadata": { "id": "xz62Lb1oNm97" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "print(tf.__version__)" @@ -143,9 +139,7 @@ "metadata": { "id": "1Ua5FpcJNrIj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import IPython.display as display\n", "\n", @@ -174,9 +168,7 @@ "metadata": { "id": "16g57cIMQnen" }, - "outputs": [ - - ], + "outputs": [], "source": [ "content_path = tf.keras.utils.get_file('belfry.jpg','https://storage.googleapis.com/khanhlvg-public.appspot.com/arbitrary-style-transfer/belfry-2611573_1280.jpg')\n", "style_path = tf.keras.utils.get_file('style23.jpg','https://storage.googleapis.com/khanhlvg-public.appspot.com/arbitrary-style-transfer/style23.jpg')\n", @@ -204,9 +196,7 @@ "metadata": { "id": "Cg0Vi-rXRUFl" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Function to load an image from a file, and add a batch dimension.\n", "def load_img(path_to_img):\n", @@ -258,9 +248,7 @@ "metadata": { "id": "ncPA4esJRcEu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def imshow(image, title=None):\n", " if len(image.shape) > 3:\n", @@ -301,9 +289,7 @@ "metadata": { "id": "o3zd9cTFRiS_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Function to run style prediction on preprocessed style image.\n", "def run_style_predict(preprocessed_style_image):\n", @@ -343,9 +329,7 @@ "metadata": { "id": "cZp5bCj8SX1w" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Run style transform on preprocessed style image\n", "def run_style_transform(style_bottleneck, preprocessed_content_image):\n", @@ -392,9 +376,7 @@ "metadata": { "id": "eJcAURXQQtJ7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Calculate style bottleneck of the content image.\n", "style_bottleneck_content = run_style_predict(\n", @@ -408,9 +390,7 @@ "metadata": { "id": "4S3yg2MgkmRD" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Define content blending ratio between [0..1].\n", "# 0.0: 0% style extracts from content image.\n", @@ -509,9 +489,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "overview.ipynb", "toc_visible": true }, diff --git a/site/ko/lite/performance/post_training_float16_quant.ipynb b/site/ko/lite/performance/post_training_float16_quant.ipynb index 3faf1ea29d..4246ae1231 100644 --- a/site/ko/lite/performance/post_training_float16_quant.ipynb +++ b/site/ko/lite/performance/post_training_float16_quant.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "I9sUhVL_VZNO" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -93,9 +91,7 @@ "metadata": { "id": "gyqAw1M9lyab" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import logging\n", "logging.getLogger(\"tensorflow\").setLevel(logging.DEBUG)\n", @@ -121,9 +117,7 @@ "metadata": { "id": "hWSAjQWagIHl" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Load MNIST dataset\n", "mnist = keras.datasets.mnist\n", @@ -183,9 +177,7 @@ "metadata": { "id": "_i8B2nDZmAgQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "converter = tf.lite.TFLiteConverter.from_keras_model(model)\n", "tflite_model = converter.convert()" @@ -206,9 +198,7 @@ "metadata": { "id": "vptWZq2xnclo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tflite_models_dir = pathlib.Path(\"/tmp/mnist_tflite_models/\")\n", "tflite_models_dir.mkdir(exist_ok=True, parents=True)" @@ -220,9 +210,7 @@ "metadata": { "id": "Ie9pQaQrn5ue" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tflite_model_file = tflite_models_dir/\"mnist_model.tflite\"\n", "tflite_model_file.write_bytes(tflite_model)" @@ -243,9 +231,7 @@ "metadata": { "id": "HEZ6ET1AHAS3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "converter.optimizations = [tf.lite.Optimize.DEFAULT]\n", "converter.target_spec.supported_types = [tf.float16]" @@ -266,9 +252,7 @@ "metadata": { "id": "yuNfl3CoHNK3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tflite_fp16_model = converter.convert()\n", "tflite_model_fp16_file = tflite_models_dir/\"mnist_model_quant_f16.tflite\"\n", @@ -290,9 +274,7 @@ "metadata": { "id": "JExfcfLDscu4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!ls -lh {tflite_models_dir}" ] @@ -330,9 +312,7 @@ "metadata": { "id": "Jn16Rc23zTss" }, - "outputs": [ - - ], + "outputs": [], "source": [ "interpreter = tf.lite.Interpreter(model_path=str(tflite_model_file))\n", "interpreter.allocate_tensors()" @@ -344,9 +324,7 @@ "metadata": { "id": "J8Pztk1mvNVL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "interpreter_fp16 = tf.lite.Interpreter(model_path=str(tflite_model_fp16_file))\n", "interpreter_fp16.allocate_tensors()" @@ -367,9 +345,7 @@ "metadata": { "id": "AKslvo2kwWac" }, - "outputs": [ - - ], + "outputs": [], "source": [ "test_image = np.expand_dims(test_images[0], axis=0).astype(np.float32)\n", "\n", @@ -387,9 +363,7 @@ "metadata": { "id": "XZClM2vo3_bm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import matplotlib.pylab as plt\n", "\n", @@ -406,9 +380,7 @@ "metadata": { "id": "3gwhv4lKbYZ4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "test_image = np.expand_dims(test_images[0], axis=0).astype(np.float32)\n", "\n", @@ -426,9 +398,7 @@ "metadata": { "id": "CIH7G_MwbY2x" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plt.imshow(test_images[0])\n", "template = \"True:{true}, predicted:{predict}\"\n", @@ -452,9 +422,7 @@ "metadata": { "id": "05aeAuWjvjPx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# A helper function to evaluate the TF Lite model using \"test\" dataset.\n", "def evaluate_model(interpreter):\n", @@ -494,9 +462,7 @@ "metadata": { "id": "T5mWkSbMcU5z" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(evaluate_model(interpreter))" ] @@ -516,9 +482,7 @@ "metadata": { "id": "-9cnwiPp6EGm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# NOTE: Colab runs on server CPUs. At the time of writing this, TensorFlow Lite\n", "# doesn't have super optimized server CPU kernels. For this reason this may be\n", @@ -555,9 +519,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "post_training_float16_quant.ipynb", "toc_visible": true }, diff --git a/site/ko/lite/tutorials/pose_classification.ipynb b/site/ko/lite/tutorials/pose_classification.ipynb index e14aaf28e5..3c8ddddd21 100644 --- a/site/ko/lite/tutorials/pose_classification.ipynb +++ b/site/ko/lite/tutorials/pose_classification.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "ZtimvKLdili0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -88,9 +86,7 @@ "metadata": { "id": "PWlbrkMCx-W-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install -q opencv-python" ] @@ -101,9 +97,7 @@ "metadata": { "id": "KTkttSWnUi1Q" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import csv\n", "import cv2\n", @@ -142,9 +136,7 @@ "cellView": "form", "id": "48kW1c2F5l1R" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Functions to run pose estimation with MoveNet\n", "\n", @@ -202,9 +194,7 @@ "cellView": "form", "id": "fKo0NzwQJ5Rm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Functions to visualize the pose estimation results.\n", "\n", @@ -249,9 +239,7 @@ "cellView": "form", "id": "QUkOW_26S6K-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Code to load the images, detect pose landmarks and save them into a CSV file\n", "\n", @@ -443,9 +431,7 @@ "cellView": "form", "id": "LB3QIVrdU108" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title (Optional) Code snippet to try out the Movenet pose estimation logic\n", "\n", @@ -488,9 +474,7 @@ "cellView": "form", "id": "Kw6jwOFD40Fr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "is_skip_step_1 = False #@param [\"False\", \"True\"] {type:\"raw\"}" ] @@ -511,9 +495,7 @@ "cellView": "form", "id": "iEnjgeKeS_VP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "use_custom_dataset = False #@param [\"False\", \"True\"] {type:\"raw\"}\n", "\n", @@ -578,9 +560,7 @@ "cellView": "form", "id": "joAHy_r62dsI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@markdown Be sure you run this cell. It's hiding the `split_into_train_test()` function that's called in the next code block.\n", "\n", @@ -653,9 +633,7 @@ "metadata": { "id": "IfpNIjAmR0lp" }, - "outputs": [ - - ], + "outputs": [], "source": [ "if use_custom_dataset:\n", " # ATTENTION:\n", @@ -699,9 +677,7 @@ "metadata": { "id": "GVpOi5Hr4Xxt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "if not is_skip_step_1 and not use_custom_dataset:\n", " !wget -O yoga_poses.zip http://download.tensorflow.org/data/pose_classification/yoga_poses.zip\n", @@ -724,9 +700,7 @@ "metadata": { "id": "OsdqxGfxTE2H" }, - "outputs": [ - - ], + "outputs": [], "source": [ "if not is_skip_step_1:\n", " images_in_train_folder = os.path.join(IMAGES_ROOT, 'train')\n", @@ -757,9 +731,7 @@ "metadata": { "id": "hddKVPjrTNbt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "if not is_skip_step_1:\n", " images_in_test_folder = os.path.join(IMAGES_ROOT, 'test')\n", @@ -806,9 +778,7 @@ "metadata": { "id": "ShpOD7yb4MRp" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Download the preprocessed CSV files which are the same as the output of step 1\n", "if is_skip_step_1:\n", @@ -835,9 +805,7 @@ "metadata": { "id": "pOUcc8EL5rrj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def load_pose_landmarks(csv_path):\n", " \"\"\"Loads a CSV created by MoveNetPreprocessor.\n", @@ -885,9 +853,7 @@ "metadata": { "id": "xawmSDGXUUzW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Load the train data\n", "X, y, class_names, _ = load_pose_landmarks(csvs_out_train_path)\n", @@ -903,9 +869,7 @@ "metadata": { "id": "R42kicUMaTX0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Load the test data\n", "X_test, y_test, _, df_test = load_pose_landmarks(csvs_out_test_path)" @@ -934,9 +898,7 @@ "metadata": { "id": "HgQMdfeT65Z5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def get_center_point(landmarks, left_bodypart, right_bodypart):\n", " \"\"\"Calculates the center point of the two given landmarks.\"\"\"\n", @@ -1038,9 +1000,7 @@ "metadata": { "id": "1Pte6b1bgWKv" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Define the model\n", "inputs = tf.keras.Input(shape=(51))\n", @@ -1062,9 +1022,7 @@ "metadata": { "id": "5ZuMwd7Ugtsa" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.compile(\n", " optimizer='adam',\n", @@ -1097,9 +1055,7 @@ "metadata": { "id": "pNVqmd2JO6Rp" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Visualize the training history to see whether you're overfitting.\n", "plt.plot(history.history['accuracy'])\n", @@ -1117,9 +1073,7 @@ "metadata": { "id": "m_byMBVQgyQm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Evaluate the model using the TEST dataset\n", "loss, accuracy = model.evaluate(X_test, y_test)" @@ -1140,9 +1094,7 @@ "metadata": { "id": "CJuVw7gygyyd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def plot_confusion_matrix(cm, classes,\n", " normalize=False,\n", @@ -1209,9 +1161,7 @@ "metadata": { "id": "bdJdwOkFGonK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "if is_skip_step_1:\n", " raise RuntimeError('You must have run step 1 to run this cell.')\n", @@ -1260,9 +1210,7 @@ "metadata": { "id": "FmwEAgi2Flb3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "converter = tf.lite.TFLiteConverter.from_keras_model(model)\n", "converter.optimizations = [tf.lite.Optimize.DEFAULT]\n", @@ -1289,9 +1237,7 @@ "metadata": { "id": "ZVW9j5vF6hBM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "with open('pose_labels.txt', 'w') as f:\n", " f.write('\\n'.join(class_names))" @@ -1312,9 +1258,7 @@ "metadata": { "id": "rv4fZFNcsN-1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def evaluate_model(interpreter, X, y_true):\n", " \"\"\"Evaluates the given TFLite model and return its accuracy.\"\"\"\n", @@ -1364,9 +1308,7 @@ "metadata": { "id": "KvcM_LkApOT3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!zip pose_classifier.zip pose_labels.txt pose_classifier.tflite" ] @@ -1377,9 +1319,7 @@ "metadata": { "id": "VQ-i27VypI1u" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Download the zip archive if running on Colab.\n", "try:\n", @@ -1392,9 +1332,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "pose_classification.ipynb", "toc_visible": true }, diff --git a/site/ko/model_optimization/guide/clustering/clustering_comprehensive_guide.ipynb b/site/ko/model_optimization/guide/clustering/clustering_comprehensive_guide.ipynb index 78e2e4b5c1..23edbb655c 100644 --- a/site/ko/model_optimization/guide/clustering/clustering_comprehensive_guide.ipynb +++ b/site/ko/model_optimization/guide/clustering/clustering_comprehensive_guide.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "ITj3u97-tNR7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -92,9 +90,7 @@ "metadata": { "id": "08dJRvOqN4rw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "! pip install -q tensorflow-model-optimization\n", "\n", @@ -202,9 +198,7 @@ "metadata": { "id": "29g7OADjN4r1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow_model_optimization as tfmot\n", "\n", @@ -255,9 +249,7 @@ "metadata": { "id": "IqBdl3uJN4r_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Create a base model\n", "base_model = setup_model()\n", @@ -325,9 +317,7 @@ "metadata": { "id": "73iboQ7MmxTs" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class MyDenseLayer(tf.keras.layers.Dense, tfmot.clustering.keras.ClusterableLayer):\n", "\n", @@ -383,9 +373,7 @@ "metadata": { "id": "w7P67mPk6RkQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Define the model.\n", "base_model = setup_model()\n", @@ -460,9 +448,7 @@ "metadata": { "id": "ZvuiCBsVN4sR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = setup_model()\n", "clustered_model = cluster_weights(model, **clustering_params)\n", @@ -493,9 +479,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "clustering_comprehensive_guide.ipynb", "toc_visible": true }, diff --git a/site/ko/model_optimization/guide/clustering/clustering_example.ipynb b/site/ko/model_optimization/guide/clustering/clustering_example.ipynb index b3478d71d0..42959aa2a3 100644 --- a/site/ko/model_optimization/guide/clustering/clustering_example.ipynb +++ b/site/ko/model_optimization/guide/clustering/clustering_example.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "mEE8NFIMSGO-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -100,9 +98,7 @@ "metadata": { "id": "3asgXMqnSGPE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "! pip install -q tensorflow-model-optimization" ] @@ -113,9 +109,7 @@ "metadata": { "id": "gL6JiLXkSGPI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "from tensorflow import keras\n", @@ -141,9 +135,7 @@ "metadata": { "id": "w7Fd6jZ7SGPL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Load MNIST dataset\n", "mnist = keras.datasets.mnist\n", @@ -191,9 +183,7 @@ "metadata": { "id": "HYulekocSGPP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_, baseline_model_accuracy = model.evaluate(\n", " test_images, test_labels, verbose=0)\n", @@ -247,9 +237,7 @@ "metadata": { "id": "OzqKKt0mSGPT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow_model_optimization as tfmot\n", "\n", @@ -299,9 +287,7 @@ "metadata": { "id": "jn29-coXSGPX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Fine-tune model\n", "clustered_model.fit(\n", @@ -327,9 +313,7 @@ "metadata": { "id": "bE7MxpWLTaQ1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_, clustered_model_accuracy = clustered_model.evaluate(\n", " test_images, test_labels, verbose=0)\n", @@ -364,9 +348,7 @@ "metadata": { "id": "4h6tSvMzSGPd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "final_model = tfmot.clustering.keras.strip_clustering(clustered_model)\n", "\n", @@ -391,9 +373,7 @@ "metadata": { "id": "v2N47QW6SGPh" }, - "outputs": [ - - ], + "outputs": [], "source": [ "clustered_tflite_file = '/tmp/clustered_mnist.tflite'\n", "converter = tf.lite.TFLiteConverter.from_keras_model(final_model)\n", @@ -418,9 +398,7 @@ "metadata": { "id": "1XJ4QBMpW5JB" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def get_gzipped_model_size(file):\n", " # It returns the size of the gzipped model in bytes.\n", @@ -449,9 +427,7 @@ "metadata": { "id": "SG1MgZCeSGPk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(\"Size of gzipped baseline Keras model: %.2f bytes\" % (get_gzipped_model_size(keras_file)))\n", "print(\"Size of gzipped clustered Keras model: %.2f bytes\" % (get_gzipped_model_size(clustered_keras_file)))\n", @@ -482,9 +458,7 @@ "metadata": { "id": "XyHC8euLSGPo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "converter = tf.lite.TFLiteConverter.from_keras_model(final_model)\n", "converter.optimizations = [tf.lite.Optimize.DEFAULT]\n", @@ -524,9 +498,7 @@ "metadata": { "id": "EJ9B7pRISGPw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def eval_model(interpreter):\n", " input_index = interpreter.get_input_details()[0][\"index\"]\n", @@ -573,9 +545,7 @@ "metadata": { "id": "RFD4LXjpSGPz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "interpreter = tf.lite.Interpreter(model_content=tflite_quant_model)\n", "interpreter.allocate_tensors()\n", @@ -607,9 +577,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "clustering_example.ipynb", "toc_visible": true }, diff --git a/site/ko/model_optimization/guide/combine/cqat_example.ipynb b/site/ko/model_optimization/guide/combine/cqat_example.ipynb index 9b659426c6..e48b04524f 100644 --- a/site/ko/model_optimization/guide/combine/cqat_example.ipynb +++ b/site/ko/model_optimization/guide/combine/cqat_example.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "mEE8NFIMSGO-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -99,9 +97,7 @@ "metadata": { "id": "3asgXMqnSGPE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "! pip install -q tensorflow-model-optimization" ] @@ -112,9 +108,7 @@ "metadata": { "id": "gL6JiLXkSGPI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "\n", @@ -139,9 +133,7 @@ "metadata": { "id": "w7Fd6jZ7SGPL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Load MNIST dataset\n", "mnist = tf.keras.datasets.mnist\n", @@ -189,9 +181,7 @@ "metadata": { "id": "HYulekocSGPP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_, baseline_model_accuracy = model.evaluate(\n", " test_images, test_labels, verbose=0)\n", @@ -245,9 +235,7 @@ "metadata": { "id": "OzqKKt0mSGPT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow_model_optimization as tfmot\n", "\n", @@ -297,9 +285,7 @@ "metadata": { "id": "jn29-coXSGPX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Fine-tune model\n", "clustered_model.fit(\n", @@ -324,9 +310,7 @@ "metadata": { "id": "f3gf1TDjR2rp" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def print_model_weight_clusters(model):\n", "\n", @@ -361,9 +345,7 @@ "metadata": { "id": "5l1jOLMfR2rq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "stripped_clustered_model = tfmot.clustering.keras.strip_clustering(clustered_model)\n", "\n", @@ -385,9 +367,7 @@ "metadata": { "id": "bE7MxpWLTaQ1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_, clustered_model_accuracy = clustered_model.evaluate(\n", " test_images, test_labels, verbose=0)\n", @@ -420,9 +400,7 @@ "metadata": { "id": "4h6tSvMzSGPd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# QAT\n", "qat_model = tfmot.quantization.keras.quantize_model(stripped_clustered_model)\n", @@ -453,9 +431,7 @@ "metadata": { "id": "-25FRoM0R2rt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(\"QAT Model clusters:\")\n", "print_model_weight_clusters(qat_model)\n", @@ -480,9 +456,7 @@ "metadata": { "id": "gc5txUkwR2ru" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def get_gzipped_model_size(file):\n", " # It returns the size of the gzipped model in kilobytes.\n", @@ -509,9 +483,7 @@ "metadata": { "id": "OChikLlhR2rv" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# QAT model\n", "converter = tf.lite.TFLiteConverter.from_keras_model(qat_model)\n", @@ -552,9 +524,7 @@ "metadata": { "id": "BEeTH_qBR2rw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def eval_model(interpreter):\n", " input_index = interpreter.get_input_details()[0][\"index\"]\n", @@ -601,9 +571,7 @@ "metadata": { "id": "LLHIyrumR2rx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "interpreter = tf.lite.Interpreter(cqat_model_file)\n", "interpreter.allocate_tensors()\n", @@ -633,9 +601,7 @@ "metadata": { "id": "LoVVjF-zR2ry" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def mnist_representative_data_gen():\n", " for image in train_images[:1000]: \n", @@ -658,9 +624,7 @@ "metadata": { "id": "4MK8mjIuR2ry" }, - "outputs": [ - - ], + "outputs": [], "source": [ "converter = tf.lite.TFLiteConverter.from_keras_model(stripped_clustered_model)\n", "converter.optimizations = [tf.lite.Optimize.DEFAULT]\n", @@ -702,9 +666,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "cqat_example.ipynb", "toc_visible": true }, diff --git a/site/ko/model_optimization/guide/combine/pcqat_example.ipynb b/site/ko/model_optimization/guide/combine/pcqat_example.ipynb index e28c9499ea..b5322c0b1a 100644 --- a/site/ko/model_optimization/guide/combine/pcqat_example.ipynb +++ b/site/ko/model_optimization/guide/combine/pcqat_example.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "mEE8NFIMSGO-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -41,11 +39,11 @@ "source": [ "\n", " \n", - " \n", - " \n", - " \n", + " \n", "
TensorFlow.org에서보기 Google Colab에서 실행하기\n", + " Google Colab에서 실행하기\n", " GitHub에서 소스 보기\n", + " GitHub에서 소스 보기\n", " 노트북 다운로드하기 노트북 다운로드하기
" ] }, @@ -103,9 +101,7 @@ "metadata": { "id": "3asgXMqnSGPE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "! pip install -q tensorflow-model-optimization" ] @@ -116,9 +112,7 @@ "metadata": { "id": "gL6JiLXkSGPI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "\n", @@ -143,9 +137,7 @@ "metadata": { "id": "w7Fd6jZ7SGPL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Load MNIST dataset\n", "mnist = tf.keras.datasets.mnist\n", @@ -195,9 +187,7 @@ "metadata": { "id": "HYulekocSGPP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_, baseline_model_accuracy = model.evaluate(\n", " test_images, test_labels, verbose=0)\n", @@ -244,9 +234,7 @@ "metadata": { "id": "mqsN5tP-kXZF" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow_model_optimization as tfmot\n", "\n", @@ -288,9 +276,7 @@ "metadata": { "id": "2aBxR8uEkXZG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Fine-tune model\n", "pruned_model.fit(\n", @@ -316,9 +302,7 @@ "metadata": { "id": "XL-zWoU4kXZG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def print_model_weights_sparsity(model):\n", " for layer in model.layers:\n", @@ -368,9 +352,7 @@ "metadata": { "id": "_8_p--1NkXZG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "stripped_pruned_model = tfmot.sparsity.keras.strip_pruning(pruned_model)\n", "\n", @@ -401,9 +383,7 @@ "metadata": { "id": "RetnGeQnkXZH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow_model_optimization as tfmot\n", "from tensorflow_model_optimization.python.core.clustering.keras.experimental import (\n", @@ -446,9 +426,7 @@ "metadata": { "id": "iHN3NW8OkXZI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "stripped_clustered_model = tfmot.clustering.keras.strip_clustering(sparsity_clustered_model)\n", "\n", @@ -483,9 +461,7 @@ "metadata": { "id": "Nfp-xfHdZIUc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# QAT\n", "qat_model = tfmot.quantization.keras.quantize_model(stripped_clustered_model)\n", @@ -516,9 +492,7 @@ "metadata": { "id": "6kluyg_2ZIUd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(\"QAT Model clusters:\")\n", "print_model_weight_clusters(qat_model)\n", @@ -547,9 +521,7 @@ "metadata": { "id": "vehNHBYsZIUe" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def get_gzipped_model_size(file):\n", " # It returns the size of the gzipped model in kilobytes.\n", @@ -576,9 +548,7 @@ "metadata": { "id": "mbe2jMAyZIUe" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# QAT model\n", "converter = tf.lite.TFLiteConverter.from_keras_model(qat_model)\n", @@ -619,9 +589,7 @@ "metadata": { "id": "9P-1dmQcZIUf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def eval_model(interpreter):\n", " input_index = interpreter.get_input_details()[0][\"index\"]\n", @@ -668,9 +636,7 @@ "metadata": { "id": "6p4RBECpZIUg" }, - "outputs": [ - - ], + "outputs": [], "source": [ "interpreter = tf.lite.Interpreter(pcqat_model_file)\n", "interpreter.allocate_tensors()\n", @@ -708,9 +674,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "pcqat_example.ipynb", "toc_visible": true }, diff --git a/site/ko/model_optimization/guide/combine/pqat_example.ipynb b/site/ko/model_optimization/guide/combine/pqat_example.ipynb index 6cac9aa588..95e6e90bdb 100644 --- a/site/ko/model_optimization/guide/combine/pqat_example.ipynb +++ b/site/ko/model_optimization/guide/combine/pqat_example.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "mEE8NFIMSGO-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -41,11 +39,11 @@ "source": [ "\n", " \n", - " \n", - " \n", - " \n", + " \n", "
TensorFlow.org에서보기 Google Colab에서 실행하기\n", + " Google Colab에서 실행하기\n", " GitHub에서 소스 보기\n", + " GitHub에서 소스 보기\n", " 노트북 다운로드하기 노트북 다운로드하기
" ] }, @@ -101,9 +99,7 @@ "metadata": { "id": "3asgXMqnSGPE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "! pip install -q tensorflow-model-optimization" ] @@ -114,9 +110,7 @@ "metadata": { "id": "gL6JiLXkSGPI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "\n", @@ -141,9 +135,7 @@ "metadata": { "id": "w7Fd6jZ7SGPL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Load MNIST dataset\n", "mnist = tf.keras.datasets.mnist\n", @@ -191,9 +183,7 @@ "metadata": { "id": "HYulekocSGPP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_, baseline_model_accuracy = model.evaluate(\n", " test_images, test_labels, verbose=0)\n", @@ -247,9 +237,7 @@ "metadata": { "id": "OzqKKt0mSGPT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow_model_optimization as tfmot\n", "\n", @@ -300,9 +288,7 @@ "metadata": { "id": "jn29-coXSGPX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Fine-tune model\n", "pruned_model.fit(\n", @@ -328,9 +314,7 @@ "metadata": { "id": "69468934028c" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def print_model_weights_sparsity(model):\n", "\n", @@ -366,9 +350,7 @@ "metadata": { "id": "a3fada83ffd7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "stripped_pruned_model = tfmot.sparsity.keras.strip_pruning(pruned_model)\n", "\n", @@ -390,9 +372,7 @@ "metadata": { "id": "bE7MxpWLTaQ1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_, pruned_model_accuracy = pruned_model.evaluate(\n", " test_images, test_labels, verbose=0)\n", @@ -425,9 +405,7 @@ "metadata": { "id": "4h6tSvMzSGPd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# QAT\n", "qat_model = tfmot.quantization.keras.quantize_model(stripped_pruned_model)\n", @@ -458,9 +436,7 @@ "metadata": { "id": "8e90c14cce8d" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(\"QAT Model sparsity:\")\n", "print_model_weights_sparsity(qat_model)\n", @@ -485,9 +461,7 @@ "metadata": { "id": "b72869768986" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def get_gzipped_model_size(file):\n", " # It returns the size of the gzipped model in kilobytes.\n", @@ -514,9 +488,7 @@ "metadata": { "id": "057965bfae3d" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# QAT model\n", "converter = tf.lite.TFLiteConverter.from_keras_model(qat_model)\n", @@ -557,9 +529,7 @@ "metadata": { "id": "8808bb8628bd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def eval_model(interpreter):\n", " input_index = interpreter.get_input_details()[0][\"index\"]\n", @@ -606,9 +576,7 @@ "metadata": { "id": "4eaf0160ea09" }, - "outputs": [ - - ], + "outputs": [], "source": [ "interpreter = tf.lite.Interpreter(pqat_model_file)\n", "interpreter.allocate_tensors()\n", @@ -638,9 +606,7 @@ "metadata": { "id": "e92771026b96" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def mnist_representative_data_gen():\n", " for image in train_images[:1000]: \n", @@ -663,9 +629,7 @@ "metadata": { "id": "0c913c4d4f9b" }, - "outputs": [ - - ], + "outputs": [], "source": [ "converter = tf.lite.TFLiteConverter.from_keras_model(stripped_pruned_model)\n", "converter.optimizations = [tf.lite.Optimize.DEFAULT]\n", @@ -707,9 +671,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "pqat_example.ipynb", "toc_visible": true }, diff --git a/site/ko/model_optimization/guide/combine/sparse_clustering_example.ipynb b/site/ko/model_optimization/guide/combine/sparse_clustering_example.ipynb index c6b94c6e4c..72806a9ce4 100644 --- a/site/ko/model_optimization/guide/combine/sparse_clustering_example.ipynb +++ b/site/ko/model_optimization/guide/combine/sparse_clustering_example.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "mEE8NFIMSGO-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -50,11 +48,11 @@ "source": [ "\n", " \n", - " \n", - " \n", - " \n", + " \n", "
TensorFlow.org에서보기 Google Colab에서 실행하기\n", + " Google Colab에서 실행하기\n", " GitHub에서 소스 보기\n", + " GitHub에서 소스 보기\n", " 노트북 다운로드하기 노트북 다운로드하기
" ] }, @@ -101,9 +99,7 @@ "metadata": { "id": "3asgXMqnSGPE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "! pip install -q tensorflow-model-optimization" ] @@ -114,9 +110,7 @@ "metadata": { "id": "gL6JiLXkSGPI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "\n", @@ -141,9 +135,7 @@ "metadata": { "id": "w7Fd6jZ7SGPL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Load MNIST dataset\n", "mnist = tf.keras.datasets.mnist\n", @@ -191,9 +183,7 @@ "metadata": { "id": "HYulekocSGPP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_, baseline_model_accuracy = model.evaluate(\n", " test_images, test_labels, verbose=0)\n", @@ -240,9 +230,7 @@ "metadata": { "id": "mqsN5tP-kXZF" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow_model_optimization as tfmot\n", "\n", @@ -286,9 +274,7 @@ "metadata": { "id": "2aBxR8uEkXZG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Fine-tune model\n", "pruned_model.fit(\n", @@ -314,9 +300,7 @@ "metadata": { "id": "XL-zWoU4kXZG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def print_model_weights_sparsity(model):\n", "\n", @@ -351,9 +335,7 @@ "metadata": { "id": "_8_p--1NkXZG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "stripped_pruned_model = tfmot.sparsity.keras.strip_pruning(pruned_model)\n", "\n", @@ -387,9 +369,7 @@ "metadata": { "id": "RetnGeQnkXZH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Clustering\n", "cluster_weights = tfmot.clustering.keras.cluster_weights\n", @@ -450,9 +430,7 @@ "metadata": { "id": "iHN3NW8OkXZI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(\"Clustered Model sparsity:\\n\")\n", "print_model_weights_sparsity(clustered_model)\n", @@ -477,9 +455,7 @@ "metadata": { "id": "obozrEwrkXZI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def get_gzipped_model_size(file):\n", " # It returns the size of the gzipped model in kilobytes.\n", @@ -497,9 +473,7 @@ "metadata": { "id": "RTjq8zjnkXZJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Clustered model\n", "clustered_model_file = 'clustered_model.h5'\n", @@ -534,9 +508,7 @@ "metadata": { "id": "i4dI7XSakXZJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "stripped_sparsity_clustered_model = tfmot.clustering.keras.strip_clustering(sparsity_clustered_model)\n", "\n", @@ -569,9 +541,7 @@ "metadata": { "id": "c1HTl0x0kXZK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def eval_model(interpreter):\n", " input_index = interpreter.get_input_details()[0][\"index\"]\n", @@ -618,9 +588,7 @@ "metadata": { "id": "lbumQ_-0kXZL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Keras model evaluation\n", "stripped_sparsity_clustered_model.compile(optimizer='adam',\n", @@ -660,9 +628,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "sparse_clustering_example.ipynb", "toc_visible": true }, diff --git a/site/ko/model_optimization/guide/pruning/comprehensive_guide.ipynb b/site/ko/model_optimization/guide/pruning/comprehensive_guide.ipynb index 1eb84a5815..7c6748731d 100644 --- a/site/ko/model_optimization/guide/pruning/comprehensive_guide.ipynb +++ b/site/ko/model_optimization/guide/pruning/comprehensive_guide.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "IcfrhafzkZbH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -105,9 +103,7 @@ "cellView": "both", "id": "lvpH1Hg7ULFz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "! pip install -q tensorflow-model-optimization\n", "\n", @@ -203,9 +199,7 @@ "metadata": { "id": "aIn-hFO_T_PU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "base_model = setup_model()\n", "base_model.load_weights(pretrained_weights) # optional but recommended.\n", @@ -251,9 +245,7 @@ "metadata": { "id": "HN0B_QB-ZhE2" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Create a base model\n", "base_model = setup_model()\n", @@ -291,9 +283,7 @@ "metadata": { "id": "CjY_JyB808Da" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(base_model.layers[0].name)" ] @@ -333,9 +323,7 @@ "metadata": { "id": "7Wow55hg5oiM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Use `prune_low_magnitude` to make the `Dense` layer train with pruning.\n", "i = tf.keras.Input(shape=(20,))\n", @@ -361,9 +349,7 @@ "metadata": { "id": "mQOiDUGgfi4y" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Use `prune_low_magnitude` to make the `Dense` layer train with pruning.\n", "model_for_pruning = tf.keras.Sequential([\n", @@ -405,9 +391,7 @@ "metadata": { "id": "77jgBjccnTh6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class MyDenseLayer(tf.keras.layers.Dense, tfmot.sparsity.keras.PrunableLayer):\n", "\n", @@ -459,9 +443,7 @@ "metadata": { "id": "fKZ2PxcpY_WV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Define the model.\n", "base_model = setup_model()\n", @@ -527,9 +509,7 @@ "metadata": { "id": "hPQUrkodbIF2" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Define the model.\n", "base_model = setup_model()\n", @@ -630,9 +610,7 @@ "metadata": { "id": "6khQg-q7imfH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Define the model.\n", "base_model = setup_model()\n", @@ -660,9 +638,7 @@ "metadata": { "id": "2nGC1hZnYlzb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Deserialize model.\n", "with tfmot.sparsity.keras.prune_scope():\n", @@ -704,9 +680,7 @@ "metadata": { "id": "EZ3TD8cYkxZM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Define the model.\n", "base_model = setup_model()\n", @@ -753,9 +727,7 @@ "metadata": { "id": "xedaVDeFc0bw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "base_model = setup_model()\n", "\n", diff --git a/site/ko/model_optimization/guide/pruning/pruning_for_on_device_inference.ipynb b/site/ko/model_optimization/guide/pruning/pruning_for_on_device_inference.ipynb index e77025f370..2907e97683 100644 --- a/site/ko/model_optimization/guide/pruning/pruning_for_on_device_inference.ipynb +++ b/site/ko/model_optimization/guide/pruning/pruning_for_on_device_inference.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "DwBljPxTJ4Ng" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -50,10 +48,10 @@ "source": [ "\n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", "
TensorFlow.org에서보기 Google Colab에서 실행하기\n", + " Google Colab에서 실행하기\n", "GitHub에서 소그 보기 노트북 다운로드하기 GitHub에서 소그 보기 노트북 다운로드하기
" ] }, @@ -92,9 +90,7 @@ "metadata": { "id": "re0qdmOAJ4Nk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "! pip install -q tensorflow\n", "! pip install -q tensorflow-model-optimization" @@ -106,9 +102,7 @@ "metadata": { "id": "aIn7sB8-J4Nk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tempfile\n", "\n", @@ -146,9 +140,7 @@ "metadata": { "id": "Ws4cmZCJJ4Nm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Load CIFAR10 dataset.\n", "(ds_train, ds_val, ds_test), ds_info = tfds.load(\n", @@ -248,9 +240,7 @@ "metadata": { "id": "N1WQt5dmJ4Nn" }, - "outputs": [ - - ], + "outputs": [], "source": [ "prune_low_magnitude = tfmot.sparsity.keras.prune_low_magnitude\n", "\n", @@ -291,9 +281,7 @@ "metadata": { "id": "qvALAbZeJ4No" }, - "outputs": [ - - ], + "outputs": [], "source": [ "fixed_dense_model = keras.Sequential([\n", " keras.layers.InputLayer(input_shape=(32, 32, 3)),\n", @@ -364,9 +352,7 @@ "metadata": { "id": "GzdS6AgRJ4Np" }, - "outputs": [ - - ], + "outputs": [], "source": [ "logdir = tempfile.mkdtemp()\n", "\n", @@ -408,9 +394,7 @@ "metadata": { "id": "fGDkSxKJJ4Nq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#docs_infra: no_execute\n", "%tensorboard --logdir={logdir}" @@ -442,9 +426,7 @@ "metadata": { "id": "AAJr2XKCJ4Nr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "converter = tf.lite.TFLiteConverter.from_keras_model(dense_model)\n", "dense_tflite_model = converter.convert()\n", @@ -479,9 +461,7 @@ "metadata": { "id": "-qamJwAM7psU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "! adb shell /data/local/tmp/benchmark_model \\\n", " --graph=/data/local/tmp/dense_model.tflite \\\n", @@ -496,9 +476,7 @@ "metadata": { "id": "fpTxyOcd7psU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "! adb shell /data/local/tmp/benchmark_model \\\n", " --graph=/data/local/tmp/pruned_model.tflite \\\n", @@ -539,9 +517,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "pruning_for_on_device_inference.ipynb", "toc_visible": true }, diff --git a/site/ko/model_optimization/guide/pruning/pruning_with_sparsity_2_by_4.ipynb b/site/ko/model_optimization/guide/pruning/pruning_with_sparsity_2_by_4.ipynb index a74c148109..3e152d76be 100644 --- a/site/ko/model_optimization/guide/pruning/pruning_with_sparsity_2_by_4.ipynb +++ b/site/ko/model_optimization/guide/pruning/pruning_with_sparsity_2_by_4.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "IcfrhafzkZbH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -50,10 +48,10 @@ "source": [ "\n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", "
TensorFlow.org에서보기 Google Colab에서 실행하기\n", + " Google Colab에서 실행하기\n", "GitHub에서 소그 보기 노트북 다운로드하기 GitHub에서 소그 보기 노트북 다운로드하기
" ] }, @@ -121,9 +119,7 @@ "cellView": "both", "id": "lvpH1Hg7ULFz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "! pip install -q tensorflow\n", "! pip install -q tensorflow-model-optimization\n", @@ -136,9 +132,7 @@ "metadata": { "id": "_hn5e5_gWr_E" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "from tensorflow import keras\n", @@ -162,9 +156,7 @@ "metadata": { "id": "hSf4jYKGWr_E" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Load MNIST dataset.\n", "mnist = keras.datasets.mnist\n", @@ -201,9 +193,7 @@ "metadata": { "id": "1EXNYAPJWr_F" }, - "outputs": [ - - ], + "outputs": [], "source": [ "pruning_params_2_by_4 = {\n", " 'sparsity_m_by_n': (2, 4),\n", @@ -225,9 +215,7 @@ "metadata": { "id": "un24AZUOWr_F" }, - "outputs": [ - - ], + "outputs": [], "source": [ "pruning_params_sparsity_0_5 = {\n", " 'pruning_schedule': tfmot.sparsity.keras.ConstantSparsity(target_sparsity=0.5,\n", @@ -255,9 +243,7 @@ "metadata": { "id": "BDGzC6YlWr_G" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = keras.Sequential([\n", " prune_low_magnitude(\n", @@ -307,9 +293,7 @@ "metadata": { "id": "F4CnppA1Wr_H" }, - "outputs": [ - - ], + "outputs": [], "source": [ "batch_size = 128\n", "epochs = 2\n", @@ -342,9 +326,7 @@ "metadata": { "id": "3wn-OQ_gWr_H" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = tfmot.sparsity.keras.strip_pruning(model)" ] @@ -364,9 +346,7 @@ "metadata": { "id": "EJ7DsA6-Wr_I" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tempfile\n", "\n", @@ -403,9 +383,7 @@ "metadata": { "id": "fOIp6QB5Wr_J" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Load tflite file with the created pruned model\n", "interpreter = tf.lite.Interpreter(model_path=tflite_file)\n", @@ -436,9 +414,7 @@ "metadata": { "id": "mCDkwMUPWr_K" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(f\"Shape of Dense layer is {tensor_data.shape}\")" ] @@ -458,9 +434,7 @@ "metadata": { "id": "WZfn34bRWr_K" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", @@ -490,9 +464,7 @@ "metadata": { "id": "LUplruw9Wr_L" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def plot_separation_lines(height, width):\n", "\n", @@ -526,9 +498,7 @@ "metadata": { "id": "ATeyf5vCWr_L" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plot_separation_lines(height, width)\n", "\n", @@ -554,9 +524,7 @@ "metadata": { "id": "_Dkbt7eRWr_M" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Get weights of the convolutional layer that has been pruned with 2 by 4 sparsity.\n", "tensor_name = 'structural_pruning/Conv2D'\n", @@ -580,9 +548,7 @@ "metadata": { "id": "wyvLpfa6Wr_M" }, - "outputs": [ - - ], + "outputs": [], "source": [ "weights_to_display = tf.reshape(tensor_data, [tf.reduce_prod(tensor_data.shape[:-1]), -1])\n", "weights_to_display = weights_to_display[0:width, 0:height]\n", @@ -615,9 +581,7 @@ "metadata": { "id": "eEHu5nizWr_M" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Get weights of the convolutional layer that has been pruned with random pruning.\n", "tensor_name = 'pruning_sparsity_0_5/Conv2D'\n", @@ -632,9 +596,7 @@ "metadata": { "id": "Cimzp3kVWr_M" }, - "outputs": [ - - ], + "outputs": [], "source": [ "weights_to_display = tf.reshape(tensor_data, [tensor_data.shape[0],tf.reduce_prod(tensor_data.shape[1:])])\n", "weights_to_display = weights_to_display[0:width, 0:height]\n", @@ -667,9 +629,7 @@ "metadata": { "id": "7HDYffebWr_N" }, - "outputs": [ - - ], + "outputs": [], "source": [ "! python3 ./tensorflow_model_optimization/python/core/sparsity/keras/tools/check_sparsity_m_by_n.py --model_tflite=pruned_model.tflite --m_by_n=2,4\n" ] diff --git a/site/ko/neural_structured_learning/tutorials/adversarial_keras_cnn_mnist.ipynb b/site/ko/neural_structured_learning/tutorials/adversarial_keras_cnn_mnist.ipynb index 922bb70295..9c552cc9dd 100644 --- a/site/ko/neural_structured_learning/tutorials/adversarial_keras_cnn_mnist.ipynb +++ b/site/ko/neural_structured_learning/tutorials/adversarial_keras_cnn_mnist.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "nxbcnXODdE06" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -179,9 +177,7 @@ "metadata": { "id": "ByJ7133BQULR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install --quiet neural-structured-learning" ] @@ -201,9 +197,7 @@ "metadata": { "id": "EuqEuAYzTMo0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import neural_structured_learning as nsl\n", @@ -252,9 +246,7 @@ "metadata": { "id": "iOc8YdmIRSHo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class HParams(object):\n", " def __init__(self):\n", @@ -300,9 +292,7 @@ "metadata": { "id": "R1dK6E4axNHB" }, - "outputs": [ - - ], + "outputs": [], "source": [ "datasets = tfds.load('mnist')\n", "\n", @@ -328,9 +318,7 @@ "metadata": { "id": "VhMEJqKs0_7z" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def normalize(features):\n", " features[IMAGE_INPUT_NAME] = tf.cast(\n", @@ -364,9 +352,7 @@ "metadata": { "id": "4UjrtuIsYWo3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def build_base_model(hparams):\n", " \"\"\"Builds a model according to the architecture defined in `hparams`.\"\"\"\n", @@ -395,9 +381,7 @@ "metadata": { "id": "288nsmN5pLoo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "base_model = build_base_model(HPARAMS)\n", "base_model.summary()" @@ -418,9 +402,7 @@ "metadata": { "id": "K2cFDbmRpRMp" }, - "outputs": [ - - ], + "outputs": [], "source": [ "base_model.compile(\n", " optimizer='adam',\n", @@ -435,9 +417,7 @@ "metadata": { "id": "J94Y_WTaqAsi" }, - "outputs": [ - - ], + "outputs": [], "source": [ "results = base_model.evaluate(test_dataset)\n", "named_results = dict(zip(base_model.metrics_names, results))\n", @@ -479,9 +459,7 @@ "metadata": { "id": "-WWVwJB2qstE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "adv_config = nsl.configs.make_adv_reg_config(\n", " multiplier=HPARAMS.adv_multiplier,\n", @@ -507,9 +485,7 @@ "metadata": { "id": "TObqJLEX4sQq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "base_adv_model = build_base_model(HPARAMS)\n", "adv_model = nsl.keras.AdversarialRegularization(\n", @@ -537,9 +513,7 @@ "metadata": { "id": "aTSK-cHbuWDw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "adv_model.compile(\n", " optimizer='adam',\n", @@ -554,9 +528,7 @@ "metadata": { "id": "3v_Jn7wuviZx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "results = adv_model.evaluate(test_set_for_adv_model)\n", "named_results = dict(zip(adv_model.metrics_names, results))\n", @@ -591,9 +563,7 @@ "metadata": { "id": "FLkYw54pvxJO" }, - "outputs": [ - - ], + "outputs": [], "source": [ "reference_model = nsl.keras.AdversarialRegularization(\n", " base_model, label_keys=[LABEL_INPUT_NAME], adv_config=adv_config)\n", @@ -620,9 +590,7 @@ "metadata": { "id": "igRBxPlPm_JE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "models_to_eval = {\n", " 'base': base_model,\n", @@ -649,9 +617,7 @@ "metadata": { "id": "IGnLXhswmUN8" }, - "outputs": [ - - ], + "outputs": [], "source": [ "perturbed_images, labels, predictions = [], [], []\n", "\n", @@ -699,9 +665,7 @@ "metadata": { "id": "3iK9vO_xKJfg" }, - "outputs": [ - - ], + "outputs": [], "source": [ "batch_index = 0\n", "\n", @@ -744,9 +708,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "adversarial_keras_cnn_mnist.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/A_Tour_of_TensorFlow_Probability.ipynb b/site/ko/probability/examples/A_Tour_of_TensorFlow_Probability.ipynb index fccaf8ae62..a1c184d143 100644 --- a/site/ko/probability/examples/A_Tour_of_TensorFlow_Probability.ipynb +++ b/site/ko/probability/examples/A_Tour_of_TensorFlow_Probability.ipynb @@ -18,9 +18,7 @@ "cellView": "form", "id": "CpDUTVKYTowI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -75,9 +73,7 @@ "metadata": { "id": "5UYdUIGU5KJ6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Import { display-mode: \"form\" }\n", "\n", @@ -108,9 +104,7 @@ "metadata": { "id": "di_gCffY43PT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Utils { display-mode: \"form\" }\n", "def print_subclasses_from_module(module, base_class, maxwidth=80):\n", @@ -400,9 +394,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -430,9 +422,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -457,9 +447,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -710,9 +698,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -792,9 +778,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -870,9 +854,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -933,9 +915,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -968,9 +948,7 @@ "metadata": { "id": "n0xgOdM2XstI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Suppose we have some observed data\n", "obs_x = [[-3.], [0.], [2.]] # Shape 3x1 (3 1-D vectors)\n", @@ -994,9 +972,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1096,9 +1072,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1125,9 +1099,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1161,9 +1133,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1247,9 +1217,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1330,9 +1298,7 @@ "metadata": { "id": "5lZhXdbgbSwP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Generate some data\n", "def f(x, w):\n", @@ -1366,9 +1332,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1403,9 +1367,7 @@ "metadata": { "id": "UY56HpEaduUV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Define the joint_log_prob function, and our unnormalized posterior.\n", "def joint_log_prob(w, x, y):\n", @@ -1428,9 +1390,7 @@ "metadata": { "id": "lgL8c1nKjSi8" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Create our unnormalized target density by currying x and y from the joint.\n", "def unnormalized_posterior(w):\n", @@ -1452,9 +1412,7 @@ "metadata": { "id": "T9Myqb0Yjph3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Create an HMC TransitionKernel\n", "hmc_kernel = tfp.mcmc.HamiltonianMonteCarlo(\n", @@ -1469,9 +1427,7 @@ "metadata": { "id": "JBuIs-IbedWo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# We wrap sample_chain in tf.function, telling TF to precompile a reusable\n", "# computation graph, which will dramatically improve performance.\n", @@ -1534,9 +1490,7 @@ "metadata": { "id": "QzAocJeU0wib" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Apply a simple step size adaptation during burnin\n", "@tf.function\n", @@ -1590,9 +1544,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -1604,9 +1556,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1780,9 +1730,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -1794,9 +1742,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1865,9 +1811,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "A_Tour_of_TensorFlow_Probability.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/Bayesian_Gaussian_Mixture_Model.ipynb b/site/ko/probability/examples/Bayesian_Gaussian_Mixture_Model.ipynb index a9ab321886..e91f3259cf 100644 --- a/site/ko/probability/examples/Bayesian_Gaussian_Mixture_Model.ipynb +++ b/site/ko/probability/examples/Bayesian_Gaussian_Mixture_Model.ipynb @@ -18,9 +18,7 @@ "cellView": "form", "id": "9HGeUNoteaSm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -120,9 +118,7 @@ "metadata": { "id": "uswTWdgNu46j" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%matplotlib inline\n", "\n", @@ -168,9 +164,7 @@ "metadata": { "id": "nc4yy6vW-lC_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class MVNCholPrecisionTriL(tfd.TransformedDistribution):\n", " \"\"\"MVN from loc and (Cholesky) precision matrix.\"\"\"\n", @@ -280,9 +274,7 @@ "metadata": { "id": "xhzxySDjL2-S" }, - "outputs": [ - - ], + "outputs": [], "source": [ "dtype = np.float64\n", "dims = 2\n", @@ -296,9 +288,7 @@ "metadata": { "id": "xAOmHhZ7LzDQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "bgmm = tfd.JointDistributionNamed(dict(\n", " mix_probs=tfd.Dirichlet(\n", @@ -333,9 +323,7 @@ "metadata": { "id": "CpLnRJr2TXYD" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def joint_log_prob(observations, mix_probs, loc, chol_precision):\n", " \"\"\"BGMM with priors: loc=Normal, precision=Inverse-Wishart, mix=Dirichlet.\n", @@ -382,9 +370,7 @@ "metadata": { "id": "1AJZAtwXV8RQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "true_loc = np.array([[-2., -2],\n", " [0, 0],\n", @@ -422,9 +408,7 @@ "metadata": { "id": "tVoaDFSf7L_j" }, - "outputs": [ - - ], + "outputs": [], "source": [ "unnormalized_posterior_log_prob = functools.partial(joint_log_prob, observations)" ] @@ -435,9 +419,7 @@ "metadata": { "id": "a0OMIWIYeMmQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "initial_state = [\n", " tf.fill([components],\n", @@ -499,9 +481,7 @@ "metadata": { "id": "_atEQrDR7JvG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "unconstraining_bijectors = [\n", " tfb.SoftmaxCentered(),\n", @@ -518,9 +498,7 @@ "metadata": { "id": "0zq6QJJ-NSPJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function(autograph=False)\n", "def sample():\n", @@ -556,9 +534,7 @@ "metadata": { "id": "_ceX1A3-ZFiN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "acceptance_rate = tf.reduce_mean(tf.cast(is_accepted, dtype=tf.float32)).numpy()\n", "mean_mix_probs = tf.reduce_mean(mix_probs, axis=0).numpy()\n", @@ -618,9 +594,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -654,9 +628,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "Bayesian_Gaussian_Mixture_Model.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/Distributed_Inference_with_JAX.ipynb b/site/ko/probability/examples/Distributed_Inference_with_JAX.ipynb index 0a0973bfc4..5773605399 100644 --- a/site/ko/probability/examples/Distributed_Inference_with_JAX.ipynb +++ b/site/ko/probability/examples/Distributed_Inference_with_JAX.ipynb @@ -18,9 +18,7 @@ "cellView": "form", "id": "_RX4_K8Z5msT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -173,9 +171,7 @@ "metadata": { "id": "X4Pe3mZKgO6i" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tfd = tfp.distributions\n", "tfb = tfp.bijectors\n", @@ -377,9 +373,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -416,9 +410,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -486,9 +478,7 @@ "metadata": { "id": "LQAqJ4O3h1oM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def run(seed):\n", " target_log_prob = tfd.Sample(tfd.Normal(0., 1.), 2).log_prob\n", @@ -555,9 +545,7 @@ "metadata": { "id": "uz1etedpjw_f" }, - "outputs": [ - - ], + "outputs": [], "source": [ "states = states.transpose([0, 2, 1, 3]).reshape([-1, 1000, 2])\n", "log_probs = log_probs.transpose([0, 2, 1]).reshape([-1, 1000])" @@ -579,9 +567,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -678,9 +664,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -717,9 +701,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -755,9 +737,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -803,9 +783,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -882,9 +860,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -950,9 +926,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1070,9 +1044,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -1110,9 +1082,7 @@ "metadata": { "id": "cRvMbzl8vO3h" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def shard_value(x):\n", " x = x.reshape((jax.device_count(), -1, *x.shape[1:]))\n", @@ -1167,9 +1137,7 @@ "metadata": { "id": "VuJ9Um1xvSPt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# We can use `out_axes=None` in the `pmap` because the results will be the same\n", "# on every device. \n", @@ -1315,9 +1283,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1431,9 +1397,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -1449,9 +1413,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -1467,9 +1429,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -1497,9 +1457,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -1523,9 +1481,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -1618,9 +1574,7 @@ "metadata": { "id": "4SUlkEg__ElT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "sharded_watch_matrix = shard(watch_matrix)" ] @@ -1640,9 +1594,7 @@ "metadata": { "id": "XEPHnzdo-_G2" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def make_run(*,\n", " axis_name,\n", @@ -1800,9 +1752,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1868,9 +1818,7 @@ "metadata": { "id": "q-cc2vAfZYyz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@jax.jit\n", "def recommend(sample, user_id):\n", @@ -1896,9 +1844,7 @@ "metadata": { "id": "hfAjsSmueSZH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def get_recommendations(user_id): \n", " movie_ids = []\n", @@ -1977,9 +1923,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -2021,9 +1965,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -2051,9 +1993,7 @@ "metadata": { "accelerator": "TPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "Distributed_Inference_with_JAX.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/Gaussian_Process_Regression_In_TFP.ipynb b/site/ko/probability/examples/Gaussian_Process_Regression_In_TFP.ipynb index 3812538216..4da3283082 100644 --- a/site/ko/probability/examples/Gaussian_Process_Regression_In_TFP.ipynb +++ b/site/ko/probability/examples/Gaussian_Process_Regression_In_TFP.ipynb @@ -18,9 +18,7 @@ "cellView": "form", "id": "S2AOrHzjK0_L" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -131,9 +129,7 @@ "metadata": { "id": "Qrys68xzZE-c" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def sinusoid(x):\n", " return np.sin(3 * np.pi * x[..., 0])\n", @@ -160,9 +156,7 @@ "metadata": { "id": "Tem9p8rUlqQR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Generate training data with a known noise level (we'll later try to recover\n", "# this value from the data).\n", @@ -187,9 +181,7 @@ "metadata": { "id": "i63dMy4FbnTd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def build_gp(amplitude, length_scale, observation_noise_variance):\n", " \"\"\"Defines the conditional dist. of GP outputs, given kernel parameters.\"\"\"\n", @@ -282,9 +274,7 @@ "metadata": { "id": "ByXndE3pkA4x" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Create the trainable model parameters, which we'll subsequently optimize.\n", "# Note that we constrain them to be strictly positive.\n", @@ -330,9 +320,7 @@ "metadata": { "id": "yjO8TWIXvFr5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def target_log_prob(amplitude, length_scale, observation_noise_variance):\n", " return gp_joint_model.log_prob({\n", @@ -402,8 +390,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -422,9 +409,7 @@ "metadata": { "id": "1DOkwqQEsXVs" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Having trained the model, we'd like to sample from the posterior conditioned\n", "# on observations. We'd like the samples to be at points other than the training\n", @@ -464,8 +449,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -520,9 +504,7 @@ "metadata": { "id": "t1sZUooao1D0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "num_results = 100\n", "num_burnin_steps = 50\n", @@ -596,8 +578,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -627,9 +608,7 @@ "metadata": { "id": "XzZmJc7yrNGJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# The sampled hyperparams have a leading batch dimension, `[num_results, ...]`,\n", "# so they construct a *batch* of kernels.\n", @@ -670,8 +649,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -705,9 +683,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "Gaussian_Process_Regression_In_TFP.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/HLM_TFP_R_Stan.ipynb b/site/ko/probability/examples/HLM_TFP_R_Stan.ipynb index 187f1f6271..63b4659df2 100644 --- a/site/ko/probability/examples/HLM_TFP_R_Stan.ipynb +++ b/site/ko/probability/examples/HLM_TFP_R_Stan.ipynb @@ -18,9 +18,7 @@ "cellView": "form", "id": "li5wNGR6naj0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -77,9 +75,7 @@ "metadata": { "id": "0axKjgZvRtL9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%matplotlib inline\n", "\n", @@ -182,9 +178,7 @@ "metadata": { "id": "4LjOBqLDV0IQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def load_and_preprocess_radon_dataset(state='MN'):\n", " \"\"\"Preprocess Radon dataset as done in \"Bayesian Data Analysis\" book.\n", @@ -227,9 +221,7 @@ "metadata": { "id": "hJE3-eC0I-Lm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "radon, county_name = load_and_preprocess_radon_dataset()" ] @@ -240,9 +232,7 @@ "metadata": { "id": "nV-IAEW2FIqX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# We'll use the following directory to store our preprocessed dataset.\n", "CACHE_DIR = os.path.join(os.sep, 'tmp', 'radon')\n", @@ -357,9 +347,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -383,9 +371,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -415,9 +401,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -481,9 +465,7 @@ "metadata": { "id": "ZBqZjyHdsPIB" }, - "outputs": [ - - ], + "outputs": [], "source": [ "suppressMessages({\n", " library('bayesplot')\n", @@ -548,9 +530,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -565,9 +545,7 @@ "metadata": { "id": "uRqAdn3WsoN-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# https://github.com/stan-dev/example-models/wiki/ARM-Models-Sorted-by-Chapter\n", "radon.model <- lmer(log_radon ~ 1 + floor + (0 + log_uranium_ppm | county), data = data)" @@ -611,9 +589,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -637,9 +613,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" }, @@ -648,9 +622,7 @@ "image/png": "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" }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -665,9 +637,7 @@ "metadata": { "id": "nCsGcLnP40Lg" }, - "outputs": [ - - ], + "outputs": [], "source": [ "write.csv(as.data.frame(ranef(radon.model, condVar = TRUE)), '/tmp/radon/lme4_fit.csv')" ] @@ -839,9 +809,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -865,9 +833,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" }, @@ -876,9 +842,7 @@ "image/png": "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" }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -904,9 +868,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" }, @@ -915,9 +877,7 @@ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeAAAAHgCAIAAADytinCAAAgAElEQVR4nOydd3wUVdfHf1O2b5LdTe+kEZIAoZcgHQUFqSJFBfXRB1Ts5cGK+vj6iCIWUBQVUBEbAmIBEYHQAyGEHkjvPZtke5t5/1gSQrKpJNkk3O8ffmRy594zZc/cOXPu71A8z4NAIBAIXQ/a2QYQCAQCwTHEQRMIBEIXhThoAoFA6KIQB00gEAhdFOKgCQQCoYvS2Q46KSnpiSeeWLVq1b333rtnzx77xvz8/CVLlnz66adPP/10SkqKfeOePXvmz5//xRdfpKamarXarVu3PvbYY51srUNOnDhx5syZzh/XYrF88sknQ4cOLS4ubpUZN2Jw5x/skSNHHnjggWeffbYzByUQuiZsZw7G8/zMmTOPHj0aEBBQWFjYr1+/4uJihmGWLl362GOPTZkyJTc3d9SoURcvXmQY5t577z158mRwcPAPP/wQFRVVVlY2bty4DjJs//79KpUqNja2JY03bNigUCha2LgdEQgEcXFxy5Yta4kZdY/oRgxudt9WnbqWMHz48HfeeYdlO/XOJBC6KHwnotVqGYZJSkrieV6v1wcEBFgslqNHj8rlcovFYm8zbNiwdevW2Tfat+zatYvn+cWLF5eWlnaEVVeuXFGpVImJiR3RefuSl5cHoKioqOlmnXZEHTTQ0qVLH3roofbtk0DojnTqPEUmk02bNu3ee+/dtWvXN99888Ybb7Ase+LEiYiIiNoZU1RU1L59+/r162d/eFAUlZ+fD0CtVnt4eDTW87Zt2z777LPZs2fv3LkzISFh/vz5H330Ecuyp0+f3rp1q7e398GDBxcvXnznnXcCePnll0NDQ1NSUqKioh588MFz585VVFRs2rQpNzd35syZe/bsOXLkyMWLFwGsX78+Pj7+888/v/vuu9etW9e7d+8nn3zys88+8/b2fvvttwE07H/Hjh1122/evLlpI3///fd67esZoFQqL126tGHDBh8fn8zMTHtXJ0+erGtGcnLy9u3bPTw84uPjX3311fT09Noj8vf3r23522+/zZo1a+HChV999ZXNZlu4cOGwYcMGDRpUb7hag+uOsm/fvtWrV8+ZM+f48ePbtm175plnXnzxxVadunnz5jUcffny5atWrbJarQaDoby8fM2aNRRF1b2y9S5WO9yFBEI3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" }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -946,9 +906,7 @@ "metadata": { "id": "h9HtqG65x1a6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Write the posterior samples (4000 for each variable) to a CSV.\n", "write.csv(tidy(as.matrix(fit)), \"/tmp/radon/stan_fit.csv\")" @@ -969,9 +927,7 @@ "metadata": { "id": "wwhJD-t86Dnq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "with tf.gfile.Open('/tmp/radon/lme4_fit.csv', 'r') as f:\n", " lme4_fit = pd.read_csv(f, index_col=0)" @@ -1068,9 +1024,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1124,9 +1078,7 @@ "metadata": { "id": "S8TQNRaKFecg" }, - "outputs": [ - - ], + "outputs": [], "source": [ "with tf.Session() as sess:\n", " lme4_dist = tfp.distributions.Independent(\n", @@ -1152,9 +1104,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1178,9 +1128,7 @@ "metadata": { "id": "YxXhcMfG3uoX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "with tf.gfile.Open('/tmp/radon/stan_fit.csv', 'r') as f:\n", " samples = pd.read_csv(f, index_col=0)" @@ -1432,9 +1380,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1500,9 +1446,7 @@ "metadata": { "id": "TOh_69los9gK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Handy snippet to reset the global graph and global session.\n", "with warnings.catch_warnings():\n", @@ -1551,9 +1495,7 @@ "metadata": { "id": "NzpFXkvOXMav" }, - "outputs": [ - - ], + "outputs": [], "source": [ "inv_scale_transform = lambda y: np.log(y) # Not using TF here.\n", "fwd_scale_transform = tf.exp" @@ -1576,9 +1518,7 @@ "metadata": { "id": "JnPFL-pKXMRl" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def _make_weights_prior(num_counties, dtype):\n", " \"\"\"Returns a `len(log_uranium_ppm)` batch of univariate Normal.\"\"\"\n", @@ -1613,9 +1553,7 @@ "metadata": { "id": "wNQTcHcQXMIp" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def _make_log_radon_likelihood(random_effect_weights, floor, county,\n", " log_county_uranium_ppm, init_log_radon_stddev):\n", @@ -1654,9 +1592,7 @@ "metadata": { "id": "_UBayNK538JD" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def joint_log_prob(random_effect_weights, log_radon, floor, county,\n", " log_county_uranium_ppm, dtype):\n", @@ -1714,9 +1650,7 @@ "metadata": { "id": "FSwVJAkNEx6Y" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Specify unnormalized posterior.\n", "\n", @@ -1759,9 +1693,7 @@ "metadata": { "id": "WnZ_KMP0E0ot" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Set-up E-step.\n", "\n", @@ -1803,9 +1735,7 @@ "metadata": { "id": "wceMwnGwvUfF" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Set-up M-step.\n", "\n", @@ -1838,9 +1768,7 @@ "metadata": { "id": "PakV59O8E3m5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Initialize all variables.\n", "\n", @@ -1853,9 +1781,7 @@ "metadata": { "id": "FziBCkW_NXFF" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Grab variable handles for diagnostic purposes.\n", "\n", @@ -1894,9 +1820,7 @@ "metadata": { "id": "Cy36-LMMNbTc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "init_op.run()\n", "w_ = np.zeros([len(log_county_uranium_ppm)], dtype=dtype)" @@ -2085,9 +2009,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -2155,9 +2077,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -2356,9 +2276,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "HLM_TFP_R_Stan.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/JointDistributionAutoBatched_A_Gentle_Tutorial.ipynb b/site/ko/probability/examples/JointDistributionAutoBatched_A_Gentle_Tutorial.ipynb index c0aeb0bb33..6f90cb4a07 100644 --- a/site/ko/probability/examples/JointDistributionAutoBatched_A_Gentle_Tutorial.ipynb +++ b/site/ko/probability/examples/JointDistributionAutoBatched_A_Gentle_Tutorial.ipynb @@ -27,9 +27,7 @@ "cellView": "form", "id": "CpDUTVKYTowI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -93,9 +91,7 @@ "metadata": { "id": "coUnDhkpT5_6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Import and set ups{ display-mode: \"form\" }\n", "\n", @@ -155,9 +151,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -216,9 +210,7 @@ "metadata": { "id": "kY501q-QVR9g" }, - "outputs": [ - - ], + "outputs": [], "source": [ "jds = tfd.JointDistributionSequential([\n", " tfd.Normal(loc=0., scale=1.), # m\n", @@ -264,9 +256,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -302,9 +292,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -415,9 +403,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -452,9 +438,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -491,9 +475,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -518,9 +500,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -589,9 +569,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -624,9 +602,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -660,9 +636,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -695,9 +669,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -730,9 +702,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -863,9 +833,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -889,9 +857,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -970,9 +936,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1010,9 +974,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1045,9 +1007,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1087,9 +1047,7 @@ "metadata": { "id": "LZtVljb0fRx2" }, - "outputs": [ - - ], + "outputs": [], "source": [ "jds_ab = tfd.JointDistributionSequentialAutoBatched([\n", " tfd.Normal(loc=0., scale=1.), # m\n", @@ -1113,9 +1071,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1144,9 +1100,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1176,9 +1130,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1223,9 +1175,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1249,9 +1199,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1275,9 +1223,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1301,9 +1247,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1346,9 +1290,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1502,9 +1444,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1540,9 +1480,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1629,9 +1567,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "JointDistributionAutoBatched_A_Gentle_Tutorial.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/Linear_Mixed_Effects_Model_Variational_Inference.ipynb b/site/ko/probability/examples/Linear_Mixed_Effects_Model_Variational_Inference.ipynb index 48b43de8b8..8843a283bf 100644 --- a/site/ko/probability/examples/Linear_Mixed_Effects_Model_Variational_Inference.ipynb +++ b/site/ko/probability/examples/Linear_Mixed_Effects_Model_Variational_Inference.ipynb @@ -18,9 +18,7 @@ "cellView": "form", "id": "3jTEqPzFiHQ0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -57,9 +55,7 @@ "metadata": { "id": "yPby2hWGS651" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Install { display-mode: \"form\" }\n", "TF_Installation = 'System' #@param ['TF Nightly', 'TF Stable', 'System']\n", @@ -83,9 +79,7 @@ "metadata": { "id": "ZKFMx9zmTBbd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Install { display-mode: \"form\" }\n", "TFP_Installation = \"System\" #@param [\"Nightly\", \"Stable\", \"System\"]\n", @@ -243,9 +237,7 @@ "metadata": { "id": "_zr34b0IBqgY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%matplotlib inline\n", "%config InlineBackend.figure_format = 'retina'\n", @@ -394,9 +386,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -484,9 +474,7 @@ "height": 296, "width": 729 }, - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -542,9 +530,7 @@ "height": 421, "width": 1291 }, - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -590,9 +576,7 @@ "metadata": { "id": "AFFj4KrwfPMg" }, - "outputs": [ - - ], + "outputs": [], "source": [ "features = df[['county_code', 'floor']].astype(int)\n", "labels = df[['log_radon']].astype(np.float32).values.flatten()" @@ -613,9 +597,7 @@ "metadata": { "id": "ujtDCBCcCu1q" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def make_joint_distribution_coroutine(floor, county, n_counties, n_floors):\n", "\n", @@ -671,9 +653,7 @@ "metadata": { "id": "Ov8PwoebKn2T" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Initialize locations and scales randomly with `tf.Variable`s and \n", "# `tfp.util.TransformedVariable`s.\n", @@ -734,9 +714,7 @@ "metadata": { "id": "Ow-XvCiJczNr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "optimizer = tf.optimizers.Adam(learning_rate=1e-2)\n", "\n", @@ -796,9 +774,7 @@ "height": 228, "width": 628 }, - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -840,9 +816,7 @@ "height": 418, "width": 1185 }, - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -901,9 +875,7 @@ "height": 459, "width": 632 }, - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -945,9 +917,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -962,9 +932,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -979,9 +947,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -996,9 +962,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -1013,9 +977,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -1030,9 +992,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -1047,9 +1007,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -1064,9 +1022,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1167,9 +1123,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "Linear_Mixed_Effects_Model_Variational_Inference.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/Linear_Mixed_Effects_Models.ipynb b/site/ko/probability/examples/Linear_Mixed_Effects_Models.ipynb index 116e7cb57e..8834a7925e 100644 --- a/site/ko/probability/examples/Linear_Mixed_Effects_Models.ipynb +++ b/site/ko/probability/examples/Linear_Mixed_Effects_Models.ipynb @@ -18,9 +18,7 @@ "cellView": "form", "id": "G5eriUZ9g1Ia" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -77,9 +75,7 @@ "metadata": { "id": "coUnDhkpT5_6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Import and set ups{ display-mode: \"form\" }\n", "\n", @@ -173,9 +169,7 @@ "metadata": { "id": "lZ8OfS3cDMeG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def load_insteval():\n", " \"\"\"Loads the InstEval data set.\n", @@ -401,8 +395,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -439,9 +432,7 @@ "metadata": { "id": "NzfVQJN9B7VQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "get_value = lambda dataframe, key, dtype: dataframe[key].values.astype(dtype)\n", "features_train = {\n", @@ -552,9 +543,7 @@ "metadata": { "id": "GS7SjqREp9wC" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class LinearMixedEffectModel(tf.Module):\n", " def __init__(self):\n", @@ -624,8 +613,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -661,8 +649,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -697,9 +684,7 @@ "metadata": { "id": "U1Ro35iA7UPG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "target_log_prob_fn = lambda *x: lmm_train.log_prob(x + (labels_train,))\n", "trainable_variables = lmm_train.trainable_variables\n", @@ -720,8 +705,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -736,9 +720,7 @@ "metadata": { "id": "F7uOcwQFB7Vb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Set up E-step (MCMC).\n", "hmc = tfp.mcmc.HamiltonianMonteCarlo(\n", @@ -781,9 +763,7 @@ "metadata": { "id": "XwZMt2uqVDzh" }, - "outputs": [ - - ], + "outputs": [], "source": [ "num_warmup_iters = 1000\n", "num_iters = 1500\n", @@ -857,9 +837,7 @@ "metadata": { "id": "9WmwCZNQWqh7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function(autograph=False, jit_compile=True)\n", "def run_k_e_steps(k, current_state, kernel_results):\n", @@ -971,9 +949,7 @@ "metadata": { "id": "p4vreJekB7Vf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "lmm_test = lmm_jointdist(features_test)\n", "\n", diff --git a/site/ko/probability/examples/Modeling_with_JointDistribution.ipynb b/site/ko/probability/examples/Modeling_with_JointDistribution.ipynb index de833357a6..8c72d7041e 100644 --- a/site/ko/probability/examples/Modeling_with_JointDistribution.ipynb +++ b/site/ko/probability/examples/Modeling_with_JointDistribution.ipynb @@ -18,9 +18,7 @@ "cellView": "form", "id": "CpDUTVKYTowI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -75,9 +73,7 @@ "metadata": { "id": "x5d1QObzCrlR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# We will be using ArviZ, a multi-backend Bayesian diagnosis and plotting library\n", "!pip3 install -q git+git://github.com/arviz-devs/arviz.git" @@ -89,9 +85,7 @@ "metadata": { "id": "coUnDhkpT5_6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Import and set ups{ display-mode: \"form\" }\n", "\n", @@ -240,9 +234,7 @@ "height": 565, "width": 567 }, - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -308,9 +300,7 @@ "metadata": { "id": "YLlvnGSk5awL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "X_np = dfhoggs['x'].values\n", "sigma_y_np = dfhoggs['sigma_y'].values\n", @@ -334,9 +324,7 @@ "metadata": { "id": "G61a6pDYW82H" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mdl_ols = tfd.JointDistributionSequential([\n", " # b0 ~ Normal(0, 1)\n", @@ -375,9 +363,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -416,9 +402,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -455,9 +439,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -497,9 +479,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -525,9 +505,7 @@ "metadata": { "id": "kmo6QgUvtKzv" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mdl_ols_ = tfd.JointDistributionSequential([\n", " # b0\n", @@ -593,9 +571,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -629,9 +605,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -672,9 +646,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -698,9 +670,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -741,9 +711,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -777,9 +745,7 @@ "cellView": "both", "id": "nSJZfpUT7DI5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Define some helper functions\n", "\n", @@ -863,9 +829,7 @@ "metadata": { "id": "ucA51UWFL84D" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mapper = Mapper(mdl_ols_.sample()[:-1],\n", " [tfb.Identity(), tfb.Identity()],\n", @@ -880,9 +844,7 @@ "metadata": { "id": "-w0Jha-rxFUG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@_make_val_and_grad_fn\n", "def neg_log_likelihood(x):\n", @@ -928,9 +890,7 @@ "height": 565, "width": 567 }, - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -977,9 +937,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1030,9 +988,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1061,9 +1017,7 @@ "metadata": { "id": "8ZFQTCktDXWc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def gen_ols_batch_model(X, sigma, hyperprior_mean=0, hyperprior_scale=1):\n", " hyper_mean = tf.cast(hyperprior_mean, dtype)\n", @@ -1097,9 +1051,7 @@ "metadata": { "id": "y3q-On2sYj9y" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Small helper function to validate log_prob shape (avoid wrong broadcasting)\n", "def validate_log_prob_part(model, batch_shape=1, observed=-1):\n", @@ -1163,9 +1115,7 @@ "cellView": "form", "id": "o9NELzZFHwtp" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title A common `run_chain` function\n", "@tf.function(autograph=False, experimental_compile=True)\n", @@ -1212,9 +1162,7 @@ "metadata": { "id": "eEjA8P8x-1HP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "nchain = 10\n", "b0, b1, _ = mdl_ols_batch.sample(nchain)\n", @@ -1238,9 +1186,7 @@ "metadata": { "id": "4qQdOPk90f7t" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# using the pymc3 naming convention\n", "sample_stats_name = ['lp', 'tree_size', 'diverging', 'energy', 'mean_tree_accept']\n", @@ -1273,9 +1219,7 @@ "height": 294, "width": 872 }, - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1303,9 +1247,7 @@ "height": 296, "width": 656 }, - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1350,9 +1292,7 @@ "height": 565, "width": 567 }, - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1402,9 +1342,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1440,9 +1378,7 @@ "metadata": { "id": "mG3HwG8ubK9a" }, - "outputs": [ - - ], + "outputs": [], "source": [ "validate_log_prob_part(mdl_studentt, 4)" ] @@ -1471,9 +1407,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1498,9 +1432,7 @@ "metadata": { "id": "SiVOEdlsTCqL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# bijector to map contrained parameters to real\n", "a, b = tf.constant(1., dtype), tf.constant(100., dtype),\n", @@ -1533,9 +1465,7 @@ "metadata": { "id": "Kd_-b20W_un2" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@_make_val_and_grad_fn\n", "def neg_log_likelihood(x):\n", @@ -1582,9 +1512,7 @@ "height": 565, "width": 567 }, - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1614,9 +1542,7 @@ "metadata": { "id": "7SRaHxfFUMvB" }, - "outputs": [ - - ], + "outputs": [], "source": [ "nchain = 10\n", "b0, b1, df, _ = mdl_studentt.sample(nchain)\n", @@ -1635,9 +1561,7 @@ "metadata": { "id": "J61CwG0_3Qfg" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# using the pymc3 naming convention\n", "sample_stats_name = ['lp', 'tree_size', 'diverging', 'energy', 'mean_tree_accept']\n", @@ -1750,9 +1674,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1780,9 +1702,7 @@ "height": 438, "width": 872 }, - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1810,9 +1730,7 @@ "height": 296, "width": 656 }, - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1845,9 +1763,7 @@ "height": 255, "width": 376 }, - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1887,9 +1803,7 @@ "height": 565, "width": 567 }, - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1923,9 +1837,7 @@ "metadata": { "id": "ZPT1yHaDhAw1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "data = pd.read_table('https://raw.githubusercontent.com/pymc-devs/pymc3/master/pymc3/examples/data/efron-morris-75-data.tsv',\n", " sep=\"\\t\")\n", @@ -1951,9 +1863,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1999,9 +1909,7 @@ "metadata": { "id": "26Y9MRDPlF6G" }, - "outputs": [ - - ], + "outputs": [], "source": [ "phi, kappa_log, thetas, y = mdl_baseball.sample(4)\n", "# phi, kappa_log, thetas, y" @@ -2058,9 +1966,7 @@ "metadata": { "id": "8l9PIYHlwMnG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "unconstraining_bijectors = [\n", " tfb.Sigmoid(),\n", @@ -2081,9 +1987,7 @@ "metadata": { "id": "FyykqiOVBeej" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@_make_val_and_grad_fn\n", "def neg_log_likelihood(x):\n", @@ -2122,9 +2026,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -2148,9 +2050,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -2175,9 +2075,7 @@ "metadata": { "id": "-UNxjka5gfGr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "if result.shape[0] > 0:\n", " phi_est, kappa_est, theta_est = mapper.split_and_reshape(result)\n", @@ -2199,9 +2097,7 @@ "metadata": { "id": "kuT8ILmjgfGy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "target_log_prob_fn = lambda *x: mdl_baseball.log_prob(x + (hits, ))\n", "\n", @@ -2221,9 +2117,7 @@ "metadata": { "id": "1qr9PFPt9i3S" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# using the pymc3 naming convention\n", "sample_stats_name = ['lp', 'tree_size', 'diverging', 'energy', 'mean_tree_accept']\n", @@ -2256,9 +2150,7 @@ "height": 440, "width": 872 }, - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -2286,9 +2178,7 @@ "height": 584, "width": 656 }, - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -2323,9 +2213,7 @@ "cellView": "form", "id": "Udlc1qnFXNJ3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Load raw data and clean up\n", "srrs2 = pd.read_csv('https://raw.githubusercontent.com/pymc-devs/pymc3/master/pymc3/examples/data/srrs2.dat')\n", @@ -2373,9 +2261,7 @@ "metadata": { "id": "_ogaMtI3drVX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def affine(u_val, x_county, county, floor, gamma, eps, b):\n", " \"\"\"Linear equation of the coefficients and the covariates, with broadcasting.\"\"\"\n", @@ -2471,9 +2357,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -2510,9 +2394,7 @@ "metadata": { "id": "jO3FjTTbgUoc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "from tensorflow_probability.python.mcmc.transformed_kernel import (\n", " make_transform_fn, make_transformed_log_prob)" @@ -2524,9 +2406,7 @@ "metadata": { "id": "86dDqmgUgUog" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Wrap logp so that all parameters are in the Real domain\n", "# copied and edited from tensorflow_probability/python/mcmc/transformed_kernel.py\n", @@ -2595,9 +2475,7 @@ "metadata": { "id": "YNnTSjPngUoi" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Build meanfield ADVI for a jointdistribution\n", "# Inspect the input jointdistribution and replace the list of distribution with\n", @@ -2676,9 +2554,7 @@ "metadata": { "id": "JAyOK6VYN9N9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "opt = tf.optimizers.Adam(learning_rate=.1)\n", "\n", @@ -2714,9 +2590,7 @@ "height": 271, "width": 414 }, - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -2733,9 +2607,7 @@ "metadata": { "id": "SF7clFifgUoq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "graph_info = contextual_effect2.resolve_graph()\n", "approx_param = dict()\n", @@ -2760,9 +2632,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -2787,9 +2657,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -2817,9 +2685,7 @@ "height": 271, "width": 405 }, - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -2861,9 +2727,7 @@ "height": 271, "width": 729 }, - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -2901,9 +2765,7 @@ "metadata": { "id": "cybiDlswI_7K" }, - "outputs": [ - - ], + "outputs": [], "source": [ "USE_FULLRANK = True" ] @@ -2914,9 +2776,7 @@ "metadata": { "id": "i72_qlt2zj6p" }, - "outputs": [ - - ], + "outputs": [], "source": [ "*prior_tensors, _ = contextual_effect2.sample()\n", "\n", @@ -2996,9 +2856,7 @@ "metadata": { "id": "3aJFQ8mrKI8R" }, - "outputs": [ - - ], + "outputs": [], "source": [ "learning_rate = tf.optimizers.schedules.ExponentialDecay(\n", " initial_learning_rate=1e-2,\n", @@ -3040,9 +2898,7 @@ "height": 271, "width": 407 }, - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -3072,9 +2928,7 @@ "height": 326, "width": 631 }, - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -3095,9 +2949,7 @@ "metadata": { "id": "Lndt-B20Gmjr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "graph_info = contextual_effect2.resolve_graph()\n", "approx_param = dict()\n", @@ -3128,9 +2980,7 @@ "height": 271, "width": 405 }, - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -3172,9 +3022,7 @@ "height": 271, "width": 729 }, - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -3212,9 +3060,7 @@ "metadata": { "id": "yqir31vbSWjX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "dtype = tf.float32" ] @@ -3225,9 +3071,7 @@ "metadata": { "id": "I4c5nHUtdE8f" }, - "outputs": [ - - ], + "outputs": [], "source": [ "n = 50000 # number of examples reviewed\n", "p_bad_ = 0.1 # fraction of bad events\n", @@ -3273,9 +3117,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -3317,9 +3159,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -3347,9 +3187,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -3373,9 +3211,7 @@ "metadata": { "id": "amcaMV2bKfEH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "nchain = 10\n", "prc, rcl, p_bad, _ = mdl_mixture.sample(nchain)\n", @@ -3404,9 +3240,7 @@ "metadata": { "id": "IWAA2JbqBXnf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# using the pymc3 naming convention\n", "sample_stats_name = ['lp', 'tree_size', 'diverging', 'energy', 'mean_tree_accept']\n", @@ -3439,9 +3273,7 @@ "height": 440, "width": 872 }, - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -3453,9 +3285,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "Modeling_with_JointDistribution.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/Multilevel_Modeling_Primer.ipynb b/site/ko/probability/examples/Multilevel_Modeling_Primer.ipynb index d5c9c33a3f..75a4b47c4e 100644 --- a/site/ko/probability/examples/Multilevel_Modeling_Primer.ipynb +++ b/site/ko/probability/examples/Multilevel_Modeling_Primer.ipynb @@ -18,9 +18,7 @@ "cellView": "form", "id": "bJFDjPpKnMRt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -68,9 +66,7 @@ "metadata": { "id": "LI9d-F11u_yW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Import { display-mode: \"form\" }\n", "\n", @@ -183,9 +179,7 @@ "metadata": { "id": "RdJw71grz89v" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def load_and_preprocess_radon_dataset(state='MN'): \n", " \"\"\"Preprocess Radon dataset as done in \"Bayesian Data Analysis\" book.\n", @@ -228,9 +222,7 @@ "metadata": { "id": "LgxATJVF0FfV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "radon, county_name = load_and_preprocess_radon_dataset()\n", "num_counties = len(county_name)\n", @@ -243,9 +235,7 @@ "metadata": { "id": "ogZQTW9S1jLJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Create copies of variables as Tensors.\n", "county = tf.convert_to_tensor(radon['county'], dtype=tf.int32)\n", @@ -423,8 +413,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -455,8 +444,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -511,8 +499,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -576,9 +563,7 @@ "metadata": { "id": "nL-S3qLbPpSz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function\n", "def affine(x, kernel_diag, bias=tf.zeros([])):\n", @@ -594,9 +579,7 @@ "metadata": { "id": "R-HjDR2LNdSk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def pooled_model(floor):\n", " \"\"\"Creates a joint distribution representing our generative process.\"\"\"\n", @@ -622,9 +605,7 @@ "metadata": { "id": "xAicPeh7N9Cs" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function\n", "def sample_pooled(num_chains, num_results, num_burnin_steps, num_observations):\n", @@ -719,9 +700,7 @@ "metadata": { "id": "CVYEBL8qVtjW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def reduce_samples(var_samples, reduce_fn):\n", " \"\"\"Reduces across leading two dims using reduce_fn.\"\"\"\n", @@ -758,8 +737,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -786,9 +764,7 @@ "metadata": { "id": "v0hZwZfQyjsR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Utility function to plot traces of sampled variables.\n", "def plot_traces(var_name, samples, num_chains):\n", @@ -819,8 +795,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" }, { @@ -830,8 +805,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" }, { @@ -841,8 +815,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -874,8 +847,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -931,9 +903,7 @@ "metadata": { "id": "mm-llNYvQh6i" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def unpooled_model(floor, county):\n", " \"\"\"Creates a joint distribution for the unpooled model.\"\"\"\n", @@ -962,9 +932,7 @@ "metadata": { "id": "SmTXK4-YzeRT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function\n", "def sample_unpooled(num_chains, num_results, num_burnin_steps):\n", @@ -1048,8 +1016,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" }, { @@ -1059,8 +1026,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1085,9 +1051,7 @@ "cellView": "form", "id": "UZv1Hg-HIzlU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Utility function for Forest plots.\n", "def forest_plot(num_chains, num_vars, var_name, var_labels, samples):\n", @@ -1137,8 +1101,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1174,8 +1137,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1205,9 +1167,7 @@ "cellView": "form", "id": "Ig9MyVbN0tsK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Utility function to plot estimates for a sample set of counties.\n", "def plot_estimates(linear_estimates, labels, sample_counties):\n", @@ -1270,8 +1230,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1326,8 +1285,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1373,8 +1331,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1424,8 +1381,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1493,8 +1449,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1553,9 +1508,7 @@ "metadata": { "id": "-bPcpgMsIykz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def partial_pooling_model(county):\n", " \"\"\"Creates a joint distribution for the partial pooling model.\"\"\"\n", @@ -1585,9 +1538,7 @@ "metadata": { "id": "7hSPAeErXfAG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function\n", "def sample_partial_pooling(num_chains, num_results, num_burnin_steps):\n", @@ -1688,8 +1639,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1761,8 +1711,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1832,9 +1781,7 @@ "metadata": { "id": "fYXWHqduZ6l9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def varying_intercept_model(floor, county):\n", " \"\"\"Creates a joint distribution for the varying intercept model.\"\"\"\n", @@ -1864,9 +1811,7 @@ "metadata": { "id": "Mowimh-sbH0M" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function\n", "def sample_varying_intercepts(num_chains, num_results, num_burnin_steps):\n", @@ -1970,8 +1915,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -2003,8 +1947,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" }, { @@ -2014,8 +1957,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -2084,9 +2026,7 @@ "metadata": { "id": "10vbr5f9CafT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def plot_intercepts_and_slopes(linear_estimates, title):\n", " xvals = np.arange(2)\n", @@ -2117,8 +2057,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -2156,8 +2095,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -2236,9 +2174,7 @@ "metadata": { "id": "0jOXEyCzDqZC" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def varying_slopes_model(floor, county):\n", " \"\"\"Creates a joint distribution for the varying slopes model.\"\"\"\n", @@ -2267,9 +2203,7 @@ "metadata": { "id": "de1c3PThDrNW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function\n", "def sample_varying_slopes(num_chains, num_results, num_burnin_steps):\n", @@ -2373,8 +2307,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -2417,8 +2350,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -2508,9 +2440,7 @@ "metadata": { "id": "UTxOCUgvqRo0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def varying_intercepts_and_slopes_model(floor, county):\n", " \"\"\"Creates a joint distribution for the varying slope model.\"\"\"\n", @@ -2547,9 +2477,7 @@ "metadata": { "id": "M24GusA_p87C" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function\n", "def sample_varying_intercepts_and_slopes(num_chains, num_results,\n", @@ -2660,8 +2588,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -2689,8 +2616,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" }, { @@ -2700,8 +2626,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -2753,8 +2678,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -2836,9 +2760,7 @@ "metadata": { "id": "-R-_0RGq6_x1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def hierarchical_intercepts_model(floor, county, log_uranium):\n", " \"\"\"Creates a joint distribution for the varying slope model.\"\"\"\n", @@ -2874,9 +2796,7 @@ "metadata": { "id": "xe7DtZ7hMo2J" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function\n", "def sample_hierarchical_intercepts(num_chains, num_results, num_burnin_steps):\n", @@ -2986,8 +2906,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -3056,8 +2975,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -3131,9 +3049,7 @@ "metadata": { "id": "OQfrcxjtrPbq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Create a new variable for mean of floor across counties\n", "xbar = tf.convert_to_tensor(radon.groupby('county')['floor'].mean(), tf.float32)\n", @@ -3146,9 +3062,7 @@ "metadata": { "id": "NPg5IFi_7SkH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def contextual_effects_model(floor, county, log_uranium, xbar):\n", " \"\"\"Creates a joint distribution for the varying slope model.\"\"\"\n", @@ -3186,9 +3100,7 @@ "metadata": { "id": "S1aycsvdYVyW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function\n", "def sample_contextual_effects(num_chains, num_results, num_burnin_steps):\n", @@ -3369,8 +3281,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -3395,9 +3306,7 @@ "metadata": { "id": "3EySq4TJlsTr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "st_louis_log_uranium = tf.convert_to_tensor(\n", " radon.where(radon['county'] == 69)['log_uranium_ppm'].mean(), tf.float32)\n", @@ -3411,9 +3320,7 @@ "metadata": { "id": "NFvRstfncwAg" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function\n", "def intercept_a(gamma_0, gamma_1, gamma_2, eps_a, log_uranium, xbar, county):\n", @@ -3470,9 +3377,7 @@ "metadata": { "id": "ymV4ANtBhLxw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function\n", "def sample_contextual_effects_predictive(num_chains, num_results,\n", @@ -3593,8 +3498,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], @@ -3616,8 +3520,7 @@ "
" ] }, - "metadata": { - }, + "metadata": {}, "output_type": "display_data" } ], diff --git a/site/ko/probability/examples/Multiple_changepoint_detection_and_Bayesian_model_selection.ipynb b/site/ko/probability/examples/Multiple_changepoint_detection_and_Bayesian_model_selection.ipynb index e21e2c4da3..8921f07f47 100644 --- a/site/ko/probability/examples/Multiple_changepoint_detection_and_Bayesian_model_selection.ipynb +++ b/site/ko/probability/examples/Multiple_changepoint_detection_and_Bayesian_model_selection.ipynb @@ -18,9 +18,7 @@ "cellView": "form", "id": "YCriMWd-pRTP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -75,9 +73,7 @@ "metadata": { "id": "No2QPkJ1_9z9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import numpy as np\n", "import tensorflow.compat.v2 as tf\n", @@ -125,9 +121,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" }, @@ -139,9 +133,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -240,9 +232,7 @@ "metadata": { "id": "bvEpqBxvoleY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Define variable to represent the unknown log rates.\n", "trainable_log_rates = tf.Variable(\n", @@ -282,9 +272,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" }, @@ -296,9 +284,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -368,9 +354,7 @@ "metadata": { "id": "IpTbdyah-IyX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Runs forward-backward algorithm to compute marginal posteriors.\n", "posterior_dists = hmm.posterior_marginals(observed_counts)\n", @@ -401,9 +385,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -463,9 +445,7 @@ "metadata": { "id": "PsXpBrH3DKbl" }, - "outputs": [ - - ], + "outputs": [], "source": [ "most_probable_states = hmm.posterior_mode(observed_counts)\n", "most_probable_rates = tf.gather(rates, most_probable_states)" @@ -486,9 +466,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" }, @@ -500,9 +478,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -674,9 +650,7 @@ "metadata": { "id": "ly0mT_mqdubx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "rate_prior = tfd.LogNormal(5, 5)\n", "\n", @@ -711,9 +685,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" }, @@ -725,9 +697,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -756,9 +726,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" }, @@ -770,9 +738,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -853,9 +819,7 @@ "metadata": { "id": "XEuhytSKcn4g" }, - "outputs": [ - - ], + "outputs": [], "source": [ "most_probable_states = hmm.posterior_mode(observed_counts)" ] @@ -875,9 +839,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -922,9 +884,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "Multiple_changepoint_detection_and_Bayesian_model_selection.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/Optimizers_in_TensorFlow_Probability.ipynb b/site/ko/probability/examples/Optimizers_in_TensorFlow_Probability.ipynb index 7125f3885d..b785cb3fbf 100644 --- a/site/ko/probability/examples/Optimizers_in_TensorFlow_Probability.ipynb +++ b/site/ko/probability/examples/Optimizers_in_TensorFlow_Probability.ipynb @@ -18,9 +18,7 @@ "cellView": "form", "id": "YCriMWd-pRTP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -77,9 +75,7 @@ "metadata": { "id": "2nA2FSdTgcEM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Import { display-mode: \"form\" }\n", "\n", @@ -125,9 +121,7 @@ "cellView": "form", "id": "Tm6BS93hQ9Ym" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Helper functions\n", "\n", @@ -369,9 +363,7 @@ "metadata": { "id": "G7d6oBnYFZwh" }, - "outputs": [ - - ], + "outputs": [], "source": [ "np.random.seed(12345)\n", "\n", @@ -753,9 +745,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "Optimizers_in_TensorFlow_Probability.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/Probabilistic_Layers_VAE.ipynb b/site/ko/probability/examples/Probabilistic_Layers_VAE.ipynb index af4c9e40e6..41d0ee469b 100644 --- a/site/ko/probability/examples/Probabilistic_Layers_VAE.ipynb +++ b/site/ko/probability/examples/Probabilistic_Layers_VAE.ipynb @@ -18,9 +18,7 @@ "cellView": "form", "id": "CpDUTVKYTowI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -75,9 +73,7 @@ "metadata": { "id": "kZ0MdF1j8WJf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Import { display-mode: \"form\" }\n", "\n", @@ -165,9 +161,7 @@ "metadata": { "id": "daPl6ycN9cD3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "datasets, datasets_info = tfds.load(name='mnist',\n", " with_info=True,\n", @@ -222,9 +216,7 @@ "metadata": { "id": "rd3Voa64_Gtv" }, - "outputs": [ - - ], + "outputs": [], "source": [ "input_shape = datasets_info.features['image'].shape\n", "encoded_size = 16\n", @@ -237,9 +229,7 @@ "metadata": { "id": "9d7Jbm66FN_u" }, - "outputs": [ - - ], + "outputs": [], "source": [ "prior = tfd.Independent(tfd.Normal(loc=tf.zeros(encoded_size), scale=1),\n", " reinterpreted_batch_ndims=1)" @@ -300,9 +290,7 @@ "metadata": { "id": "baP--pt6-ewK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "decoder = tfk.Sequential([\n", " tfkl.InputLayer(input_shape=[encoded_size]),\n", @@ -332,9 +320,7 @@ "metadata": { "id": "7itugvZVLyWL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "vae = tfk.Model(inputs=encoder.inputs,\n", " outputs=decoder(encoder.outputs[0]))" @@ -419,9 +405,7 @@ "metadata": { "id": "3ZqfOYMP_2p_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# We'll just examine ten random digits.\n", "x = next(iter(eval_dataset))[0][:10]\n", @@ -436,9 +420,7 @@ "cellView": "form", "id": "MM7wW4S2OrBt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Image Plot Util\n", "import matplotlib.pyplot as plt\n", @@ -482,9 +464,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -504,9 +484,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -526,9 +504,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -548,9 +524,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -575,9 +549,7 @@ "metadata": { "id": "C3_5HPUCQpYO" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Now, let's generate ten never-before-seen digits.\n", "z = prior.sample(10)\n", @@ -608,9 +580,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -630,9 +600,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -652,9 +620,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -674,9 +640,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "Probabilistic_Layers_VAE.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/STS_approximate_inference_for_models_with_non_Gaussian_observations.ipynb b/site/ko/probability/examples/STS_approximate_inference_for_models_with_non_Gaussian_observations.ipynb index ecce8c85e6..af4818e08f 100644 --- a/site/ko/probability/examples/STS_approximate_inference_for_models_with_non_Gaussian_observations.ipynb +++ b/site/ko/probability/examples/STS_approximate_inference_for_models_with_non_Gaussian_observations.ipynb @@ -18,9 +18,7 @@ "cellView": "form", "id": "S2AOrHzjK0_L" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -66,9 +64,7 @@ "metadata": { "id": "4YJz-JDu0X9E" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import time\n", "import matplotlib.pyplot as plt\n", @@ -109,9 +105,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" }, @@ -123,9 +117,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -155,9 +147,7 @@ "metadata": { "id": "hSsekKzIwsg6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def build_model(approximate_unconstrained_rates):\n", " trend = tfp.sts.LocalLinearTrend(\n", @@ -183,9 +173,7 @@ "metadata": { "id": "Hg_B4tofzxgc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "positive_bijector = tfb.Softplus() # Or tfb.Exp()\n", "\n", @@ -211,9 +199,7 @@ "metadata": { "id": "vquh2LxgBjfy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def sts_with_poisson_likelihood_model():\n", " # Encode the parameters of the STS model as random variables.\n", @@ -249,9 +235,7 @@ "metadata": { "id": "rSj7blvWh1w8" }, - "outputs": [ - - ], + "outputs": [], "source": [ "pinned_model = model.experimental_pin(observed_counts=observed_counts)" ] @@ -271,9 +255,7 @@ "metadata": { "id": "ZVajaBpLf8h0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "constraining_bijector = pinned_model.experimental_default_event_space_bijector()" ] @@ -297,9 +279,7 @@ "metadata": { "id": "NMPlVBk6PcpT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Sampler configuration\n", "\n", @@ -326,9 +306,7 @@ "metadata": { "id": "15ue-mBGdcmh" }, - "outputs": [ - - ], + "outputs": [], "source": [ "sampler = tfp.mcmc.TransformedTransitionKernel(\n", " tfp.mcmc.NoUTurnSampler(\n", @@ -404,9 +382,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -443,9 +419,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" }, @@ -457,9 +431,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -501,9 +473,7 @@ "metadata": { "id": "v1HuVuk6Qocm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def sample_forecasted_counts(sts_model, posterior_latent_rates,\n", " posterior_params, num_steps_forecast,\n", @@ -543,9 +513,7 @@ "metadata": { "id": "MyPFQzV8SOSs" }, - "outputs": [ - - ], + "outputs": [], "source": [ "forecast_samples = np.squeeze(forecast_samples)" ] @@ -556,9 +524,7 @@ "metadata": { "id": "iD_kLwF1V3m-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def plot_forecast_helper(data, forecast_samples, CI=90):\n", " \"\"\"Plot the observed time series alongside the forecast.\"\"\"\n", @@ -606,9 +572,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -636,9 +600,7 @@ "metadata": { "id": "7aZQEnTThgMT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "surrogate_posterior = tfp.experimental.vi.build_factored_surrogate_posterior(\n", " event_shape=pinned_model.event_shape,\n", @@ -689,9 +651,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -717,9 +677,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" }, @@ -731,9 +689,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -769,9 +725,7 @@ "metadata": { "id": "0aoMoQyf_fWC" }, - "outputs": [ - - ], + "outputs": [], "source": [ "forecast_samples, rate_samples = sample_forecasted_counts(\n", " sts_model,\n", @@ -788,9 +742,7 @@ "metadata": { "id": "eQ7zJpEr_hHU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "forecast_samples = np.squeeze(forecast_samples)" ] @@ -810,9 +762,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -824,9 +774,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "STS_approximate_inference_for_models_with_non_Gaussian_observations.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/TFP_Release_Notebook_0_11_0.ipynb b/site/ko/probability/examples/TFP_Release_Notebook_0_11_0.ipynb index d3f5ee3637..42046dc79f 100644 --- a/site/ko/probability/examples/TFP_Release_Notebook_0_11_0.ipynb +++ b/site/ko/probability/examples/TFP_Release_Notebook_0_11_0.ipynb @@ -18,9 +18,7 @@ "cellView": "form", "id": "qS8MroChhSzR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -157,9 +155,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -245,9 +241,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -260,9 +254,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -310,9 +302,7 @@ "metadata": { "id": "x8Un2FoJf0ne" }, - "outputs": [ - - ], + "outputs": [], "source": [ "nparticles = 2048\n", "seed = ()\n", @@ -344,9 +334,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -381,9 +369,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -396,9 +382,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -444,9 +428,7 @@ "cellView": "form", "id": "bzJMetHkhBHe" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title `plot_spherical`\n", "def plot_spherical(dist, nsamples):\n", @@ -644,9 +626,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -753,9 +733,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -865,9 +843,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -907,9 +883,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -945,9 +919,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -995,9 +967,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1028,9 +998,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1065,9 +1033,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1098,9 +1064,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1137,9 +1101,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1170,9 +1132,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1225,9 +1185,7 @@ }, "execution_count": 19, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1645,9 +1603,7 @@ }, "execution_count": 3, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1780,9 +1736,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1862,9 +1816,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -1886,9 +1838,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -1910,9 +1860,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1977,9 +1925,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "TFP_Release_Notebook_0_11_0.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/TFP_Release_Notebook_0_12_1.ipynb b/site/ko/probability/examples/TFP_Release_Notebook_0_12_1.ipynb index 0d199a8c8e..8f73a694d6 100644 --- a/site/ko/probability/examples/TFP_Release_Notebook_0_12_1.ipynb +++ b/site/ko/probability/examples/TFP_Release_Notebook_0_12_1.ipynb @@ -18,9 +18,7 @@ "cellView": "form", "id": "FW9em4rqnw0S" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -59,9 +57,7 @@ "metadata": { "id": "oUPWBWHIHBPM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Installs & imports { vertical-output: true }\n", "!pip3 install -qU tensorflow==2.4.0 tensorflow_probability==0.12.1 tensorflow-datasets inference_gym\n", @@ -128,9 +124,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -182,9 +176,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -254,9 +246,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -303,9 +293,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -355,9 +343,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -409,9 +395,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -462,9 +446,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -504,9 +486,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -519,9 +499,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -679,9 +657,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -725,9 +701,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -787,9 +761,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -968,9 +940,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -983,9 +953,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -998,9 +966,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1049,9 +1015,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1088,9 +1052,7 @@ "metadata": { "id": "Hjv8snlYm7Gi" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Import a Brownian Motion model from TFP's inference gym.\r\n", "model = gym.targets.BrownianMotionMissingMiddleObservations()\r\n", @@ -1135,9 +1097,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1173,9 +1133,7 @@ "metadata": { "id": "g1iSSYX-nCLT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "logging.getLogger('tensorflow').setLevel(logging.ERROR) # suppress pfor warnings\r\n", "\r\n", @@ -1195,9 +1153,7 @@ "metadata": { "id": "sFmuRAt1Czvr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Construct and train a Mean-Field Surrogate Posterior.\r\n", "factored_surrogate_posterior = tfp.experimental.vi.build_factored_surrogate_posterior(event_shape=prior.event_shape)\r\n", @@ -1214,9 +1170,7 @@ "metadata": { "id": "GJPtYZAspk8x" }, - "outputs": [ - - ], + "outputs": [], "source": [ "logging.getLogger('tensorflow').setLevel(logging.ERROR) # suppress pfor warnings\r\n", "\r\n", @@ -1252,9 +1206,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1296,9 +1248,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1364,9 +1314,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1404,9 +1352,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -1468,9 +1414,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1545,9 +1489,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -1560,9 +1502,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1606,9 +1546,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1663,9 +1601,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "TFP_Release_Notebook_0_12_1.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/TFP_Release_Notebook_0_13_0.ipynb b/site/ko/probability/examples/TFP_Release_Notebook_0_13_0.ipynb index 37e2f8ec6d..7a051c05a2 100644 --- a/site/ko/probability/examples/TFP_Release_Notebook_0_13_0.ipynb +++ b/site/ko/probability/examples/TFP_Release_Notebook_0_13_0.ipynb @@ -18,9 +18,7 @@ "cellView": "form", "id": "FW9em4rqnw0S" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -134,9 +132,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -182,9 +178,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -259,9 +253,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -314,9 +306,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -373,9 +363,7 @@ }, "execution_count": 6, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -421,9 +409,7 @@ }, "execution_count": 7, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -495,9 +481,7 @@ }, "execution_count": 8, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -703,9 +687,7 @@ }, "execution_count": 13, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -828,9 +810,7 @@ }, "execution_count": 73, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -912,9 +892,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1035,9 +1013,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -1050,9 +1026,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -1065,9 +1039,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -1080,9 +1052,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1180,9 +1150,7 @@ }, "execution_count": 26, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" }, @@ -1195,9 +1163,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1246,9 +1212,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1266,9 +1230,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "TFP_Release_Notebook_0_13_0.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/TensorFlow_Distributions_Tutorial.ipynb b/site/ko/probability/examples/TensorFlow_Distributions_Tutorial.ipynb index 4b13909324..8709b45ac1 100644 --- a/site/ko/probability/examples/TensorFlow_Distributions_Tutorial.ipynb +++ b/site/ko/probability/examples/TensorFlow_Distributions_Tutorial.ipynb @@ -18,9 +18,7 @@ "cellView": "form", "id": "MeKZo1dnV1cE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -77,9 +75,7 @@ "metadata": { "id": "J6t0EUihrG4B" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import collections\n", "\n", @@ -128,9 +124,7 @@ }, "execution_count": 3, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -164,9 +158,7 @@ }, "execution_count": 4, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -199,9 +191,7 @@ }, "execution_count": 5, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -234,9 +224,7 @@ }, "execution_count": 6, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -269,9 +257,7 @@ }, "execution_count": 7, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -304,9 +290,7 @@ }, "execution_count": 8, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -331,9 +315,7 @@ }, "execution_count": 9, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -357,9 +339,7 @@ }, "execution_count": 10, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -383,9 +363,7 @@ }, "execution_count": 11, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -409,9 +387,7 @@ }, "execution_count": 12, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -453,9 +429,7 @@ }, "execution_count": 13, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -489,9 +463,7 @@ }, "execution_count": 14, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -533,9 +505,7 @@ }, "execution_count": 15, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -564,9 +534,7 @@ }, "execution_count": 16, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -590,9 +558,7 @@ }, "execution_count": 17, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -625,9 +591,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -676,9 +640,7 @@ }, "execution_count": 19, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -714,9 +676,7 @@ }, "execution_count": 20, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -746,9 +706,7 @@ }, "execution_count": 21, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -781,9 +739,7 @@ }, "execution_count": 22, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -838,9 +794,7 @@ }, "execution_count": 23, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -874,9 +828,7 @@ }, "execution_count": 24, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -911,9 +863,7 @@ }, "execution_count": 25, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -946,9 +896,7 @@ }, "execution_count": 26, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1011,9 +959,7 @@ }, "execution_count": 27, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1069,9 +1015,7 @@ }, "execution_count": 28, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1104,9 +1048,7 @@ }, "execution_count": 29, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1169,9 +1111,7 @@ }, "execution_count": 30, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1196,9 +1136,7 @@ }, "execution_count": 31, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1222,9 +1160,7 @@ }, "execution_count": 32, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1250,9 +1186,7 @@ }, "execution_count": 33, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1285,9 +1219,7 @@ }, "execution_count": 34, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1321,9 +1253,7 @@ }, "execution_count": 35, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1356,9 +1286,7 @@ }, "execution_count": 36, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1393,9 +1321,7 @@ }, "execution_count": 37, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1419,9 +1345,7 @@ }, "execution_count": 38, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1447,9 +1371,7 @@ "metadata": { "id": "mKHtmSP6SnvY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "b3 = tfd.Bernoulli(probs=[.3, .5, .7])" ] @@ -1478,9 +1400,7 @@ }, "execution_count": 40, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1521,9 +1441,7 @@ }, "execution_count": 41, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1567,9 +1485,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "TensorFlow_Distributions_Tutorial.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/TensorFlow_Probability_Case_Study_Covariance_Estimation.ipynb b/site/ko/probability/examples/TensorFlow_Probability_Case_Study_Covariance_Estimation.ipynb index c03143ecc2..0e9fc2baaf 100644 --- a/site/ko/probability/examples/TensorFlow_Probability_Case_Study_Covariance_Estimation.ipynb +++ b/site/ko/probability/examples/TensorFlow_Probability_Case_Study_Covariance_Estimation.ipynb @@ -18,9 +18,7 @@ "cellView": "form", "id": "I4NyePmVaxhL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -118,9 +116,7 @@ "metadata": { "id": "tQ_h8ns5Inq-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import collections\n", "import math\n", @@ -179,9 +175,7 @@ "metadata": { "id": "z4lSqTGHKAyf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# We're assuming 2-D data with a known true mean of (0, 0)\n", "true_mean = np.zeros([2], dtype=np.float32)\n", @@ -245,9 +239,7 @@ "metadata": { "id": "XjHoAXOlXbYi" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Set the seed so the results are reproducible.\n", "np.random.seed(123)\n", @@ -276,9 +268,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -313,9 +303,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -419,9 +407,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -475,9 +461,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -511,9 +495,7 @@ "metadata": { "id": "ibgUDLfImeZy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "n = my_data.shape[0]\n", "nu_prior = PRIOR_DF\n", @@ -550,9 +532,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -680,9 +660,7 @@ "metadata": { "id": "9ITlkvOvHkX5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "VALIDATE_ARGS = True\n", "ALLOW_NAN_STATS = False" @@ -713,9 +691,7 @@ "metadata": { "id": "GJB5wJ1IEsBu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def log_lik_data(precisions, replicated_data):\n", " n = tf.shape(precisions)[0] # number of precision matrices\n", @@ -822,9 +798,7 @@ "metadata": { "id": "dIzU4zNxEQPQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function(autograph=False)\n", "def log_lik_prior(precisions):\n", @@ -885,9 +859,7 @@ "metadata": { "id": "Ps6teXnZluC5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def get_log_lik(data, n_chains=1):\n", " # The data argument that is passed in will be available to the inner function\n", @@ -995,9 +967,7 @@ "metadata": { "id": "ZWg3y5KU_mg9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def get_log_lik_verbose(data, n_chains=1):\n", " # The data argument that is passed in will be available to the inner function\n", @@ -1161,9 +1131,7 @@ "metadata": { "id": "OM4s01mGsjfZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Our transform has 3 stages that we chain together via composition:\n", "precision_to_unconstrained = tfb.Chain([\n", @@ -1254,9 +1222,7 @@ "metadata": { "id": "k0pQ7HqrN8aq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def log_lik_prior_transformed(transformed_precisions):\n", " rv_precision = tfd.TransformedDistribution(\n", @@ -1325,9 +1291,7 @@ "metadata": { "id": "vM-nF4t2QqSr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def log_lik_data_transformed(transformed_precisions, replicated_data):\n", " # We recover the precision matrix by inverting our bijector. This is\n", @@ -1396,9 +1360,7 @@ "metadata": { "id": "JKWHJFisTIzo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def get_log_lik_transformed(data, n_chains=1):\n", " # The data argument that is passed in will be available to the inner function\n", @@ -1455,9 +1417,7 @@ "metadata": { "id": "PFvyLlP_Tbi4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# We'll choose a proper random initial value this time\n", "np.random.seed(123)\n", @@ -1480,9 +1440,7 @@ "metadata": { "id": "pUobCu7xTnoa" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Sample!\n", "@tf.function(autograph=False)\n", @@ -1588,9 +1546,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1677,9 +1633,7 @@ "metadata": { "id": "xgLX6o9PZRwQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# The number of chains is determined by the shape of the initial values.\n", "# Here we'll generate 3 chains, so we'll need a tensor of 3 initial values.\n", @@ -1706,9 +1660,7 @@ "metadata": { "id": "M7A-JG6hwCVu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function(autograph=False)\n", "def sample():\n", @@ -1902,9 +1854,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1950,9 +1900,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -2015,9 +1963,7 @@ "metadata": { "id": "Vv4JqbHUP9n7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# The bijector we need for the TransformedTransitionKernel is the inverse of\n", "# the one we used above\n", @@ -2080,9 +2026,7 @@ "metadata": { "id": "a2VVVg4KhSnb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function(autograph=False)\n", "def sample():\n", @@ -2179,9 +2123,7 @@ "metadata": { "id": "jXxuO15HkeTD" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# The output samples have shape [n_steps, n_chains, 2, 2]\n", "# Flatten them to [n_steps * n_chains, 2, 2] via reshape:\n", @@ -2292,9 +2234,7 @@ "metadata": { "id": "QgUyMB4OEyFZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# An optimized Wishart distribution that has been transformed to operate on\n", "# Cholesky factors instead of full matrices. Note that we gain a modest\n", @@ -2461,9 +2401,7 @@ "metadata": { "id": "BJXoPZ1e-8yh" }, - "outputs": [ - - ], + "outputs": [], "source": [ "inverse_wishart_cholesky = tfd.TransformedDistribution(\n", " distribution=CholeskyWishart(\n", @@ -2509,9 +2447,7 @@ "metadata": { "id": "f8V5hA9SUqHy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Our new prior.\n", "PRIOR_SCALE_CHOLESKY = np.linalg.cholesky(PRIOR_SCALE)\n", @@ -2606,9 +2542,7 @@ "metadata": { "id": "GLUqa6lvPCIM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class MVNPrecisionCholesky(tfd.TransformedDistribution):\n", " \"\"\"Multivariate normal parameterized by loc and Cholesky precision matrix.\"\"\"\n", @@ -2633,9 +2567,7 @@ "metadata": { "id": "5rp-71gFUdUz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function(autograph=False)\n", "def log_lik_data_cholesky(precisions_cholesky, replicated_data):\n", @@ -2699,9 +2631,7 @@ "metadata": { "id": "tqx8TS2wYTYh" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def get_log_lik_cholesky(data, n_chains=1):\n", " # The data argument that is passed in will be available to the inner function\n", @@ -2733,9 +2663,7 @@ "metadata": { "id": "8Nva4oOGTjN_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "unconstrained_to_precision_cholesky = tfb.Chain([\n", " # step 2: exponentiate the diagonals \n", @@ -2802,9 +2730,7 @@ "metadata": { "id": "oIOjT1HxZg0C" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# The number of chains is determined by the shape of the initial values.\n", "# Here we'll generate 3 chains, so we'll need a tensor of 3 initial values.\n", @@ -2838,9 +2764,7 @@ "metadata": { "id": "aFzFjNIoYre3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function(autograph=False)\n", "def sample():\n", @@ -2943,9 +2867,7 @@ "metadata": { "id": "merfcOkkrKMS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# The output samples have shape [n_steps, n_chains, 2, 2]\n", "# Flatten them to [n_steps * n_chains, 2, 2] via reshape:\n", @@ -3023,9 +2945,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "TensorFlow_Probability_Case_Study_Covariance_Estimation.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/TensorFlow_Probability_on_JAX.ipynb b/site/ko/probability/examples/TensorFlow_Probability_on_JAX.ipynb index d582fe2207..7c130d1c50 100644 --- a/site/ko/probability/examples/TensorFlow_Probability_on_JAX.ipynb +++ b/site/ko/probability/examples/TensorFlow_Probability_on_JAX.ipynb @@ -18,9 +18,7 @@ "cellView": "form", "id": "MeKZo1dnV1cE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -86,9 +84,7 @@ "metadata": { "id": "dQMyDsSckCpV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip uninstall tensorflow -y -q" ] @@ -108,9 +104,7 @@ "metadata": { "id": "Tl5CfrtVkQd7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install -Uq tfp-nightly[jax] > /dev/null" ] @@ -163,9 +157,7 @@ "metadata": { "id": "pSa7v4CWk38v" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import jax.numpy as jnp\n", "from jax import grad\n", @@ -192,9 +184,7 @@ "metadata": { "id": "nlx8w2gPkEM6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "from tensorflow_probability.substrates import jax as tfp\n", "tfd = tfp.distributions\n", @@ -228,9 +218,7 @@ "metadata": { "id": "0HHsy5lsf_S7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "iris = datasets.load_iris()\n", "features, labels = iris['data'], iris['target']\n", @@ -254,9 +242,7 @@ "metadata": { "id": "0Ri7RxnekWUr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "Root = tfd.JointDistributionCoroutine.Root\n", "def model():\n", @@ -298,9 +284,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -344,9 +328,7 @@ "metadata": { "id": "sRkYo3z1lox5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def classifier_probs(params):\n", " dists, _ = dist.sample_distributions(seed=random.PRNGKey(0),\n", @@ -492,9 +474,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -639,9 +619,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -675,9 +653,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -703,9 +679,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -783,9 +757,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -832,9 +804,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -866,9 +836,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -898,9 +866,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -951,9 +917,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1086,9 +1050,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1188,9 +1150,7 @@ }, "execution_count": 0, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1214,9 +1174,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1260,9 +1218,7 @@ "metadata": { "id": "dJaHRkDI_qY_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "target_log_prob = tfd.MultivariateNormalDiag(jnp.zeros(2), jnp.ones(2)).log_prob" ] @@ -1291,9 +1247,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -1305,9 +1259,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1352,9 +1304,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -1366,9 +1316,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1408,9 +1356,7 @@ "metadata": { "id": "veOHaWtOeE0-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "minimum = jnp.array([1.0, 1.0]) # The center of the quadratic bowl.\n", "scales = jnp.array([2.0, 3.0]) # The scales along the two axes.\n", @@ -1714,9 +1660,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "TensorFlow_Probability_on_JAX.ipynb", "toc_visible": true }, diff --git a/site/ko/probability/examples/Understanding_TensorFlow_Distributions_Shapes.ipynb b/site/ko/probability/examples/Understanding_TensorFlow_Distributions_Shapes.ipynb index e4b4b25550..6c5e33f16e 100644 --- a/site/ko/probability/examples/Understanding_TensorFlow_Distributions_Shapes.ipynb +++ b/site/ko/probability/examples/Understanding_TensorFlow_Distributions_Shapes.ipynb @@ -18,9 +18,7 @@ "cellView": "form", "id": "htHLjlnLYSoB" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -57,9 +55,7 @@ "metadata": { "id": "J6t0EUihrG4B" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import collections\n", "\n", @@ -120,9 +116,7 @@ "metadata": { "id": "bq8guNPtrG4M" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def describe_distributions(distributions):\n", " print('\\n'.join([str(d) for d in distributions]))" @@ -441,8 +435,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -467,8 +460,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -492,8 +484,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -533,8 +524,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -570,8 +560,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -598,9 +587,7 @@ "metadata": { "id": "MkSWkwYarG5d" }, - "outputs": [ - - ], + "outputs": [], "source": [ "poisson_2_by_3 = tfd.Poisson(\n", " rate=[[1., 10., 100.,], [2., 20., 200.]],\n", @@ -623,8 +610,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -648,8 +634,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -673,8 +658,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -698,8 +682,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -723,8 +706,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -748,8 +730,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -773,8 +754,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -810,8 +790,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -847,8 +826,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -884,8 +862,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -921,8 +898,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -958,8 +934,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -1003,8 +978,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -1030,8 +1004,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -1180,8 +1153,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -1215,8 +1187,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -1249,8 +1220,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -1282,8 +1252,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -1325,8 +1294,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -1360,8 +1328,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -1386,8 +1353,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -1409,8 +1375,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -1452,8 +1417,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -1490,8 +1454,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -1523,8 +1486,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -1559,8 +1521,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -1591,8 +1552,7 @@ ] }, "execution_count": 0, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], diff --git a/site/ko/probability/examples/Variational_Inference_with_Multipart_Bijectors.ipynb b/site/ko/probability/examples/Variational_Inference_with_Multipart_Bijectors.ipynb index 04cad07142..1f7de14e66 100644 --- a/site/ko/probability/examples/Variational_Inference_with_Multipart_Bijectors.ipynb +++ b/site/ko/probability/examples/Variational_Inference_with_Multipart_Bijectors.ipynb @@ -18,9 +18,7 @@ "cellView": "form", "id": "3jTEqPzFiHQ0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", "# you may not use this file except in compliance with the License.\n", @@ -45,10 +43,10 @@ "\n", "\n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", "
TensorFlow.org에서보기 Google Colab에서 실행하기\n", + " Google Colab에서 실행하기\n", "GitHub에서 소스 보기노트북 다운로드하기GitHub에서 소스 보기노트북 다운로드하기
" ] }, @@ -124,9 +122,7 @@ "metadata": { "id": "i00BTGk5tiwe" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip3 install -q tf-nightly tfp-nightly" ] @@ -137,9 +133,7 @@ "metadata": { "id": "H9omoz32_Y9F" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", @@ -161,9 +155,7 @@ "metadata": { "id": "BFKYEEfY1FhB" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Load the Radon dataset from `tensorflow_datasets` and filter to data from\n", "# Minnesota.\n", @@ -217,9 +209,7 @@ "metadata": { "id": "awL6fCUh6OCF" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Create variables for fixed effects.\n", "floor_weight = tf.Variable(0.)\n", @@ -288,9 +278,7 @@ "metadata": { "id": "sJuvC5ykBAiK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Determine the `event_shape` of the posterior, and calculate the size of each\n", "# `event_shape` component. These determine the sizes of the components of the\n", @@ -321,9 +309,7 @@ "metadata": { "id": "0ceaCfU8sPjg" }, - "outputs": [ - - ], + "outputs": [], "source": [ "base_standard_dist = tfd.JointDistributionSequential(\n", " [tfd.Sample(tfd.Normal(0., 1.), s) for s in flat_event_size])" @@ -348,9 +334,7 @@ "metadata": { "id": "dUCks9qg6nU2" }, - "outputs": [ - - ], + "outputs": [], "source": [ "operators = (\n", " (tf.linalg.LinearOperatorDiag,), # Variance of uranium weight (scalar).\n", @@ -382,9 +366,7 @@ "metadata": { "id": "ceS386lN448r" }, - "outputs": [ - - ], + "outputs": [], "source": [ "loc_bijector = tfb.JointMap(\n", " tf.nest.map_structure(\n", @@ -409,9 +391,7 @@ "metadata": { "id": "PnnU3lJ7H-pj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Reshape each component to match the prior, using a nested structure of\n", "# `Reshape` bijectors wrapped in `JointMap` to form a multipart bijector.\n", @@ -439,9 +419,7 @@ "metadata": { "id": "xlrIbELO5EWR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "surrogate_posterior = tfd.TransformedDistribution(\n", " base_standard_dist,\n", @@ -486,9 +464,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -553,9 +529,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -616,9 +590,7 @@ "metadata": { "id": "R0FFLYnaGRrc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Build a standard Normal with a vector `event_shape`, with length equal to the\n", "# total number of degrees of freedom in the posterior.\n", @@ -684,9 +656,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -736,9 +706,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -781,9 +749,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -862,9 +828,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -980,9 +944,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -994,9 +956,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -1008,9 +968,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -1022,9 +980,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1069,9 +1025,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1097,9 +1051,7 @@ "cellView": "form", "id": "OUnECXkG42uZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Plotting functions\n", "\n", @@ -1175,9 +1127,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1212,9 +1162,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1244,10 +1192,8 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], - "name": "Variational_Inference_and_Joint_Distributions.ipynb", + "collapsed_sections": [], + "name": "Variational_Inference_with_Multipart_Bijectors.ipynb", "toc_visible": true }, "kernelspec": { diff --git a/site/ko/quantum/tutorials/hello_many_worlds.ipynb b/site/ko/quantum/tutorials/hello_many_worlds.ipynb index ebe71acf91..a8ae9093a0 100644 --- a/site/ko/quantum/tutorials/hello_many_worlds.ipynb +++ b/site/ko/quantum/tutorials/hello_many_worlds.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "iiQkM5ZgQ8r2" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -80,9 +78,7 @@ "metadata": { "id": "TorxE5tnkvb2" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install tensorflow==2.7.0" ] @@ -102,9 +98,7 @@ "metadata": { "id": "saFHsRDpkvkH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install tensorflow-quantum==0.7.2" ] @@ -115,9 +109,7 @@ "metadata": { "id": "4Ql5PW-ACO0J" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Update package resources to account for version changes.\n", "import importlib, pkg_resources\n", @@ -139,9 +131,7 @@ "metadata": { "id": "enZ300Bflq80" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "import tensorflow_quantum as tfq\n", @@ -184,9 +174,7 @@ "metadata": { "id": "2yQdmhQLCrzQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "a, b = sympy.symbols('a b')" ] @@ -206,9 +194,7 @@ "metadata": { "id": "Ps-pd2mndXs7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Create two qubits\n", "q0, q1 = cirq.GridQubit.rect(1, 2)\n", @@ -236,9 +222,7 @@ "metadata": { "id": "VMq7EayNRyQb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Calculate a state vector with a=0.5 and b=-0.5.\n", "resolver = cirq.ParamResolver({a: 0.5, b: -0.5})\n", @@ -261,9 +245,7 @@ "metadata": { "id": "hrSnOCi3ehr_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "z0 = cirq.Z(q0)\n", "\n", @@ -278,9 +260,7 @@ "metadata": { "id": "OZ0lWFXv6pII" }, - "outputs": [ - - ], + "outputs": [], "source": [ "z0x1 = 0.5 * z0 + cirq.X(q1)\n", "\n", @@ -304,9 +284,7 @@ "metadata": { "id": "1gLQjA02mIyy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Rank 1 tensor containing 1 circuit.\n", "circuit_tensor = tfq.convert_to_tensor([circuit])\n", @@ -330,9 +308,7 @@ "metadata": { "id": "aX_vEmCKmpQS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Rank 1 tensor containing 2 Pauli operators.\n", "pauli_tensor = tfq.convert_to_tensor([z0, z0x1])\n", @@ -360,9 +336,7 @@ "metadata": { "id": "1fsVZhF5lIXp" }, - "outputs": [ - - ], + "outputs": [], "source": [ "batch_vals = np.array(np.random.uniform(0, 2 * np.pi, (5, 2)), dtype=float)" ] @@ -382,9 +356,7 @@ "metadata": { "id": "RsfF53UCJtr9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "cirq_results = []\n", "cirq_simulator = cirq.Simulator()\n", @@ -416,9 +388,7 @@ "metadata": { "id": "kGZVdcZ6y9lC" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tfq.layers.Expectation()(circuit,\n", " symbol_names=[a, b],\n", @@ -472,9 +442,7 @@ "metadata": { "id": "N-j7SCl-51-q" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Parameters that the classical NN will feed values into.\n", "control_params = sympy.symbols('theta_1 theta_2 theta_3')\n", @@ -506,9 +474,7 @@ "metadata": { "id": "1v4CK2jD6pIj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# The classical neural network layers.\n", "controller = tf.keras.Sequential([\n", @@ -534,9 +500,7 @@ "metadata": { "id": "kZbYRTe16pIm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "controller(tf.constant([[0.0],[1.0]])).numpy()" ] @@ -569,9 +533,7 @@ "metadata": { "id": "UfHF8NNE6pIr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# This input is the simulated miscalibration that the model will learn to correct.\n", "circuits_input = tf.keras.Input(shape=(),\n", @@ -600,9 +562,7 @@ "metadata": { "id": "Zvt2YGmZ6pIu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "dense_2 = controller(commands_input)\n", "\n", @@ -628,9 +588,7 @@ "metadata": { "id": "Xs6EMhah6pIz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# The full Keras model is built from our layers.\n", "model = tf.keras.Model(inputs=[circuits_input, commands_input],\n", @@ -654,9 +612,7 @@ "metadata": { "id": "ERXNPe4F6pI4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf.keras.utils.plot_model(model, show_shapes=True, dpi=70)" ] @@ -694,9 +650,7 @@ "metadata": { "id": "ciMIJAuH6pJA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# The command input values to the classical NN.\n", "commands = np.array([[0], [1]], dtype=np.float32)\n", @@ -731,9 +685,7 @@ "metadata": { "id": "_VYfzHffWo7n" }, - "outputs": [ - - ], + "outputs": [], "source": [ "random_rotations = np.random.uniform(0, 2 * np.pi, 3)\n", "noisy_preparation = cirq.Circuit(\n", @@ -761,9 +713,7 @@ "metadata": { "id": "6nk2Yr3e6pJJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "datapoint_circuits.shape" ] @@ -792,9 +742,7 @@ "metadata": { "id": "Lwphqvs96pJO" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model([datapoint_circuits, commands]).numpy()" ] @@ -814,9 +762,7 @@ "metadata": { "id": "dtPYqbNi8zeZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "optimizer = tf.keras.optimizers.Adam(learning_rate=0.05)\n", "loss = tf.keras.losses.MeanSquaredError()\n", @@ -833,9 +779,7 @@ "metadata": { "id": "azE-qV0OaC1o" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plt.plot(history.history['loss'])\n", "plt.title(\"Learning to Control a Qubit\")\n", @@ -870,9 +814,7 @@ "metadata": { "id": "RoIlb7r7j5SY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def check_error(command_values, desired_values):\n", " \"\"\"Based on the value in `command_value` see how well you could prepare\n", @@ -912,9 +854,7 @@ "metadata": { "id": "aYskLTacs8Ku" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model([datapoint_circuits, commands])" ] @@ -952,9 +892,7 @@ "metadata": { "id": "hta0G3Nc6pJY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Define inputs.\n", "commands_input = tf.keras.layers.Input(shape=(1),\n", @@ -984,9 +922,7 @@ "metadata": { "id": "n_aTG4g3-y0F" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Define classical NN.\n", "controller = tf.keras.Sequential([\n", @@ -1010,9 +946,7 @@ "metadata": { "id": "IMHjiKit6pJg" }, - "outputs": [ - - ], + "outputs": [], "source": [ "dense_2 = controller(commands_input)\n", "\n", @@ -1047,9 +981,7 @@ "metadata": { "id": "4gw_L3JG0_G0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# The operators to measure, for each command.\n", "operator_data = tfq.convert_to_tensor([[cirq.X(qubit)], [cirq.Z(qubit)]])\n", @@ -1078,9 +1010,7 @@ "metadata": { "id": "nFuGA73MAA4p" }, - "outputs": [ - - ], + "outputs": [], "source": [ "optimizer = tf.keras.optimizers.Adam(learning_rate=0.05)\n", "loss = tf.keras.losses.MeanSquaredError()\n", @@ -1100,9 +1030,7 @@ "metadata": { "id": "Cf_G-GdturLL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plt.plot(history.history['loss'])\n", "plt.title(\"Learning to Control a Qubit\")\n", @@ -1135,9 +1063,7 @@ "metadata": { "id": "uXmH0TQ76pJt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "controller.predict(np.array([0,1]))" ] @@ -1154,9 +1080,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "hello_many_worlds.ipynb", "toc_visible": true }, diff --git a/site/ko/quantum/tutorials/mnist.ipynb b/site/ko/quantum/tutorials/mnist.ipynb index ca2b8759f8..4e5da8a780 100644 --- a/site/ko/quantum/tutorials/mnist.ipynb +++ b/site/ko/quantum/tutorials/mnist.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "iiQkM5ZgQ8r2" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -80,9 +78,7 @@ "metadata": { "id": "TorxE5tnkvb2" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install tensorflow==2.7.0" ] @@ -102,9 +98,7 @@ "metadata": { "id": "saFHsRDpkvkH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install tensorflow-quantum==0.7.2" ] @@ -115,9 +109,7 @@ "metadata": { "id": "4Ql5PW-ACO0J" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Update package resources to account for version changes.\n", "import importlib, pkg_resources\n", @@ -139,9 +131,7 @@ "metadata": { "id": "enZ300Bflq80" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "import tensorflow_quantum as tfq\n", @@ -200,9 +190,7 @@ "metadata": { "id": "d9OSExvCojg0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()\n", "\n", @@ -228,9 +216,7 @@ "metadata": { "id": "hOw68cCZojg4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def filter_36(x, y):\n", " keep = (y == 3) | (y == 6)\n", @@ -245,9 +231,7 @@ "metadata": { "id": "p-XEU8egGL6q" }, - "outputs": [ - - ], + "outputs": [], "source": [ "x_train, y_train = filter_36(x_train, y_train)\n", "x_test, y_test = filter_36(x_test, y_test)\n", @@ -271,9 +255,7 @@ "metadata": { "id": "j5STP7MbojhA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(y_train[0])\n", "\n", @@ -305,9 +287,7 @@ "metadata": { "id": "lbhUdBFWojhE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "x_train_small = tf.image.resize(x_train, (4,4)).numpy()\n", "x_test_small = tf.image.resize(x_test, (4,4)).numpy()" @@ -328,9 +308,7 @@ "metadata": { "id": "YIYOtCRIGL6y" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(y_train[0])\n", "\n", @@ -364,9 +342,7 @@ "metadata": { "id": "LqOPW0C7ojhL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def remove_contradicting(xs, ys):\n", " mapping = collections.defaultdict(set)\n", @@ -420,9 +396,7 @@ "metadata": { "id": "zpnsAssWojhP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "x_train_nocon, y_train_nocon = remove_contradicting(x_train_small, y_train)" ] @@ -444,9 +418,7 @@ "metadata": { "id": "1z8J7OyDojhV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "THRESHOLD = 0.5\n", "\n", @@ -469,9 +441,7 @@ "metadata": { "id": "1z8J7OyDojhW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_ = remove_contradicting(x_train_bin, y_train_nocon)" ] @@ -491,9 +461,7 @@ "metadata": { "id": "aOu_3-3ZGL61" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def convert_to_circuit(image):\n", " \"\"\"Encode truncated classical image into quantum datapoint.\"\"\"\n", @@ -525,9 +493,7 @@ "metadata": { "id": "w3POmUEUojhe" }, - "outputs": [ - - ], + "outputs": [], "source": [ "SVGCircuit(x_train_circ[0])" ] @@ -547,9 +513,7 @@ "metadata": { "id": "TBIsiXdtojhh" }, - "outputs": [ - - ], + "outputs": [], "source": [ "bin_img = x_train_bin[0,:,:,0]\n", "indices = np.array(np.where(bin_img)).T\n", @@ -571,9 +535,7 @@ "metadata": { "id": "IZStEMk4ojhk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "x_train_tfcirc = tfq.convert_to_tensor(x_train_circ)\n", "x_test_tfcirc = tfq.convert_to_tensor(x_test_circ)" @@ -609,9 +571,7 @@ "metadata": { "id": "-hjxxgU5ojho" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class CircuitLayerBuilder():\n", " def __init__(self, data_qubits, readout):\n", @@ -639,9 +599,7 @@ "metadata": { "id": "SzXWOpUGojhs" }, - "outputs": [ - - ], + "outputs": [], "source": [ "demo_builder = CircuitLayerBuilder(data_qubits = cirq.GridQubit.rect(4,1),\n", " readout=cirq.GridQubit(-1,-1))\n", @@ -666,9 +624,7 @@ "metadata": { "id": "JiALbpwRGL69" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def create_quantum_model():\n", " \"\"\"Create a QNN model circuit and readout operation to go along with it.\"\"\"\n", @@ -700,9 +656,7 @@ "metadata": { "id": "2QZvVh7vojhx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model_circuit, model_readout = create_quantum_model()" ] @@ -726,9 +680,7 @@ "metadata": { "id": "ZYdf_KOxojh0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Build the Keras model.\n", "model = tf.keras.Sequential([\n", @@ -760,9 +712,7 @@ "metadata": { "id": "CgMNkC1Fojh5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "y_train_hinge = 2.0*y_train_nocon-1.0\n", "y_test_hinge = 2.0*y_test-1.0" @@ -783,9 +733,7 @@ "metadata": { "id": "3XKtZ_TEojh8" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def hinge_accuracy(y_true, y_pred):\n", " y_true = tf.squeeze(y_true) > 0.0\n", @@ -801,9 +749,7 @@ "metadata": { "id": "FlpETlLRojiA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.compile(\n", " loss=tf.keras.losses.Hinge(),\n", @@ -817,9 +763,7 @@ "metadata": { "id": "jkHq2RstojiC" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(model.summary())" ] @@ -841,9 +785,7 @@ "metadata": { "id": "n8vuQpSLlBV2" }, - "outputs": [ - - ], + "outputs": [], "source": [ "EPOCHS = 3\n", "BATCH_SIZE = 32\n", @@ -857,9 +799,7 @@ "metadata": { "id": "qJnNG-3JojiI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "x_train_tfcirc_sub = x_train_tfcirc[:NUM_EXAMPLES]\n", "y_train_hinge_sub = y_train_hinge[:NUM_EXAMPLES]" @@ -880,9 +820,7 @@ "metadata": { "id": "Ya9qP3KkojiM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "qnn_history = model.fit(\n", " x_train_tfcirc_sub, y_train_hinge_sub,\n", @@ -922,9 +860,7 @@ "metadata": { "id": "pZofEHhLGL7L" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def create_classical_model():\n", " # A simple model based off LeNet from https://keras.io/examples/mnist_cnn/\n", @@ -954,9 +890,7 @@ "metadata": { "id": "CiAJl7sZojiU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.fit(x_train,\n", " y_train,\n", @@ -983,9 +917,7 @@ "metadata": { "id": "70TOM6r-ojiZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def create_fair_classical_model():\n", " # A simple model based off LeNet from https://keras.io/examples/mnist_cnn/\n", @@ -1010,9 +942,7 @@ "metadata": { "id": "lA_Fx-8gojid" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.fit(x_train_bin,\n", " y_train_nocon,\n", @@ -1041,9 +971,7 @@ "metadata": { "id": "NOMeN7pMGL7P" }, - "outputs": [ - - ], + "outputs": [], "source": [ "qnn_accuracy = qnn_results[1]\n", "cnn_accuracy = cnn_results[1]\n", @@ -1056,9 +984,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "mnist.ipynb", "toc_visible": true }, diff --git a/site/ko/quantum/tutorials/quantum_reinforcement_learning.ipynb b/site/ko/quantum/tutorials/quantum_reinforcement_learning.ipynb index 021f8709f1..367fbcbbc6 100644 --- a/site/ko/quantum/tutorials/quantum_reinforcement_learning.ipynb +++ b/site/ko/quantum/tutorials/quantum_reinforcement_learning.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "5w2rucWZwpUA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -118,9 +116,7 @@ "metadata": { "id": "bPTH8ScrwpUG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install tensorflow==2.7.0" ] @@ -140,9 +136,7 @@ "metadata": { "id": "MZeJimx6wpUI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install tensorflow-quantum==0.7.2" ] @@ -162,9 +156,7 @@ "metadata": { "id": "6A2JRKhMwpUJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install gym==0.18.0" ] @@ -184,9 +176,7 @@ "metadata": { "id": "4Ql5PW-ACO0J" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Update package resources to account for version changes.\n", "import importlib, pkg_resources\n", @@ -199,9 +189,7 @@ "metadata": { "id": "RIIYRJ79wpUK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "import tensorflow_quantum as tfq\n", @@ -271,9 +259,7 @@ "metadata": { "id": "X4P5EORYwpUM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def one_qubit_rotation(qubit, symbols):\n", " \"\"\"\n", @@ -308,9 +294,7 @@ "metadata": { "id": "PEicpzq9wpUN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def generate_circuit(qubits, n_layers):\n", " \"\"\"Prepares a data re-uploading circuit on `qubits` with `n_layers` layers.\"\"\"\n", @@ -371,8 +355,7 @@ ] }, "execution_count": 4, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -400,9 +383,7 @@ "metadata": { "id": "7XJvWgQ4wpUP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class ReUploadingPQC(tf.keras.layers.Layer):\n", " \"\"\"\n", @@ -488,9 +469,7 @@ "metadata": { "id": "kPLHsGRewpUQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class Alternating(tf.keras.layers.Layer):\n", " def __init__(self, output_dim):\n", @@ -518,9 +497,7 @@ "metadata": { "id": "l3yZCMhywpUQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "n_qubits = 4 # Dimension of the state vectors in CartPole\n", "n_layers = 5 # Number of layers in the PQC\n", @@ -544,9 +521,7 @@ "metadata": { "id": "qMAc2_--wpUR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ops = [cirq.Z(q) for q in qubits]\n", "observables = [reduce((lambda x, y: x * y), ops)] # Z_0*Z_1*Z_2*Z_3" @@ -567,9 +542,7 @@ "metadata": { "id": "-ivAvce6wpUR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def generate_model_policy(qubits, n_layers, n_actions, beta, observables):\n", " \"\"\"Generates a Keras model for a data re-uploading PQC policy.\"\"\"\n", @@ -605,9 +578,7 @@ }, "execution_count": 10, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -643,9 +614,7 @@ "metadata": { "id": "dYepv83JwpUT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def gather_episodes(state_bounds, n_actions, model, n_episodes, env_name):\n", " \"\"\"Interact with environment in batched fashion.\"\"\"\n", @@ -693,9 +662,7 @@ "metadata": { "id": "KGDLrNN1wpUT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def compute_returns(rewards_history, gamma):\n", " \"\"\"Compute discounted returns with discount factor `gamma`.\"\"\"\n", @@ -728,9 +695,7 @@ "metadata": { "id": "QUuSU1LRwpUU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "state_bounds = np.array([2.4, 2.5, 0.21, 2.5])\n", "gamma = 1\n", @@ -753,9 +718,7 @@ "metadata": { "id": "2fxGvCKpwpUU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "optimizer_in = tf.keras.optimizers.Adam(learning_rate=0.1, amsgrad=True)\n", "optimizer_var = tf.keras.optimizers.Adam(learning_rate=0.01, amsgrad=True)\n", @@ -780,9 +743,7 @@ "metadata": { "id": "zLfbu8Q2wpUV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function\n", "def reinforce_update(states, actions, returns, model):\n", @@ -923,9 +884,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -962,9 +921,7 @@ "metadata": { "id": "-VpROTJ1wpUX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# from PIL import Image\n", "\n", @@ -990,7 +947,6 @@ "id": "i0iA0nubwpUX" }, "source": [ - "\n", " " ] }, @@ -1029,9 +985,7 @@ "metadata": { "id": "MX5l96qywpUY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class Rescaling(tf.keras.layers.Layer):\n", " def __init__(self, input_dim):\n", @@ -1060,9 +1014,7 @@ "metadata": { "id": "cpV0PxZqwpUY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "n_qubits = 4 # Dimension of the state vectors in CartPole\n", "n_layers = 5 # Number of layers in the PQC\n", @@ -1088,9 +1040,7 @@ "metadata": { "id": "PBGM6RHIwpUZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def generate_model_Qlearning(qubits, n_layers, n_actions, observables, target):\n", " \"\"\"Generates a Keras model for a data re-uploading PQC Q-function approximator.\"\"\"\n", @@ -1125,9 +1075,7 @@ }, "execution_count": 9, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1152,9 +1100,7 @@ }, "execution_count": 10, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1187,9 +1133,7 @@ "metadata": { "id": "0L9cV26PwpUb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def interact_env(state, model, epsilon, n_actions, env):\n", " # Preprocess state\n", @@ -1228,9 +1172,7 @@ "metadata": { "id": "RR2DjesVwpUb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function\n", "def Q_learning_update(states, actions, rewards, next_states, done, model, gamma, n_actions):\n", @@ -1274,9 +1216,7 @@ "metadata": { "id": "SQ937aYPwpUc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "gamma = 0.99\n", "n_episodes = 2000\n", @@ -1308,9 +1248,7 @@ "metadata": { "id": "713nl3oUwpUc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "optimizer_in = tf.keras.optimizers.Adam(learning_rate=0.001, amsgrad=True)\n", "optimizer_var = tf.keras.optimizers.Adam(learning_rate=0.001, amsgrad=True)\n", @@ -1511,9 +1449,7 @@ }, "metadata": { "needs_background": "light", - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } diff --git a/site/ko/tensorboard/get_started.ipynb b/site/ko/tensorboard/get_started.ipynb index 926ce2ba77..262b3ffa25 100644 --- a/site/ko/tensorboard/get_started.ipynb +++ b/site/ko/tensorboard/get_started.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "0sK8X2O9bTlz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -66,9 +64,7 @@ "metadata": { "id": "6B95Hb6YVgPZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Load the TensorBoard notebook extension\n", "%load_ext tensorboard" @@ -80,9 +76,7 @@ "metadata": { "id": "_wqSAZExy6xV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "import datetime" @@ -94,9 +88,7 @@ "metadata": { "id": "Ao7fJW1Pyiza" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Clear any logs from previous runs\n", "!rm -rf ./logs/ " @@ -194,9 +186,7 @@ }, "execution_count": 6, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -232,9 +222,7 @@ "metadata": { "id": "A4UKgTLb9fKI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%tensorboard --logdir logs/fit" ] @@ -289,9 +277,7 @@ "metadata": { "id": "nnHx4DsMezy1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))\n", "test_dataset = tf.data.Dataset.from_tensor_slices((x_test, y_test))\n", @@ -315,9 +301,7 @@ "metadata": { "id": "H2Y5-aPbAANs" }, - "outputs": [ - - ], + "outputs": [], "source": [ "loss_object = tf.keras.losses.SparseCategoricalCrossentropy()\n", "optimizer = tf.keras.optimizers.Adam()" @@ -338,9 +322,7 @@ "metadata": { "id": "jD0tEWrgH0TL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Define our metrics\n", "train_loss = tf.keras.metrics.Mean('train_loss', dtype=tf.float32)\n", @@ -364,9 +346,7 @@ "metadata": { "id": "TTWcJO35IJgK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def train_step(model, optimizer, x_train, y_train):\n", " with tf.GradientTape() as tape:\n", @@ -401,9 +381,7 @@ "metadata": { "id": "3Qp-exmbWf4w" }, - "outputs": [ - - ], + "outputs": [], "source": [ "current_time = datetime.datetime.now().strftime(\"%Y%m%d-%H%M%S\")\n", "train_log_dir = 'logs/gradient_tape/' + current_time + '/train'\n", @@ -487,9 +465,7 @@ "metadata": { "id": "-Iue509kgOyE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%tensorboard --logdir logs/gradient_tape" ] @@ -531,9 +507,7 @@ "metadata": { "id": "Q3nupQL24E5E" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!tensorboard dev upload \\\n", " --logdir logs/fit \\\n", @@ -558,9 +532,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "get_started.ipynb", "toc_visible": true }, diff --git a/site/ko/tensorboard/graphs.ipynb b/site/ko/tensorboard/graphs.ipynb index 077048e680..37179ce1f4 100644 --- a/site/ko/tensorboard/graphs.ipynb +++ b/site/ko/tensorboard/graphs.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "0sK8X2O9bTlz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -84,9 +82,7 @@ "metadata": { "id": "6B95Hb6YVgPZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Load the TensorBoard notebook extension.\n", "%load_ext tensorboard" @@ -133,8 +129,7 @@ ] }, "execution_count": 4, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -149,9 +144,7 @@ "metadata": { "id": "Ao7fJW1Pyiza" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Clear any logs from previous runs\n", "!rm -rf ./logs/ " @@ -174,9 +167,7 @@ "metadata": { "id": "skqORzvE3Egy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Define the model.\n", "model = keras.models.Sequential([\n", @@ -207,9 +198,7 @@ "metadata": { "id": "6TDmc41z3g38" }, - "outputs": [ - - ], + "outputs": [], "source": [ "(train_images, train_labels), _ = keras.datasets.fashion_mnist.load_data()\n", "train_images = train_images / 255.0" @@ -256,8 +245,7 @@ ] }, "execution_count": 8, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -292,9 +280,7 @@ "metadata": { "id": "PFgFjlPEqXb9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%tensorboard --logdir logs" ] @@ -314,9 +300,7 @@ "metadata": { "id": "b9PFgFjlPEqX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!tensorboard dev upload \\\n", " --logdir logs \\\n", @@ -417,9 +401,7 @@ "metadata": { "id": "woI67Stgv_uY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# The function to be traced.\n", "@tf.function\n", @@ -454,9 +436,7 @@ "metadata": { "id": "zCArnWzP0VuZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%tensorboard --logdir logs/func" ] diff --git a/site/ko/tensorboard/hyperparameter_tuning_with_hparams.ipynb b/site/ko/tensorboard/hyperparameter_tuning_with_hparams.ipynb index 210d1cd70d..7daf37c99b 100644 --- a/site/ko/tensorboard/hyperparameter_tuning_with_hparams.ipynb +++ b/site/ko/tensorboard/hyperparameter_tuning_with_hparams.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "atWM-s8yVnfX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -77,9 +75,7 @@ "metadata": { "id": "8p3Tbx8cWEFA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Load the TensorBoard notebook extension\n", "%load_ext tensorboard" @@ -91,9 +87,7 @@ "metadata": { "id": "lEWCCQYkWIdA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Clear any logs from previous runs\n", "!rm -rf ./logs/ " @@ -114,9 +108,7 @@ "metadata": { "id": "mVtYvbbIWRkV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "from tensorboard.plugins.hparams import api as hp" @@ -183,9 +175,7 @@ "metadata": { "id": "5Euw0agpWb4V" }, - "outputs": [ - - ], + "outputs": [], "source": [ "HP_NUM_UNITS = hp.HParam('num_units', hp.Discrete([16, 32]))\n", "HP_DROPOUT = hp.HParam('dropout', hp.RealInterval(0.1, 0.2))\n", @@ -226,9 +216,7 @@ "metadata": { "id": "hG-zalNfW5Zl" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def train_test_model(hparams):\n", " model = tf.keras.models.Sequential([\n", @@ -263,9 +251,7 @@ "metadata": { "id": "8j-fO6nEXRfW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def run(run_dir, hparams):\n", " with tf.summary.create_file_writer(run_dir).as_default():\n", @@ -396,9 +382,7 @@ "metadata": { "id": "Xf4KM-U2bbP_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%tensorboard --logdir logs/hparam_tuning" ] @@ -457,9 +441,7 @@ "metadata": { "id": "oxrSUAnCeFmQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%bash\n", "wget -q 'https://storage.googleapis.com/download.tensorflow.org/tensorboard/hparams_demo_logs.zip'\n", @@ -481,9 +463,7 @@ "metadata": { "id": "KBHp6M_zgjp4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%tensorboard --logdir logs/hparam_demo" ] @@ -511,9 +491,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "hyperparameter_tuning_with_hparams.ipynb", "toc_visible": true }, diff --git a/site/ko/tensorboard/image_summaries.ipynb b/site/ko/tensorboard/image_summaries.ipynb index f71e32680d..a3dbd980c8 100644 --- a/site/ko/tensorboard/image_summaries.ipynb +++ b/site/ko/tensorboard/image_summaries.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "su2RaORHpReL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -230,9 +228,7 @@ "metadata": { "id": "5yPh-7EWB8IK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Reshape the image for the Summary API.\n", "img = np.reshape(train_images[0], (-1, 28, 28, 1))" @@ -253,9 +249,7 @@ "metadata": { "id": "IJNpyVyxbVtT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Clear out any prior log data.\n", "!rm -rf logs\n", @@ -285,9 +279,7 @@ "metadata": { "id": "T_X-wIy-lD9f" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%tensorboard --logdir logs/train_data" ] @@ -333,9 +325,7 @@ "metadata": { "id": "iHUjCXbetIpb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "with file_writer.as_default():\n", " # Don't forget to reshape.\n", @@ -375,9 +365,7 @@ "metadata": { "id": "F5U_5WKt8bdQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Clear out prior logging data.\n", "!rm -rf logs/plots\n", @@ -454,9 +442,7 @@ "metadata": { "id": "R74hPWJHzgvZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = keras.models.Sequential([\n", " keras.layers.Flatten(input_shape=(28, 28)),\n", @@ -488,9 +474,7 @@ "metadata": { "id": "rBiXP8-UO8t6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def plot_confusion_matrix(cm, class_names):\n", " \"\"\"\n", @@ -546,9 +530,7 @@ "metadata": { "id": "utd-vH6hn5RY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Clear out prior logging data.\n", "!rm -rf logs/image\n", @@ -565,9 +547,7 @@ "metadata": { "id": "bXQ7-9CF0TPA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def log_confusion_matrix(epoch, logs):\n", " # Use the model to predict the values from the validation dataset.\n", @@ -594,9 +574,7 @@ "metadata": { "id": "k6CV7dy-oJZu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Start TensorBoard.\n", "%tensorboard --logdir logs/image\n", @@ -643,9 +621,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "image_summaries.ipynb", "toc_visible": true }, diff --git a/site/ko/tensorboard/migrate.ipynb b/site/ko/tensorboard/migrate.ipynb index 42306def3b..6e87e99bc0 100644 --- a/site/ko/tensorboard/migrate.ipynb +++ b/site/ko/tensorboard/migrate.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "0sK8X2O9bTlz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -43,9 +41,9 @@ "\n", "\n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", "
TensorFlow.org에서 보기 Google Colab에서 실행 GitHub에서 소스 보기노트북 다운로드 Google Colab에서 실행 GitHub에서 소스 보기노트북 다운로드
" ] }, @@ -64,9 +62,7 @@ "metadata": { "id": "c50hsFk2MiWs" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf" ] @@ -131,9 +127,7 @@ "metadata": { "id": "GgFXOtSeVFqP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "writer = tf.summary.create_file_writer(\"/tmp/mylogs/eager\")\n", "\n", @@ -150,9 +144,7 @@ "metadata": { "id": "h5fk_NG7QKve" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ls /tmp/mylogs/eager" ] @@ -172,9 +164,7 @@ "metadata": { "id": "kovK0LEEVKjR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "writer = tf.summary.create_file_writer(\"/tmp/mylogs/tf_function\")\n", "\n", @@ -195,9 +185,7 @@ "metadata": { "id": "Qw5nHhRUSM7_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ls /tmp/mylogs/tf_function" ] @@ -217,9 +205,7 @@ "metadata": { "id": "OyQgeqZhVRNB" }, - "outputs": [ - - ], + "outputs": [], "source": [ "g = tf.compat.v1.Graph()\n", "with g.as_default():\n", @@ -247,9 +233,7 @@ "metadata": { "id": "iqKOyawnNQSH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ls /tmp/mylogs/session" ] @@ -292,9 +276,7 @@ "metadata": { "id": "6457297c0b9d" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Enable eager execution.\n", "tf.compat.v1.enable_v2_behavior()\n", @@ -406,9 +388,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "migrate.ipynb", "toc_visible": true }, diff --git a/site/ko/tensorboard/scalars_and_keras.ipynb b/site/ko/tensorboard/scalars_and_keras.ipynb index 2cb59552cb..c8580c7995 100644 --- a/site/ko/tensorboard/scalars_and_keras.ipynb +++ b/site/ko/tensorboard/scalars_and_keras.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "su2RaORHpReL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -76,9 +74,7 @@ "metadata": { "id": "3U5gdCw_nSG3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Load the TensorBoard notebook extension.\n", "%load_ext tensorboard" @@ -120,9 +116,7 @@ "metadata": { "id": "UbFM4dlnGB3S" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Clear any logs from previous runs\n", "!rm -rf ./logs/ " @@ -149,9 +143,7 @@ "metadata": { "id": "j-ryO6OxnQH_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "data_size = 1000\n", "# 80% of the data is for training.\n", @@ -254,9 +246,7 @@ "metadata": { "id": "6pck56gKReON" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%tensorboard --logdir logs/scalars" ] @@ -358,9 +348,7 @@ "metadata": { "id": "XB95ltRiXVXk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "logdir = \"logs/scalars/\" + datetime.now().strftime(\"%Y%m%d-%H%M%S\")\n", "file_writer = tf.summary.create_file_writer(logdir + \"/metrics\")\n", @@ -420,9 +408,7 @@ "metadata": { "id": "0sjM2wXGa0mF" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%tensorboard --logdir logs/scalars" ] @@ -564,9 +550,7 @@ "metadata": { "id": "7OTD7Vpg2DLv" }, - "outputs": [ - - ], + "outputs": [], "source": [ "log_dir = 'logs/batch_level/' + datetime.now().strftime(\"%Y%m%d-%H%M%S\") + '/train'\n", "train_writer = tf.summary.create_file_writer(log_dir)" @@ -587,9 +571,7 @@ "metadata": { "id": "IGcNr1ZS1xXL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class MyModel(tf.keras.Model):\n", " def __init__(self, model):\n", @@ -658,8 +640,7 @@ ] }, "execution_count": 15, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -689,9 +670,7 @@ "metadata": { "id": "XlcafPNY2oUW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%tensorboard --logdir logs/batch_level" ] @@ -729,9 +708,7 @@ "metadata": { "id": "hX3nsdqi28W1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "log_dir = 'logs/batch_avg/' + datetime.now().strftime(\"%Y%m%d-%H%M%S\") + '/train'\n", "train_writer = tf.summary.create_file_writer(log_dir)" @@ -752,9 +729,7 @@ "metadata": { "id": "0cAiVu_KjOVi" }, - "outputs": [ - - ], + "outputs": [], "source": [ "batch_loss = tf.keras.metrics.Mean('batch_loss', dtype=tf.float32)\n", "batch_accuracy = tf.keras.metrics.SparseCategoricalAccuracy('batch_accuracy')" @@ -775,9 +750,7 @@ "metadata": { "id": "vQ_-46fpjUVl" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class MyModel(tf.keras.Model):\n", " def __init__(self, model):\n", @@ -847,8 +820,7 @@ ] }, "execution_count": 26, - "metadata": { - }, + "metadata": {}, "output_type": "execute_result" } ], @@ -878,9 +850,7 @@ "metadata": { "id": "kYmYfTeSk7AD" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%tensorboard --logdir logs/batch_avg" ] @@ -897,9 +867,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "scalars_and_keras.ipynb", "toc_visible": true }, diff --git a/site/ko/tensorboard/tbdev_getting_started.ipynb b/site/ko/tensorboard/tbdev_getting_started.ipynb index f0802bae27..cdb1e01c7e 100644 --- a/site/ko/tensorboard/tbdev_getting_started.ipynb +++ b/site/ko/tensorboard/tbdev_getting_started.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "zZ81_4tLxSvd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -70,9 +68,7 @@ "metadata": { "id": "L3ns52Luracm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "import datetime\n", @@ -94,9 +90,7 @@ "metadata": { "id": "LZExSr2Qrc5S" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mnist = tf.keras.datasets.mnist\n", "\n", @@ -127,9 +121,7 @@ "metadata": { "id": "dsVjm5CrUtXm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = create_model()\n", "model.compile(\n", @@ -191,9 +183,7 @@ "metadata": { "id": "n2PvxhOkW7vn" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!tensorboard dev upload --logdir ./logs \\\n", " --name \"Simple experiment with MNIST\" \\\n", @@ -220,9 +210,7 @@ "metadata": { "id": "C2Pj3RQCNQvP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!tensorboard dev list" ] @@ -261,9 +249,7 @@ "metadata": { "id": "VSkJTT9rNWJq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# You must replace YOUR_EXPERIMENT_ID with the value output from the previous\n", "# tensorboard `list` command or `upload` command. For example\n", @@ -275,9 +261,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "tbdev_getting_started.ipynb", "toc_visible": true }, diff --git a/site/ko/tensorboard/tensorboard_profiling_keras.ipynb b/site/ko/tensorboard/tensorboard_profiling_keras.ipynb index 06f179d66f..5d8c5ae35f 100644 --- a/site/ko/tensorboard/tensorboard_profiling_keras.ipynb +++ b/site/ko/tensorboard/tensorboard_profiling_keras.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "su2RaORHpReL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -75,9 +73,7 @@ "metadata": { "id": "cpS3QzrHkPia" }, - "outputs": [ - - ], + "outputs": [], "source": [ "from datetime import datetime\n", "from packaging import version\n", @@ -197,9 +193,7 @@ "metadata": { "id": "E9iGdPe8knMP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow_datasets as tfds\n", "tfds.disable_progress_bar()" @@ -257,9 +251,7 @@ "metadata": { "id": "ZI31gE_3ktiz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def normalize_img(image, label):\n", " \"\"\"Normalizes images: `uint8` -> `float32`.\"\"\"\n", @@ -275,9 +267,7 @@ "metadata": { "id": "2vjIX9O8k0fx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ds_test = ds_test.map(normalize_img)\n", "ds_test = ds_test.batch(128)" @@ -298,9 +288,7 @@ "metadata": { "id": "QabMuRcWk2qr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = tf.keras.models.Sequential([\n", " tf.keras.layers.Flatten(input_shape=(28, 28, 1)),\n", @@ -366,9 +354,7 @@ }, "execution_count": 11, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -404,9 +390,7 @@ "metadata": { "id": "jqx5wF1Vlwe9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Load the TensorBoard notebook extension.\n", "%load_ext tensorboard" @@ -704,9 +688,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -791,9 +773,7 @@ "metadata": { "id": "m5JRkpRLk1Gn" }, - "outputs": [ - - ], + "outputs": [], "source": [ "(ds_train, ds_test), ds_info = tfds.load(\n", " 'mnist',\n", @@ -810,9 +790,7 @@ "metadata": { "id": "ZWYYeN-aSP4K" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ds_train = ds_train.map(normalize_img)\n", "ds_train = ds_train.batch(128)\n", @@ -826,9 +804,7 @@ "metadata": { "id": "9CmH9HkTlF3e" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ds_test = ds_test.map(normalize_img)\n", "ds_test = ds_test.batch(128)\n", @@ -870,9 +846,7 @@ }, "execution_count": 17, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "execute_result" } @@ -1148,9 +1122,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" }, @@ -1174,9 +1146,7 @@ ] }, "metadata": { - "tags": [ - - ] + "tags": [] }, "output_type": "display_data" } @@ -1229,9 +1199,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "tensorboard_profiling_keras.ipynb", "toc_visible": true }, diff --git a/site/ko/tensorboard/text_summaries.ipynb b/site/ko/tensorboard/text_summaries.ipynb index c0396fadbd..7510b997a9 100644 --- a/site/ko/tensorboard/text_summaries.ipynb +++ b/site/ko/tensorboard/text_summaries.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "su2RaORHpReL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -44,10 +42,10 @@ "\n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", "
TensorFlow.org에서 보기\n", " Google Colab에서 실행하기\n", + " Google Colab에서 실행하기\n", "GitHub에서 소스 보기노트북 다운로드GitHub에서 소스 보기노트북 다운로드
" ] }, @@ -79,9 +77,7 @@ "metadata": { "id": "3U5gdCw_nSG3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "try:\n", " # %tensorflow_version only exists in Colab.\n", @@ -138,9 +134,7 @@ "metadata": { "id": "FxMPcdmvBn9t" }, - "outputs": [ - - ], + "outputs": [], "source": [ "my_text = \"Hello world! 😃\"" ] @@ -151,9 +145,7 @@ "metadata": { "id": "IJNpyVyxbVtT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Clear out any prior log data.\n", "!rm -rf logs\n", @@ -183,9 +175,7 @@ "metadata": { "id": "T_X-wIy-lD9f" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%tensorboard --logdir logs" ] @@ -218,9 +208,7 @@ "metadata": { "id": "dda6960f0119" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Sets up a second directory to not overwrite the first one.\n", "logdir = \"logs/multiple_texts/\" + datetime.now().strftime(\"%Y%m%d-%H%M%S\")\n", @@ -244,9 +232,7 @@ "metadata": { "id": "515199f4b547" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%tensorboard --logdir logs/multiple_texts --samples_per_plugin 'text=5'" ] @@ -268,9 +254,7 @@ "metadata": { "id": "iHUjCXbetIpb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Sets up a third timestamped log directory under \"logs\"\n", "logdir = \"logs/markdown/\" + datetime.now().strftime(\"%Y%m%d-%H%M%S\")\n", @@ -325,9 +309,7 @@ "metadata": { "id": "57082d8d6839" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%tensorboard --logdir logs/markdown" ] @@ -335,9 +317,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "text_summaries.ipynb", "toc_visible": true }, diff --git a/site/ko/tfx/tutorials/data_validation/tfdv_basic.ipynb b/site/ko/tfx/tutorials/data_validation/tfdv_basic.ipynb index d0d21d74b2..051288405c 100644 --- a/site/ko/tfx/tutorials/data_validation/tfdv_basic.ipynb +++ b/site/ko/tfx/tutorials/data_validation/tfdv_basic.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "rSGJWC5biBiG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -54,9 +52,9 @@ "\n", "" ] }, @@ -147,9 +145,7 @@ "metadata": { "id": "b0ISmRq3nY3-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "try:\n", " import colab\n", @@ -175,9 +171,7 @@ "metadata": { "id": "hPJsE5Gkdp8m" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print('Installing TensorFlow Data Validation')\n", "!pip install --upgrade 'tensorflow_data_validation[visualization]<2'" @@ -202,9 +196,7 @@ "metadata": { "id": "E2j9VD9HbGWw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import pkg_resources\n", "import importlib\n", @@ -226,9 +218,7 @@ "metadata": { "id": "F5rPatTDSCHB" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "import tensorflow_data_validation as tfdv\n", @@ -253,9 +243,7 @@ "metadata": { "id": "x5gfFiTeDa6Y" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import os\n", "import tempfile, urllib, zipfile\n", @@ -298,9 +286,7 @@ "metadata": { "id": "EE481oMbT-H0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_stats = tfdv.generate_statistics_from_csv(data_location=TRAIN_DATA)" ] @@ -328,9 +314,7 @@ "metadata": { "id": "U3tUKgh7Up3x" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# docs-infra: no-execute\n", "tfdv.visualize_statistics(train_stats)" @@ -364,9 +348,7 @@ "metadata": { "id": "6LLkRJThVr9m" }, - "outputs": [ - - ], + "outputs": [], "source": [ "schema = tfdv.infer_schema(statistics=train_stats)\n", "tfdv.display_schema(schema=schema)" @@ -396,9 +378,7 @@ "metadata": { "id": "j_P0RLYlV6XG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Compute stats for evaluation data\n", "eval_stats = tfdv.generate_statistics_from_csv(data_location=EVAL_DATA)" @@ -410,9 +390,7 @@ "metadata": { "id": "Qn-3fQWJLimn" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# docs-infra: no-execute\n", "# Compare evaluation data with training data\n", @@ -448,9 +426,7 @@ "metadata": { "id": "T7uGVeL2WOam" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Check eval data for errors by validating the eval data stats using the previously inferred schema.\n", "anomalies = tfdv.validate_statistics(statistics=eval_stats, schema=schema)\n", @@ -480,9 +456,7 @@ "metadata": { "id": "legN2nXLWZAc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Relax the minimum fraction of values that must come from the domain for feature company.\n", "company = tfdv.get_feature(schema, 'company')\n", @@ -534,9 +508,7 @@ "metadata": { "id": "wSZfbnifJuTA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "serving_stats = tfdv.generate_statistics_from_csv(SERVING_DATA)\n", "serving_anomalies = tfdv.validate_statistics(serving_stats, schema)\n", @@ -561,9 +533,7 @@ "metadata": { "id": "OhtYF8aAczpd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "options = tfdv.StatsOptions(schema=schema, infer_type_from_schema=True)\n", "serving_stats = tfdv.generate_statistics_from_csv(SERVING_DATA, stats_options=options)\n", @@ -587,9 +557,7 @@ "metadata": { "id": "bnbnw8H6Lp2M" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# All features are by default in both TRAINING and SERVING environments.\n", "schema.default_environment.append('TRAINING')\n", @@ -658,9 +626,7 @@ "metadata": { "id": "wEUsZm_rOd1Q" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Add skew comparator for 'payment_type' feature.\n", "payment_type = tfdv.get_feature(schema, 'payment_type')\n", @@ -703,9 +669,7 @@ "metadata": { "id": "ydkL4DkIWn18" }, - "outputs": [ - - ], + "outputs": [], "source": [ "from tensorflow.python.lib.io import file_io\n", "from google.protobuf import text_format\n", diff --git a/site/ko/tfx/tutorials/serving/rest_simple.ipynb b/site/ko/tfx/tutorials/serving/rest_simple.ipynb index 1c203d5e66..ebe5397066 100644 --- a/site/ko/tfx/tutorials/serving/rest_simple.ipynb +++ b/site/ko/tfx/tutorials/serving/rest_simple.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "_ckMIh7O7s6D" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -79,9 +77,7 @@ "metadata": { "id": "FWkuJabJSKGB" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import sys\n", "\n", @@ -95,9 +91,7 @@ "metadata": { "id": "dzLKpmZICaWN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# TensorFlow and tf.keras\n", "print(\"Installing dependencies for Colab environment\")\n", @@ -150,9 +144,7 @@ "metadata": { "id": "7MqDQO0KCaWS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "fashion_mnist = keras.datasets.fashion_mnist\n", "(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()\n", @@ -189,9 +181,7 @@ "metadata": { "id": "LTNN0ANGgA36" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = keras.Sequential([\n", " keras.layers.Conv2D(input_shape=(28,28,1), filters=8, kernel_size=3, \n", @@ -230,9 +220,7 @@ "metadata": { "id": "0w5Rq8SsgWE6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Fetch the Keras session and save the model\n", "# The signature definition is defined by the input and output tensors,\n", @@ -275,9 +263,7 @@ "metadata": { "id": "LU4GDF_aYtfQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!saved_model_cli show --dir {export_path} --all" ] @@ -314,9 +300,7 @@ "metadata": { "id": "v2hF_ChoOrEd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import sys\n", "# We need sudo prefix if not on a Google Colab.\n", @@ -332,9 +316,7 @@ "metadata": { "id": "EWg9X2QHlbGS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# This is the same as you would do from your command line, but without the [arch=amd64], and no sudo\n", "# You would instead do:\n", @@ -363,9 +345,7 @@ "metadata": { "id": "ygwa9AgRloYy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# TODO: Use the latest model server version when colab supports it.\n", "#!{SUDO_IF_NEEDED} apt-get install tensorflow-model-server\n", @@ -397,9 +377,7 @@ "metadata": { "id": "aUgp3vUdU5GS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "os.environ[\"MODEL_DIR\"] = MODEL_DIR" ] @@ -410,9 +388,7 @@ "metadata": { "id": "kJDhHNJVnaLN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%bash --bg \n", "nohup tensorflow_model_server \\\n", @@ -427,9 +403,7 @@ "metadata": { "id": "IxbeiOCUUs2z" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!tail server.log" ] @@ -451,9 +425,7 @@ "metadata": { "id": "Luqm_Jyff9iR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def show(idx, title):\n", " plt.figure()\n", @@ -481,9 +453,7 @@ "metadata": { "id": "2dsD7KQG1m-R" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import json\n", "data = json.dumps({\"signature_name\": \"serving_default\", \"instances\": test_images[0:3].tolist()})\n", @@ -516,9 +486,7 @@ "metadata": { "id": "vGvFyuIzW6n6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# docs_infra: no_execute\n", "!pip install -q requests\n", @@ -549,9 +517,7 @@ "metadata": { "id": "zRftRxeR1tZx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# docs_infra: no_execute\n", "headers = {\"content-type\": \"application/json\"}\n", @@ -567,9 +533,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "rest_simple.ipynb", "toc_visible": true }, diff --git a/site/ko/tfx/tutorials/tfx/components.ipynb b/site/ko/tfx/tutorials/tfx/components.ipynb index abd6ca5df3..dfc6b3a636 100644 --- a/site/ko/tfx/tutorials/tfx/components.ipynb +++ b/site/ko/tfx/tutorials/tfx/components.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "c2jyGuiG1gHr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -133,9 +131,7 @@ "metadata": { "id": "tFhBChv4J_PD" }, - "outputs": [ - - ], + "outputs": [], "source": [ "try:\n", " import colab\n", @@ -161,9 +157,7 @@ "metadata": { "id": "S4SQA7Q5nej3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install tfx" ] @@ -185,9 +179,7 @@ "metadata": { "id": "Y8hwtlmbktkV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip uninstall shapely -y" ] @@ -220,9 +212,7 @@ "metadata": { "id": "YIqpWK9efviJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import os\n", "import pprint\n", @@ -256,9 +246,7 @@ "metadata": { "id": "eZ4K18_DN2D8" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print('TensorFlow version: {}'.format(tf.__version__))\n", "print('TFX version: {}'.format(tfx.__version__))" @@ -279,9 +267,7 @@ "metadata": { "id": "ad5JLpKbf6sN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# This is the root directory for your TFX pip package installation.\n", "_tfx_root = tfx.__path__[0]\n", @@ -351,9 +337,7 @@ "metadata": { "id": "BywX6OUEhAqn" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_data_root = tempfile.mkdtemp(prefix='tfx-data')\n", "DATA_PATH = 'https://raw.githubusercontent.com/tensorflow/tfx/master/tfx/examples/chicago_taxi_pipeline/data/simple/data.csv'\n", @@ -376,9 +360,7 @@ "metadata": { "id": "c5YPeLPFOXaD" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!head {_data_filepath}" ] @@ -409,9 +391,7 @@ "metadata": { "id": "0Rh6K5sUf9dd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Here, we create an InteractiveContext using default parameters. This will\n", "# use a temporary directory with an ephemeral ML Metadata database instance.\n", @@ -458,9 +438,7 @@ "metadata": { "id": "PyXjuMt8f-9u" }, - "outputs": [ - - ], + "outputs": [], "source": [ "example_gen = tfx.components.CsvExampleGen(input_base=_data_root)\n", "context.run(example_gen)" @@ -481,9 +459,7 @@ "metadata": { "id": "880KkTAkPeUg" }, - "outputs": [ - - ], + "outputs": [], "source": [ "artifact = example_gen.outputs['examples'].get()[0]\n", "print(artifact.split_names, artifact.uri)" @@ -504,9 +480,7 @@ "metadata": { "id": "H4XIXjiCPwzQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Get the URI of the output artifact representing the training examples, which is a directory\n", "train_uri = os.path.join(example_gen.outputs['examples'].get()[0].uri, 'Split-train')\n", @@ -554,9 +528,7 @@ "metadata": { "id": "MAscCCYWgA-9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "statistics_gen = tfx.components.StatisticsGen(examples=example_gen.outputs['examples'])\n", "context.run(statistics_gen)" @@ -577,9 +549,7 @@ "metadata": { "id": "tLjXy7K6Tp_G" }, - "outputs": [ - - ], + "outputs": [], "source": [ "context.show(statistics_gen.outputs['statistics'])" ] @@ -603,9 +573,7 @@ "metadata": { "id": "ygQvZ6hsiQ_J" }, - "outputs": [ - - ], + "outputs": [], "source": [ "schema_gen = tfx.components.SchemaGen(\n", " statistics=statistics_gen.outputs['statistics'],\n", @@ -628,9 +596,7 @@ "metadata": { "id": "Ec9vqDXpXeMb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "context.show(schema_gen.outputs['schema'])" ] @@ -665,9 +631,7 @@ "metadata": { "id": "XRlRUuGgiXks" }, - "outputs": [ - - ], + "outputs": [], "source": [ "example_validator = tfx.components.ExampleValidator(\n", " statistics=statistics_gen.outputs['statistics'],\n", @@ -690,9 +654,7 @@ "metadata": { "id": "TDyAAozQcrk3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "context.show(example_validator.outputs['anomalies'])" ] @@ -729,9 +691,7 @@ "metadata": { "id": "PuNSiUKb4YJf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_taxi_constants_module_file = 'taxi_constants.py'" ] @@ -742,9 +702,7 @@ "metadata": { "id": "HPjhXuIF4YJh" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%writefile {_taxi_constants_module_file}\n", "\n", @@ -798,9 +756,7 @@ "metadata": { "id": "4AJ9hBs94YJm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_taxi_transform_module_file = 'taxi_transform.py'" ] @@ -811,9 +767,7 @@ "metadata": { "id": "MYmxxx9A4YJn" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%writefile {_taxi_transform_module_file}\n", "\n", @@ -908,9 +862,7 @@ "metadata": { "id": "jHfhth_GiZI9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "transform = tfx.components.Transform(\n", " examples=example_gen.outputs['examples'],\n", @@ -937,9 +889,7 @@ "metadata": { "id": "SClrAaEGR1O5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "transform.outputs" ] @@ -959,9 +909,7 @@ "metadata": { "id": "5tRw4DneR3i7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_uri = transform.outputs['transform_graph'].get()[0].uri\n", "os.listdir(train_uri)" @@ -984,9 +932,7 @@ "metadata": { "id": "pwbW2zPKR_S4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Get the URI of the output artifact representing the transformed examples, which is a directory\n", "train_uri = os.path.join(transform.outputs['transformed_examples'].get()[0].uri, 'Split-train')\n", @@ -1036,9 +982,7 @@ "metadata": { "id": "N1376oq04YJt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_taxi_trainer_module_file = 'taxi_trainer.py'" ] @@ -1049,9 +993,7 @@ "metadata": { "id": "nf9UuNng4YJu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%writefile {_taxi_trainer_module_file}\n", "\n", @@ -1296,9 +1238,7 @@ "metadata": { "id": "429-vvCWibO0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "from tfx.components.trainer.executor import Executor\n", "from tfx.dsl.components.base import executor_spec\n", @@ -1331,9 +1271,7 @@ "metadata": { "id": "bXe62WE0S0Ek" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Get the URI of the output artifact representing the training logs, which is a directory\n", "model_run_dir = trainer.outputs['model_run'].get()[0].uri\n", @@ -1361,9 +1299,7 @@ "metadata": { "id": "fVhfzzh9PDEx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "eval_config = tfma.EvalConfig(\n", " model_specs=[\n", @@ -1420,9 +1356,7 @@ "metadata": { "id": "Zjcx8g6mihSt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Use TFMA to compute a evaluation statistics over features of a model and\n", "# validate them against a baseline.\n", @@ -1461,9 +1395,7 @@ "metadata": { "id": "k4GghePOTJxL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "evaluator.outputs" ] @@ -1483,9 +1415,7 @@ "metadata": { "id": "U729j5X5QQUQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "context.show(evaluator.outputs['evaluation'])" ] @@ -1505,9 +1435,7 @@ "metadata": { "id": "pyis6iy0HLdi" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow_model_analysis as tfma\n", "\n", @@ -1546,9 +1474,7 @@ "metadata": { "id": "FZmiRtg6TKtR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "blessing_uri = evaluator.outputs['blessing'].get()[0].uri\n", "!ls -l {blessing_uri}" @@ -1569,9 +1495,7 @@ "metadata": { "id": "lxa5G08bSJ8a" }, - "outputs": [ - - ], + "outputs": [], "source": [ "PATH_TO_RESULT = evaluator.outputs['evaluation'].get()[0].uri\n", "print(tfma.load_validation_result(PATH_TO_RESULT))" @@ -1594,9 +1518,7 @@ "metadata": { "id": "r45nQ69eikc9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "pusher = tfx.components.Pusher(\n", " model=trainer.outputs['model'],\n", @@ -1622,9 +1544,7 @@ "metadata": { "id": "pRkWo-MzTSss" }, - "outputs": [ - - ], + "outputs": [], "source": [ "pusher.outputs" ] @@ -1644,9 +1564,7 @@ "metadata": { "id": "4zyIqWl9TSdG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "push_uri = pusher.outputs['pushed_model'].get()[0].uri\n", "model = tf.saved_model.load(push_uri)\n", diff --git a/site/ko/tfx/tutorials/tfx/components_keras.ipynb b/site/ko/tfx/tutorials/tfx/components_keras.ipynb index 3f26458e07..550c6cd3b9 100644 --- a/site/ko/tfx/tutorials/tfx/components_keras.ipynb +++ b/site/ko/tfx/tutorials/tfx/components_keras.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "c2jyGuiG1gHr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -124,9 +122,7 @@ "metadata": { "id": "as4OTe2ukSqm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import sys\n", "if 'google.colab' in sys.modules:\n", @@ -150,9 +146,7 @@ "metadata": { "id": "S4SQA7Q5nej3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install tfx" ] @@ -174,9 +168,7 @@ "metadata": { "id": "7kp0dFH9kgza" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip uninstall shapely -y" ] @@ -209,9 +201,7 @@ "metadata": { "id": "YIqpWK9efviJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import os\n", "import pprint\n", @@ -245,9 +235,7 @@ "metadata": { "id": "eZ4K18_DN2D8" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print('TensorFlow version: {}'.format(tf.__version__))\n", "print('TFX version: {}'.format(tfx.__version__))" @@ -268,9 +256,7 @@ "metadata": { "id": "ad5JLpKbf6sN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# This is the root directory for your TFX pip package installation.\n", "_tfx_root = tfx.__path__[0]\n", @@ -340,9 +326,7 @@ "metadata": { "id": "BywX6OUEhAqn" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_data_root = tempfile.mkdtemp(prefix='tfx-data')\n", "DATA_PATH = 'https://raw.githubusercontent.com/tensorflow/tfx/master/tfx/examples/chicago_taxi_pipeline/data/simple/data.csv'\n", @@ -365,9 +349,7 @@ "metadata": { "id": "c5YPeLPFOXaD" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!head {_data_filepath}" ] @@ -398,9 +380,7 @@ "metadata": { "id": "0Rh6K5sUf9dd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Here, we create an InteractiveContext using default parameters. This will\n", "# use a temporary directory with an ephemeral ML Metadata database instance.\n", @@ -451,9 +431,7 @@ "metadata": { "id": "PyXjuMt8f-9u" }, - "outputs": [ - - ], + "outputs": [], "source": [ "example_gen = tfx.components.CsvExampleGen(input_base=_data_root)\n", "context.run(example_gen, enable_cache=True)" @@ -474,9 +452,7 @@ "metadata": { "id": "880KkTAkPeUg" }, - "outputs": [ - - ], + "outputs": [], "source": [ "artifact = example_gen.outputs['examples'].get()[0]\n", "print(artifact.split_names, artifact.uri)" @@ -497,9 +473,7 @@ "metadata": { "id": "H4XIXjiCPwzQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Get the URI of the output artifact representing the training examples, which is a directory\n", "train_uri = os.path.join(example_gen.outputs['examples'].get()[0].uri, 'Split-train')\n", @@ -547,9 +521,7 @@ "metadata": { "id": "MAscCCYWgA-9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "statistics_gen = tfx.components.StatisticsGen(\n", " examples=example_gen.outputs['examples'])\n", @@ -571,9 +543,7 @@ "metadata": { "id": "tLjXy7K6Tp_G" }, - "outputs": [ - - ], + "outputs": [], "source": [ "context.show(statistics_gen.outputs['statistics'])" ] @@ -599,9 +569,7 @@ "metadata": { "id": "ygQvZ6hsiQ_J" }, - "outputs": [ - - ], + "outputs": [], "source": [ "schema_gen = tfx.components.SchemaGen(\n", " statistics=statistics_gen.outputs['statistics'],\n", @@ -624,9 +592,7 @@ "metadata": { "id": "Ec9vqDXpXeMb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "context.show(schema_gen.outputs['schema'])" ] @@ -661,9 +627,7 @@ "metadata": { "id": "XRlRUuGgiXks" }, - "outputs": [ - - ], + "outputs": [], "source": [ "example_validator = tfx.components.ExampleValidator(\n", " statistics=statistics_gen.outputs['statistics'],\n", @@ -686,9 +650,7 @@ "metadata": { "id": "TDyAAozQcrk3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "context.show(example_validator.outputs['anomalies'])" ] @@ -725,9 +687,7 @@ "metadata": { "id": "PuNSiUKb4YJf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_taxi_constants_module_file = 'taxi_constants.py'" ] @@ -738,9 +698,7 @@ "metadata": { "id": "HPjhXuIF4YJh" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%writefile {_taxi_constants_module_file}\n", "\n", @@ -801,9 +759,7 @@ "metadata": { "id": "4AJ9hBs94YJm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_taxi_transform_module_file = 'taxi_transform.py'" ] @@ -814,9 +770,7 @@ "metadata": { "id": "MYmxxx9A4YJn" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%writefile {_taxi_transform_module_file}\n", "\n", @@ -939,9 +893,7 @@ "metadata": { "id": "jHfhth_GiZI9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "transform = tfx.components.Transform(\n", " examples=example_gen.outputs['examples'],\n", @@ -968,9 +920,7 @@ "metadata": { "id": "SClrAaEGR1O5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "transform.outputs" ] @@ -990,9 +940,7 @@ "metadata": { "id": "5tRw4DneR3i7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_uri = transform.outputs['transform_graph'].get()[0].uri\n", "os.listdir(train_uri)" @@ -1015,9 +963,7 @@ "metadata": { "id": "pwbW2zPKR_S4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Get the URI of the output artifact representing the transformed examples, which is a directory\n", "train_uri = os.path.join(transform.outputs['transformed_examples'].get()[0].uri, 'Split-train')\n", @@ -1067,9 +1013,7 @@ "metadata": { "id": "N1376oq04YJt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_taxi_trainer_module_file = 'taxi_trainer.py'" ] @@ -1080,9 +1024,7 @@ "metadata": { "id": "nf9UuNng4YJu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%writefile {_taxi_trainer_module_file}\n", "\n", @@ -1291,9 +1233,7 @@ "metadata": { "id": "429-vvCWibO0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "trainer = tfx.components.Trainer(\n", " module_file=os.path.abspath(_taxi_trainer_module_file),\n", @@ -1322,9 +1262,7 @@ "metadata": { "id": "bXe62WE0S0Ek" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model_artifact_dir = trainer.outputs['model'].get()[0].uri\n", "pp.pprint(os.listdir(model_artifact_dir))\n", @@ -1347,9 +1285,7 @@ "metadata": { "id": "-APzqz2NeAyj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model_run_artifact_dir = trainer.outputs['model_run'].get()[0].uri\n", "\n", @@ -1376,9 +1312,7 @@ "metadata": { "id": "fVhfzzh9PDEx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Imported files such as taxi_constants are normally cached, so changes are\n", "# not honored after the first import. Normally this is good for efficiency, but\n", @@ -1449,9 +1383,7 @@ "metadata": { "id": "Zjcx8g6mihSt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Use TFMA to compute a evaluation statistics over features of a model and\n", "# validate them against a baseline.\n", @@ -1491,9 +1423,7 @@ "metadata": { "id": "k4GghePOTJxL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "evaluator.outputs" ] @@ -1513,9 +1443,7 @@ "metadata": { "id": "U729j5X5QQUQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "context.show(evaluator.outputs['evaluation'])" ] @@ -1535,9 +1463,7 @@ "metadata": { "id": "pyis6iy0HLdi" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow_model_analysis as tfma\n", "\n", @@ -1576,9 +1502,7 @@ "metadata": { "id": "FZmiRtg6TKtR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "blessing_uri = evaluator.outputs['blessing'].get()[0].uri\n", "!ls -l {blessing_uri}" @@ -1599,9 +1523,7 @@ "metadata": { "id": "lxa5G08bSJ8a" }, - "outputs": [ - - ], + "outputs": [], "source": [ "PATH_TO_RESULT = evaluator.outputs['evaluation'].get()[0].uri\n", "print(tfma.load_validation_result(PATH_TO_RESULT))" @@ -1624,9 +1546,7 @@ "metadata": { "id": "r45nQ69eikc9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "pusher = tfx.components.Pusher(\n", " model=trainer.outputs['model'],\n", @@ -1652,9 +1572,7 @@ "metadata": { "id": "pRkWo-MzTSss" }, - "outputs": [ - - ], + "outputs": [], "source": [ "pusher.outputs" ] @@ -1674,9 +1592,7 @@ "metadata": { "id": "4zyIqWl9TSdG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "push_uri = pusher.outputs['pushed_model'].get()[0].uri\n", "model = tf.saved_model.load(push_uri)\n", diff --git a/site/ko/tfx/tutorials/tfx/gcp/vertex_pipelines_bq.ipynb b/site/ko/tfx/tutorials/tfx/gcp/vertex_pipelines_bq.ipynb index b49dc94b8b..b5f4f5ab6f 100644 --- a/site/ko/tfx/tutorials/tfx/gcp/vertex_pipelines_bq.ipynb +++ b/site/ko/tfx/tutorials/tfx/gcp/vertex_pipelines_bq.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "SoFqANDE222Y" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -109,9 +107,7 @@ "metadata": { "id": "osJJdvmIrPgP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Use the latest version of pip.\n", "!pip install --upgrade pip\n", @@ -135,9 +131,7 @@ "metadata": { "id": "kOK-jepulVUU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip uninstall shapely -y" ] @@ -168,9 +162,7 @@ "metadata": { "id": "JYKpuhamrPgQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# docs_infra: no_execute\n", "import sys\n", @@ -198,9 +190,7 @@ "metadata": { "id": "FY8IqqnmrPgQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import sys\n", "if 'google.colab' in sys.modules:\n", @@ -238,9 +228,7 @@ "metadata": { "id": "mvZS3XW2rPgR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "print('TensorFlow version: {}'.format(tf.__version__))\n", @@ -273,9 +261,7 @@ "metadata": { "id": "EcUseqJaE2XN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "GOOGLE_CLOUD_PROJECT = '' # <--- ENTER THIS\n", "GOOGLE_CLOUD_PROJECT_NUMBER = '' # <--- ENTER THIS\n", @@ -302,9 +288,7 @@ "metadata": { "id": "VkWdxe4TXRHk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!gcloud config set project {GOOGLE_CLOUD_PROJECT}" ] @@ -315,9 +299,7 @@ "metadata": { "id": "CPN6UL5CazNy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "PIPELINE_NAME = 'penguin-bigquery'\n", "\n", @@ -354,9 +336,7 @@ "metadata": { "id": "4aii8K3dJEyj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!gcloud projects add-iam-policy-binding {GOOGLE_CLOUD_PROJECT} \\\n", " --member=serviceAccount:{GOOGLE_CLOUD_PROJECT_NUMBER}-compute@developer.gserviceaccount.com \\\n", @@ -402,9 +382,7 @@ "metadata": { "id": "Mb_Kj1U8pBhZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# docs_infra: no_execute\n", "%%bigquery --project {GOOGLE_CLOUD_PROJECT}\n", @@ -430,9 +408,7 @@ "metadata": { "id": "7AwysGAVnfJA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "QUERY = \"SELECT * FROM `tfx-oss-public.palmer_penguins.palmer_penguins`\"" ] @@ -454,9 +430,7 @@ "metadata": { "id": "aES7Hv5QTDK3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_trainer_module_file = 'penguin_trainer.py'" ] @@ -467,9 +441,7 @@ "metadata": { "id": "Gnc67uQNTDfW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%writefile {_trainer_module_file}\n", "\n", @@ -609,9 +581,7 @@ "metadata": { "id": "rMMs5wuNYAbc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!gsutil cp {_trainer_module_file} {MODULE_ROOT}/" ] @@ -633,9 +603,7 @@ "metadata": { "id": "M49yYVNBTPd4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "from typing import List, Optional\n", "\n", @@ -703,9 +671,7 @@ "metadata": { "id": "fAtfOZTYWJu-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# docs_infra: no_execute\n", "import os\n", @@ -747,9 +713,7 @@ "metadata": { "id": "tI71jlEvWMV7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# docs_infra: no_execute\n", "from google.cloud import aiplatform\n", diff --git a/site/ko/tfx/tutorials/tfx/gcp/vertex_pipelines_simple.ipynb b/site/ko/tfx/tutorials/tfx/gcp/vertex_pipelines_simple.ipynb index 4b30bb0a65..9d03a6d5b5 100644 --- a/site/ko/tfx/tutorials/tfx/gcp/vertex_pipelines_simple.ipynb +++ b/site/ko/tfx/tutorials/tfx/gcp/vertex_pipelines_simple.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "SoFqANDE222Y" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -111,9 +109,7 @@ "metadata": { "id": "iyQtljP-qPHY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Use the latest version of pip.\n", "!pip install --upgrade pip\n", @@ -137,9 +133,7 @@ "metadata": { "id": "lVkGjRNQkKFe" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip uninstall shapely -y" ] @@ -170,9 +164,7 @@ "metadata": { "id": "KHTSzMygoBF6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# docs_infra: no_execute\n", "import sys\n", @@ -200,9 +192,7 @@ "metadata": { "id": "kZQA0KrfXCvU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import sys\n", "if 'google.colab' in sys.modules:\n", @@ -240,9 +230,7 @@ "metadata": { "id": "Xd-iP9wEaENu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "print('TensorFlow version: {}'.format(tf.__version__))\n", @@ -275,9 +263,7 @@ "metadata": { "id": "EcUseqJaE2XN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "GOOGLE_CLOUD_PROJECT = '' # <--- ENTER THIS\n", "GOOGLE_CLOUD_REGION = '' # <--- ENTER THIS\n", @@ -303,9 +289,7 @@ "metadata": { "id": "VkWdxe4TXRHk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!gcloud config set project {GOOGLE_CLOUD_PROJECT}" ] @@ -316,9 +300,7 @@ "metadata": { "id": "CPN6UL5CazNy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "PIPELINE_NAME = 'penguin-vertex-pipelines'\n", "\n", @@ -368,9 +350,7 @@ "metadata": { "id": "4fxMs6u86acP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!gsutil cp gs://download.tensorflow.org/data/palmer_penguins/penguins_processed.csv {DATA_ROOT}/" ] @@ -390,9 +370,7 @@ "metadata": { "id": "-eSz28UDSnlG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!gsutil cat {DATA_ROOT}/penguins_processed.csv | head" ] @@ -429,9 +407,7 @@ "metadata": { "id": "aES7Hv5QTDK3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_trainer_module_file = 'penguin_trainer.py'" ] @@ -442,9 +418,7 @@ "metadata": { "id": "Gnc67uQNTDfW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%writefile {_trainer_module_file}\n", "\n", @@ -585,9 +559,7 @@ "metadata": { "id": "rMMs5wuNYAbc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!gsutil cp {_trainer_module_file} {MODULE_ROOT}/" ] @@ -609,9 +581,7 @@ "metadata": { "id": "M49yYVNBTPd4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Copied from https://www.tensorflow.org/tfx/tutorials/tfx/penguin_simple and\n", "# slightly modified because we don't need `metadata_path` argument.\n", @@ -676,9 +646,7 @@ "metadata": { "id": "fAtfOZTYWJu-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# docs_infra: no_execute\n", "import os\n", @@ -713,9 +681,7 @@ "metadata": { "id": "tI71jlEvWMV7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# docs_infra: no_execute\n", "from google.cloud import aiplatform\n", diff --git a/site/ko/tfx/tutorials/tfx/gcp/vertex_pipelines_vertex_training.ipynb b/site/ko/tfx/tutorials/tfx/gcp/vertex_pipelines_vertex_training.ipynb index 74837ab74a..304639890f 100644 --- a/site/ko/tfx/tutorials/tfx/gcp/vertex_pipelines_vertex_training.ipynb +++ b/site/ko/tfx/tutorials/tfx/gcp/vertex_pipelines_vertex_training.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "SoFqANDE222Y" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -111,9 +109,7 @@ "metadata": { "id": "iyQtljP-qPHY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Use the latest version of pip.\n", "!pip install --upgrade pip\n", @@ -137,9 +133,7 @@ "metadata": { "id": "wzBCmlXBiXgX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip uninstall shapely -y" ] @@ -170,9 +164,7 @@ "metadata": { "id": "KHTSzMygoBF6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# docs_infra: no_execute\n", "import sys\n", @@ -200,9 +192,7 @@ "metadata": { "id": "kZQA0KrfXCvU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import sys\n", "if 'google.colab' in sys.modules:\n", @@ -240,9 +230,7 @@ "metadata": { "id": "Xd-iP9wEaENu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "print('TensorFlow version: {}'.format(tf.__version__))\n", @@ -275,9 +263,7 @@ "metadata": { "id": "EcUseqJaE2XN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "GOOGLE_CLOUD_PROJECT = '' # <--- ENTER THIS\n", "GOOGLE_CLOUD_REGION = '' # <--- ENTER THIS\n", @@ -303,9 +289,7 @@ "metadata": { "id": "VkWdxe4TXRHk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!gcloud config set project {GOOGLE_CLOUD_PROJECT}" ] @@ -316,9 +300,7 @@ "metadata": { "id": "CPN6UL5CazNy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "PIPELINE_NAME = 'penguin-vertex-training'\n", "\n", @@ -365,9 +347,7 @@ "metadata": { "id": "4fxMs6u86acP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!gsutil cp gs://download.tensorflow.org/data/palmer_penguins/penguins_processed.csv {DATA_ROOT}/" ] @@ -387,9 +367,7 @@ "metadata": { "id": "-eSz28UDSnlG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!gsutil cat {DATA_ROOT}/penguins_processed.csv | head" ] @@ -430,9 +408,7 @@ "metadata": { "id": "aES7Hv5QTDK3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_trainer_module_file = 'penguin_trainer.py'" ] @@ -443,9 +419,7 @@ "metadata": { "id": "Gnc67uQNTDfW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%writefile {_trainer_module_file}\n", "\n", @@ -600,9 +574,7 @@ "metadata": { "id": "rMMs5wuNYAbc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!gsutil cp {_trainer_module_file} {MODULE_ROOT}/" ] @@ -628,9 +600,7 @@ "metadata": { "id": "M49yYVNBTPd4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def _create_pipeline(pipeline_name: str, pipeline_root: str, data_root: str,\n", " module_file: str, endpoint_name: str, project_id: str,\n", @@ -748,9 +718,7 @@ "metadata": { "id": "fAtfOZTYWJu-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# docs_infra: no_execute\n", "import os\n", @@ -788,9 +756,7 @@ "metadata": { "id": "tI71jlEvWMV7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# docs_infra: no_execute\n", "from google.cloud import aiplatform\n", @@ -833,9 +799,7 @@ "metadata": { "id": "51EWzkj8Wdly" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ENDPOINT_ID='' # <--- ENTER THIS\n", "if not ENDPOINT_ID:\n", @@ -860,9 +824,7 @@ "metadata": { "id": "Gdzxst2_OoXH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# docs_infra: no_execute\n", "import numpy as np\n", @@ -934,9 +896,7 @@ "metadata": { "id": "1TwX6bcsLo_g" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# docs_infra: no_execute\n", "runner.run(\n", diff --git a/site/ko/tfx/tutorials/tfx/neural_structured_learning.ipynb b/site/ko/tfx/tutorials/tfx/neural_structured_learning.ipynb index 91fd99b9ef..dd42f00320 100644 --- a/site/ko/tfx/tutorials/tfx/neural_structured_learning.ipynb +++ b/site/ko/tfx/tutorials/tfx/neural_structured_learning.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "ioaprt5q5US7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -111,9 +109,7 @@ "metadata": { "id": "-UmVrHUfkUA2" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import sys\n", "if 'google.colab' in sys.modules:\n", @@ -135,9 +131,7 @@ "metadata": { "id": "yDUe7gk_ztZ-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install -q \\\n", " tfx \\\n", @@ -172,9 +166,7 @@ "metadata": { "id": "2ew7HTbPpCJH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import apache_beam as beam\n", "import gzip as gzip_lib\n", @@ -271,9 +263,7 @@ "metadata": { "id": "__cZi2Ic48KL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_set, eval_set = tfds.load(\n", " \"imdb_reviews:1.0.0\",\n", @@ -296,9 +286,7 @@ "metadata": { "id": "LsnHde8T67Jz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for tfrecord in train_set.take(4):\n", " print(\"Review: {}\".format(tfrecord[\"text\"].numpy().decode(\"utf-8\")[:300]))\n", @@ -311,9 +299,7 @@ "metadata": { "id": "0wG7v3rk-Cwo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def _dict_to_example(instance):\n", " \"\"\"Decoded CSV to tf example.\"\"\"\n", @@ -364,9 +350,7 @@ "metadata": { "id": "4aVuXUil7hil" }, - "outputs": [ - - ], + "outputs": [], "source": [ "context = InteractiveContext()" ] @@ -390,9 +374,7 @@ "metadata": { "id": "WdH4ql3Y7pT4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "input_config = example_gen_pb2.Input(splits=[\n", " example_gen_pb2.Input.Split(name='train', pattern='train.tfrecord'),\n", @@ -410,9 +392,7 @@ "metadata": { "id": "IeUp6xCCrxsS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for artifact in example_gen.outputs['examples'].get():\n", " print(artifact)\n", @@ -452,9 +432,7 @@ "metadata": { "id": "XHCUzXA5qeWe" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def make_example_with_unique_id(example, id_feature_name):\n", " \"\"\"Adds a unique ID to the given `tf.train.Example` proto.\n", @@ -523,9 +501,7 @@ "metadata": { "id": "ZtLxNWHPO0je" }, - "outputs": [ - - ], + "outputs": [], "source": [ "identify_examples = IdentifyExamples(\n", " orig_examples=example_gen.outputs['examples'],\n", @@ -553,9 +529,7 @@ "metadata": { "id": "MAscCCYWgA-9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Computes statistics over data for visualization and example validation.\n", "statistics_gen = StatisticsGen(\n", @@ -582,9 +556,7 @@ "metadata": { "id": "ygQvZ6hsiQ_J" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Generates schema based on statistics files.\n", "schema_gen = SchemaGen(\n", @@ -607,9 +579,7 @@ "metadata": { "id": "L6-tgKi6A_gK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_uri = schema_gen.outputs['schema'].get()[0].uri\n", "schema_filename = os.path.join(train_uri, 'schema.pbtxt')\n", @@ -632,9 +602,7 @@ "metadata": { "id": "gycOsJIQFhi3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tfdv.display_schema(schema)" ] @@ -658,9 +626,7 @@ "metadata": { "id": "XRlRUuGgiXks" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Performs anomaly detection based on statistics and data schema.\n", "validate_stats = ExampleValidator(\n", @@ -722,9 +688,7 @@ "metadata": { "id": "2bAttbhgPa4V" }, - "outputs": [ - - ], + "outputs": [], "source": [ "swivel_url = 'https://tfhub.dev/google/tf2-preview/gnews-swivel-20dim/1'\n", "hub_layer = hub.KerasLayer(swivel_url, input_shape=[], dtype=tf.string)\n", @@ -795,9 +759,7 @@ "metadata": { "id": "ITkf2SLg1TG7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "\"\"\"Custom Artifact type\"\"\"\n", "\n", @@ -846,9 +808,7 @@ "metadata": { "id": "H0ZkHvJMA-0G" }, - "outputs": [ - - ], + "outputs": [], "source": [ "synthesize_graph = SynthesizeGraph(\n", " identified_examples=identify_examples.outputs['identified_examples'],\n", @@ -863,9 +823,7 @@ "metadata": { "id": "o54M-0Q11FcS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_uri = synthesize_graph.outputs[\"synthesized_graph\"].get()[0].uri\n", "os.listdir(train_uri)" @@ -877,9 +835,7 @@ "metadata": { "id": "IRK_rS_q1UcZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "graph_path = os.path.join(train_uri, \"Split-train\", \"graph.tsv\")\n", "print(\"node 1\\t\\t\\t\\t\\tnode 2\\t\\t\\t\\t\\tsimilarity\")\n", @@ -894,9 +850,7 @@ "metadata": { "id": "uybqyWztvCGm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!wc -l {graph_path}" ] @@ -942,9 +896,7 @@ "metadata": { "id": "7uuWiQbOG9ki" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_transform_module_file = 'imdb_transform.py'" ] @@ -955,9 +907,7 @@ "metadata": { "id": "v3EIuVQnBfH7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%writefile {_transform_module_file}\n", "\n", @@ -1039,9 +989,7 @@ "metadata": { "id": "jHfhth_GiZI9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Performs transformations and feature engineering in training and serving.\n", "transform = Transform(\n", @@ -1069,9 +1017,7 @@ "metadata": { "id": "j4UjersvAC7p" }, - "outputs": [ - - ], + "outputs": [], "source": [ "transform.outputs" ] @@ -1091,9 +1037,7 @@ "metadata": { "id": "E4I-cqfQQvaW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_uri = transform.outputs['transform_graph'].get()[0].uri\n", "os.listdir(train_uri)" @@ -1116,9 +1060,7 @@ "metadata": { "id": "-QPONyzDTswf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def pprint_examples(artifact, n_examples=3):\n", " print(\"artifact:\", artifact)\n", @@ -1139,9 +1081,7 @@ "metadata": { "id": "2zIepQhSQoPa" }, - "outputs": [ - - ], + "outputs": [], "source": [ "pprint_examples(transform.outputs['transformed_examples'].get()[0])" ] @@ -1165,9 +1105,7 @@ "metadata": { "id": "gI6P_-AXGm04" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def split_train_and_unsup(input_uri):\n", " 'Separate the labeled and unlabeled instances.'\n", @@ -1258,9 +1196,7 @@ "metadata": { "id": "r9MIEVDiOANe" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Augments training data with graph neighbors.\n", "graph_augmentation = GraphAugmentation(\n", @@ -1277,9 +1213,7 @@ "metadata": { "id": "gpSLs3Hx8viI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "pprint_examples(graph_augmentation.outputs['augmented_examples'].get()[0], 6)" ] @@ -1303,9 +1237,7 @@ "metadata": { "id": "5ajvClE6b2pd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Setup paths.\n", "_trainer_module_file = 'imdb_trainer.py'" @@ -1317,9 +1249,7 @@ "metadata": { "id": "_dh6AejVk2Oq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%writefile {_trainer_module_file}\n", "\n", @@ -1800,9 +1730,7 @@ "metadata": { "id": "MWLQI6t0b2pg" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Uses user-provided Python function that implements a model using TensorFlow's\n", "# Estimators API.\n", @@ -1833,9 +1761,7 @@ "metadata": { "id": "qDBZG9Oso-BD" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_uri = trainer.outputs['model'].get()[0].uri\n", "serving_model_path = os.path.join(train_uri, 'Format-Serving')\n", @@ -1848,9 +1774,7 @@ "metadata": { "id": "KyT3ZVGCZWsj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "exported_model.graph.get_operations()[:10] + [\"...\"]" ] @@ -1870,9 +1794,7 @@ "metadata": { "id": "rnKeqLmcGqHH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#docs_infra: no_execute\n", "\n", diff --git a/site/ko/tfx/tutorials/tfx/penguin_simple.ipynb b/site/ko/tfx/tutorials/tfx/penguin_simple.ipynb index b9e0985769..2dc157cb11 100644 --- a/site/ko/tfx/tutorials/tfx/penguin_simple.ipynb +++ b/site/ko/tfx/tutorials/tfx/penguin_simple.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "SpNWyqewk8fE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -92,9 +90,7 @@ "metadata": { "id": "as4OTe2ukSqm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "try:\n", " import colab\n", @@ -118,9 +114,7 @@ "metadata": { "id": "iyQtljP-qPHY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install -U tfx" ] @@ -142,9 +136,7 @@ "metadata": { "id": "mYn4k-r-k3qN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip uninstall shapely -y" ] @@ -175,9 +167,7 @@ "metadata": { "id": "6jh7vKSRqPHb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "print('TensorFlow version: {}'.format(tf.__version__))\n", @@ -202,9 +192,7 @@ "metadata": { "id": "EcUseqJaE2XN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import os\n", "\n", @@ -256,9 +244,7 @@ "metadata": { "id": "4fxMs6u86acP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import urllib.request\n", "import tempfile\n", @@ -284,9 +270,7 @@ "metadata": { "id": "-eSz28UDSnlG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!head {_data_filepath}" ] @@ -336,9 +320,7 @@ "metadata": { "id": "aES7Hv5QTDK3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_trainer_module_file = 'penguin_trainer.py'" ] @@ -349,9 +331,7 @@ "metadata": { "id": "Gnc67uQNTDfW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%writefile {_trainer_module_file}\n", "\n", @@ -497,9 +477,7 @@ "metadata": { "id": "M49yYVNBTPd4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def _create_pipeline(pipeline_name: str, pipeline_root: str, data_root: str,\n", " module_file: str, serving_model_dir: str,\n", @@ -569,9 +547,7 @@ "metadata": { "id": "fAtfOZTYWJu-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tfx.orchestration.LocalDagRunner().run(\n", " _create_pipeline(\n", @@ -600,9 +576,7 @@ "metadata": { "id": "NTHROkqX6yHx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# List files in created model directory.\n", "!find {SERVING_MODEL_DIR}" diff --git a/site/ko/tfx/tutorials/tfx/penguin_tfdv.ipynb b/site/ko/tfx/tutorials/tfx/penguin_tfdv.ipynb index 516177435f..36af04215d 100644 --- a/site/ko/tfx/tutorials/tfx/penguin_tfdv.ipynb +++ b/site/ko/tfx/tutorials/tfx/penguin_tfdv.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "SpNWyqewk8fE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -104,9 +102,7 @@ "metadata": { "id": "as4OTe2ukSqm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "try:\n", " import colab\n", @@ -130,9 +126,7 @@ "metadata": { "id": "iyQtljP-qPHY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install -U tfx" ] @@ -154,9 +148,7 @@ "metadata": { "id": "6NxAIvvg_V-8" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip uninstall shapely -y" ] @@ -187,9 +179,7 @@ "metadata": { "id": "6jh7vKSRqPHb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "print('TensorFlow version: {}'.format(tf.__version__))\n", @@ -214,9 +204,7 @@ "metadata": { "id": "EcUseqJaE2XN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import os\n", "\n", @@ -274,9 +262,7 @@ "metadata": { "id": "ZSfs6qFgdzO1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import urllib.request\n", "import tempfile\n", @@ -302,9 +288,7 @@ "metadata": { "id": "nLn9ith2dzO1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!head {_data_filepath}" ] @@ -353,9 +337,7 @@ "metadata": { "id": "GfQ6FAk9gxJ2" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def _create_schema_pipeline(pipeline_name: str,\n", " pipeline_root: str,\n", @@ -404,9 +386,7 @@ "metadata": { "id": "BQspf0ajg9AO" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tfx.orchestration.LocalDagRunner().run(\n", " _create_schema_pipeline(\n", @@ -453,9 +433,7 @@ "metadata": { "id": "K0i_jTvOI8mv" }, - "outputs": [ - - ], + "outputs": [], "source": [ "from ml_metadata.proto import metadata_store_pb2\n", "# Non-public APIs, just for showcase.\n", @@ -502,9 +480,7 @@ "metadata": { "id": "hRKSjXzsiqh0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Non-public APIs, just for showcase.\n", "from tfx.orchestration.metadata import Metadata\n", @@ -550,9 +526,7 @@ "metadata": { "id": "3StnKm04iqh-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# docs-infra: no-execute\n", "visualize_artifacts(stats_artifacts)" @@ -592,9 +566,7 @@ "metadata": { "id": "MVmlot5ziqh_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "visualize_artifacts(schema_artifacts)" ] @@ -625,9 +597,7 @@ "metadata": { "id": "0Pyi0oaKmRTg" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import shutil\n", "\n", @@ -656,9 +626,7 @@ "metadata": { "id": "uwHO7-HfnlWs" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(f'Schema at {SCHEMA_PATH}-----')\n", "!cat {SCHEMA_PATH}/*" @@ -705,9 +673,7 @@ "metadata": { "id": "aES7Hv5QTDK3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_trainer_module_file = 'penguin_trainer.py'" ] @@ -718,9 +684,7 @@ "metadata": { "id": "Gnc67uQNTDfW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%writefile {_trainer_module_file}\n", "\n", @@ -856,9 +820,7 @@ "metadata": { "id": "M49yYVNBTPd4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def _create_pipeline(pipeline_name: str, pipeline_root: str, data_root: str,\n", " schema_path: str, module_file: str, serving_model_dir: str,\n", @@ -932,9 +894,7 @@ "metadata": { "id": "fAtfOZTYWJu-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tfx.orchestration.LocalDagRunner().run(\n", " _create_pipeline(\n", @@ -973,9 +933,7 @@ "metadata": { "id": "TtsrZEUB1-J4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "metadata_connection_config = tfx.orchestration.metadata.sqlite_metadata_connection_config(\n", " METADATA_PATH)\n", @@ -1001,9 +959,7 @@ "metadata": { "id": "F-4oAjGR-IR0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "visualize_artifacts(anomalies_artifacts)" ] diff --git a/site/ko/tfx/tutorials/tfx/penguin_tfma.ipynb b/site/ko/tfx/tutorials/tfx/penguin_tfma.ipynb index 83236247a6..aefa0337c8 100644 --- a/site/ko/tfx/tutorials/tfx/penguin_tfma.ipynb +++ b/site/ko/tfx/tutorials/tfx/penguin_tfma.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "SpNWyqewk8fE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Apache License, 버전 2.0(\"라이선스\")에 따라서만 라이선스가 허여되며, \n", "# 라이선스를 준수하는 경우에 한해 이 파일을 사용할 수 있습니다. \n", @@ -96,9 +94,7 @@ "metadata": { "id": "as4OTe2ukSqm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "try:\n", " import colab\n", @@ -122,9 +118,7 @@ "metadata": { "id": "iyQtljP-qPHY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install -U tfx" ] @@ -146,9 +140,7 @@ "metadata": { "id": "RhieH4y1_d3n" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip uninstall shapely -y" ] @@ -179,9 +171,7 @@ "metadata": { "id": "6jh7vKSRqPHb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "print('TensorFlow version: {}'.format(tf.__version__))\n", @@ -206,9 +196,7 @@ "metadata": { "id": "EcUseqJaE2XN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import os\n", "\n", @@ -253,9 +241,7 @@ "metadata": { "id": "4fxMs6u86acP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import urllib.request\n", "import tempfile\n", @@ -298,9 +284,7 @@ "metadata": { "id": "aES7Hv5QTDK3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_trainer_module_file = 'penguin_trainer.py'" ] @@ -311,9 +295,7 @@ "metadata": { "id": "Gnc67uQNTDfW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%writefile {_trainer_module_file}\n", "\n", @@ -453,9 +435,7 @@ "metadata": { "id": "M49yYVNBTPd4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow_model_analysis as tfma\n", "\n", @@ -588,9 +568,7 @@ "metadata": { "id": "fAtfOZTYWJu-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tfx.orchestration.LocalDagRunner().run(\n", " _create_pipeline(\n", @@ -665,9 +643,7 @@ "metadata": { "id": "aiK6zbeAg3X5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "from ml_metadata.proto import metadata_store_pb2\n", "# Non-public APIs, just for showcase.\n", @@ -700,9 +676,7 @@ "metadata": { "id": "4FOo6PV5g5Mm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Non-public APIs, just for showcase.\n", "from tfx.orchestration.metadata import Metadata\n", @@ -733,9 +707,7 @@ "metadata": { "id": "wTaKoEHrj0Gs" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow_model_analysis as tfma\n", "\n", diff --git a/site/ko/tfx/tutorials/tfx/penguin_transform.ipynb b/site/ko/tfx/tutorials/tfx/penguin_transform.ipynb index 6ec6875d17..3e99933241 100644 --- a/site/ko/tfx/tutorials/tfx/penguin_transform.ipynb +++ b/site/ko/tfx/tutorials/tfx/penguin_transform.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "SpNWyqewk8fE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -54,10 +52,10 @@ "\n", "" ] @@ -98,9 +96,7 @@ "metadata": { "id": "as4OTe2ukSqm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "try:\n", " import colab\n", @@ -124,9 +120,7 @@ "metadata": { "id": "iyQtljP-qPHY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install -U tfx" ] @@ -148,9 +142,7 @@ "metadata": { "id": "3e8hUMPrlFXJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip uninstall shapely -y" ] @@ -181,9 +173,7 @@ "metadata": { "id": "6jh7vKSRqPHb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "print('TensorFlow version: {}'.format(tf.__version__))\n", @@ -208,9 +198,7 @@ "metadata": { "id": "EcUseqJaE2XN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import os\n", "\n", @@ -255,9 +243,7 @@ "metadata": { "id": "4fxMs6u86acP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import urllib.request\n", "import tempfile\n", @@ -283,9 +269,7 @@ "metadata": { "id": "-eSz28UDSnlG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!head {_data_filepath}" ] @@ -305,9 +289,7 @@ "metadata": { "id": "fQhpoaqff9ca" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!sed -i '/\\bNA\\b/d' {_data_filepath}\n", "!head {_data_filepath}" @@ -341,9 +323,7 @@ "metadata": { "id": "EDoB97m8B9nG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import shutil\n", "\n", @@ -412,9 +392,7 @@ "metadata": { "id": "aES7Hv5QTDK3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_module_file = 'penguin_utils.py'" ] @@ -425,9 +403,7 @@ "metadata": { "id": "Gnc67uQNTDfW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%writefile {_module_file}\n", "\n", @@ -646,9 +622,7 @@ "metadata": { "id": "M49yYVNBTPd4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def _create_pipeline(pipeline_name: str, pipeline_root: str, data_root: str,\n", " schema_path: str, module_file: str, serving_model_dir: str,\n", @@ -734,9 +708,7 @@ "metadata": { "id": "fAtfOZTYWJu-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tfx.orchestration.LocalDagRunner().run(\n", " _create_pipeline(\n", @@ -766,9 +738,7 @@ "metadata": { "id": "NTHROkqX6yHx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# List files in created model directory.\n", "!find {SERVING_MODEL_DIR}" @@ -789,9 +759,7 @@ "metadata": { "id": "YBfUzD_OkOq_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!saved_model_cli show --dir {SERVING_MODEL_DIR}/$(ls -1 {SERVING_MODEL_DIR} | sort -nr | head -1) --tag_set serve --signature_def serving_default" ] @@ -813,9 +781,7 @@ "metadata": { "id": "Z1Yw5yYdvqKf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Find a model with the latest timestamp.\n", "model_dirs = (item for item in os.scandir(SERVING_MODEL_DIR) if item.is_dir())\n", @@ -831,9 +797,7 @@ "metadata": { "id": "xrOHIvnIv0-4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Prepare an example and run inference.\n", "features = {\n", @@ -877,7 +841,7 @@ "collapsed_sections": [ "DjUA6S30k52h" ], - "name": "penguin_tft.ipynb", + "name": "penguin_transform.ipynb", "toc_visible": true }, "kernelspec": { diff --git a/site/ko/tfx/tutorials/tfx/python_function_component.ipynb b/site/ko/tfx/tutorials/tfx/python_function_component.ipynb index 9bd390f693..8e24d8fc32 100644 --- a/site/ko/tfx/tutorials/tfx/python_function_component.ipynb +++ b/site/ko/tfx/tutorials/tfx/python_function_component.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "SpNWyqewk8fE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -95,9 +93,7 @@ "metadata": { "id": "PQ-QwavmqPHP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import sys\n", "sys.version" @@ -120,9 +116,7 @@ "metadata": { "id": "UHvIH-wORCuV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "try:\n", " import colab\n", @@ -148,9 +142,7 @@ "metadata": { "id": "wGpQOmYIVlSV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install tfx" ] @@ -172,9 +164,7 @@ "metadata": { "id": "akSWlt-Bij9w" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip uninstall shapely -y" ] @@ -207,9 +197,7 @@ "metadata": { "id": "bRY0RFJ0VlSV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Check version\n", "from tfx import v1 as tfx\n", @@ -246,9 +234,7 @@ "metadata": { "id": "cHNtKTuiqPH4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%writefile my_generator.py\n", "\n", @@ -285,9 +271,7 @@ "metadata": { "id": "27ZEf2xQqPH7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%writefile my_consumer.py\n", "\n", @@ -337,9 +321,7 @@ "metadata": { "id": "j43snQpRqPII" }, - "outputs": [ - - ], + "outputs": [], "source": [ "from my_generator import MyGenerator\n", "from my_consumer import MyConsumer" @@ -360,9 +342,7 @@ "metadata": { "id": "dEXGvLLmKviI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Here, we create an InteractiveContext using default parameters. This will\n", "# use a temporary directory with an ephemeral ML Metadata database instance.\n", @@ -391,9 +371,7 @@ "metadata": { "id": "kfNmI5qULlSA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "generator = MyGenerator()\n", "context.run(generator)" @@ -405,9 +383,7 @@ "metadata": { "id": "cRxVZIfFLsL4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "consumer = MyConsumer(\n", " data=generator.outputs['data'],\n", @@ -430,9 +406,7 @@ "metadata": { "id": "h4P3Mx_CT0mP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!tail -v {consumer.outputs['hash'].get()[0].uri}" ] @@ -474,9 +448,7 @@ "metadata": { "id": "NpkQ805-LyJu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import os\n", "import tempfile\n", @@ -525,9 +497,7 @@ "metadata": { "id": "PLtGO2PkMQbO" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tfx.orchestration.LocalDagRunner().run(my_pipeline)" ] @@ -547,9 +517,7 @@ "metadata": { "id": "fyvYTsx8Mp1N" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!find {PIPELINE_ROOT}" ] diff --git a/site/ko/tfx/tutorials/tfx/recommenders.ipynb b/site/ko/tfx/tutorials/tfx/recommenders.ipynb index 54cc0dba5f..fc90be9b0a 100644 --- a/site/ko/tfx/tutorials/tfx/recommenders.ipynb +++ b/site/ko/tfx/tutorials/tfx/recommenders.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "bB8gHCR3FVC0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -125,9 +123,7 @@ "metadata": { "id": "GtR3txiwrT9w" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install -Uq tfx\n", "!pip install -Uq tensorflow-recommenders\n", @@ -151,9 +147,7 @@ "metadata": { "id": "w90AGSpJhz8X" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip uninstall shapely -y" ] @@ -175,9 +169,7 @@ "metadata": { "id": "SZGYDaF-m5wZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import os\n", "import absl\n", @@ -244,9 +236,7 @@ "metadata": { "id": "rcVgf7rLsv70" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@beam.ptransform_fn\n", "@beam.typehints.with_input_types(beam.Pipeline)\n", @@ -292,9 +282,7 @@ "metadata": { "id": "sM-46D40tW_V" }, - "outputs": [ - - ], + "outputs": [], "source": [ "context = InteractiveContext()" ] @@ -316,9 +304,7 @@ "metadata": { "id": "aaQhqcLGP0jL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Ratings data.\n", "ratings_example_gen = FileBasedExampleGen(\n", @@ -334,9 +320,7 @@ "metadata": { "id": "qlUFANrRvKDW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Features of all the available movies.\n", "movies_example_gen = FileBasedExampleGen(\n", @@ -363,9 +347,7 @@ "metadata": { "id": "_1-KQV2ynMdh" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def inspect_examples(component,\n", " channel_name='examples',\n", @@ -410,9 +392,7 @@ "metadata": { "id": "kHLsIHhw_x1d" }, - "outputs": [ - - ], + "outputs": [], "source": [ "inspect_examples(movies_example_gen)" ] @@ -445,9 +425,7 @@ "metadata": { "id": "X7-ZI8IsKT2P" }, - "outputs": [ - - ], + "outputs": [], "source": [ "movies_stats_gen = tfx.components.StatisticsGen(\n", " examples=movies_example_gen.outputs['examples'])\n", @@ -460,9 +438,7 @@ "metadata": { "id": "zlKLrrgnKzIe" }, - "outputs": [ - - ], + "outputs": [], "source": [ "context.show(movies_stats_gen.outputs['statistics'])" ] @@ -473,9 +449,7 @@ "metadata": { "id": "hmTThijxKmhA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ratings_stats_gen = tfx.components.StatisticsGen(\n", " examples=ratings_example_gen.outputs['examples'])\n", @@ -488,9 +462,7 @@ "metadata": { "id": "UoRcgChqK62O" }, - "outputs": [ - - ], + "outputs": [], "source": [ "context.show(ratings_stats_gen.outputs['statistics'])" ] @@ -512,9 +484,7 @@ "metadata": { "id": "vL85CAcILJiw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "movies_schema_gen = tfx.components.SchemaGen(\n", " statistics=movies_stats_gen.outputs['statistics'],\n", @@ -528,9 +498,7 @@ "metadata": { "id": "9eMtN1U1Lha1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "context.show(movies_schema_gen.outputs['schema'])" ] @@ -541,9 +509,7 @@ "metadata": { "id": "q-DkVUOeLmvX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ratings_schema_gen = tfx.components.SchemaGen(\n", " statistics=ratings_stats_gen.outputs['statistics'],\n", @@ -557,9 +523,7 @@ "metadata": { "id": "SxD9oAhZLt_Z" }, - "outputs": [ - - ], + "outputs": [], "source": [ "context.show(ratings_schema_gen.outputs['schema'])" ] @@ -587,9 +551,7 @@ "metadata": { "id": "3Oqzx5mSI8zm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_movies_transform_module_file = 'movies_transform_module.py'" ] @@ -600,9 +562,7 @@ "metadata": { "id": "MKROCiPo_5LJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%writefile {_movies_transform_module_file}\n", "\n", @@ -620,9 +580,7 @@ "metadata": { "id": "qQcQBN9SIzIa" }, - "outputs": [ - - ], + "outputs": [], "source": [ "movies_transform = tfx.components.Transform(\n", " examples=movies_example_gen.outputs['examples'],\n", @@ -637,9 +595,7 @@ "metadata": { "id": "D5oai0TlNWlv" }, - "outputs": [ - - ], + "outputs": [], "source": [ "context.show(movies_transform.outputs['post_transform_schema'])" ] @@ -650,9 +606,7 @@ "metadata": { "id": "RWahQqCiBXqA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "inspect_examples(movies_transform, channel_name='transformed_examples')" ] @@ -663,9 +617,7 @@ "metadata": { "id": "X4PmR-a8O-mD" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_ratings_transform_module_file = 'ratings_transform_module.py'" ] @@ -676,9 +628,7 @@ "metadata": { "id": "EWXuBqivPDuK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%writefile {_ratings_transform_module_file}\n", "\n", @@ -715,9 +665,7 @@ "metadata": { "id": "_4NgpBOkPXsj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ratings_transform = tfx.components.Transform(\n", " examples=ratings_example_gen.outputs['examples'],\n", @@ -732,9 +680,7 @@ "metadata": { "id": "n9Vqby34Dvzd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "context.show(ratings_transform.outputs['post_transform_schema'])" ] @@ -745,9 +691,7 @@ "metadata": { "id": "m_ec39jiaMG-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "inspect_examples(ratings_transform, channel_name='transformed_examples')" ] @@ -773,9 +717,7 @@ "metadata": { "id": "k_mmYhjAJP4g" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# We're now going to create the module file for Trainer, which will include the\n", "# code above with some modifications for TFX.\n", @@ -789,9 +731,7 @@ "metadata": { "id": "kHQZJEhXP93N" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%writefile {_trainer_module_file}\n", "\n", @@ -1078,9 +1018,7 @@ "metadata": { "id": "hsWC8UpVrngY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "trainer = tfx.components.Trainer(\n", " module_file=os.path.abspath(_trainer_module_file),\n", @@ -1117,9 +1055,7 @@ "metadata": { "id": "1hXlzwMTRkaj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_serving_model_dir = os.path.join(tempfile.mkdtemp(), 'serving_model/tfrs_retrieval')\n", "\n", @@ -1148,9 +1084,7 @@ "metadata": { "id": "MUwd9QoGRkaj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "loaded = tf.saved_model.load(pusher.outputs['pushed_model'].get()[0].uri)\n", "scores, titles = loaded([\"42\"])\n", diff --git a/site/ko/tfx/tutorials/tfx/template_beam.ipynb b/site/ko/tfx/tutorials/tfx/template_beam.ipynb index 65a41cc894..86592f4f89 100644 --- a/site/ko/tfx/tutorials/tfx/template_beam.ipynb +++ b/site/ko/tfx/tutorials/tfx/template_beam.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "SpNWyqewk8fE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -50,10 +48,10 @@ "source": [ "" ] @@ -111,9 +109,7 @@ "metadata": { "id": "llKzIjr442w1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import sys\n", "!{sys.executable} -m pip install --upgrade \"tfx<2\"" @@ -138,9 +134,7 @@ "metadata": { "id": "m6-DrWm042w4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Set `PATH` to include user python binary directory.\n", "HOME=%env HOME\n", @@ -167,9 +161,7 @@ "metadata": { "id": "sBLyQWYF42w6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!python3 -c \"from tfx import version ; print('TFX version: {}'.format(version.__version__))\"" ] @@ -207,9 +199,7 @@ "metadata": { "id": "IYGyT4ib42xG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "PIPELINE_NAME=\"my_pipeline\"\n", "import os\n", @@ -241,9 +231,7 @@ "metadata": { "id": "3PmXatBD42xI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!tfx template copy \\\n", " --pipeline_name={PIPELINE_NAME} \\\n", @@ -270,9 +258,7 @@ "metadata": { "id": "y9e_g5rc42xL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%cd {PROJECT_DIR}" ] @@ -332,9 +318,7 @@ "metadata": { "id": "H0DzGg-642xQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!{sys.executable} -m models.features_test\n", "!{sys.executable} -m models.keras.model_test\n" @@ -361,9 +345,7 @@ "metadata": { "id": "D5YikNik42xX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!tfx pipeline create --engine=local --pipeline_path=local_runner.py" ] @@ -387,9 +369,7 @@ "metadata": { "id": "SnTC_Rql42xZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!tfx run create --engine=local --pipeline_name={PIPELINE_NAME}" ] @@ -439,9 +419,7 @@ "metadata": { "id": "wMsT-5EX42xc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Update the pipeline\n", "!tfx pipeline update --engine=local --pipeline_path=local_runner.py\n", @@ -484,9 +462,7 @@ "metadata": { "id": "Ik8JbnRq42xf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!tfx pipeline update --engine=local --pipeline_path=local_runner.py\n", "!tfx run create --engine local --pipeline_name {PIPELINE_NAME}" @@ -529,9 +505,7 @@ "metadata": { "id": "2K7nuHZ4uNXc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "if 'google.colab' in sys.modules:\n", " from google.colab import auth\n", @@ -558,9 +532,7 @@ "metadata": { "id": "Vvpw_lGByxSx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Set your project name below.\n", "# WARNING! ENTER your project name before running this cell.\n", @@ -590,9 +562,7 @@ "metadata": { "id": "w8rOdC3r42xi" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!tfx pipeline update --engine=local --pipeline_path=local_runner.py\n", "!tfx run create --engine local --pipeline_name {PIPELINE_NAME}" @@ -622,10 +592,8 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], - "name": "template_local.ipynb", + "collapsed_sections": [], + "name": "template_beam.ipynb", "toc_visible": true }, "kernelspec": { diff --git a/site/ko/tfx/tutorials/transform/census.ipynb b/site/ko/tfx/tutorials/transform/census.ipynb index 9d5c544e3b..0316c2bbcb 100644 --- a/site/ko/tfx/tutorials/transform/census.ipynb +++ b/site/ko/tfx/tutorials/transform/census.ipynb @@ -8,9 +8,9 @@ "source": [ "" ] }, @@ -30,9 +30,7 @@ "cellView": "form", "id": "rSGJWC5biBiG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -102,9 +100,7 @@ "metadata": { "id": "9Ak6XDO5mT3m" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install tensorflow-transform" ] @@ -115,9 +111,7 @@ "metadata": { "id": "R0mXLOJR_-dv" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# This cell is only necessary because packages were installed while python was\n", "# running. It avoids the need to restart the runtime when running in Colab.\n", @@ -144,9 +138,7 @@ "metadata": { "id": "K4QXVIM7iglN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import math\n", "import os\n", @@ -184,9 +176,7 @@ "metadata": { "id": "mKEYRl2g_vzl" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!wget https://storage.googleapis.com/artifacts.tfx-oss-public.appspot.com/datasets/census/adult.data\n", "!wget https://storage.googleapis.com/artifacts.tfx-oss-public.appspot.com/datasets/census/adult.test\n", @@ -212,9 +202,7 @@ "metadata": { "id": "-bsr1nLHqyg_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "CATEGORICAL_FEATURE_KEYS = [\n", " 'workclass',\n", @@ -259,9 +247,7 @@ "metadata": { "id": "312cQ5vwGjOu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "pandas_train = pd.read_csv(train_path, header=None, names=ORDERED_CSV_COLUMNS)\n", "\n", @@ -274,9 +260,7 @@ "metadata": { "id": "zzjzjR3351j0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "one_row = dict(pandas_train.loc[0])" ] @@ -287,9 +271,7 @@ "metadata": { "id": "zk2b8IPd4uPr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "COLUMN_DEFAULTS = [\n", " '' if isinstance(v, str) else 0.0\n", @@ -311,9 +293,7 @@ "metadata": { "id": "RasgDIUKHCpV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "pandas_test = pd.read_csv(test_path, header=1, names=ORDERED_CSV_COLUMNS)\n", "\n", @@ -326,9 +306,7 @@ "metadata": { "id": "s9aH5ZnDdD_z" }, - "outputs": [ - - ], + "outputs": [], "source": [ "testing = os.getenv(\"WEB_TEST_BROWSER\", False)\n", "if testing:\n", @@ -351,9 +329,7 @@ "metadata": { "id": "5oS2RfyCrzMr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "RAW_DATA_FEATURE_SPEC = dict(\n", " [(name, tf.io.FixedLenFeature([], tf.string))\n", @@ -392,9 +368,7 @@ "metadata": { "id": "Wbhndy7uWqYp" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title\n", "def encode_example(input_features):\n", @@ -439,9 +413,7 @@ "metadata": { "id": "sWd95yxJceXy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf_example = encode_example(pandas_train.loc[0])\n", "tf_example.features.feature['age']" @@ -453,9 +425,7 @@ "metadata": { "id": "EutF2aPXbAUd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "serialized_example_batch = tf.constant([\n", " encode_example(pandas_train.loc[i]).SerializeToString()\n", @@ -480,9 +450,7 @@ "metadata": { "id": "jXlrur1vc4n_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "decoded_tensors = tf.io.parse_example(\n", " serialized_example_batch,\n", @@ -505,9 +473,7 @@ "metadata": { "id": "EEt3nPr_o59f" }, - "outputs": [ - - ], + "outputs": [], "source": [ "features_dict = dict(pandas_train.loc[0])\n", "features_dict.pop(LABEL_KEY)\n", @@ -530,9 +496,7 @@ "metadata": { "id": "7N5FMXO7dRzM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "no_label_example = encode_example(features_dict)\n", "\n", @@ -556,9 +520,7 @@ "metadata": { "id": "8WHyOkC9uL71" }, - "outputs": [ - - ], + "outputs": [], "source": [ "NUM_OOV_BUCKETS = 1\n", "\n", @@ -584,9 +546,7 @@ "metadata": { "id": "lG2uO-88c6R9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "if testing:\n", " TRAIN_NUM_EPOCHS = 1" @@ -637,9 +597,7 @@ "metadata": { "id": "LDrzuYH0WFc2" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def preprocessing_fn(inputs):\n", " \"\"\"Preprocess input columns into transformed columns.\"\"\"\n", @@ -734,9 +692,7 @@ "metadata": { "id": "PCeYucVoRRfo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def transform_data(train_data_file, test_data_file, working_dir):\n", " \"\"\"Transform the data and write out as a TFRecord of Example protos.\n", @@ -854,9 +810,7 @@ "metadata": { "id": "pjC7eDWFyA8K" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tempfile\n", "import pathlib\n", @@ -882,9 +836,7 @@ "metadata": { "id": "FXd4Mgj6sAGB" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf_transform_output = tft.TFTransformOutput(output_dir)" ] @@ -895,9 +847,7 @@ "metadata": { "id": "59hNe7oY9vqG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf_transform_output.transformed_feature_spec()" ] @@ -923,9 +873,7 @@ "metadata": { "id": "NG6nrHEP2L65" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!ls -l {output_dir}" ] @@ -967,9 +915,7 @@ "metadata": { "id": "775Y7BTpHBmb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def _make_training_input_fn(tf_transform_output, train_file_pattern,\n", " batch_size):\n", @@ -1001,9 +947,7 @@ "metadata": { "id": "-b8BgvBvkCnX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_file_pattern = pathlib.Path(output_dir)/f'{TRANSFORMED_TRAIN_DATA_FILEBASE}*'\n", "\n", @@ -1029,9 +973,7 @@ "metadata": { "id": "SpiS26IWlD-1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for example, label in input_fn().take(1):\n", " break\n", @@ -1045,9 +987,7 @@ "metadata": { "id": "yaMzMnij88_v" }, - "outputs": [ - - ], + "outputs": [], "source": [ "label" ] @@ -1076,9 +1016,7 @@ "metadata": { "id": "uK4brUuDTAJ4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def build_keras_model(working_dir):\n", " inputs = build_keras_inputs(working_dir)\n", @@ -1100,9 +1038,7 @@ "metadata": { "id": "6fJwIbdCRFER" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def build_keras_inputs(working_dir):\n", " tf_transform_output = tft.TFTransformOutput(working_dir)\n", @@ -1131,9 +1067,7 @@ "metadata": { "id": "9dHD5SoqRqOh" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def encode_inputs(inputs):\n", " encoded_inputs = {}\n", @@ -1157,9 +1091,7 @@ "metadata": { "id": "5xNhSq8lTTx3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = build_keras_model(output_dir)\n", "\n", @@ -1181,9 +1113,7 @@ "metadata": { "id": "afi3NOC0OMUa" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def get_dataset(working_dir, filebase):\n", " tf_transform_output = tft.TFTransformOutput(working_dir)\n", @@ -1217,9 +1147,7 @@ "metadata": { "id": "6i_lhWH8IZrk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def train_and_evaluate(\n", " model,\n", @@ -1253,9 +1181,7 @@ "metadata": { "id": "rcVsByIsViRy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def train_model(model, train_dataset, validation_dataset):\n", " model.compile(optimizer='adam',\n", @@ -1275,9 +1201,7 @@ "metadata": { "id": "f5xoioogYTle" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model, history, metric_values = train_and_evaluate(model, output_dir)" ] @@ -1288,9 +1212,7 @@ "metadata": { "id": "gQCbdPIQeXeZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plt.plot(history.history['loss'], label='Train')\n", "plt.plot(history.history['val_loss'], label='Eval')\n", @@ -1329,9 +1251,7 @@ "metadata": { "id": "tMHDZhp82ZjM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def read_csv(file_name, batch_size):\n", " return tf.data.experimental.make_csv_dataset(\n", @@ -1349,9 +1269,7 @@ "metadata": { "id": "AradAjmW2vyd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for ex in read_csv(test_path, batch_size=5):\n", " break\n", @@ -1374,9 +1292,7 @@ "metadata": { "id": "nma2Bzi--11x" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ex2 = ex.copy()\n", "ex2.pop('fnlwgt')\n", @@ -1403,9 +1319,7 @@ "metadata": { "id": "swEPuZsR0Y5S" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ex2 = pd.DataFrame(ex)[['education', 'hours-per-week']]\n", "ex2" @@ -1417,9 +1331,7 @@ "metadata": { "id": "_s4SxutV1DTI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "pd.DataFrame(tft_layer(dict(ex2)))" ] @@ -1439,9 +1351,7 @@ "metadata": { "id": "hdMKDnafJh64" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class Transform(tf.Module):\n", " def __init__(self, working_dir):\n", @@ -1477,9 +1387,7 @@ "metadata": { "id": "mm5HI578Ku1B" }, - "outputs": [ - - ], + "outputs": [], "source": [ "transform = Transform(output_dir)" ] @@ -1490,9 +1398,7 @@ "metadata": { "id": "4jeenwN_3ZRj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "t_ex, t_label = transform(ex)" ] @@ -1503,9 +1409,7 @@ "metadata": { "id": "yIavZAqALO8H" }, - "outputs": [ - - ], + "outputs": [], "source": [ "pd.DataFrame(t_ex)" ] @@ -1525,9 +1429,7 @@ "metadata": { "id": "VN3IO6u1Mk83" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.evaluate(\n", " read_csv(test_path, batch_size=5).map(transform),\n", @@ -1553,9 +1455,7 @@ "metadata": { "id": "AZ2WICuwEwqC" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class ServingModel(tf.Module):\n", " def __init__(self, model, working_dir):\n", @@ -1615,9 +1515,7 @@ "metadata": { "id": "u2mSC1UMGAwJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "serving_model = ServingModel(model, output_dir)\n", "\n", @@ -1639,9 +1537,7 @@ "metadata": { "id": "kodDWTJIEr77" }, - "outputs": [ - - ], + "outputs": [], "source": [ "saved_model_dir = serving_model.export(output_dir)\n", "saved_model_dir" @@ -1662,9 +1558,7 @@ "metadata": { "id": "nShh6GqcEr78" }, - "outputs": [ - - ], + "outputs": [], "source": [ "reloaded = tf.saved_model.load(str(saved_model_dir))\n", "run_model = reloaded.signatures['serving_default']" @@ -1676,9 +1570,7 @@ "metadata": { "id": "UiYJhQySEr78" }, - "outputs": [ - - ], + "outputs": [], "source": [ "run_model(serialized_example_batch)" ] @@ -1721,9 +1613,7 @@ "metadata": { "id": "kFO0MeWQ228a" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def _make_training_input_fn(tf_transform_output, transformed_examples,\n", " batch_size):\n", @@ -1776,9 +1666,7 @@ "cellView": "code", "id": "NN5FVg343Jea" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def _make_serving_input_fn(tf_transform_output):\n", " \"\"\"Creates an input function reading from raw data.\n", @@ -1830,9 +1718,7 @@ "metadata": { "id": "6qOFOvBk7oJX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def get_feature_columns(tf_transform_output):\n", " \"\"\"Returns the FeatureColumns for the model.\n", @@ -1875,9 +1761,7 @@ "metadata": { "id": "8iGQ0jeq8IWr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def train_and_evaluate(working_dir, num_train_instances=NUM_TRAIN_INSTANCES,\n", " num_test_instances=NUM_TEST_INSTANCES):\n", @@ -1941,9 +1825,7 @@ "metadata": { "id": "P_1_2dB6pdc2" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tempfile\n", "temp = temp = os.path.join(tempfile.mkdtemp(),'estimator')\n", @@ -1958,9 +1840,7 @@ "metadata": { "id": "O_IqGL90GCIq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "pprint.pprint(results)" ] diff --git a/site/ko/tfx/tutorials/transform/simple.ipynb b/site/ko/tfx/tutorials/transform/simple.ipynb index 343f3791fd..5a301a4bd8 100644 --- a/site/ko/tfx/tutorials/transform/simple.ipynb +++ b/site/ko/tfx/tutorials/transform/simple.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "rSGJWC5biBiG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -96,9 +94,7 @@ "metadata": { "id": "EmiQXNLZm8z-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "try:\n", " import colab\n", @@ -122,9 +118,7 @@ "metadata": { "id": "j2CTKbMNm9I4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install -q -U tensorflow_transform" ] @@ -135,9 +129,7 @@ "metadata": { "id": "R0mXLOJR_-dv" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# This cell is only necessary because packages were installed while python was\n", "# running. It avoids the need to restart the runtime when running in Colab.\n", @@ -162,9 +154,7 @@ "metadata": { "id": "K4QXVIM7iglN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import pathlib\n", "import pprint\n", @@ -198,9 +188,7 @@ "metadata": { "id": "-R236Tkf_ON3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "raw_data = [\n", " {'x': 1, 'y': 1, 's': 'hello'},\n", @@ -247,9 +235,7 @@ "metadata": { "id": "H2wANNF_2dCR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def preprocessing_fn(inputs):\n", " \"\"\"Preprocess input columns into transformed columns.\"\"\"\n", @@ -318,9 +304,7 @@ "metadata": { "id": "mAF9w7RTZU7c" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def main(output_dir):\n", " # Ignore the warnings\n", @@ -345,9 +329,7 @@ "metadata": { "id": "zZPQl0X19ni2" }, - "outputs": [ - - ], + "outputs": [], "source": [ "output_dir = pathlib.Path(tempfile.mkdtemp())\n", "\n", @@ -395,9 +377,7 @@ "metadata": { "id": "We4Mafrq8id6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!ls -l {output_dir}" ] @@ -419,9 +399,7 @@ "metadata": { "id": "cz8dqFW6ANJQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "loaded = tf.saved_model.load(str(output_dir/'transform_fn'))\n", "loaded.signatures['serving_default']" @@ -442,9 +420,7 @@ "metadata": { "id": "HNd4r2gJ75nx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf_transform_output = tft.TFTransformOutput(output_dir)\n", "\n", @@ -467,9 +443,7 @@ "metadata": { "id": "2nyE1fVj82Gp" }, - "outputs": [ - - ], + "outputs": [], "source": [ "raw_data_batch = {\n", " 's': tf.constant([ex['s'] for ex in raw_data]),\n", @@ -493,9 +467,7 @@ "metadata": { "id": "fIXJYE0Z9Mrs" }, - "outputs": [ - - ], + "outputs": [], "source": [ "transformed_batch = tft_layer(raw_data_batch)\n", "\n", @@ -546,9 +518,7 @@ "metadata": { "id": "xWiEo1ZUzp4x" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class StackDict(tf.keras.layers.Layer):\n", " def call(self, inputs):\n", @@ -564,9 +534,7 @@ "metadata": { "id": "A0QJpoWT1aUD" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class TrainedModel(tf.keras.Model):\n", " def __init__(self):\n", @@ -589,9 +557,7 @@ "metadata": { "id": "DkMwREIx2fkD" }, - "outputs": [ - - ], + "outputs": [], "source": [ "trained_model = TrainedModel()" ] @@ -625,9 +591,7 @@ "metadata": { "id": "d2KJ8nGt228O" }, - "outputs": [ - - ], + "outputs": [], "source": [ "trained_model_output = trained_model(transformed_batch)\n", "trained_model_output.shape" @@ -652,9 +616,7 @@ "metadata": { "id": "Pe-nbN123qUt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class ExportModel(tf.Module):\n", " def __init__(self, trained_model, input_transform):\n", @@ -673,9 +635,7 @@ "metadata": { "id": "iLUIO-Y87AC0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "export_model = ExportModel(trained_model=trained_model,\n", " input_transform=tft_layer)" @@ -696,9 +656,7 @@ "metadata": { "id": "AqwHTex27ILk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "export_model_output = export_model(raw_data_batch)\n", "export_model_output.shape" @@ -710,9 +668,7 @@ "metadata": { "id": "AZQ6_Dfd7xws" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf.reduce_max(abs(export_model_output - trained_model_output)).numpy()" ] @@ -732,9 +688,7 @@ "metadata": { "id": "VK17CShl8F7s" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tempfile\n", "model_dir = tempfile.mkdtemp(suffix='tft')\n", @@ -748,9 +702,7 @@ "metadata": { "id": "RTF-yRnA9yrL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "reloaded = tf.saved_model.load(model_dir)\n", "\n", @@ -764,9 +716,7 @@ "metadata": { "id": "tFx1I6FQ9_mj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf.reduce_max(abs(export_model_output - reloaded_model_output)).numpy()" ] diff --git a/site/ko/tutorials/audio/music_generation.ipynb b/site/ko/tutorials/audio/music_generation.ipynb index f9de61099d..99d002a3ed 100644 --- a/site/ko/tutorials/audio/music_generation.ipynb +++ b/site/ko/tutorials/audio/music_generation.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "JO1GUwC1_T2x" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -91,9 +89,7 @@ "metadata": { "id": "kahm6Z8v_TqC" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!sudo apt install -y fluidsynth" ] @@ -104,9 +100,7 @@ "metadata": { "id": "M0lAReB7_Vqb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install --upgrade pyfluidsynth" ] @@ -117,9 +111,7 @@ "metadata": { "id": "G46kKoQZmIa8" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install pretty_midi" ] @@ -130,9 +122,7 @@ "metadata": { "id": "GsLFq7nsiqcq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import collections\n", "import datetime\n", @@ -156,9 +146,7 @@ "metadata": { "id": "Efja_OtJNzAM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "seed = 42\n", "tf.random.set_seed(seed)\n", @@ -183,9 +171,7 @@ "metadata": { "id": "mwja4SWmibrL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "data_dir = pathlib.Path('data/maestro-v2.0.0')\n", "if not data_dir.exists():\n", @@ -212,9 +198,7 @@ "metadata": { "id": "72iFI1bPB9o1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "filenames = glob.glob(str(data_dir/'**/*.mid*'))\n", "print('Number of files:', len(filenames))" @@ -244,9 +228,7 @@ "metadata": { "id": "6oSCbHvJNbci" }, - "outputs": [ - - ], + "outputs": [], "source": [ "sample_file = filenames[1]\n", "print(sample_file)" @@ -267,9 +249,7 @@ "metadata": { "id": "1YSQ5DjRI2md" }, - "outputs": [ - - ], + "outputs": [], "source": [ "pm = pretty_midi.PrettyMIDI(sample_file)" ] @@ -289,9 +269,7 @@ "metadata": { "id": "vzoHAaVY_kyY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def display_audio(pm: pretty_midi.PrettyMIDI, seconds=30):\n", " waveform = pm.fluidsynth(fs=_SAMPLING_RATE)\n", @@ -306,9 +284,7 @@ "metadata": { "id": "GOe-3AAi_sRw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "display_audio(pm)" ] @@ -328,9 +304,7 @@ "metadata": { "id": "SIGHYQPZQnRo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print('Number of instruments:', len(pm.instruments))\n", "instrument = pm.instruments[0]\n", @@ -353,9 +327,7 @@ "metadata": { "id": "nYZm_VehYOTZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for i, note in enumerate(instrument.notes[:10]):\n", " note_name = pretty_midi.note_number_to_name(note.pitch)\n", @@ -388,9 +360,7 @@ "metadata": { "id": "Wyp_wdcEPWby" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def midi_to_notes(midi_file: str) -> pd.DataFrame:\n", " pm = pretty_midi.PrettyMIDI(midi_file)\n", @@ -420,9 +390,7 @@ "metadata": { "id": "X0kPjLBlcnY6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "raw_notes = midi_to_notes(sample_file)\n", "raw_notes.head()" @@ -443,9 +411,7 @@ "metadata": { "id": "WE9YXrGZbY2X" }, - "outputs": [ - - ], + "outputs": [], "source": [ "get_note_names = np.vectorize(pretty_midi.note_number_to_name)\n", "sample_note_names = get_note_names(raw_notes['pitch'])\n", @@ -467,9 +433,7 @@ "metadata": { "id": "liD2N7x_WOTp" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def plot_piano_roll(notes: pd.DataFrame, count: Optional[int] = None):\n", " if count:\n", @@ -493,9 +457,7 @@ "metadata": { "id": "vWeUbqmAXjOs" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plot_piano_roll(raw_notes, count=100)" ] @@ -515,9 +477,7 @@ "metadata": { "id": "G7l76hEDZX8Z" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plot_piano_roll(raw_notes)" ] @@ -537,9 +497,7 @@ "metadata": { "id": "Pq9C9XBBaK7W" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def plot_distributions(notes: pd.DataFrame, drop_percentile=2.5):\n", " plt.figure(figsize=[15, 5])\n", @@ -561,9 +519,7 @@ "metadata": { "id": "-Nu2Pw24acFD" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plot_distributions(raw_notes)" ] @@ -585,9 +541,7 @@ "metadata": { "id": "BD5rsMRARYoV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def notes_to_midi(\n", " notes: pd.DataFrame,\n", @@ -625,9 +579,7 @@ "metadata": { "id": "wTazLbuWPIPF" }, - "outputs": [ - - ], + "outputs": [], "source": [ "example_file = 'example.midi'\n", "example_pm = notes_to_midi(\n", @@ -649,9 +601,7 @@ "metadata": { "id": "fGRLs-eR_4uK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "display_audio(example_pm)" ] @@ -689,9 +639,7 @@ "metadata": { "id": "GiaQiTnXSW-T" }, - "outputs": [ - - ], + "outputs": [], "source": [ "num_files = 5\n", "all_notes = []\n", @@ -708,9 +656,7 @@ "metadata": { "id": "F4bMDeRvgWqx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "n_notes = len(all_notes)\n", "print('Number of notes parsed:', n_notes)" @@ -731,9 +677,7 @@ "metadata": { "id": "mvNHCHZdXG2P" }, - "outputs": [ - - ], + "outputs": [], "source": [ "key_order = ['pitch', 'step', 'duration']\n", "train_notes = np.stack([all_notes[key] for key in key_order], axis=1)" @@ -745,9 +689,7 @@ "metadata": { "id": "PLC_19tshyFk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "notes_ds = tf.data.Dataset.from_tensor_slices(train_notes)\n", "notes_ds.element_spec" @@ -770,9 +712,7 @@ "metadata": { "id": "ZkEC-5s6wJJV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def create_sequences(\n", " dataset: tf.data.Dataset, \n", @@ -821,9 +761,7 @@ "metadata": { "id": "fGA3VxcFXZ4T" }, - "outputs": [ - - ], + "outputs": [], "source": [ "seq_length = 25\n", "vocab_size = 128\n", @@ -846,9 +784,7 @@ "metadata": { "id": "ESK9cL7__TF3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for seq, target in seq_ds.take(1):\n", " print('sequence shape:', seq.shape)\n", @@ -872,9 +808,7 @@ "metadata": { "id": "fTpFoiM_AV_Y" }, - "outputs": [ - - ], + "outputs": [], "source": [ "batch_size = 64\n", "buffer_size = n_notes - seq_length # the number of items in the dataset\n", @@ -891,9 +825,7 @@ "metadata": { "id": "LySbjV0GzXQu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_ds.element_spec" ] @@ -922,9 +854,7 @@ "metadata": { "id": "erxLOif08e8v" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def mse_with_positive_pressure(y_true: tf.Tensor, y_pred: tf.Tensor):\n", " mse = (y_true - y_pred) ** 2\n", @@ -938,9 +868,7 @@ "metadata": { "id": "kNaVWcCzAm5V" }, - "outputs": [ - - ], + "outputs": [], "source": [ "input_shape = (seq_length, 3)\n", "learning_rate = 0.005\n", @@ -985,9 +913,7 @@ "metadata": { "id": "BlATt7Rl0XJl" }, - "outputs": [ - - ], + "outputs": [], "source": [ "losses = model.evaluate(train_ds, return_dict=True)\n", "losses" @@ -1008,9 +934,7 @@ "metadata": { "id": "9fQB5SiN3ufX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.compile(\n", " loss=loss,\n", @@ -1038,9 +962,7 @@ "metadata": { "id": "T7CzWmFR38ut" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.evaluate(train_ds, return_dict=True)" ] @@ -1060,9 +982,7 @@ "metadata": { "id": "uQA_rwKEgPjp" }, - "outputs": [ - - ], + "outputs": [], "source": [ "callbacks = [\n", " tf.keras.callbacks.ModelCheckpoint(\n", @@ -1082,9 +1002,7 @@ "metadata": { "id": "aLoYY8-XaPFN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%time\n", "epochs = 50\n", @@ -1102,9 +1020,7 @@ "metadata": { "id": "PYBSjgDWiUfT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plt.plot(history.epoch, history.history['loss'], label='total loss')\n", "plt.show()" @@ -1138,9 +1054,7 @@ "metadata": { "id": "1mil8ZyJNe1w" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def predict_next_note(\n", " notes: np.ndarray, \n", @@ -1186,9 +1100,7 @@ "metadata": { "id": "87fPl4auPdR3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "temperature = 2.0\n", "num_predictions = 120\n", @@ -1222,9 +1134,7 @@ "metadata": { "id": "0MK7HmqLuqka" }, - "outputs": [ - - ], + "outputs": [], "source": [ "generated_notes.head(10)" ] @@ -1235,9 +1145,7 @@ "metadata": { "id": "e9K9KHPaTNnK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "out_file = 'output.mid'\n", "out_pm = notes_to_midi(\n", @@ -1274,9 +1182,7 @@ "metadata": { "id": "NlNsxcnhvbcK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plot_piano_roll(generated_notes)" ] @@ -1296,9 +1202,7 @@ "metadata": { "id": "j5bco2WVRkAa" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plot_distributions(generated_notes)" ] @@ -1329,9 +1233,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "music_generation.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/audio/transfer_learning_audio.ipynb b/site/ko/tutorials/audio/transfer_learning_audio.ipynb index afef180d28..ad8a97b925 100644 --- a/site/ko/tutorials/audio/transfer_learning_audio.ipynb +++ b/site/ko/tutorials/audio/transfer_learning_audio.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "DjZQV2njKJ3U" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -89,9 +87,7 @@ "metadata": { "id": "urBpRWDHTHHU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install -q \"tensorflow==2.11.*\"\n", "# tensorflow_io 0.28 is compatible with TensorFlow 2.11\n", @@ -104,9 +100,7 @@ "metadata": { "id": "7l3nqdWVF-kC" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import os\n", "\n", @@ -155,9 +149,7 @@ "metadata": { "id": "06CWkBV5v3gr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "yamnet_model_handle = 'https://tfhub.dev/google/yamnet/1'\n", "yamnet_model = hub.load(yamnet_model_handle)" @@ -178,9 +170,7 @@ "metadata": { "id": "C5i6xktEq00P" }, - "outputs": [ - - ], + "outputs": [], "source": [ "testing_wav_file_name = tf.keras.utils.get_file('miaow_16k.wav',\n", " 'https://storage.googleapis.com/audioset/miaow_16k.wav',\n", @@ -207,9 +197,7 @@ "metadata": { "id": "Xwc9Wrdg2EtY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Utility functions for loading audio files and making sure the sample rate is correct.\n", "\n", @@ -232,9 +220,7 @@ "metadata": { "id": "FRqpjkwB0Jjw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "testing_wav_data = load_wav_16k_mono(testing_wav_file_name)\n", "\n", @@ -261,9 +247,7 @@ "metadata": { "id": "6Gyj23e_3Mgr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class_map_path = yamnet_model.class_map_path().numpy().decode('utf-8')\n", "class_names =list(pd.read_csv(class_map_path)['display_name'])\n", @@ -290,9 +274,7 @@ "metadata": { "id": "NT0otp-A4Y3u" }, - "outputs": [ - - ], + "outputs": [], "source": [ "scores, embeddings, spectrogram = yamnet_model(testing_wav_data)\n", "class_scores = tf.reduce_mean(scores, axis=0)\n", @@ -331,9 +313,7 @@ "metadata": { "id": "MWobqK8JmZOU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_ = tf.keras.utils.get_file('esc-50.zip',\n", " 'https://github.com/karoldvl/ESC-50/archive/master.zip',\n", @@ -363,9 +343,7 @@ "metadata": { "id": "jwmLygPrMAbH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "esc50_csv = './datasets/ESC-50-master/meta/esc50.csv'\n", "base_data_path = './datasets/ESC-50-master/audio/'\n", @@ -395,9 +373,7 @@ "metadata": { "id": "tFnEoQjgs14I" }, - "outputs": [ - - ], + "outputs": [], "source": [ "my_classes = ['dog', 'cat']\n", "map_class_to_id = {'dog':0, 'cat':1}\n", @@ -443,9 +419,7 @@ "metadata": { "id": "u5Rq3_PyKLtU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "filenames = filtered_pd['filename']\n", "targets = filtered_pd['target']\n", @@ -461,9 +435,7 @@ "metadata": { "id": "rsEfovDVAHGY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def load_wav_for_map(filename, label, fold):\n", " return load_wav_16k_mono(filename), label, fold\n", @@ -478,9 +450,7 @@ "metadata": { "id": "k0tG8DBNAHcE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# applies the embedding extraction model to a wav data\n", "def extract_embedding(wav_data, label, fold):\n", @@ -517,9 +487,7 @@ "metadata": { "id": "1ZYvlFiVsffC" }, - "outputs": [ - - ], + "outputs": [], "source": [ "cached_ds = main_ds.cache()\n", "train_ds = cached_ds.filter(lambda embedding, label, fold: fold < 4)\n", @@ -555,9 +523,7 @@ "metadata": { "id": "JYCE0Fr1GpN3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "my_model = tf.keras.Sequential([\n", " tf.keras.layers.Input(shape=(1024), dtype=tf.float32,\n", @@ -575,9 +541,7 @@ "metadata": { "id": "l1qgH35HY0SE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "my_model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n", " optimizer=\"adam\",\n", @@ -594,9 +558,7 @@ "metadata": { "id": "T3sj84eOZ3pk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "history = my_model.fit(train_ds,\n", " epochs=20,\n", @@ -619,9 +581,7 @@ "metadata": { "id": "H4Nh5nec3Sky" }, - "outputs": [ - - ], + "outputs": [], "source": [ "loss, accuracy = my_model.evaluate(test_ds)\n", "\n", @@ -655,9 +615,7 @@ "metadata": { "id": "79AFpA3_ctCF" }, - "outputs": [ - - ], + "outputs": [], "source": [ "scores, embeddings, spectrogram = yamnet_model(testing_wav_data)\n", "result = my_model(embeddings).numpy()\n", @@ -689,9 +647,7 @@ "metadata": { "id": "QUVCI2Suunpw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class ReduceMeanLayer(tf.keras.layers.Layer):\n", " def __init__(self, axis=0, **kwargs):\n", @@ -708,9 +664,7 @@ "metadata": { "id": "zE_Npm0nzlwc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "saved_model_path = './dogs_and_cats_yamnet'\n", "\n", @@ -730,9 +684,7 @@ "metadata": { "id": "y-0bY5FMme1C" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf.keras.utils.plot_model(serving_model)" ] @@ -752,9 +704,7 @@ "metadata": { "id": "KkYVpJS72WWB" }, - "outputs": [ - - ], + "outputs": [], "source": [ "reloaded_model = tf.saved_model.load(saved_model_path)" ] @@ -774,9 +724,7 @@ "metadata": { "id": "xeXtD5HO28y-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "reloaded_results = reloaded_model(testing_wav_data)\n", "cat_or_dog = my_classes[tf.math.argmax(reloaded_results)]\n", @@ -798,9 +746,7 @@ "metadata": { "id": "ycC8zzDSUG2s" }, - "outputs": [ - - ], + "outputs": [], "source": [ "serving_results = reloaded_model.signatures['serving_default'](testing_wav_data)\n", "cat_or_dog = my_classes[tf.math.argmax(serving_results['classifier'])]\n", @@ -826,9 +772,7 @@ "metadata": { "id": "vDf5MASIIN1z" }, - "outputs": [ - - ], + "outputs": [], "source": [ "test_pd = filtered_pd.loc[filtered_pd['fold'] == 5]\n", "row = test_pd.sample(1)\n", @@ -847,9 +791,7 @@ "metadata": { "id": "eYUzFxYJIcE1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Run the model, check the output.\n", "scores, embeddings, spectrogram = yamnet_model(waveform)\n", @@ -884,9 +826,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "transfer_learning_audio.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/customization/custom_layers.ipynb b/site/ko/tutorials/customization/custom_layers.ipynb index a4e9f7059e..697848a154 100644 --- a/site/ko/tutorials/customization/custom_layers.ipynb +++ b/site/ko/tutorials/customization/custom_layers.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "JlknJBWQtKkI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -71,9 +69,7 @@ "metadata": { "id": "Py0m-N6VgQFJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf" ] @@ -84,9 +80,7 @@ "metadata": { "id": "TluWFcB_2nP5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(tf.config.list_physical_devices('GPU'))" ] @@ -112,9 +106,7 @@ "metadata": { "id": "8PyXlPl-4TzQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# In the tf.keras.layers package, layers are objects. To construct a layer,\n", "# simply construct the object. Most layers take as a first argument the number\n", @@ -141,9 +133,7 @@ "metadata": { "id": "E3XKNknP5Mhb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# To use a layer, simply call it.\n", "layer(tf.zeros([10, 5]))" @@ -155,9 +145,7 @@ "metadata": { "id": "Wt_Nsv-L5t2s" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Layers have many useful methods. For example, you can inspect all variables\n", "# in a layer using `layer.variables` and trainable variables using\n", @@ -172,9 +160,7 @@ "metadata": { "id": "6ilvKjz8_4MQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# The variables are also accessible through nice accessors\n", "layer.kernel, layer.bias" @@ -203,9 +189,7 @@ "metadata": { "id": "5Byl3n1k5kIy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class MyDenseLayer(tf.keras.layers.Layer):\n", " def __init__(self, num_outputs):\n", @@ -229,9 +213,7 @@ "metadata": { "id": "vrmBsYGOnuGO" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_ = layer(tf.zeros([10, 5])) # Calling the layer `.builds` it." ] @@ -242,9 +224,7 @@ "metadata": { "id": "1bsLjiPfnvat" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print([var.name for var in layer.trainable_variables])" ] @@ -281,9 +261,7 @@ "metadata": { "id": "N30DTXiRASlb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class ResnetIdentityBlock(tf.keras.Model):\n", " def __init__(self, kernel_size, filters):\n", @@ -324,9 +302,7 @@ "metadata": { "id": "7D8ZR5mqtokj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_ = block(tf.zeros([1, 2, 3, 3])) " ] @@ -337,9 +313,7 @@ "metadata": { "id": "MJ8rzFpdoE_m" }, - "outputs": [ - - ], + "outputs": [], "source": [ "block.layers" ] @@ -350,9 +324,7 @@ "metadata": { "id": "dewldLuDvQRM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "len(block.variables)" ] @@ -363,9 +335,7 @@ "metadata": { "id": "FrqIXeSetaYi" }, - "outputs": [ - - ], + "outputs": [], "source": [ "block.summary()" ] @@ -385,9 +355,7 @@ "metadata": { "id": "L9frk7Ur4uvJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "my_seq = tf.keras.Sequential([tf.keras.layers.Conv2D(1, (1, 1),\n", " input_shape=(\n", @@ -407,9 +375,7 @@ "metadata": { "id": "tVAsbFITuScB" }, - "outputs": [ - - ], + "outputs": [], "source": [ "my_seq.summary()" ] @@ -428,9 +394,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "custom_layers.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/distribute/dtensor_keras_tutorial.ipynb b/site/ko/tutorials/distribute/dtensor_keras_tutorial.ipynb index 0c817dd432..e48e1f4307 100644 --- a/site/ko/tutorials/distribute/dtensor_keras_tutorial.ipynb +++ b/site/ko/tutorials/distribute/dtensor_keras_tutorial.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "tuOe1ymfHZPu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -92,9 +90,7 @@ "metadata": { "id": "4dHik7NYA5vm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install --quiet --upgrade --pre tensorflow tensorflow-datasets" ] @@ -116,9 +112,7 @@ "metadata": { "id": "CodX6idGBGSm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "import tensorflow_datasets as tfds\n", @@ -131,9 +125,7 @@ "metadata": { "id": "aAtvrpasDpDD" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def configure_virtual_cpus(ncpu):\n", " phy_devices = tf.config.list_physical_devices('CPU')\n", @@ -164,9 +156,7 @@ "metadata": { "id": "9u85YypguL8N" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf.keras.backend.experimental.enable_tf_random_generator()\n", "tf.keras.utils.set_random_seed(1337)" @@ -193,9 +183,7 @@ "metadata": { "id": "6sT6s6z4j9H-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mesh = dtensor.create_mesh([(\"batch\", 8)], devices=devices)" ] @@ -215,9 +203,7 @@ "metadata": { "id": "U8OxvkDKE1Nu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "example_weight_layout = dtensor.Layout([dtensor.UNSHARDED, dtensor.UNSHARDED], mesh) # or\n", "example_weight_layout = dtensor.Layout.replicated(mesh, rank=2)" @@ -238,9 +224,7 @@ "metadata": { "id": "PhYp0EKBFfxt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "example_data_layout = dtensor.Layout(['batch', dtensor.UNSHARDED], mesh) # or\n", "example_data_layout = dtensor.Layout.batch_sharded(mesh, 'batch', rank=2)" @@ -267,9 +251,7 @@ "metadata": { "id": "Koc5GlA1tFXY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "unsharded_layout_2d = dtensor.Layout.replicated(mesh, 2)\n", "unsharded_layout_1d = dtensor.Layout.replicated(mesh, 1)" @@ -281,9 +263,7 @@ "metadata": { "id": "GfOGTIxGs5Ql" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = tf.keras.models.Sequential([\n", " tf.keras.layers.Flatten(input_shape=(28, 28)),\n", @@ -314,9 +294,7 @@ "metadata": { "id": "Z_nqv_VdwcXo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for weight in model.weights:\n", " print(f'Weight name: {weight.name} with layout: {weight.layout}')\n", @@ -340,9 +318,7 @@ "metadata": { "id": "zGt4kwltxOt4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "(ds_train, ds_test), ds_info = tfds.load(\n", " 'mnist',\n", @@ -359,9 +335,7 @@ "metadata": { "id": "HkUaOB_ryaLH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def normalize_img(image, label):\n", " \"\"\"Normalizes images: `uint8` -> `float32`.\"\"\"\n", @@ -374,9 +348,7 @@ "metadata": { "id": "Efm2H1iqydan" }, - "outputs": [ - - ], + "outputs": [], "source": [ "batch_size = 128\n", "\n", @@ -394,9 +366,7 @@ "metadata": { "id": "Lcrg6QAtyis4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ds_test = ds_test.map(\n", " normalize_img, num_parallel_calls=tf.data.AUTOTUNE)\n", @@ -424,9 +394,7 @@ "metadata": { "id": "CAx11gMjzzjs" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function\n", "def train_step(model, x, y, optimizer, metrics):\n", @@ -454,9 +422,7 @@ "metadata": { "id": "maSTWeRemO0P" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function\n", "def eval_step(model, x, y, metrics):\n", @@ -478,9 +444,7 @@ "metadata": { "id": "dt00axcLmvLr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def pack_dtensor_inputs(images, labels, image_layout, label_layout):\n", " num_local_devices = image_layout.mesh.num_local_devices()\n", @@ -512,9 +476,7 @@ "metadata": { "id": "1lu_0mz1sxrl" }, - "outputs": [ - - ], + "outputs": [], "source": [ "optimizer = tf.keras.dtensor.experimental.optimizers.Adam(0.01, mesh=mesh)\n", "metrics = {'accuracy': tf.keras.metrics.SparseCategoricalAccuracy(mesh=mesh)}\n", @@ -540,9 +502,7 @@ "metadata": { "id": "kZW568Dk0vvL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "num_epochs = 3\n", "\n", @@ -621,9 +581,7 @@ "metadata": { "id": "LZ0hRFs8unu0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class SubclassedModel(tf.keras.Model):\n", "\n", @@ -663,9 +621,7 @@ "metadata": { "id": "goVX6iIZw468" }, - "outputs": [ - - ], + "outputs": [], "source": [ "layout_map = tf.keras.dtensor.experimental.LayoutMap(mesh=mesh)\n", "\n", @@ -691,9 +647,7 @@ "metadata": { "id": "c3CbD9l7qUNq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "dtensor_input = dtensor.copy_to_mesh(tf.zeros((16, 16)), layout=unsharded_layout_2d)\n", "# Trigger the weights creation for subclass model\n", @@ -737,9 +691,7 @@ "metadata": { "id": "gXK2EquIRJCC" }, - "outputs": [ - - ], + "outputs": [], "source": [ "layout_map = tf.keras.dtensor.experimental.LayoutMap(mesh=mesh)\n", "\n", @@ -753,9 +705,7 @@ "metadata": { "id": "cBzwJqrg2TH3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "with layout_map.scope():\n", " inputs = tf.keras.Input((16,), batch_size=16)\n", @@ -773,9 +723,7 @@ "metadata": { "id": "pPuh1NlE3-wO" }, - "outputs": [ - - ], + "outputs": [], "source": [ "with layout_map.scope():\n", " model = tf.keras.Sequential([\n", diff --git a/site/ko/tutorials/distribute/dtensor_ml_tutorial.ipynb b/site/ko/tutorials/distribute/dtensor_ml_tutorial.ipynb index 5e19c36575..502ebb3f9f 100644 --- a/site/ko/tutorials/distribute/dtensor_ml_tutorial.ipynb +++ b/site/ko/tutorials/distribute/dtensor_ml_tutorial.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "tuOe1ymfHZPu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -102,9 +100,7 @@ "metadata": { "id": "-RKXLJN-7Yyb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install --quiet --upgrade --pre tensorflow tensorflow-datasets" ] @@ -126,9 +122,7 @@ "metadata": { "id": "dXcB26oP7dUd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tempfile\n", "import numpy as np\n", @@ -146,9 +140,7 @@ "metadata": { "id": "oHtO6MJLUXlz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def configure_virtual_cpus(ncpu):\n", " phy_devices = tf.config.list_physical_devices('CPU')\n", @@ -179,9 +171,7 @@ "metadata": { "id": "fW4w4QlFVHhx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_data = tfds.load('imdb_reviews', split='train', shuffle_files=True, batch_size=64)\n", "train_data" @@ -211,9 +201,7 @@ "metadata": { "id": "zNpxjku_57Lg" }, - "outputs": [ - - ], + "outputs": [], "source": [ "text_vectorization = tf.keras.layers.TextVectorization(output_mode='tf_idf', max_tokens=1200, output_sequence_length=None)\n", "text_vectorization.adapt(data=train_data.map(lambda x: x['text']))" @@ -225,9 +213,7 @@ "metadata": { "id": "q16bjngoVwQp" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def vectorize(features):\n", " return text_vectorization(features['text']), features['label']\n", @@ -287,9 +273,7 @@ "metadata": { "id": "VpKblz7Yb16G" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class Dense(tf.Module):\n", "\n", @@ -343,9 +327,7 @@ "metadata": { "id": "riBA9pfhlPFq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class BatchNorm(tf.Module):\n", "\n", @@ -375,9 +357,7 @@ "metadata": { "id": "unFcP99zprJj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def make_keras_bn(bn_layout):\n", " return tf.keras.layers.BatchNormalization(gamma_layout=bn_layout,\n", @@ -404,7 +384,6 @@ "id": "udFGAO-NrZw6" }, "source": [ - "\n", "\"비분산 \n" ] }, @@ -427,9 +406,7 @@ "metadata": { "id": "junyS-965opl" }, - "outputs": [ - - ], + "outputs": [], "source": [ "from typing import Tuple\n", "\n", @@ -466,9 +443,7 @@ "metadata": { "id": "wEZR7UlihsYX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class MLPStricter(tf.Module):\n", "\n", @@ -505,9 +480,7 @@ "metadata": { "id": "zOPuYeQwallh" }, - "outputs": [ - - ], + "outputs": [], "source": [ "WORLD = dtensor.create_mesh([(\"world\", 8)], devices=DEVICES)\n", "\n", @@ -542,9 +515,7 @@ "metadata": { "id": "3t5WvQR4Hvo4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def repack_local_tensor(x, layout):\n", " \"\"\"Repacks a local Tensor-like to a DTensor with layout.\n", @@ -619,9 +590,7 @@ "metadata": { "id": "C0IyOlxmeu4I" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mesh = dtensor.create_mesh([(\"batch\", 8)], devices=DEVICES)\n", "\n", @@ -648,9 +617,7 @@ "metadata": { "id": "8xMYkTpGocY8" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def repack_batch(x, y, mesh):\n", " x = repack_local_tensor(x, layout=dtensor.Layout(['batch', dtensor.UNSHARDED], mesh))\n", @@ -685,9 +652,7 @@ "metadata": { "id": "BwUFzLGDtQT6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Refer to the CTL (custom training loop guide)\n", "@tf.function\n", @@ -729,9 +694,7 @@ "metadata": { "id": "rsInFFJg7x9t" }, - "outputs": [ - - ], + "outputs": [], "source": [ "CHECKPOINT_DIR = tempfile.mkdtemp()\n", "\n", @@ -766,9 +729,7 @@ "metadata": { "id": "UaLn-vGZgqbS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "num_epochs = 2\n", "manager = start_checkpoint_manager(model)\n", @@ -814,9 +775,7 @@ "metadata": { "id": "5gZE9IT5Dzwl" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mesh = dtensor.create_mesh([(\"batch\", 4), (\"model\", 2)], devices=DEVICES)\n", "model = MLP([dtensor.Layout([dtensor.UNSHARDED, \"model\"], mesh), \n", @@ -838,9 +797,7 @@ "metadata": { "id": "dZf56ynbE_p1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def repack_batch(x, y, mesh):\n", " x = repack_local_tensor(x, layout=dtensor.Layout(['batch', dtensor.UNSHARDED], mesh))\n", @@ -865,9 +822,7 @@ "metadata": { "id": "LLC0wgii7EgA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "num_epochs = 2\n", "manager = start_checkpoint_manager(model)\n", @@ -914,9 +869,7 @@ "metadata": { "id": "jpc9mqURGpmK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mesh = dtensor.create_mesh([(\"batch\", 2), (\"feature\", 2), (\"model\", 2)], devices=DEVICES)\n", "model = MLP([dtensor.Layout([\"feature\", \"model\"], mesh), \n", @@ -938,9 +891,7 @@ "metadata": { "id": "DWR8qF6BGtFL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def repack_batch_for_spt(x, y, mesh):\n", " # Shard data on feature dimension, too\n", @@ -964,9 +915,7 @@ "metadata": { "id": "p3NnpHSKo-hx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "num_epochs = 2\n", "\n", @@ -1005,9 +954,7 @@ "metadata": { "id": "49HfIq_SJZoj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mesh = dtensor.create_mesh([(\"world\", 1)], devices=DEVICES[:1])\n", "mlp = MLP([dtensor.Layout([dtensor.UNSHARDED, dtensor.UNSHARDED], mesh), \n", @@ -1044,9 +991,7 @@ "metadata": { "id": "HG_ASSzR4IWW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "sample_batch = train_data.take(1).get_single_element()\n", "sample_batch" @@ -1058,9 +1003,7 @@ "metadata": { "id": "qW8yKPrhKQ5b" }, - "outputs": [ - - ], + "outputs": [], "source": [ "loaded = tf.saved_model.load(\"/tmp/saved_model\")\n", "\n", @@ -1074,9 +1017,7 @@ "metadata": { "id": "GahGbv0ZmkJb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "np.mean(tf.argmax(result, axis=-1) == sample_batch['label'])" ] @@ -1101,9 +1042,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "dtensor_ml_tutorial.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/distribute/multi_worker_with_estimator.ipynb b/site/ko/tutorials/distribute/multi_worker_with_estimator.ipynb index bbbd8d5c58..32e8f07db2 100644 --- a/site/ko/tutorials/distribute/multi_worker_with_estimator.ipynb +++ b/site/ko/tutorials/distribute/multi_worker_with_estimator.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "tuOe1ymfHZPu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -90,9 +88,7 @@ "metadata": { "id": "bnYxvfLD-LW-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow_datasets as tfds\n", "import tensorflow as tf\n", @@ -115,9 +111,7 @@ "metadata": { "id": "5dJ6UYrGDsVs" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf.compat.v1.disable_eager_execution()" ] @@ -139,9 +133,7 @@ "metadata": { "id": "dma_wUAxZqo2" }, - "outputs": [ - - ], + "outputs": [], "source": [ "BUFFER_SIZE = 10000\n", "BATCH_SIZE = 64\n", @@ -216,9 +208,7 @@ "metadata": { "id": "WNvOn_OeiUYC" }, - "outputs": [ - - ], + "outputs": [], "source": [ "LEARNING_RATE = 1e-4\n", "def model_fn(features, labels, mode):\n", @@ -276,9 +266,7 @@ "metadata": { "id": "1uFSHCJXMrQ-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "strategy = tf.distribute.experimental.MultiWorkerMirroredStrategy()" ] @@ -300,9 +288,7 @@ "metadata": { "id": "BcsuBYrpgnlS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "config = tf.estimator.RunConfig(train_distribute=strategy)\n", "\n", diff --git a/site/ko/tutorials/distribute/multi_worker_with_keras.ipynb b/site/ko/tutorials/distribute/multi_worker_with_keras.ipynb index c7eec7ac32..e44edbd6d7 100644 --- a/site/ko/tutorials/distribute/multi_worker_with_keras.ipynb +++ b/site/ko/tutorials/distribute/multi_worker_with_keras.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "tuOe1ymfHZPu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -106,9 +104,7 @@ "metadata": { "id": "bnYxvfLD-LW-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import json\n", "import os\n", @@ -132,9 +128,7 @@ "metadata": { "id": "rpEIVI5upIzM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"-1\"" ] @@ -154,9 +148,7 @@ "metadata": { "id": "WEJLYa2_7OZF" }, - "outputs": [ - - ], + "outputs": [], "source": [ "os.environ.pop('TF_CONFIG', None)" ] @@ -176,9 +168,7 @@ "metadata": { "id": "hPBuZUNSZmrQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "if '.' not in sys.path:\n", " sys.path.insert(0, '.')" @@ -199,9 +189,7 @@ "metadata": { "id": "-XqozLfzz30N" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install tf-nightly" ] @@ -221,9 +209,7 @@ "metadata": { "id": "vHNvttzV43sA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf" ] @@ -252,9 +238,7 @@ "metadata": { "id": "dma_wUAxZqo2" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%writefile mnist_setup.py\n", "\n", @@ -305,9 +289,7 @@ "metadata": { "id": "6Qe6iAf5O8iJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import mnist_setup\n", "\n", @@ -351,9 +333,7 @@ "metadata": { "id": "XK1eTYvSZiX7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf_config = {\n", " 'cluster': {\n", @@ -378,9 +358,7 @@ "metadata": { "id": "yY-T0YDQZjbu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "json.dumps(tf_config)" ] @@ -432,9 +410,7 @@ "metadata": { "id": "PH2gHn2_0_U8" }, - "outputs": [ - - ], + "outputs": [], "source": [ "os.environ['GREETINGS'] = 'Hello TensorFlow!'" ] @@ -454,9 +430,7 @@ "metadata": { "id": "pquKO6IA18G5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%bash\n", "echo ${GREETINGS}" @@ -495,9 +469,7 @@ "metadata": { "id": "1uFSHCJXMrQ-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "strategy = tf.distribute.MultiWorkerMirroredStrategy()" ] @@ -526,9 +498,7 @@ "metadata": { "id": "wo6b9wX65glL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "with strategy.scope():\n", " # Model building/compiling need to be within `strategy.scope()`.\n", @@ -561,9 +531,7 @@ "metadata": { "id": "BcsuBYrpgnlS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%writefile main.py\n", "\n", @@ -614,9 +582,7 @@ "metadata": { "id": "bi6x05Sr60O9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%bash\n", "ls *.py" @@ -637,9 +603,7 @@ "metadata": { "id": "9uu3g7vV7Bbt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "os.environ['TF_CONFIG'] = json.dumps(tf_config)" ] @@ -659,9 +623,7 @@ "metadata": { "id": "txMXaq8d8N_S" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# first kill any previous runs\n", "%killbgscripts" @@ -673,9 +635,7 @@ "metadata": { "id": "qnSma_Ck7r-r" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%bash --bg\n", "python main.py &> job_0.log" @@ -703,9 +663,7 @@ "metadata": { "id": "Hm2yrULE9281" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import time\n", "time.sleep(10)" @@ -726,9 +684,7 @@ "metadata": { "id": "vZEOuVgQ9-hn" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%bash\n", "cat job_0.log" @@ -758,9 +714,7 @@ "metadata": { "id": "lAiYkkPu_Jqd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf_config['task']['index'] = 1\n", "os.environ['TF_CONFIG'] = json.dumps(tf_config)" @@ -781,9 +735,7 @@ "metadata": { "id": "_ESVtyQ9_xjx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%bash\n", "python main.py" @@ -804,9 +756,7 @@ "metadata": { "id": "rc6hw3yTBKXX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%bash\n", "cat job_0.log" @@ -827,9 +777,7 @@ "metadata": { "id": "sG5_1UgrgniF" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Delete the `TF_CONFIG`, and kill any background tasks so they don't affect the next section.\n", "os.environ.pop('TF_CONFIG', None)\n", @@ -877,9 +825,7 @@ "metadata": { "id": "JxEtdh1vH-TF" }, - "outputs": [ - - ], + "outputs": [], "source": [ "options = tf.data.Options()\n", "options.experimental_distribute.auto_shard_policy = tf.data.experimental.AutoShardPolicy.OFF\n", @@ -1018,9 +964,7 @@ "metadata": { "id": "XQfGkmg-pfCY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model_path = '/tmp/keras-model'\n", "\n", @@ -1078,9 +1022,7 @@ "metadata": { "id": "J-yA3BYG_vTs" }, - "outputs": [ - - ], + "outputs": [], "source": [ "multi_worker_model.save(write_model_path)" ] @@ -1100,9 +1042,7 @@ "metadata": { "id": "aJTyu-97ABpY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "if not _is_chief(task_type, task_id):\n", " tf.io.gfile.rmtree(os.path.dirname(write_model_path))" @@ -1125,9 +1065,7 @@ "metadata": { "id": "iUZna-JKAOrX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "loaded_model = tf.keras.models.load_model(model_path)\n", "\n", @@ -1154,9 +1092,7 @@ "metadata": { "id": "_1-RYaB5xnNH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "checkpoint_dir = '/tmp/ckpt'\n", "\n", @@ -1181,9 +1117,7 @@ "metadata": { "id": "l1ZXG_GbWzLp" }, - "outputs": [ - - ], + "outputs": [], "source": [ "checkpoint_manager.save()\n", "if not _is_chief(task_type, task_id):\n", @@ -1205,9 +1139,7 @@ "metadata": { "id": "NJW7vtknXFEH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "latest_checkpoint = tf.train.latest_checkpoint(checkpoint_dir)\n", "checkpoint.restore(latest_checkpoint)\n", @@ -1245,9 +1177,7 @@ "metadata": { "id": "CYdzZi4Qs1jz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Multi-worker training with `MultiWorkerMirroredStrategy`\n", "# and the `BackupAndRestore` callback. The training state \n", @@ -1277,9 +1207,7 @@ "metadata": { "id": "rZjQGPsF0aEI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# The training state is backed up at epoch boundaries because `save_freq` is\n", "# set to `epoch`.\n", @@ -1310,9 +1238,7 @@ "metadata": { "id": "bSJUyLSF0moC" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# The training state is backed up at every 30 steps because `save_freq` is set\n", "# to an integer value of `30`.\n", diff --git a/site/ko/tutorials/distribute/save_and_load.ipynb b/site/ko/tutorials/distribute/save_and_load.ipynb index 9f54ab0550..bb2e25d4bb 100644 --- a/site/ko/tutorials/distribute/save_and_load.ipynb +++ b/site/ko/tutorials/distribute/save_and_load.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "CPSnXS88KFEo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -86,9 +84,7 @@ "metadata": { "id": "RWG5HchAiOrZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow_datasets as tfds\n", "\n", @@ -110,9 +106,7 @@ "metadata": { "id": "yrYiAf_ziRyw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mirrored_strategy = tf.distribute.MirroredStrategy()\n", "\n", @@ -167,9 +161,7 @@ "metadata": { "id": "zmGurbJmS_vN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = get_model()\n", "train_dataset, eval_dataset = get_data()\n", @@ -214,9 +206,7 @@ "metadata": { "id": "LYOStjV5knTQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "keras_model_path = '/tmp/keras_save.keras'\n", "model.save(keras_model_path)" @@ -237,9 +227,7 @@ "metadata": { "id": "WrXAAVtrzRgv" }, - "outputs": [ - - ], + "outputs": [], "source": [ "restored_keras_model = tf.keras.models.load_model(keras_model_path)\n", "restored_keras_model.fit(train_dataset, epochs=2)" @@ -262,9 +250,7 @@ "metadata": { "id": "wROPrJaAqBQz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "another_strategy = tf.distribute.OneDeviceStrategy('/cpu:0')\n", "with another_strategy.scope():\n", @@ -305,9 +291,7 @@ "metadata": { "id": "4y6T31APuCqK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = get_model() # get a fresh model\n", "saved_model_path = '/tmp/tf_save'\n", @@ -329,9 +313,7 @@ "metadata": { "id": "aaEKqBSPwAuM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "DEFAULT_FUNCTION_KEY = 'serving_default'\n", "loaded = tf.saved_model.load(saved_model_path)\n", @@ -353,9 +335,7 @@ "metadata": { "id": "5Ore5q8-UjW1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "predict_dataset = eval_dataset.map(lambda image, label: image)\n", "for batch in predict_dataset.take(1):\n", @@ -377,9 +357,7 @@ "metadata": { "id": "iDYvu12zYTmT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "another_strategy = tf.distribute.MirroredStrategy()\n", "with another_strategy.scope():\n", @@ -411,9 +389,7 @@ "metadata": { "id": "clfk3hQoyKu6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow_hub as hub\n", "\n", @@ -472,9 +448,7 @@ "metadata": { "id": "Ktwg2GwnXE8v" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = get_model()\n", "\n", @@ -511,9 +485,7 @@ "metadata": { "id": "jFcuzsI94bNA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = get_model()\n", "\n", @@ -553,9 +525,7 @@ "metadata": { "id": "gurSIbDFjOBc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class SubclassedModel(tf.keras.Model):\n", " \"\"\"Example model defined by subclassing `tf.keras.Model`.\"\"\"\n", @@ -594,9 +564,7 @@ "metadata": { "id": "064SE47mYDj8" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf.saved_model.save(my_model, saved_model_path)\n", "x = tf.saved_model.load(saved_model_path)\n", @@ -620,9 +588,7 @@ "metadata": { "id": "xAXise4eR0YJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(my_model.save_spec() is None)" ] @@ -642,9 +608,7 @@ "metadata": { "id": "cv5LTi0zDkKS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "BATCH_SIZE_PER_REPLICA = 4\n", "BATCH_SIZE = BATCH_SIZE_PER_REPLICA * mirrored_strategy.num_replicas_in_sync\n", @@ -664,9 +628,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "save_and_load.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/estimator/keras_model_to_estimator.ipynb b/site/ko/tutorials/estimator/keras_model_to_estimator.ipynb index 6db6f02885..23d025c11f 100644 --- a/site/ko/tutorials/estimator/keras_model_to_estimator.ipynb +++ b/site/ko/tutorials/estimator/keras_model_to_estimator.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "KsOkK8O69PyT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -50,10 +48,10 @@ "source": [ "\n", " \n", - " \n", " \n", - " \n", + " \n", "
TensorFlow.org에서 보기 Google Colab에서 실행하기\n", + " Google Colab에서 실행하기\n", "GitHub에서 소스 보기노트북 다운론드하기노트북 다운론드하기
" ] }, @@ -94,9 +92,7 @@ "metadata": { "id": "Qmq4FzaztASN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "\n", @@ -130,9 +126,7 @@ "metadata": { "id": "p5NSx38itD1a" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = tf.keras.models.Sequential([\n", " tf.keras.layers.Dense(16, activation='relu', input_shape=(4,)),\n", @@ -156,9 +150,7 @@ "metadata": { "id": "nViACuBDtVEC" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n", " optimizer='adam')\n", @@ -184,9 +176,7 @@ "metadata": { "id": "H0DpLEop_x0o" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def input_fn():\n", " split = tfds.Split.TRAIN\n", @@ -211,9 +201,7 @@ "metadata": { "id": "WO94bGYKBKRv" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for features_batch, labels_batch in input_fn().take(1):\n", " print(features_batch)\n", @@ -237,9 +225,7 @@ "metadata": { "id": "roChngg8t7il" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tempfile\n", "model_dir = tempfile.mkdtemp()\n", @@ -262,9 +248,7 @@ "metadata": { "id": "ouIkVtp9uAg5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "keras_estimator.train(input_fn=input_fn, steps=500)\n", "eval_result = keras_estimator.evaluate(input_fn=input_fn, steps=10)\n", @@ -274,9 +258,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "keras_model_to_estimator.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/generative/cvae.ipynb b/site/ko/tutorials/generative/cvae.ipynb index 9d1959b000..87d2c70ca9 100644 --- a/site/ko/tutorials/generative/cvae.ipynb +++ b/site/ko/tutorials/generative/cvae.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "MTKwbguKwT4R" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -82,9 +80,7 @@ "metadata": { "id": "P-JuIu2N_SQf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install tensorflow-probability\n", "\n", @@ -99,9 +95,7 @@ "metadata": { "id": "YfIk2es3hJEd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "from IPython import display\n", "\n", @@ -132,9 +126,7 @@ "metadata": { "id": "a4fYMGxGhrna" }, - "outputs": [ - - ], + "outputs": [], "source": [ "(train_images, _), (test_images, _) = tf.keras.datasets.mnist.load_data()" ] @@ -145,9 +137,7 @@ "metadata": { "id": "NFC2ghIdiZYE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def preprocess_images(images):\n", " images = images.reshape((images.shape[0], 28, 28, 1)) / 255.\n", @@ -163,9 +153,7 @@ "metadata": { "id": "S4PIDhoDLbsZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_size = 60000\n", "batch_size = 32\n", @@ -187,9 +175,7 @@ "metadata": { "id": "-yKCCQOoJ7cn" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_dataset = (tf.data.Dataset.from_tensor_slices(train_images)\n", " .shuffle(train_size).batch(batch_size))\n", @@ -238,9 +224,7 @@ "metadata": { "id": "VGLbvBEmjK0a" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class CVAE(tf.keras.Model):\n", " \"\"\"Convolutional variational autoencoder.\"\"\"\n", @@ -325,9 +309,7 @@ "metadata": { "id": "iWCn_PVdEJZ7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "optimizer = tf.keras.optimizers.Adam(1e-4)\n", "\n", @@ -391,9 +373,7 @@ "metadata": { "id": "NS2GWywBbAWo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "epochs = 10\n", "# set the dimensionality of the latent space to a plane for visualization later\n", @@ -413,9 +393,7 @@ "metadata": { "id": "RmdVsmvhPxyy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def generate_and_save_images(model, epoch, test_sample):\n", " mean, logvar = model.encode(test_sample)\n", @@ -439,9 +417,7 @@ "metadata": { "id": "swCyrbqQQ-Ri" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Pick a sample of the test set for generating output images\n", "assert batch_size >= num_examples_to_generate\n", @@ -455,9 +431,7 @@ "metadata": { "id": "2M7LmLtGEMQJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "generate_and_save_images(model, 0, test_sample)\n", "\n", @@ -492,9 +466,7 @@ "metadata": { "id": "WfO5wCdclHGL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def display_image(epoch_no):\n", " return PIL.Image.open('image_at_epoch_{:04d}.png'.format(epoch_no))" @@ -506,9 +478,7 @@ "metadata": { "id": "5x3q9_Oe5q0A" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plt.imshow(display_image(epoch))\n", "plt.axis('off') # Display images" @@ -529,9 +499,7 @@ "metadata": { "id": "IGKQgENQ8lEI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "anim_file = 'cvae.gif'\n", "\n", @@ -551,9 +519,7 @@ "metadata": { "id": "2ZqAEtdqUmJF" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow_docs.vis.embed as embed\n", "embed.embed_file(anim_file)" @@ -577,9 +543,7 @@ "cellView": "code", "id": "mNcaaYPBS3mj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def plot_latent_images(model, n, digit_size=28):\n", " \"\"\"Plots n x n digit images decoded from the latent space.\"\"\"\n", @@ -611,9 +575,7 @@ "metadata": { "id": "F-ZG69QCZnGY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plot_latent_images(model, 20)" ] @@ -645,9 +607,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "cvae.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/generative/cyclegan.ipynb b/site/ko/tutorials/generative/cyclegan.ipynb index a774bbd596..7280c29ae2 100644 --- a/site/ko/tutorials/generative/cyclegan.ipynb +++ b/site/ko/tutorials/generative/cyclegan.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "qmkj-80IHxnd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -97,9 +95,7 @@ "metadata": { "id": "bJ1ROiQxJ-vY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install git+https://github.com/tensorflow/examples.git" ] @@ -110,9 +106,7 @@ "metadata": { "id": "lhSsUx9Nyb3t" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf" ] @@ -123,9 +117,7 @@ "metadata": { "id": "YfIk2es3hJEd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow_datasets as tfds\n", "from tensorflow_examples.models.pix2pix import pix2pix\n", @@ -162,9 +154,7 @@ "metadata": { "id": "iuGVPOo7Cce0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "dataset, metadata = tfds.load('cycle_gan/horse2zebra',\n", " with_info=True, as_supervised=True)\n", @@ -179,9 +169,7 @@ "metadata": { "id": "2CbTEt448b4R" }, - "outputs": [ - - ], + "outputs": [], "source": [ "BUFFER_SIZE = 1000\n", "BATCH_SIZE = 1\n", @@ -195,9 +183,7 @@ "metadata": { "id": "Yn3IwqhiIszt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def random_crop(image):\n", " cropped_image = tf.image.random_crop(\n", @@ -212,9 +198,7 @@ "metadata": { "id": "muhR2cgbLKWW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# normalizing the images to [-1, 1]\n", "def normalize(image):\n", @@ -229,9 +213,7 @@ "metadata": { "id": "fVQOjcPVLrUc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def random_jitter(image):\n", " # resizing to 286 x 286 x 3\n", @@ -253,9 +235,7 @@ "metadata": { "id": "tyaP4hLJ8b4W" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def preprocess_image_train(image, label):\n", " image = random_jitter(image)\n", @@ -269,9 +249,7 @@ "metadata": { "id": "VB3Z6D_zKSru" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def preprocess_image_test(image, label):\n", " image = normalize(image)\n", @@ -284,9 +262,7 @@ "metadata": { "id": "RsajGXxd5JkZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_horses = train_horses.cache().map(\n", " preprocess_image_train, num_parallel_calls=AUTOTUNE).shuffle(\n", @@ -311,9 +287,7 @@ "metadata": { "id": "e3MhJ3zVLPan" }, - "outputs": [ - - ], + "outputs": [], "source": [ "sample_horse = next(iter(train_horses))\n", "sample_zebra = next(iter(train_zebras))" @@ -325,9 +299,7 @@ "metadata": { "id": "4pOYjMk_KfIB" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plt.subplot(121)\n", "plt.title('Horse')\n", @@ -344,9 +316,7 @@ "metadata": { "id": "0KJyB9ENLb2y" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plt.subplot(121)\n", "plt.title('Zebra')\n", @@ -395,9 +365,7 @@ "metadata": { "id": "8ju9Wyw87MRW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "OUTPUT_CHANNELS = 3\n", "\n", @@ -414,9 +382,7 @@ "metadata": { "id": "wDaGZ3WpZUyw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "to_zebra = generator_g(sample_horse)\n", "to_horse = generator_f(sample_zebra)\n", @@ -442,9 +408,7 @@ "metadata": { "id": "O5MhJmxyZiy9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plt.figure(figsize=(8, 8))\n", "\n", @@ -485,9 +449,7 @@ "metadata": { "id": "cyhxTuvJyIHV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "LAMBDA = 10" ] @@ -498,9 +460,7 @@ "metadata": { "id": "Q1Xbz5OaLj5C" }, - "outputs": [ - - ], + "outputs": [], "source": [ "loss_obj = tf.keras.losses.BinaryCrossentropy(from_logits=True)" ] @@ -511,9 +471,7 @@ "metadata": { "id": "wkMNfBWlT-PV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def discriminator_loss(real, generated):\n", " real_loss = loss_obj(tf.ones_like(real), real)\n", @@ -531,9 +489,7 @@ "metadata": { "id": "90BIcCKcDMxz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def generator_loss(generated):\n", " return loss_obj(tf.ones_like(generated), generated)" @@ -566,9 +522,7 @@ "metadata": { "id": "NMpVGj_sW6Vo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def calc_cycle_loss(real_image, cycled_image):\n", " loss1 = tf.reduce_mean(tf.abs(real_image - cycled_image))\n", @@ -595,9 +549,7 @@ "metadata": { "id": "05ywEH680Aud" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def identity_loss(real_image, same_image):\n", " loss = tf.reduce_mean(tf.abs(real_image - same_image))\n", @@ -619,9 +571,7 @@ "metadata": { "id": "iWCn_PVdEJZ7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "generator_g_optimizer = tf.keras.optimizers.Adam(2e-4, beta_1=0.5)\n", "generator_f_optimizer = tf.keras.optimizers.Adam(2e-4, beta_1=0.5)\n", @@ -645,9 +595,7 @@ "metadata": { "id": "WJnftd5sQsv6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "checkpoint_path = \"./checkpoints/train\"\n", "\n", @@ -685,9 +633,7 @@ "metadata": { "id": "NS2GWywBbAWo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "EPOCHS = 10" ] @@ -698,9 +644,7 @@ "metadata": { "id": "RmdVsmvhPxyy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def generate_images(model, test_input):\n", " prediction = model(test_input)\n", @@ -739,9 +683,7 @@ "metadata": { "id": "KBKUV2sKXDbY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function\n", "def train_step(real_x, real_y):\n", @@ -811,9 +753,7 @@ "metadata": { "id": "2M7LmLtGEMQJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for epoch in range(EPOCHS):\n", " start = time.time()\n", @@ -854,9 +794,7 @@ "metadata": { "id": "KUgSnmy2nqSP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Run the trained model on the test dataset\n", "for inp in test_horses.take(5):\n", @@ -880,9 +818,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "cyclegan.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/generative/dcgan.ipynb b/site/ko/tutorials/generative/dcgan.ipynb index ba3a546f8d..dafdfbf860 100644 --- a/site/ko/tutorials/generative/dcgan.ipynb +++ b/site/ko/tutorials/generative/dcgan.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "V_sgB_5dx1f1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -103,9 +101,7 @@ "metadata": { "id": "WZKbyU2-AiY-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf" ] @@ -116,9 +112,7 @@ "metadata": { "id": "wx-zNbLqB4K8" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf.__version__" ] @@ -129,9 +123,7 @@ "metadata": { "id": "YzTlj4YdCip_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# To generate GIFs\n", "!pip install imageio\n", @@ -144,9 +136,7 @@ "metadata": { "id": "YfIk2es3hJEd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import glob\n", "import imageio\n", @@ -177,9 +167,7 @@ "metadata": { "id": "a4fYMGxGhrna" }, - "outputs": [ - - ], + "outputs": [], "source": [ "(train_images, train_labels), (_, _) = tf.keras.datasets.mnist.load_data()" ] @@ -190,9 +178,7 @@ "metadata": { "id": "NFC2ghIdiZYE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_images = train_images.reshape(train_images.shape[0], 28, 28, 1).astype('float32')\n", "train_images = (train_images - 127.5) / 127.5 # Normalize the images to [-1, 1]" @@ -204,9 +190,7 @@ "metadata": { "id": "S4PIDhoDLbsZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "BUFFER_SIZE = 60000\n", "BATCH_SIZE = 256" @@ -218,9 +202,7 @@ "metadata": { "id": "-yKCCQOoJ7cn" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Batch and shuffle the data\n", "train_dataset = tf.data.Dataset.from_tensor_slices(train_images).shuffle(BUFFER_SIZE).batch(BATCH_SIZE)" @@ -254,9 +236,7 @@ "metadata": { "id": "6bpTcDqoLWjY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def make_generator_model():\n", " model = tf.keras.Sequential()\n", @@ -298,9 +278,7 @@ "metadata": { "id": "gl7jcC7TdPTG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "generator = make_generator_model()\n", "\n", @@ -327,9 +305,7 @@ "metadata": { "id": "dw2tPLmk2pEP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def make_discriminator_model():\n", " model = tf.keras.Sequential()\n", @@ -363,9 +339,7 @@ "metadata": { "id": "gDkA05NE6QMs" }, - "outputs": [ - - ], + "outputs": [], "source": [ "discriminator = make_discriminator_model()\n", "decision = discriminator(generated_image)\n", @@ -389,9 +363,7 @@ "metadata": { "id": "psQfmXxYKU3X" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# This method returns a helper function to compute cross entropy loss\n", "cross_entropy = tf.keras.losses.BinaryCrossentropy(from_logits=True)" @@ -414,9 +386,7 @@ "metadata": { "id": "wkMNfBWlT-PV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def discriminator_loss(real_output, fake_output):\n", " real_loss = cross_entropy(tf.ones_like(real_output), real_output)\n", @@ -442,9 +412,7 @@ "metadata": { "id": "90BIcCKcDMxz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def generator_loss(fake_output):\n", " return cross_entropy(tf.ones_like(fake_output), fake_output)" @@ -465,9 +433,7 @@ "metadata": { "id": "iWCn_PVdEJZ7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "generator_optimizer = tf.keras.optimizers.Adam(1e-4)\n", "discriminator_optimizer = tf.keras.optimizers.Adam(1e-4)" @@ -490,9 +456,7 @@ "metadata": { "id": "CA1w-7s2POEy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "checkpoint_dir = './training_checkpoints'\n", "checkpoint_prefix = os.path.join(checkpoint_dir, \"ckpt\")\n", @@ -517,9 +481,7 @@ "metadata": { "id": "NS2GWywBbAWo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "EPOCHS = 50\n", "noise_dim = 100\n", @@ -545,9 +507,7 @@ "metadata": { "id": "3t5ibNo05jCB" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Notice the use of `tf.function`\n", "# This annotation causes the function to be \"compiled\".\n", @@ -577,9 +537,7 @@ "metadata": { "id": "2M7LmLtGEMQJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def train(dataset, epochs):\n", " for epoch in range(epochs):\n", @@ -622,9 +580,7 @@ "metadata": { "id": "RmdVsmvhPxyy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def generate_and_save_images(model, epoch, test_input):\n", " # Notice `training` is set to False.\n", @@ -661,9 +617,7 @@ "metadata": { "id": "Ly3UN0SLLY2l" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train(train_dataset, EPOCHS)" ] @@ -683,9 +637,7 @@ "metadata": { "id": "XhXsd0srPo8c" }, - "outputs": [ - - ], + "outputs": [], "source": [ "checkpoint.restore(tf.train.latest_checkpoint(checkpoint_dir))" ] @@ -705,9 +657,7 @@ "metadata": { "id": "WfO5wCdclHGL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Display a single image using the epoch number\n", "def display_image(epoch_no):\n", @@ -720,9 +670,7 @@ "metadata": { "id": "5x3q9_Oe5q0A" }, - "outputs": [ - - ], + "outputs": [], "source": [ "display_image(EPOCHS)" ] @@ -742,9 +690,7 @@ "metadata": { "id": "IGKQgENQ8lEI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "anim_file = 'dcgan.gif'\n", "\n", @@ -764,9 +710,7 @@ "metadata": { "id": "ZBwyU6t2Wf3g" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow_docs.vis.embed as embed\n", "embed.embed_file(anim_file)" @@ -794,9 +738,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "dcgan.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/generative/deepdream.ipynb b/site/ko/tutorials/generative/deepdream.ipynb index 03165036c4..cbef5e1e4c 100644 --- a/site/ko/tutorials/generative/deepdream.ipynb +++ b/site/ko/tutorials/generative/deepdream.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "k7gifg92NbG9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -79,9 +77,7 @@ "metadata": { "id": "Sc5Yq_Rgxreb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf" ] @@ -92,9 +88,7 @@ "metadata": { "id": "g_Qp173_NbG5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import numpy as np\n", "\n", @@ -128,9 +122,7 @@ "metadata": { "id": "0lclzk9sNbG2" }, - "outputs": [ - - ], + "outputs": [], "source": [ "url = 'https://storage.googleapis.com/download.tensorflow.org/example_images/YellowLabradorLooking_new.jpg'" ] @@ -141,9 +133,7 @@ "metadata": { "id": "Y5BPgc8NNbG0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Download an image and read it into a NumPy array.\n", "def download(url, max_dim=None):\n", @@ -194,9 +184,7 @@ "metadata": { "id": "GlLi48GKNbGy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "base_model = tf.keras.applications.InceptionV3(include_top=False, weights='imagenet')" ] @@ -225,9 +213,7 @@ "metadata": { "id": "08KB502ONbGt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Maximize the activations of these layers\n", "names = ['mixed3', 'mixed5']\n", @@ -254,9 +240,7 @@ "metadata": { "id": "8MhfSweXXiuq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def calc_loss(img, model):\n", " # Pass forward the image through the model to retrieve the activations.\n", @@ -295,9 +279,7 @@ "metadata": { "id": "qRScWg_VNqvj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class DeepDream(tf.Module):\n", " def __init__(self, model):\n", @@ -339,9 +321,7 @@ "metadata": { "id": "yB9pTqn6xfuK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "deepdream = DeepDream(dream_model)" ] @@ -361,9 +341,7 @@ "metadata": { "id": "9vHEcy7dTysi" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def run_deep_dream_simple(img, steps=100, step_size=0.01):\n", " # Convert from uint8 to the range expected by the model.\n", @@ -400,9 +378,7 @@ "metadata": { "id": "tEfd00rr0j8Z" }, - "outputs": [ - - ], + "outputs": [], "source": [ "dream_img = run_deep_dream_simple(img=original_img, \n", " steps=100, step_size=0.01)" @@ -433,9 +409,7 @@ "metadata": { "id": "0eGDSdatLT-8" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import time\n", "start = time.time()\n", @@ -485,9 +459,7 @@ "metadata": { "id": "oGgLHk7o80ac" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def random_roll(img, maxroll):\n", " # Randomly shift the image to avoid tiled boundaries.\n", @@ -502,9 +474,7 @@ "metadata": { "id": "sKsiqWfA9H41" }, - "outputs": [ - - ], + "outputs": [], "source": [ "shift, img_rolled = random_roll(np.array(original_img), 512)\n", "show(img_rolled)" @@ -525,9 +495,7 @@ "metadata": { "id": "x__TZ0uqNbGm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class TiledGradients(tf.Module):\n", " def __init__(self, model):\n", @@ -583,9 +551,7 @@ "metadata": { "id": "Vcq4GubA2e5J" }, - "outputs": [ - - ], + "outputs": [], "source": [ "get_tiled_gradients = TiledGradients(dream_model)" ] @@ -605,9 +571,7 @@ "metadata": { "id": "gA-15DM4NbGk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def run_deep_dream_with_octaves(img, steps_per_octave=100, step_size=0.01, \n", " octaves=range(-2,3), octave_scale=1.3):\n", @@ -643,9 +607,7 @@ "metadata": { "id": "T7PbRLV74RrU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "img = run_deep_dream_with_octaves(img=original_img, step_size=0.01)\n", "\n", @@ -670,9 +632,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "deepdream.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/generative/style_transfer.ipynb b/site/ko/tutorials/generative/style_transfer.ipynb index 832a42c71b..326562baa2 100644 --- a/site/ko/tutorials/generative/style_transfer.ipynb +++ b/site/ko/tutorials/generative/style_transfer.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "2pHVBk_seED1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -127,9 +125,7 @@ "metadata": { "id": "NyftRTSMuwue" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import os\n", "import tensorflow as tf\n", @@ -143,9 +139,7 @@ "metadata": { "id": "sc1OLbOWhPCO" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import IPython.display as display\n", "\n", @@ -166,9 +160,7 @@ "metadata": { "id": "GM6VEGrGLh62" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def tensor_to_image(tensor):\n", " tensor = tensor*255\n", @@ -194,9 +186,7 @@ "metadata": { "id": "wqc0OJHwyFAk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "content_path = tf.keras.utils.get_file('YellowLabradorLooking_new.jpg', 'https://storage.googleapis.com/download.tensorflow.org/example_images/YellowLabradorLooking_new.jpg')\n", "style_path = tf.keras.utils.get_file('kandinsky5.jpg','https://storage.googleapis.com/download.tensorflow.org/example_images/Vassily_Kandinsky%2C_1913_-_Composition_7.jpg')" @@ -226,9 +216,7 @@ "metadata": { "id": "3TLljcwv5qZs" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def load_img(path_to_img):\n", " max_dim = 512\n", @@ -262,9 +250,7 @@ "metadata": { "id": "cBX-eNT8PAK_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def imshow(image, title=None):\n", " if len(image.shape) > 3:\n", @@ -281,9 +267,7 @@ "metadata": { "id": "_UWQmeEaiKkP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "content_image = load_img(content_path)\n", "style_image = load_img(style_path)\n", @@ -312,9 +296,7 @@ "metadata": { "id": "iYSLexgRKSh-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow_hub as hub\n", "hub_model = hub.load('https://tfhub.dev/google/magenta/arbitrary-image-stylization-v1-256/2')\n", @@ -348,9 +330,7 @@ "metadata": { "id": "fMbzrr7BCTq0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "x = tf.keras.applications.vgg19.preprocess_input(content_image*255)\n", "x = tf.image.resize(x, (224, 224))\n", @@ -365,9 +345,7 @@ "metadata": { "id": "1_FyCm0dYnvl" }, - "outputs": [ - - ], + "outputs": [], "source": [ "predicted_top_5 = tf.keras.applications.vgg19.decode_predictions(prediction_probabilities.numpy())[0]\n", "[(class_name, prob) for (number, class_name, prob) in predicted_top_5]" @@ -388,9 +366,7 @@ "metadata": { "id": "Yh_AV6220ebD" }, - "outputs": [ - - ], + "outputs": [], "source": [ "vgg = tf.keras.applications.VGG19(include_top=False, weights='imagenet')\n", "\n", @@ -414,9 +390,7 @@ "metadata": { "id": "ArfX_6iA0WAX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "content_layers = ['block5_conv2'] \n", "\n", @@ -468,9 +442,7 @@ "metadata": { "id": "nfec6MuMAbPx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def vgg_layers(layer_names):\n", " \"\"\" Creates a VGG model that returns a list of intermediate output values.\"\"\"\n", @@ -499,9 +471,7 @@ "metadata": { "id": "LkyvPpBHSfVi" }, - "outputs": [ - - ], + "outputs": [], "source": [ "style_extractor = vgg_layers(style_layers)\n", "style_outputs = style_extractor(style_image*255)\n", @@ -539,9 +509,7 @@ "metadata": { "id": "HAy1iGPdoEpZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def gram_matrix(input_tensor):\n", " result = tf.linalg.einsum('bijc,bijd->bcd', input_tensor, input_tensor)\n", @@ -574,9 +542,7 @@ "metadata": { "id": "Sr6QALY-I1ja" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class StyleContentModel(tf.keras.models.Model):\n", " def __init__(self, style_layers, content_layers):\n", @@ -624,9 +590,7 @@ "metadata": { "id": "rkjO-DoNDU0A" }, - "outputs": [ - - ], + "outputs": [], "source": [ "extractor = StyleContentModel(style_layers, content_layers)\n", "\n", @@ -669,9 +633,7 @@ "metadata": { "id": "PgkNOnGUFcKa" }, - "outputs": [ - - ], + "outputs": [], "source": [ "style_targets = extractor(style_image)['style']\n", "content_targets = extractor(content_image)['content']" @@ -692,9 +654,7 @@ "metadata": { "id": "J0vKxF8ZO6G8" }, - "outputs": [ - - ], + "outputs": [], "source": [ "image = tf.Variable(content_image)" ] @@ -714,9 +674,7 @@ "metadata": { "id": "kdgpTJwL_vE2" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def clip_0_1(image):\n", " return tf.clip_by_value(image, clip_value_min=0.0, clip_value_max=1.0)" @@ -737,9 +695,7 @@ "metadata": { "id": "r4XZjqUk_5Eu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "opt = tf.keras.optimizers.Adam(learning_rate=0.02, beta_1=0.99, epsilon=1e-1)" ] @@ -759,9 +715,7 @@ "metadata": { "id": "Dt4pxarvA4I4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "style_weight=1e-2\n", "content_weight=1e4" @@ -773,9 +727,7 @@ "metadata": { "id": "0ggx2Na8oROH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def style_content_loss(outputs):\n", " style_outputs = outputs['style']\n", @@ -806,9 +758,7 @@ "metadata": { "id": "0t0umkajFIuh" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function()\n", "def train_step(image):\n", @@ -836,9 +786,7 @@ "metadata": { "id": "Y542mxi-O2a2" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_step(image)\n", "train_step(image)\n", @@ -861,9 +809,7 @@ "metadata": { "id": "rQW1tXYoLbUS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import time\n", "start = time.time()\n", @@ -902,9 +848,7 @@ "metadata": { "id": "7szUUybCQMB3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def high_pass_x_y(image):\n", " x_var = image[:, :, 1:, :] - image[:, :, :-1, :]\n", @@ -919,9 +863,7 @@ "metadata": { "id": "Atc2oL29PXu_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "x_deltas, y_deltas = high_pass_x_y(content_image)\n", "\n", @@ -958,9 +900,7 @@ "metadata": { "id": "HyvqCiywiUfL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plt.figure(figsize=(14, 10))\n", "\n", @@ -986,9 +926,7 @@ "metadata": { "id": "mP-92lXMIYPn" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def total_variation_loss(image):\n", " x_deltas, y_deltas = high_pass_x_y(image)\n", @@ -1001,9 +939,7 @@ "metadata": { "id": "s4OYBUX2KQ25" }, - "outputs": [ - - ], + "outputs": [], "source": [ "total_variation_loss(image).numpy()" ] @@ -1023,9 +959,7 @@ "metadata": { "id": "YQjWW04NKLfJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf.image.total_variation(image).numpy()" ] @@ -1047,9 +981,7 @@ "metadata": { "id": "tGeRLD4GoAd4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "total_variation_weight=30" ] @@ -1069,9 +1001,7 @@ "metadata": { "id": "BzmfcyyYUyWq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "@tf.function()\n", "def train_step(image):\n", @@ -1100,9 +1030,7 @@ "metadata": { "id": "a-dPRr8BqexB" }, - "outputs": [ - - ], + "outputs": [], "source": [ "opt = tf.keras.optimizers.Adam(learning_rate=0.02, beta_1=0.99, epsilon=1e-1)\n", "image = tf.Variable(content_image)" @@ -1123,9 +1051,7 @@ "metadata": { "id": "q3Cc3bLtoOWy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import time\n", "start = time.time()\n", @@ -1162,9 +1088,7 @@ "metadata": { "id": "SSH6OpyyQn7w" }, - "outputs": [ - - ], + "outputs": [], "source": [ "file_name = 'stylized-image.png'\n", "tensor_to_image(image).save(file_name)\n", @@ -1192,9 +1116,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "style_transfer.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/images/classification.ipynb b/site/ko/tutorials/images/classification.ipynb index 496000b489..5601fd3ba2 100644 --- a/site/ko/tutorials/images/classification.ipynb +++ b/site/ko/tutorials/images/classification.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "1z4xy2gTUc4a" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -96,9 +94,7 @@ "metadata": { "id": "L1WtoaOHVrVh" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", @@ -143,9 +139,7 @@ "metadata": { "id": "57CcilYSG0zv" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import pathlib\n", "\n", @@ -169,9 +163,7 @@ "metadata": { "id": "SbtTDYhOHZb6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "image_count = len(list(data_dir.glob('*/*.jpg')))\n", "print(image_count)" @@ -192,9 +184,7 @@ "metadata": { "id": "N1loMlbYHeiJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "roses = list(data_dir.glob('roses/*'))\n", "PIL.Image.open(str(roses[0]))" @@ -206,9 +196,7 @@ "metadata": { "id": "RQbZBOTLHiUP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "PIL.Image.open(str(roses[1]))" ] @@ -228,9 +216,7 @@ "metadata": { "id": "HyQkfPGdHilw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tulips = list(data_dir.glob('tulips/*'))\n", "PIL.Image.open(str(tulips[0]))" @@ -242,9 +228,7 @@ "metadata": { "id": "wtlhWJPAHivf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "PIL.Image.open(str(tulips[1]))" ] @@ -284,9 +268,7 @@ "metadata": { "id": "H74l2DoDI2XD" }, - "outputs": [ - - ], + "outputs": [], "source": [ "batch_size = 32\n", "img_height = 180\n", @@ -308,9 +290,7 @@ "metadata": { "id": "fIR0kRZiI_AT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_ds = tf.keras.utils.image_dataset_from_directory(\n", " data_dir,\n", @@ -327,9 +307,7 @@ "metadata": { "id": "iscU3UoVJBXj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "val_ds = tf.keras.utils.image_dataset_from_directory(\n", " data_dir,\n", @@ -355,9 +333,7 @@ "metadata": { "id": "ZHAxkHX5JD3k" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class_names = train_ds.class_names\n", "print(class_names)" @@ -380,9 +356,7 @@ "metadata": { "id": "wBmEA9c0JYes" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "\n", @@ -410,9 +384,7 @@ "metadata": { "id": "2-MfMoenJi8s" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for image_batch, labels_batch in train_ds:\n", " print(image_batch.shape)\n", @@ -453,9 +425,7 @@ "metadata": { "id": "nOjJSm7DKoZA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "AUTOTUNE = tf.data.AUTOTUNE\n", "\n", @@ -489,9 +459,7 @@ "metadata": { "id": "PEYxo2CTJvY9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "normalization_layer = layers.Rescaling(1./255)" ] @@ -511,9 +479,7 @@ "metadata": { "id": "X9o9ESaJJ502" }, - "outputs": [ - - ], + "outputs": [], "source": [ "normalized_ds = train_ds.map(lambda x, y: (normalization_layer(x), y))\n", "image_batch, labels_batch = next(iter(normalized_ds))\n", @@ -559,9 +525,7 @@ "metadata": { "id": "QR6argA1K074" }, - "outputs": [ - - ], + "outputs": [], "source": [ "num_classes = len(class_names)\n", "\n", @@ -596,9 +560,7 @@ "metadata": { "id": "jloGNS1MLx3A" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.compile(optimizer='adam',\n", " loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n", @@ -622,9 +584,7 @@ "metadata": { "id": "llLYH-BXL7Xe" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.summary()" ] @@ -653,9 +613,7 @@ "metadata": { "id": "5fWToCqYMErH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "epochs=10\n", "history = model.fit(\n", @@ -689,9 +647,7 @@ "metadata": { "id": "jWnopEChMMCn" }, - "outputs": [ - - ], + "outputs": [], "source": [ "acc = history.history['accuracy']\n", "val_acc = history.history['val_accuracy']\n", @@ -775,9 +731,7 @@ "metadata": { "id": "9J80BAbIMs21" }, - "outputs": [ - - ], + "outputs": [], "source": [ "data_augmentation = keras.Sequential(\n", " [\n", @@ -806,9 +760,7 @@ "metadata": { "id": "7Z90k539S838" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plt.figure(figsize=(10, 10))\n", "for images, _ in train_ds.take(1):\n", @@ -849,9 +801,7 @@ "metadata": { "id": "2Zeg8zsqXCsm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = Sequential([\n", " data_augmentation,\n", @@ -884,9 +834,7 @@ "metadata": { "id": "EvyAINs9ZOmJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.compile(optimizer='adam',\n", " loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n", @@ -899,9 +847,7 @@ "metadata": { "id": "wWLkKoKjZSoC" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.summary()" ] @@ -912,9 +858,7 @@ "metadata": { "id": "LWS-vvNaZDag" }, - "outputs": [ - - ], + "outputs": [], "source": [ "epochs = 15\n", "history = model.fit(\n", @@ -941,9 +885,7 @@ "metadata": { "id": "dduoLfKsZVIA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "acc = history.history['accuracy']\n", "val_acc = history.history['val_accuracy']\n", @@ -1001,9 +943,7 @@ "metadata": { "id": "dC40sRITBSsQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "sunflower_url = \"https://storage.googleapis.com/download.tensorflow.org/example_images/592px-Red_sunflower.jpg\"\n", "sunflower_path = tf.keras.utils.get_file('Red_sunflower', origin=sunflower_url)\n", @@ -1053,9 +993,7 @@ "metadata": { "id": "mXo6ftuL2ufx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Convert the model.\n", "converter = tf.lite.TFLiteConverter.from_keras_model(model)\n", @@ -1094,9 +1032,7 @@ "metadata": { "id": "cHYcip_FOaHq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "TF_MODEL_FILE_PATH = 'model.tflite' # The default path to the saved TensorFlow Lite model\n", "\n", @@ -1118,9 +1054,7 @@ "metadata": { "id": "ZdDl00E2OaHq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "interpreter.get_signature_list()" ] @@ -1142,9 +1076,7 @@ "metadata": { "id": "yFoT_7W_OaHq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "classify_lite = interpreter.get_signature_runner('serving_default')\n", "classify_lite" @@ -1167,9 +1099,7 @@ "metadata": { "id": "sEqR27YcnFvc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "predictions_lite = classify_lite(sequential_1_input=img_array)['outputs']\n", "score_lite = tf.nn.softmax(predictions_lite)" @@ -1181,9 +1111,7 @@ "metadata": { "id": "ZKP_GFeKUWb5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(\n", " \"This image most likely belongs to {} with a {:.2f} percent confidence.\"\n", @@ -1206,9 +1134,7 @@ "metadata": { "id": "InXXDJL8UYC1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(np.max(np.abs(predictions - predictions_lite)))" ] @@ -1239,9 +1165,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "classification.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/images/cnn.ipynb b/site/ko/tutorials/images/cnn.ipynb index 3abc1e02ac..f92617f460 100644 --- a/site/ko/tutorials/images/cnn.ipynb +++ b/site/ko/tutorials/images/cnn.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "679Lmwt3l1Bk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -80,9 +78,7 @@ "metadata": { "id": "iAve6DCL4JH4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "\n", @@ -107,9 +103,7 @@ "metadata": { "id": "JWoEqyMuXFF4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()\n", "\n", @@ -134,9 +128,7 @@ "metadata": { "id": "K3PAELE2eSU9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',\n", " 'dog', 'frog', 'horse', 'ship', 'truck']\n", @@ -180,9 +172,7 @@ "metadata": { "id": "L9YmGQBQPrdn" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = models.Sequential()\n", "model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))\n", @@ -207,9 +197,7 @@ "metadata": { "id": "8-C4XBg4UTJy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.summary()" ] @@ -240,9 +228,7 @@ "metadata": { "id": "mRs95d6LUVEi" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.add(layers.Flatten())\n", "model.add(layers.Dense(64, activation='relu'))\n", @@ -264,9 +250,7 @@ "metadata": { "id": "8Yu_m-TZUWGX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.summary()" ] @@ -295,9 +279,7 @@ "metadata": { "id": "MdDzI75PUXrG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.compile(optimizer='adam',\n", " loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n", @@ -322,9 +304,7 @@ "metadata": { "id": "gtyDF0MKUcM7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plt.plot(history.history['accuracy'], label='accuracy')\n", "plt.plot(history.history['val_accuracy'], label = 'val_accuracy')\n", @@ -342,9 +322,7 @@ "metadata": { "id": "0LvwaKhtUdOo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(test_acc)" ] @@ -362,9 +340,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "cnn.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/images/data_augmentation.ipynb b/site/ko/tutorials/images/data_augmentation.ipynb index 88e73dae84..e06ca45f87 100644 --- a/site/ko/tutorials/images/data_augmentation.ipynb +++ b/site/ko/tutorials/images/data_augmentation.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "pkTRazeVRwDe" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -87,9 +85,7 @@ "metadata": { "id": "C2Q5rPenTAJP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", @@ -116,9 +112,7 @@ "metadata": { "id": "ytHhsYmO52zy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "(train_ds, val_ds, test_ds), metadata = tfds.load(\n", " 'tf_flowers',\n", @@ -143,9 +137,7 @@ "metadata": { "id": "wKwx7vQuspxz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "num_classes = metadata.features['label'].num_classes\n", "print(num_classes)" @@ -166,9 +158,7 @@ "metadata": { "id": "kXlx1lCr5Bip" }, - "outputs": [ - - ], + "outputs": [], "source": [ "get_label_name = metadata.features['label'].int2str\n", "\n", @@ -210,9 +200,7 @@ "metadata": { "id": "jMM3b85e3yhd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "IMG_SIZE = 180\n", "\n", @@ -246,9 +234,7 @@ "metadata": { "id": "X9OLuR1bC1Pd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "result = resize_and_rescale(image)\n", "_ = plt.imshow(result)" @@ -269,9 +255,7 @@ "metadata": { "id": "DPTB8IQmSeKM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(\"Min and max pixel values:\", result.numpy().min(), result.numpy().max())" ] @@ -309,9 +293,7 @@ "metadata": { "id": "Svu_5yfa_Jb7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "data_augmentation = tf.keras.Sequential([\n", " layers.RandomFlip(\"horizontal_and_vertical\"),\n", @@ -325,9 +307,7 @@ "metadata": { "id": "kfzEuaNg69iU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Add the image to a batch.\n", "image = tf.cast(tf.expand_dims(image, 0), tf.float32)" @@ -339,9 +319,7 @@ "metadata": { "id": "eR4wwi5Q_UZK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plt.figure(figsize=(10, 10))\n", "for i in range(9):\n", @@ -386,9 +364,7 @@ "metadata": { "id": "ULGJQjP6hHvu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = tf.keras.Sequential([\n", " # Add the preprocessing layers you created earlier.\n", @@ -437,9 +413,7 @@ "metadata": { "id": "r1Bt7w5VhVDY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "aug_ds = train_ds.map(\n", " lambda x, y: (resize_and_rescale(x, training=True), y))" @@ -499,9 +473,7 @@ "metadata": { "id": "R5fGVMqlFxF7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "batch_size = 32\n", "AUTOTUNE = tf.data.AUTOTUNE\n", @@ -532,9 +504,7 @@ "metadata": { "id": "N86SFGMBHcx-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_ds = prepare(train_ds, shuffle=True, augment=True)\n", "val_ds = prepare(val_ds)\n", @@ -560,9 +530,7 @@ "metadata": { "id": "IODSymGhq9N6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = tf.keras.Sequential([\n", " layers.Conv2D(16, 3, padding='same', activation='relu'),\n", @@ -592,9 +560,7 @@ "metadata": { "id": "ZnRJr95WY68k" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.compile(optimizer='adam',\n", " loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n", @@ -616,9 +582,7 @@ "metadata": { "id": "i_sDl9uZY9Mh" }, - "outputs": [ - - ], + "outputs": [], "source": [ "epochs=5\n", "history = model.fit(\n", @@ -634,9 +598,7 @@ "metadata": { "id": "V9PSf4qgiQJG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "loss, acc = model.evaluate(test_ds)\n", "print(\"Accuracy\", acc)" @@ -666,9 +628,7 @@ "metadata": { "id": "nMxEhIVXmAH0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def random_invert_img(x, p=0.5):\n", " if tf.random.uniform([]) < p:\n", @@ -684,9 +644,7 @@ "metadata": { "id": "C0huNpxdmDKu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def random_invert(factor=0.5):\n", " return layers.Lambda(lambda x: random_invert_img(x, factor))\n", @@ -700,9 +658,7 @@ "metadata": { "id": "wAcOluP0TNG6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plt.figure(figsize=(10, 10))\n", "for i in range(9):\n", @@ -727,9 +683,7 @@ "metadata": { "id": "d11eExc-Ke-7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class RandomInvert(layers.Layer):\n", " def __init__(self, factor=0.5, **kwargs):\n", @@ -746,9 +700,7 @@ "metadata": { "id": "qX-VQgkRL6fc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_ = plt.imshow(RandomInvert()(image)[0])" ] @@ -795,9 +747,7 @@ "metadata": { "id": "JB-lAS0z9ZJY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "(train_ds, val_ds, test_ds), metadata = tfds.load(\n", " 'tf_flowers',\n", @@ -822,9 +772,7 @@ "metadata": { "id": "dDsPaAi8de_j" }, - "outputs": [ - - ], + "outputs": [], "source": [ "image, label = next(iter(train_ds))\n", "_ = plt.imshow(image)\n", @@ -846,9 +794,7 @@ "metadata": { "id": "sN1ykjJCHikc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def visualize(original, augmented):\n", " fig = plt.figure()\n", @@ -887,9 +833,7 @@ "metadata": { "id": "1ZjVI24nIH0S" }, - "outputs": [ - - ], + "outputs": [], "source": [ "flipped = tf.image.flip_left_right(image)\n", "visualize(image, flipped)" @@ -912,9 +856,7 @@ "metadata": { "id": "ikaMj0guIRtL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "grayscaled = tf.image.rgb_to_grayscale(image)\n", "visualize(image, tf.squeeze(grayscaled))\n", @@ -938,9 +880,7 @@ "metadata": { "id": "PHz-NosiInmz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "saturated = tf.image.adjust_saturation(image, 3)\n", "visualize(image, saturated)" @@ -963,9 +903,7 @@ "metadata": { "id": "1hdG-j46I0nJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "bright = tf.image.adjust_brightness(image, 0.4)\n", "visualize(image, bright)" @@ -988,9 +926,7 @@ "metadata": { "id": "RWkK5GFHJUKT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "cropped = tf.image.central_crop(image, central_fraction=0.5)\n", "visualize(image, cropped)" @@ -1013,9 +949,7 @@ "metadata": { "id": "b19KuAhkJKR-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "rotated = tf.image.rot90(image)\n", "visualize(image, rotated)" @@ -1069,9 +1003,7 @@ "metadata": { "id": "-fFd1kh7Fr-_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for i in range(3):\n", " seed = (i, 0) # tuple of size (2,)\n", @@ -1097,9 +1029,7 @@ "metadata": { "id": "GmcYoQHaUoke" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for i in range(3):\n", " seed = (i, 0) # tuple of size (2,)\n", @@ -1125,9 +1055,7 @@ "metadata": { "id": "vtZQbUw0VOm5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for i in range(3):\n", " seed = (i, 0) # tuple of size (2,)\n", @@ -1153,9 +1081,7 @@ "metadata": { "id": "xC80NQP809Uo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "(train_datasets, val_ds, test_ds), metadata = tfds.load(\n", " 'tf_flowers',\n", @@ -1180,9 +1106,7 @@ "metadata": { "id": "1JKmx06lfcFr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def resize_and_rescale(image, label):\n", " image = tf.cast(image, tf.float32)\n", @@ -1206,9 +1130,7 @@ "metadata": { "id": "KitLdvlpVxPa" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def augment(image_label, seed):\n", " image, label = image_label\n", @@ -1243,9 +1165,7 @@ "metadata": { "id": "SZ6Qq0IWznfi" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Create a `Counter` object and `Dataset.zip` it together with the training set.\n", "counter = tf.data.experimental.Counter()\n", @@ -1267,9 +1187,7 @@ "metadata": { "id": "wQK9BDKk1_3N" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_ds = (\n", " train_ds\n", @@ -1286,9 +1204,7 @@ "metadata": { "id": "3AQoyA-k3ELk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "val_ds = (\n", " val_ds\n", @@ -1304,9 +1220,7 @@ "metadata": { "id": "p2IQN3NN3G_M" }, - "outputs": [ - - ], + "outputs": [], "source": [ "test_ds = (\n", " test_ds\n", @@ -1336,9 +1250,7 @@ "metadata": { "id": "BQDvedZ33eAy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Create a generator.\n", "rng = tf.random.Generator.from_seed(123, alg='philox')" @@ -1350,9 +1262,7 @@ "metadata": { "id": "eDEkO1nt2ta0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Create a wrapper function for updating seeds.\n", "def f(x, y):\n", @@ -1376,9 +1286,7 @@ "metadata": { "id": "Pu2uB7k12xKw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_ds = (\n", " train_datasets\n", @@ -1395,9 +1303,7 @@ "metadata": { "id": "e6caldPi2HAP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "val_ds = (\n", " val_ds\n", @@ -1413,9 +1319,7 @@ "metadata": { "id": "ceaCdJnh2I-r" }, - "outputs": [ - - ], + "outputs": [], "source": [ "test_ds = (\n", " test_ds\n", @@ -1453,9 +1357,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "data_augmentation.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/images/segmentation.ipynb b/site/ko/tutorials/images/segmentation.ipynb index f640ea7e43..e9b7868c82 100644 --- a/site/ko/tutorials/images/segmentation.ipynb +++ b/site/ko/tutorials/images/segmentation.ipynb @@ -18,9 +18,7 @@ "cellView": "form", "id": "JOgMcEajtkmg" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -83,9 +81,7 @@ "metadata": { "id": "MQmKthrSBCld" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install git+https://github.com/tensorflow/examples.git" ] @@ -96,9 +92,7 @@ "metadata": { "id": "YQX7R4bhZy5h" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "\n", @@ -111,9 +105,7 @@ "metadata": { "id": "g87--n2AtyO_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "from tensorflow_examples.models.pix2pix import pix2pix\n", "\n", @@ -138,9 +130,7 @@ "metadata": { "id": "40ITeStwDwZb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "dataset, info = tfds.load('oxford_iiit_pet:3.*.*', with_info=True)" ] @@ -160,9 +150,7 @@ "metadata": { "id": "FD60EbcAQqov" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def normalize(input_image, input_mask):\n", " input_image = tf.cast(input_image, tf.float32) / 255.0\n", @@ -176,9 +164,7 @@ "metadata": { "id": "Zf0S67hJRp3D" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def load_image(datapoint):\n", " input_image = tf.image.resize(datapoint['image'], (128, 128))\n", @@ -208,9 +194,7 @@ "metadata": { "id": "yHwj2-8SaQli" }, - "outputs": [ - - ], + "outputs": [], "source": [ "TRAIN_LENGTH = info.splits['train'].num_examples\n", "BATCH_SIZE = 64\n", @@ -224,9 +208,7 @@ "metadata": { "id": "39fYScNz9lmo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_images = dataset['train'].map(load_image, num_parallel_calls=tf.data.AUTOTUNE)\n", "test_images = dataset['test'].map(load_image, num_parallel_calls=tf.data.AUTOTUNE)" @@ -247,9 +229,7 @@ "metadata": { "id": "fUWdDJRTL0PP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class Augment(tf.keras.layers.Layer):\n", " def __init__(self, seed=42):\n", @@ -279,9 +259,7 @@ "metadata": { "id": "VPscskQcNCx4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_batches = (\n", " train_images\n", @@ -310,9 +288,7 @@ "metadata": { "id": "3N2RPAAW9q4W" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def display(display_list):\n", " plt.figure(figsize=(15, 15))\n", @@ -333,9 +309,7 @@ "metadata": { "id": "a6u_Rblkteqb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for images, masks in train_batches.take(2):\n", " sample_image, sample_mask = images[0], masks[0]\n", @@ -368,9 +342,7 @@ "metadata": { "id": "liCeLH0ctjq7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "base_model = tf.keras.applications.MobileNetV2(input_shape=[128, 128, 3], include_top=False)\n", "\n", @@ -405,9 +377,7 @@ "metadata": { "id": "p0ZbfywEbZpJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "up_stack = [\n", " pix2pix.upsample(512, 3), # 4x4 -> 8x8\n", @@ -423,9 +393,7 @@ "metadata": { "id": "45HByxpVtrPF" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def unet_model(output_channels:int):\n", " inputs = tf.keras.layers.Input(shape=[128, 128, 3])\n", @@ -481,9 +449,7 @@ "metadata": { "id": "6he36HK5uKAc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "OUTPUT_CLASSES = 3\n", "\n", @@ -508,9 +474,7 @@ "metadata": { "id": "sw82qF1Gcovr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf.keras.utils.plot_model(model, show_shapes=True)" ] @@ -530,9 +494,7 @@ "metadata": { "id": "UwvIKLZPtxV_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def create_mask(pred_mask):\n", " pred_mask = tf.math.argmax(pred_mask, axis=-1)\n", @@ -546,9 +508,7 @@ "metadata": { "id": "YLNsrynNtx4d" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def show_predictions(dataset=None, num=1):\n", " if dataset:\n", @@ -566,9 +526,7 @@ "metadata": { "id": "X_1CC0T4dho3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "show_predictions()" ] @@ -588,9 +546,7 @@ "metadata": { "id": "wHrHsqijdmL6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class DisplayCallback(tf.keras.callbacks.Callback):\n", " def on_epoch_end(self, epoch, logs=None):\n", @@ -605,9 +561,7 @@ "metadata": { "id": "StKDH_B9t4SD" }, - "outputs": [ - - ], + "outputs": [], "source": [ "EPOCHS = 20\n", "VAL_SUBSPLITS = 5\n", @@ -626,9 +580,7 @@ "metadata": { "id": "P_mu0SAbt40Q" }, - "outputs": [ - - ], + "outputs": [], "source": [ "loss = model_history.history['loss']\n", "val_loss = model_history.history['val_loss']\n", @@ -668,9 +620,7 @@ "metadata": { "id": "ikrzoG24qwf5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "show_predictions(test_batches, 3)" ] @@ -701,9 +651,7 @@ "metadata": { "id": "aHt90UEQsZDn" }, - "outputs": [ - - ], + "outputs": [], "source": [ "try:\n", " model_history = model.fit(train_batches, epochs=EPOCHS,\n", @@ -731,9 +679,7 @@ "metadata": { "id": "EmHtImJn5Kk-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "label = [0,0]\n", "prediction = [[-3., 0], [-3, 0]] \n", @@ -761,9 +707,7 @@ "metadata": { "id": "DlG-n2Ugo8Jc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def add_sample_weights(image, label):\n", " # The weights for each class, with the constraint that:\n", @@ -793,9 +737,7 @@ "metadata": { "id": "SE_ezRSFRCnE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_batches.map(add_sample_weights).element_spec" ] @@ -815,9 +757,7 @@ "metadata": { "id": "QDWipedAoOQe" }, - "outputs": [ - - ], + "outputs": [], "source": [ "weighted_model = unet_model(OUTPUT_CLASSES)\n", "weighted_model.compile(\n", @@ -832,9 +772,7 @@ "metadata": { "id": "btEFKc1xodGR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "weighted_model.fit(\n", " train_batches.map(add_sample_weights),\n", @@ -859,9 +797,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "segmentation.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/images/transfer_learning_with_hub.ipynb b/site/ko/tutorials/images/transfer_learning_with_hub.ipynb index 8024c63611..b3054ac943 100644 --- a/site/ko/tutorials/images/transfer_learning_with_hub.ipynb +++ b/site/ko/tutorials/images/transfer_learning_with_hub.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "0O_LFhwSBCjm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -80,9 +78,7 @@ "metadata": { "id": "OGNpmn43C0O6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import numpy as np\n", "import time\n", @@ -126,9 +122,7 @@ "metadata": { "id": "feiXojVXAbI9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "classifier_url =\"https://tfhub.dev/google/tf2-preview/mobilenet_v2/classification/2\" #@param {type:\"string\"}" ] @@ -139,9 +133,7 @@ "metadata": { "id": "y_6bGjoPtzau" }, - "outputs": [ - - ], + "outputs": [], "source": [ "IMAGE_SHAPE = (224, 224)\n", "\n", @@ -174,9 +166,7 @@ "metadata": { "id": "w5wDjXNjuXGD" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import numpy as np\n", "import PIL.Image as Image\n", @@ -192,9 +182,7 @@ "metadata": { "id": "BEmmBnGbLxPp" }, - "outputs": [ - - ], + "outputs": [], "source": [ "grace_hopper = np.array(grace_hopper)/255.0\n", "grace_hopper.shape" @@ -215,9 +203,7 @@ "metadata": { "id": "EMquyn29v8q3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "result = classifier.predict(grace_hopper[np.newaxis, ...])\n", "result.shape" @@ -240,9 +226,7 @@ "metadata": { "id": "rgXb44vt6goJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "predicted_class = tf.math.argmax(result[0], axis=-1)\n", "predicted_class" @@ -265,9 +249,7 @@ "metadata": { "id": "ij6SrDxcxzry" }, - "outputs": [ - - ], + "outputs": [], "source": [ "labels_path = tf.keras.utils.get_file('ImageNetLabels.txt','https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt')\n", "imagenet_labels = np.array(open(labels_path).read().splitlines())" @@ -279,9 +261,7 @@ "metadata": { "id": "uzziRK3Z2VQo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plt.imshow(grace_hopper)\n", "plt.axis('off')\n", @@ -329,9 +309,7 @@ "metadata": { "id": "DrIUV3V0xDL_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import pathlib\n", "\n", @@ -359,9 +337,7 @@ "metadata": { "id": "mqnsczfLgcwv" }, - "outputs": [ - - ], + "outputs": [], "source": [ "batch_size = 32\n", "img_height = 224\n", @@ -391,9 +367,7 @@ "metadata": { "id": "AFgDHs6VEFRD" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class_names = np.array(train_ds.class_names)\n", "print(class_names)" @@ -423,9 +397,7 @@ "metadata": { "id": "8NzDDWEMCL20" }, - "outputs": [ - - ], + "outputs": [], "source": [ "normalization_layer = tf.keras.layers.Rescaling(1./255)\n", "train_ds = train_ds.map(lambda x, y: (normalization_layer(x), y)) # Where x—images, y—labels.\n", @@ -449,9 +421,7 @@ "metadata": { "id": "ZmJMKFw7C4ki" }, - "outputs": [ - - ], + "outputs": [], "source": [ "AUTOTUNE = tf.data.AUTOTUNE\n", "train_ds = train_ds.cache().prefetch(buffer_size=AUTOTUNE)\n", @@ -464,9 +434,7 @@ "metadata": { "id": "m0JyiEZ0imgf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for image_batch, labels_batch in train_ds:\n", " print(image_batch.shape)\n", @@ -498,9 +466,7 @@ "metadata": { "id": "pcFeNcrehEue" }, - "outputs": [ - - ], + "outputs": [], "source": [ "result_batch = classifier.predict(train_ds)" ] @@ -511,9 +477,7 @@ "metadata": { "id": "-wK2ky45hlyS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "predicted_class_names = imagenet_labels[tf.math.argmax(result_batch, axis=-1)]\n", "predicted_class_names" @@ -534,9 +498,7 @@ "metadata": { "id": "IXTB22SpxDLP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plt.figure(figsize=(10,9))\n", "plt.subplots_adjust(hspace=0.5)\n", @@ -578,9 +540,7 @@ "metadata": { "id": "4bw8Jf94DSnP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mobilenet_v2 = \"https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4\"\n", "inception_v3 = \"https://tfhub.dev/google/tf2-preview/inception_v3/feature_vector/4\"\n", @@ -603,9 +563,7 @@ "metadata": { "id": "5wB030nezBwI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "feature_extractor_layer = hub.KerasLayer(\n", " feature_extractor_model,\n", @@ -628,9 +586,7 @@ "metadata": { "id": "Of7i-35F09ls" }, - "outputs": [ - - ], + "outputs": [], "source": [ "feature_batch = feature_extractor_layer(image_batch)\n", "print(feature_batch.shape)" @@ -653,9 +609,7 @@ "metadata": { "id": "vQq_kCWzlqSu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "num_classes = len(class_names)\n", "\n", @@ -673,9 +627,7 @@ "metadata": { "id": "IyhX4VCFmzVS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "predictions = model(image_batch)" ] @@ -686,9 +638,7 @@ "metadata": { "id": "FQdUaTkzm3jQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "predictions.shape" ] @@ -710,9 +660,7 @@ "metadata": { "id": "4xRx8Rjzm67O" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.compile(\n", " optimizer=tf.keras.optimizers.Adam(),\n", @@ -742,9 +690,7 @@ "metadata": { "id": "JI0yAKd-nARd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "steps_per_epoch = np.ceil(image_data.samples/image_data.batch_size)\n", "\n", @@ -770,9 +716,7 @@ "metadata": { "id": "-yVJar0MiT2t" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%tensorboard --logdir logs/fit" ] @@ -803,9 +747,7 @@ "metadata": { "id": "JGbEf5l1I4jz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class_names = sorted(image_data.class_indices.items(), key=lambda pair:pair[1])\n", "class_names = np.array([key.title() for key, value in class_names])\n", @@ -827,9 +769,7 @@ "metadata": { "id": "hW3Ic_ZlwtrZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plt.figure(figsize=(10,9))\n", "plt.subplots_adjust(hspace=0.5)\n", @@ -859,9 +799,7 @@ "metadata": { "id": "PLcqg-RmsLno" }, - "outputs": [ - - ], + "outputs": [], "source": [ "t = time.time()\n", "\n", @@ -886,9 +824,7 @@ "metadata": { "id": "7nI5fvkAQvbS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "reloaded = tf.keras.models.load_model(export_path)" ] @@ -899,9 +835,7 @@ "metadata": { "id": "dnZO14taYPH6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "abs(reloaded_result_batch - result_batch).max()" ] @@ -912,9 +846,7 @@ "metadata": { "id": "wtjsIPjQnPyM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "abs(reloaded_result_batch - result_batch).max()" ] @@ -925,9 +857,7 @@ "metadata": { "id": "jor83-LqI8xW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "result_batch = model.predict(image_batch)\n", "reloaded_result_batch = reloaded.predict(image_batch)" @@ -939,9 +869,7 @@ "metadata": { "id": "RkQIBksVkxPO" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plt.figure(figsize=(10,9))\n", "plt.subplots_adjust(hspace=0.5)\n", diff --git a/site/ko/tutorials/keras/keras_tuner.ipynb b/site/ko/tutorials/keras/keras_tuner.ipynb index 7e60285137..2c635187cf 100644 --- a/site/ko/tutorials/keras/keras_tuner.ipynb +++ b/site/ko/tutorials/keras/keras_tuner.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "tuOe1ymfHZPu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -89,9 +87,7 @@ "metadata": { "id": "IqR2PQG4ZaZ0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "from tensorflow import keras" @@ -112,9 +108,7 @@ "metadata": { "id": "hpMLpbt9jcO6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install -q -U keras-tuner" ] @@ -125,9 +119,7 @@ "metadata": { "id": "_leAIdFKAxAD" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import keras_tuner as kt" ] @@ -158,9 +150,7 @@ "metadata": { "id": "OHlHs9Wj_PUM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "(img_train, label_train), (img_test, label_test) = keras.datasets.fashion_mnist.load_data()" ] @@ -171,9 +161,7 @@ "metadata": { "id": "bLVhXs3xrUD0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Normalize pixel values between 0 and 1\n", "img_train = img_train.astype('float32') / 255.0\n", @@ -206,9 +194,7 @@ "metadata": { "id": "ZQKodC-jtsva" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def model_builder(hp):\n", " model = keras.Sequential()\n", @@ -250,9 +236,7 @@ "metadata": { "id": "oichQFly6Y46" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tuner = kt.Hyperband(model_builder,\n", " objective='val_accuracy',\n", @@ -286,9 +270,7 @@ "metadata": { "id": "WT9IkS9NEjLc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class ClearTrainingOutput(tf.keras.callbacks.Callback):\n", " def on_train_end(*args, **kwargs):\n", @@ -310,9 +292,7 @@ "metadata": { "id": "dSBQcTHF9cKt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tuner.search(img_train, label_train, epochs=50, validation_split=0.2, callbacks=[stop_early])\n", "\n", @@ -343,9 +323,7 @@ "metadata": { "id": "McO82AXOuxXh" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Build the model with the optimal hyperparameters and train it on the data for 50 epochs\n", "model = tuner.hypermodel.build(best_hps)\n", @@ -371,9 +349,7 @@ "metadata": { "id": "NoiPUEHmMhCe" }, - "outputs": [ - - ], + "outputs": [], "source": [ "hypermodel = tuner.hypermodel.build(best_hps)\n", "\n", @@ -396,9 +372,7 @@ "metadata": { "id": "9E0BTp9Ealjb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "eval_result = hypermodel.evaluate(img_test, label_test)\n", "print(\"[test loss, test accuracy]:\", eval_result)" diff --git a/site/ko/tutorials/keras/overfit_and_underfit.ipynb b/site/ko/tutorials/keras/overfit_and_underfit.ipynb index df0b09f5aa..ce89556bc6 100644 --- a/site/ko/tutorials/keras/overfit_and_underfit.ipynb +++ b/site/ko/tutorials/keras/overfit_and_underfit.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "lzyBOpYMdp3F" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -40,9 +38,7 @@ "cellView": "form", "id": "m_x4KfSJ7Vt7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title MIT License\n", "#\n", @@ -137,9 +133,7 @@ "metadata": { "id": "5pZ8A2liqvgk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "\n", @@ -155,9 +149,7 @@ "metadata": { "id": "QnAtAjqRYVXe" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install git+https://github.com/tensorflow/docs\n", "\n", @@ -172,9 +164,7 @@ "metadata": { "id": "-pnOU-ctX27Q" }, - "outputs": [ - - ], + "outputs": [], "source": [ "from IPython import display\n", "from matplotlib import pyplot as plt\n", @@ -192,9 +182,7 @@ "metadata": { "id": "jj6I4dvTtbUe" }, - "outputs": [ - - ], + "outputs": [], "source": [ "logdir = pathlib.Path(tempfile.mkdtemp())/\"tensorboard_logs\"\n", "shutil.rmtree(logdir, ignore_errors=True)" @@ -217,9 +205,7 @@ "metadata": { "id": "YPjAvwb-6dFd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "gz = tf.keras.utils.get_file('HIGGS.csv.gz', 'http://mlphysics.ics.uci.edu/data/higgs/HIGGS.csv.gz')" ] @@ -230,9 +216,7 @@ "metadata": { "id": "AkiyUdaWIrww" }, - "outputs": [ - - ], + "outputs": [], "source": [ "FEATURES = 28" ] @@ -252,9 +236,7 @@ "metadata": { "id": "QHz4sLVQEVIU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ds = tf.data.experimental.CsvDataset(gz,[float(),]*(FEATURES+1), compression_type=\"GZIP\")" ] @@ -274,9 +256,7 @@ "metadata": { "id": "zPD6ICDlF6Wf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def pack_row(*row):\n", " label = row[0]\n", @@ -301,9 +281,7 @@ "metadata": { "id": "-w-VHTwwGVoZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "packed_ds = ds.batch(10000).map(pack_row).unbatch()" ] @@ -325,9 +303,7 @@ "metadata": { "id": "TfcXuv33Fvka" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for features,label in packed_ds.batch(1000).take(1):\n", " print(features[0])\n", @@ -349,9 +325,7 @@ "metadata": { "id": "hmk49OqZIFZP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "N_VALIDATION = int(1e3)\n", "N_TRAIN = int(1e4)\n", @@ -377,9 +351,7 @@ "metadata": { "id": "H8H_ZzpBOOk-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "validate_ds = packed_ds.take(N_VALIDATION).cache()\n", "train_ds = packed_ds.skip(N_VALIDATION).take(N_TRAIN).cache()" @@ -391,9 +363,7 @@ "metadata": { "id": "9zAOqk2_Px7K" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_ds" ] @@ -413,9 +383,7 @@ "metadata": { "id": "Y7I4J355O223" }, - "outputs": [ - - ], + "outputs": [], "source": [ "validate_ds = validate_ds.batch(BATCH_SIZE)\n", "train_ds = train_ds.shuffle(BUFFER_SIZE).repeat().batch(BATCH_SIZE)" @@ -468,9 +436,7 @@ "metadata": { "id": "LwQp-ERhAD6F" }, - "outputs": [ - - ], + "outputs": [], "source": [ "lr_schedule = tf.keras.optimizers.schedules.InverseTimeDecay(\n", " 0.001,\n", @@ -497,9 +463,7 @@ "metadata": { "id": "HIo_yPjEAFgn" }, - "outputs": [ - - ], + "outputs": [], "source": [ "step = np.linspace(0,100000)\n", "lr = lr_schedule(step)\n", @@ -531,9 +495,7 @@ "metadata": { "id": "vSv8rfw_T85n" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def get_callbacks(name):\n", " return [\n", @@ -558,9 +520,7 @@ "metadata": { "id": "xRCGwU3YH5sT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def compile_and_fit(model, name, optimizer=None, max_epochs=10000):\n", " if optimizer is None:\n", @@ -608,9 +568,7 @@ "metadata": { "id": "EZh-QFjKHb70" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tiny_model = tf.keras.Sequential([\n", " layers.Dense(16, activation='elu', input_shape=(FEATURES,)),\n", @@ -624,9 +582,7 @@ "metadata": { "id": "X72IUdWYipIS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "size_histories = {}" ] @@ -637,9 +593,7 @@ "metadata": { "id": "bdOcJtPGHhJ5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "size_histories['Tiny'] = compile_and_fit(tiny_model, 'sizes/Tiny')" ] @@ -659,9 +613,7 @@ "metadata": { "id": "dkEvb2x5XsjE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plotter = tfdocs.plots.HistoryPlotter(metric = 'binary_crossentropy', smoothing_std=10)\n", "plotter.plot(size_histories)\n", @@ -694,9 +646,7 @@ "metadata": { "id": "QKgdXPx9usBa" }, - "outputs": [ - - ], + "outputs": [], "source": [ "small_model = tf.keras.Sequential([\n", " # `input_shape` is only required here so that `.summary` works.\n", @@ -712,9 +662,7 @@ "metadata": { "id": "LqG3MXF5xSjR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "size_histories['Small'] = compile_and_fit(small_model, 'sizes/Small')" ] @@ -743,9 +691,7 @@ "metadata": { "id": "jksi-XtaxDAh" }, - "outputs": [ - - ], + "outputs": [], "source": [ "medium_model = tf.keras.Sequential([\n", " layers.Dense(64, activation='elu', input_shape=(FEATURES,)),\n", @@ -770,9 +716,7 @@ "metadata": { "id": "Ofn1AwDhx-Fe" }, - "outputs": [ - - ], + "outputs": [], "source": [ "size_histories['Medium'] = compile_and_fit(medium_model, \"sizes/Medium\")" ] @@ -794,9 +738,7 @@ "metadata": { "id": "ghQwwqwqvQM9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "large_model = tf.keras.Sequential([\n", " layers.Dense(512, activation='elu', input_shape=(FEATURES,)),\n", @@ -822,9 +764,7 @@ "metadata": { "id": "U1A99dhqvepf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "size_histories['large'] = compile_and_fit(large_model, \"sizes/large\")" ] @@ -871,9 +811,7 @@ "metadata": { "id": "0XmKDtOWzOpk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plotter.plot(size_histories)\n", "a = plt.xscale('log')\n", @@ -910,9 +848,7 @@ "metadata": { "id": "6oa1lkJddZ-m" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Load the TensorBoard notebook extension\n", "%load_ext tensorboard\n", @@ -954,9 +890,7 @@ "metadata": { "id": "40k1eBtnQzNo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "shutil.rmtree(logdir/'regularizers/Tiny', ignore_errors=True)\n", "shutil.copytree(logdir/'sizes/Tiny', logdir/'regularizers/Tiny')" @@ -968,9 +902,7 @@ "metadata": { "id": "vFWMeFo7jLpN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "regularizer_histories = {}\n", "regularizer_histories['Tiny'] = size_histories['Tiny']" @@ -1010,9 +942,7 @@ "metadata": { "id": "HFGmcwduwVyQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "l2_model = tf.keras.Sequential([\n", " layers.Dense(512, activation='elu',\n", @@ -1049,9 +979,7 @@ "metadata": { "id": "7wkfLyxBZdh_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plotter.plot(regularizer_histories)\n", "plt.ylim([0.5, 0.7])" @@ -1085,9 +1013,7 @@ "metadata": { "id": "apDHQNybjaML" }, - "outputs": [ - - ], + "outputs": [], "source": [ "result = l2_model(features)\n", "regularization_loss=tf.add_n(l2_model.losses)" @@ -1131,9 +1057,7 @@ "metadata": { "id": "OFEYvtrHxSWS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "dropout_model = tf.keras.Sequential([\n", " layers.Dense(512, activation='elu', input_shape=(FEATURES,)),\n", @@ -1156,9 +1080,7 @@ "metadata": { "id": "SPZqwVchx5xp" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plotter.plot(regularizer_histories)\n", "plt.ylim([0.5, 0.7])" @@ -1190,9 +1112,7 @@ "metadata": { "id": "7zfs_qQIw1cz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "combined_model = tf.keras.Sequential([\n", " layers.Dense(512, kernel_regularizer=regularizers.l2(0.0001),\n", @@ -1219,9 +1139,7 @@ "metadata": { "id": "qDqBBxfI0Yd8" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plotter.plot(regularizer_histories)\n", "plt.ylim([0.5, 0.7])" @@ -1255,9 +1173,7 @@ "metadata": { "id": "Op4vLqVWBK_y" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%tensorboard --logdir {logdir}/regularizers" ] diff --git a/site/ko/tutorials/keras/regression.ipynb b/site/ko/tutorials/keras/regression.ipynb index ae664b0dfa..02ee93e637 100644 --- a/site/ko/tutorials/keras/regression.ipynb +++ b/site/ko/tutorials/keras/regression.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "AwOEIRJC6Une" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -40,9 +38,7 @@ "cellView": "form", "id": "KyPEtTqk6VdG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title MIT License\n", "#\n", @@ -109,9 +105,7 @@ "metadata": { "id": "moB4tpEHxKB3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Use seaborn for pairplot.\n", "!pip install -q seaborn" @@ -123,9 +117,7 @@ "metadata": { "id": "1rRo8oNqZ-Rj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", @@ -142,9 +134,7 @@ "metadata": { "id": "9xQKvCJ85kCQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "\n", @@ -182,9 +172,7 @@ "metadata": { "id": "CiX2FI4gZtTt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data'\n", "column_names = ['MPG', 'Cylinders', 'Displacement', 'Horsepower', 'Weight',\n", @@ -201,9 +189,7 @@ "metadata": { "id": "2oY3pMPagJrO" }, - "outputs": [ - - ], + "outputs": [], "source": [ "dataset = raw_dataset.copy()\n", "dataset.tail()" @@ -226,9 +212,7 @@ "metadata": { "id": "JEJHhN65a2VV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "dataset.isna().sum()" ] @@ -248,9 +232,7 @@ "metadata": { "id": "4ZUDosChC1UN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "dataset = dataset.dropna()" ] @@ -272,9 +254,7 @@ "metadata": { "id": "gWNTD2QjBWFJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "dataset['Origin'] = dataset['Origin'].map({1: 'USA', 2: 'Europe', 3: 'Japan'})" ] @@ -285,9 +265,7 @@ "metadata": { "id": "ulXz4J7PAUzk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "dataset = pd.get_dummies(dataset, columns=['Origin'], prefix='', prefix_sep='')\n", "dataset.tail()" @@ -310,9 +288,7 @@ "metadata": { "id": "qn-IGhUE7_1H" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_dataset = dataset.sample(frac=0.8, random_state=0)\n", "test_dataset = dataset.drop(train_dataset.index)" @@ -337,9 +313,7 @@ "metadata": { "id": "oRKO_x8gWKv-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "sns.pairplot(train_dataset[['MPG', 'Cylinders', 'Displacement', 'Weight']], diag_kind='kde')" ] @@ -359,9 +333,7 @@ "metadata": { "id": "yi2FzC3T21jR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_dataset.describe().transpose()" ] @@ -383,9 +355,7 @@ "metadata": { "id": "t2sluJdCW7jN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_features = train_dataset.copy()\n", "test_features = test_dataset.copy()\n", @@ -411,9 +381,7 @@ "metadata": { "id": "IcmY6lKKbkw8" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_dataset.describe().transpose()[['mean', 'std']]" ] @@ -452,9 +420,7 @@ "metadata": { "id": "JlC5ooJrgjQF" }, - "outputs": [ - - ], + "outputs": [], "source": [ "normalizer = tf.keras.layers.Normalization(axis=-1)" ] @@ -474,9 +440,7 @@ "metadata": { "id": "CrBbbjbwV91f" }, - "outputs": [ - - ], + "outputs": [], "source": [ "normalizer.adapt(np.array(train_features))" ] @@ -496,9 +460,7 @@ "metadata": { "id": "GGn-ukwxSPtx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(normalizer.mean.numpy())" ] @@ -518,9 +480,7 @@ "metadata": { "id": "2l7zFL_XWIRu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "first = np.array(train_features[:1])\n", "\n", @@ -576,9 +536,7 @@ "metadata": { "id": "1gJAy0fKs1TS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "horsepower = np.array(train_features['Horsepower'])\n", "\n", @@ -601,9 +559,7 @@ "metadata": { "id": "c0sXM7qLlKfZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "horsepower_model = tf.keras.Sequential([\n", " horsepower_normalizer,\n", @@ -630,9 +586,7 @@ "metadata": { "id": "UfV1HS6bns-s" }, - "outputs": [ - - ], + "outputs": [], "source": [ "horsepower_model.predict(horsepower[:10])" ] @@ -652,9 +606,7 @@ "metadata": { "id": "JxA_3lpOm-SK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "horsepower_model.compile(\n", " optimizer=tf.keras.optimizers.Adam(learning_rate=0.1),\n", @@ -676,9 +628,7 @@ "metadata": { "id": "-iSrNy59nRAp" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%time\n", "history = horsepower_model.fit(\n", @@ -706,9 +656,7 @@ "metadata": { "id": "YCAwD_y4AdC3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "hist = pd.DataFrame(history.history)\n", "hist['epoch'] = history.epoch\n", @@ -721,9 +669,7 @@ "metadata": { "id": "9E54UoZunqhc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def plot_loss(history):\n", " plt.plot(history.history['loss'], label='loss')\n", @@ -741,9 +687,7 @@ "metadata": { "id": "yYsQYrIZyqjz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plot_loss(history)" ] @@ -763,9 +707,7 @@ "metadata": { "id": "kDZ8EvNYrDtx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "test_results = {}\n", "\n", @@ -789,9 +731,7 @@ "metadata": { "id": "xDS2JEtOn9Jn" }, - "outputs": [ - - ], + "outputs": [], "source": [ "x = tf.linspace(0.0, 250, 251)\n", "y = horsepower_model.predict(x)" @@ -803,9 +743,7 @@ "metadata": { "id": "rttFCTU8czsI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def plot_horsepower(x, y):\n", " plt.scatter(train_features['Horsepower'], train_labels, label='Data')\n", @@ -821,9 +759,7 @@ "metadata": { "id": "7l9ZiAOEUNBL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plot_horsepower(x, y)" ] @@ -854,9 +790,7 @@ "metadata": { "id": "ssnVcKg7oMe6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "linear_model = tf.keras.Sequential([\n", " normalizer,\n", @@ -879,9 +813,7 @@ "metadata": { "id": "DynfJV18WiuT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "linear_model.predict(train_features[:10])" ] @@ -901,9 +833,7 @@ "metadata": { "id": "DwJ4Fq0RXBQf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "linear_model.layers[1].kernel" ] @@ -923,9 +853,7 @@ "metadata": { "id": "A0Sv_Ybr0szp" }, - "outputs": [ - - ], + "outputs": [], "source": [ "linear_model.compile(\n", " optimizer=tf.keras.optimizers.Adam(learning_rate=0.1),\n", @@ -938,9 +866,7 @@ "metadata": { "id": "EZoOYORvoTSe" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%time\n", "history = linear_model.fit(\n", @@ -968,9 +894,7 @@ "metadata": { "id": "4sWO3W0koYgu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plot_loss(history)" ] @@ -990,9 +914,7 @@ "metadata": { "id": "jNC3D1DGsGgK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "test_results['linear_model'] = linear_model.evaluate(\n", " test_features, test_labels, verbose=0)" @@ -1041,9 +963,7 @@ "metadata": { "id": "c26juK7ZG8j-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def build_and_compile_model(norm):\n", " model = keras.Sequential([\n", @@ -1082,9 +1002,7 @@ "metadata": { "id": "cGbPb-PHGbhs" }, - "outputs": [ - - ], + "outputs": [], "source": [ "dnn_horsepower_model = build_and_compile_model(horsepower_normalizer)" ] @@ -1104,9 +1022,7 @@ "metadata": { "id": "ReAD0n6MsFK-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "dnn_horsepower_model.summary()" ] @@ -1126,9 +1042,7 @@ "metadata": { "id": "sD7qHCmNIOY0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%time\n", "history = dnn_horsepower_model.fit(\n", @@ -1153,9 +1067,7 @@ "metadata": { "id": "NcF6UWjdCU8T" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plot_loss(history)" ] @@ -1175,9 +1087,7 @@ "metadata": { "id": "hPF53Rem14NS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "x = tf.linspace(0.0, 250, 251)\n", "y = dnn_horsepower_model.predict(x)" @@ -1189,9 +1099,7 @@ "metadata": { "id": "rsf9rD8I17Wq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plot_horsepower(x, y)" ] @@ -1211,9 +1119,7 @@ "metadata": { "id": "bJjM0dU52XtN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "test_results['dnn_horsepower_model'] = dnn_horsepower_model.evaluate(\n", " test_features['Horsepower'], test_labels,\n", @@ -1244,9 +1150,7 @@ "metadata": { "id": "c0mhscXh2k36" }, - "outputs": [ - - ], + "outputs": [], "source": [ "dnn_model = build_and_compile_model(normalizer)\n", "dnn_model.summary()" @@ -1258,9 +1162,7 @@ "metadata": { "id": "CXDENACl2tuW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%time\n", "history = dnn_model.fit(\n", @@ -1276,9 +1178,7 @@ "metadata": { "id": "-9Dbj0fX23RQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plot_loss(history)" ] @@ -1298,9 +1198,7 @@ "metadata": { "id": "-bZIa96W3c7K" }, - "outputs": [ - - ], + "outputs": [], "source": [ "test_results['dnn_model'] = dnn_model.evaluate(test_features, test_labels, verbose=0)" ] @@ -1329,9 +1227,7 @@ "metadata": { "id": "e5_ooufM5iH2" }, - "outputs": [ - - ], + "outputs": [], "source": [ "pd.DataFrame(test_results, index=['Mean absolute error [MPG]']).T" ] @@ -1362,9 +1258,7 @@ "metadata": { "id": "Xe7RXH3N3CWU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "test_predictions = dnn_model.predict(test_features).flatten()\n", "\n", @@ -1395,9 +1289,7 @@ "metadata": { "id": "f-OHX4DiXd8x" }, - "outputs": [ - - ], + "outputs": [], "source": [ "error = test_predictions - test_labels\n", "plt.hist(error, bins=25)\n", @@ -1420,9 +1312,7 @@ "metadata": { "id": "4-WwLlmfT-mb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "dnn_model.save('dnn_model.keras')" ] @@ -1442,9 +1332,7 @@ "metadata": { "id": "dyyyj2zVT-mf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "reloaded = tf.keras.models.load_model('dnn_model.keras')\n", "\n", @@ -1458,9 +1346,7 @@ "metadata": { "id": "f_GchJ2tg-2o" }, - "outputs": [ - - ], + "outputs": [], "source": [ "pd.DataFrame(test_results, index=['Mean absolute error [MPG]']).T" ] @@ -1484,9 +1370,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "regression.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/keras/save_and_load.ipynb b/site/ko/tutorials/keras/save_and_load.ipynb index 035feb1a47..32d7baf36f 100644 --- a/site/ko/tutorials/keras/save_and_load.ipynb +++ b/site/ko/tutorials/keras/save_and_load.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "2pHVBk_seED1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -40,9 +38,7 @@ "cellView": "form", "id": "N_fMsQ-N8I7j" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title MIT License\n", "#\n", @@ -136,9 +132,7 @@ "metadata": { "id": "RzIOVSdnMYyO" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install pyyaml h5py # Required to save models in HDF5 format" ] @@ -149,9 +143,7 @@ "metadata": { "id": "7Nm7Tyb-gRt-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import os\n", "\n", @@ -178,9 +170,7 @@ "metadata": { "id": "9rGfFwE9XVwz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()\n", "\n", @@ -215,9 +205,7 @@ "metadata": { "id": "0HZbJIjxyX1S" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Define a simple sequential model\n", "def create_model():\n", @@ -268,9 +256,7 @@ "metadata": { "id": "IFPuhwntH8VH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "checkpoint_path = \"training_1/cp.ckpt\"\n", "checkpoint_dir = os.path.dirname(checkpoint_path)\n", @@ -307,9 +293,7 @@ "metadata": { "id": "gXG5FVKFOVQ3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "os.listdir(checkpoint_dir)" ] @@ -331,9 +315,7 @@ "metadata": { "id": "Fp5gbuiaPqCT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Create a basic model instance\n", "model = create_model()\n", @@ -358,9 +340,7 @@ "metadata": { "id": "2IZxbwiRRSD2" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Loads the weights\n", "model.load_weights(checkpoint_path)\n", @@ -389,9 +369,7 @@ "metadata": { "id": "mQF_dlgIVOvq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Include the epoch in the file name (uses `str.format`)\n", "checkpoint_path = \"training_2/cp-{epoch:04d}.ckpt\"\n", @@ -442,9 +420,7 @@ "metadata": { "id": "p64q3-V4sXt0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "os.listdir(checkpoint_dir)" ] @@ -455,9 +431,7 @@ "metadata": { "id": "1AN_fnuyR41H" }, - "outputs": [ - - ], + "outputs": [], "source": [ "latest = tf.train.latest_checkpoint(checkpoint_dir)\n", "latest" @@ -480,9 +454,7 @@ "metadata": { "id": "3M04jyK-H3QK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Create a new model instance\n", "model = create_model()\n", @@ -535,9 +507,7 @@ "metadata": { "id": "R7W5plyZ-u9X" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Save the weights\n", "model.save_weights('./checkpoints/my_checkpoint')\n", @@ -608,9 +578,7 @@ "metadata": { "id": "3f55mAXwukUX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Create and train a new model instance.\n", "model = create_model()\n", @@ -635,9 +603,7 @@ "metadata": { "id": "HyfUMOZwux_-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "new_model = tf.keras.models.load_model('my_model.keras')\n", "\n", @@ -660,9 +626,7 @@ "metadata": { "id": "8BT4mHNIvMdW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Evaluate the restored model\n", "loss, acc = new_model.evaluate(test_images, test_labels, verbose=2)\n", @@ -695,9 +659,7 @@ "metadata": { "id": "sI1YvCDFzpl3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Create and train a new model instance.\n", "model = create_model()\n", @@ -723,9 +685,7 @@ "metadata": { "id": "sq8fPglI1RWA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# my_model directory\n", "!ls saved_model\n", @@ -749,9 +709,7 @@ "metadata": { "id": "0YofwHdN0pxa" }, - "outputs": [ - - ], + "outputs": [], "source": [ "new_model = tf.keras.models.load_model('saved_model/my_model')\n", "\n", @@ -774,9 +732,7 @@ "metadata": { "id": "Yh5Mu0yOgE5J" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Evaluate the restored model\n", "loss, acc = new_model.evaluate(test_images, test_labels, verbose=2)\n", @@ -802,9 +758,7 @@ "metadata": { "id": "m2dkmJVCGUia" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Create and train a new model instance.\n", "model = create_model()\n", @@ -830,9 +784,7 @@ "metadata": { "id": "5NDMO_7kS6Do" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Recreate the exact same model, including its weights and the optimizer\n", "new_model = tf.keras.models.load_model('my_model.h5')\n", @@ -856,9 +808,7 @@ "metadata": { "id": "jwEaj9DnTCVA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "loss, acc = new_model.evaluate(test_images, test_labels, verbose=2)\n", "print('Restored model, accuracy: {:5.2f}%'.format(100 * acc))" @@ -907,9 +857,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "save_and_load.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/keras/text_classification.ipynb b/site/ko/tutorials/keras/text_classification.ipynb index d40fa708f4..74b14fda01 100644 --- a/site/ko/tutorials/keras/text_classification.ipynb +++ b/site/ko/tutorials/keras/text_classification.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "ioaprt5q5US7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -40,9 +38,7 @@ "cellView": "form", "id": "yCl0eTNH5RS3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title MIT License\n", "#\n", @@ -105,9 +101,7 @@ "metadata": { "id": "8RZOuS9LWQvv" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import os\n", @@ -126,9 +120,7 @@ "metadata": { "id": "6-tTFS04dChr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(tf.__version__)" ] @@ -163,9 +155,7 @@ "metadata": { "id": "k7ZYnuajVlFN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "url = \"https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz\"\n", "\n", @@ -182,9 +172,7 @@ "metadata": { "id": "355CfOvsV1pl" }, - "outputs": [ - - ], + "outputs": [], "source": [ "os.listdir(dataset_dir)" ] @@ -195,9 +183,7 @@ "metadata": { "id": "7ASND15oXpF1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_dir = os.path.join(dataset_dir, 'train')\n", "os.listdir(train_dir)" @@ -218,9 +204,7 @@ "metadata": { "id": "R7g8hFvzWLIZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "sample_file = os.path.join(train_dir, 'pos/1181_9.txt')\n", "with open(sample_file) as f:\n", @@ -263,9 +247,7 @@ "metadata": { "id": "VhejsClzaWfl" }, - "outputs": [ - - ], + "outputs": [], "source": [ "remove_dir = os.path.join(train_dir, 'unsup')\n", "shutil.rmtree(remove_dir)" @@ -290,9 +272,7 @@ "metadata": { "id": "nOrK-MTYaw3C" }, - "outputs": [ - - ], + "outputs": [], "source": [ "batch_size = 32\n", "seed = 42\n", @@ -320,9 +300,7 @@ "metadata": { "id": "51wNaPPApk1K" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for text_batch, label_batch in raw_train_ds.take(1):\n", " for i in range(3):\n", @@ -347,9 +325,7 @@ "metadata": { "id": "MlICTG8spyO2" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(\"Label 0 corresponds to\", raw_train_ds.class_names[0])\n", "print(\"Label 1 corresponds to\", raw_train_ds.class_names[1])" @@ -379,9 +355,7 @@ "metadata": { "id": "JsMwwhOoqjKF" }, - "outputs": [ - - ], + "outputs": [], "source": [ "raw_val_ds = tf.keras.utils.text_dataset_from_directory(\n", " 'aclImdb/train', \n", @@ -397,9 +371,7 @@ "metadata": { "id": "rdSr0Nt3q_ns" }, - "outputs": [ - - ], + "outputs": [], "source": [ "raw_test_ds = tf.keras.utils.text_dataset_from_directory(\n", " 'aclImdb/test', \n", @@ -436,9 +408,7 @@ "metadata": { "id": "SDRI_s_tX1Hk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def custom_standardization(input_data):\n", " lowercase = tf.strings.lower(input_data)\n", @@ -465,9 +435,7 @@ "metadata": { "id": "-c76RvSzsMnX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "max_features = 10000\n", "sequence_length = 250\n", @@ -503,9 +471,7 @@ "metadata": { "id": "GH4_2ZGJsa_X" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Make a text-only dataset (without labels), then call adapt\n", "train_text = raw_train_ds.map(lambda x, y: x)\n", @@ -527,9 +493,7 @@ "metadata": { "id": "SCIg_T50wOCU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def vectorize_text(text, label):\n", " text = tf.expand_dims(text, -1)\n", @@ -542,9 +506,7 @@ "metadata": { "id": "XULcm6B3xQIO" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# retrieve a batch (of 32 reviews and labels) from the dataset\n", "text_batch, label_batch = next(iter(raw_train_ds))\n", @@ -569,9 +531,7 @@ "metadata": { "id": "kRq9hTQzhVhW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(\"1287 ---> \",vectorize_layer.get_vocabulary()[1287])\n", "print(\" 313 ---> \",vectorize_layer.get_vocabulary()[313])\n", @@ -593,9 +553,7 @@ "metadata": { "id": "2zhmpeViI1iG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_ds = raw_train_ds.map(vectorize_text)\n", "val_ds = raw_val_ds.map(vectorize_text)\n", @@ -625,9 +583,7 @@ "metadata": { "id": "wMcs_H7izm5m" }, - "outputs": [ - - ], + "outputs": [], "source": [ "AUTOTUNE = tf.data.AUTOTUNE\n", "\n", @@ -653,9 +609,7 @@ "metadata": { "id": "dkQP6in8yUBR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "embedding_dim = 16" ] @@ -666,9 +620,7 @@ "metadata": { "id": "xpKOoWgu-llD" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = tf.keras.Sequential([\n", " layers.Embedding(max_features + 1, embedding_dim),\n", @@ -712,9 +664,7 @@ "metadata": { "id": "Mr0GP-cQ-llN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.compile(loss=losses.BinaryCrossentropy(from_logits=True),\n", " optimizer='adam',\n", @@ -738,9 +688,7 @@ "metadata": { "id": "tXSGrjWZ-llW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "epochs = 10\n", "history = model.fit(\n", @@ -766,9 +714,7 @@ "metadata": { "id": "zOMKywn4zReN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "loss, accuracy = model.evaluate(test_ds)\n", "\n", @@ -802,9 +748,7 @@ "metadata": { "id": "-YcvZsdvWfDf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "history_dict = history.history\n", "history_dict.keys()" @@ -825,9 +769,7 @@ "metadata": { "id": "2SEMeQ5YXs8z" }, - "outputs": [ - - ], + "outputs": [], "source": [ "acc = history_dict['binary_accuracy']\n", "val_acc = history_dict['val_binary_accuracy']\n", @@ -854,9 +796,7 @@ "metadata": { "id": "Z3PJemLPXwz_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plt.plot(epochs, acc, 'bo', label='Training acc')\n", "plt.plot(epochs, val_acc, 'b', label='Validation acc')\n", @@ -900,9 +840,7 @@ "metadata": { "id": "FWXsMvryuZuq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "export_model = tf.keras.Sequential([\n", " vectorize_layer,\n", @@ -936,9 +874,7 @@ "metadata": { "id": "QW355HH5L49K" }, - "outputs": [ - - ], + "outputs": [], "source": [ "examples = [\n", " \"The movie was great!\",\n", @@ -1024,9 +960,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "text_classification.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/keras/text_classification_with_hub.ipynb b/site/ko/tutorials/keras/text_classification_with_hub.ipynb index 6f51beed71..b9fb8a002e 100644 --- a/site/ko/tutorials/keras/text_classification_with_hub.ipynb +++ b/site/ko/tutorials/keras/text_classification_with_hub.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "ioaprt5q5US7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -40,9 +38,7 @@ "cellView": "form", "id": "yCl0eTNH5RS3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title MIT License\n", "#\n", @@ -112,9 +108,7 @@ "metadata": { "id": "IHTzYqKZ7auw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install tensorflow-hub\n", "!pip install tensorflow-datasets" @@ -126,9 +120,7 @@ "metadata": { "id": "2ew7HTbPpCJH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import os\n", "import numpy as np\n", @@ -160,9 +152,7 @@ "metadata": { "id": "zXXx5Oc3pOmN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Split the training set into 60% and 40% to end up with 15,000 examples\n", "# for training, 10,000 examples for validation and 25,000 examples for testing.\n", @@ -191,9 +181,7 @@ "metadata": { "id": "QtTS4kpEpjbi" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_examples_batch, train_labels_batch = next(iter(train_data.batch(10)))\n", "train_examples_batch" @@ -214,9 +202,7 @@ "metadata": { "id": "tvAjVXOWc6Mj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_labels_batch" ] @@ -269,9 +255,7 @@ "metadata": { "id": "_NUbzVeYkgcO" }, - "outputs": [ - - ], + "outputs": [], "source": [ "embedding = \"https://tfhub.dev/google/nnlm-en-dim50/2\"\n", "hub_layer = hub.KerasLayer(embedding, input_shape=[], \n", @@ -294,9 +278,7 @@ "metadata": { "id": "xpKOoWgu-llD" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = tf.keras.Sequential()\n", "model.add(hub_layer)\n", @@ -344,9 +326,7 @@ "metadata": { "id": "Mr0GP-cQ-llN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.compile(optimizer='adam',\n", " loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),\n", @@ -370,9 +350,7 @@ "metadata": { "id": "tXSGrjWZ-llW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "history = model.fit(train_data.shuffle(10000).batch(512),\n", " epochs=10,\n", @@ -397,9 +375,7 @@ "metadata": { "id": "zOMKywn4zReN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "results = model.evaluate(test_data.batch(512), verbose=2)\n", "\n", @@ -431,9 +407,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "text_classification_with_hub.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/load_data/images.ipynb b/site/ko/tutorials/load_data/images.ipynb index ab72bde225..215ac21436 100644 --- a/site/ko/tutorials/load_data/images.ipynb +++ b/site/ko/tutorials/load_data/images.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "ufPx7EiCiqgR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -84,9 +82,7 @@ "metadata": { "id": "3vhAMaIOBIee" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import numpy as np\n", "import os\n", @@ -102,9 +98,7 @@ "metadata": { "id": "Qnp9Z2sT5dWj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(tf.__version__)" ] @@ -144,9 +138,7 @@ "metadata": { "id": "rN-Pc6Zd6awg" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import pathlib\n", "dataset_url = \"https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz\"\n", @@ -169,9 +161,7 @@ "metadata": { "id": "QhewYCxhXQBX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "image_count = len(list(data_dir.glob('*/*.jpg')))\n", "print(image_count)" @@ -192,9 +182,7 @@ "metadata": { "id": "crs7ZjEp60Ot" }, - "outputs": [ - - ], + "outputs": [], "source": [ "roses = list(data_dir.glob('roses/*'))\n", "PIL.Image.open(str(roses[0]))" @@ -206,9 +194,7 @@ "metadata": { "id": "oV9PtjdKKWyI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "roses = list(data_dir.glob('roses/*'))\n", "PIL.Image.open(str(roses[1]))" @@ -249,9 +235,7 @@ "metadata": { "id": "qJdpyqK541ty" }, - "outputs": [ - - ], + "outputs": [], "source": [ "batch_size = 32\n", "img_height = 180\n", @@ -273,9 +257,7 @@ "metadata": { "id": "chqakIP14PDm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_ds = tf.keras.utils.image_dataset_from_directory(\n", " data_dir,\n", @@ -292,9 +274,7 @@ "metadata": { "id": "pb2Af2lsUShk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "val_ds = tf.keras.utils.image_dataset_from_directory(\n", " data_dir,\n", @@ -320,9 +300,7 @@ "metadata": { "id": "R7z2yKt7VDPJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class_names = train_ds.class_names\n", "print(class_names)" @@ -345,9 +323,7 @@ "metadata": { "id": "AAY3LJN28Kuy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "\n", @@ -375,9 +351,7 @@ "metadata": { "id": "BdPHeHXt9sjA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for image_batch, labels_batch in train_ds:\n", " print(image_batch.shape)\n", @@ -422,9 +396,7 @@ "metadata": { "id": "16yNdZXdExyM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "normalization_layer = tf.keras.layers.Rescaling(1./255)" ] @@ -444,9 +416,7 @@ "metadata": { "id": "QgOnza-U_z5Y" }, - "outputs": [ - - ], + "outputs": [], "source": [ "normalized_ds = train_ds.map(lambda x, y: (normalization_layer(x), y))\n", "image_batch, labels_batch = next(iter(normalized_ds))\n", @@ -504,9 +474,7 @@ "metadata": { "id": "Ea3kbMe-pGDw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "AUTOTUNE = tf.data.AUTOTUNE\n", "\n", @@ -533,9 +501,7 @@ "metadata": { "id": "LdR0BzCcqxw0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "num_classes = 5\n", "\n", @@ -568,9 +534,7 @@ "metadata": { "id": "t_BlmsnmsEr4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.compile(\n", " optimizer='adam',\n", @@ -593,9 +557,7 @@ "metadata": { "id": "S08ZKKODsnGW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.fit(\n", " train_ds,\n", @@ -648,9 +610,7 @@ "metadata": { "id": "lAkQp5uxoINu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "list_ds = tf.data.Dataset.list_files(str(data_dir/'*/*'), shuffle=False)\n", "list_ds = list_ds.shuffle(image_count, reshuffle_each_iteration=False)" @@ -662,9 +622,7 @@ "metadata": { "id": "coORvEH-NGwc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for f in list_ds.take(5):\n", " print(f.numpy())" @@ -685,9 +643,7 @@ "metadata": { "id": "uRPHzDGhKACK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class_names = np.array(sorted([item.name for item in data_dir.glob('*') if item.name != \"LICENSE.txt\"]))\n", "print(class_names)" @@ -708,9 +664,7 @@ "metadata": { "id": "GWHNPzXclpVr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "val_size = int(image_count * 0.2)\n", "train_ds = list_ds.skip(val_size)\n", @@ -732,9 +686,7 @@ "metadata": { "id": "SiKQrb9ppS-7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(tf.data.experimental.cardinality(train_ds).numpy())\n", "print(tf.data.experimental.cardinality(val_ds).numpy())" @@ -755,9 +707,7 @@ "metadata": { "id": "arSQzIey-4D4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def get_label(file_path):\n", " # Convert the path to a list of path components\n", @@ -774,9 +724,7 @@ "metadata": { "id": "MGlq4IP4Aktb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def decode_img(img):\n", " # Convert the compressed string to a 3D uint8 tensor\n", @@ -791,9 +739,7 @@ "metadata": { "id": "-xhBRgvNqRRe" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def process_path(file_path):\n", " label = get_label(file_path)\n", @@ -818,9 +764,7 @@ "metadata": { "id": "3SDhbo8lOBQv" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Set `num_parallel_calls` so multiple images are loaded/processed in parallel.\n", "train_ds = train_ds.map(process_path, num_parallel_calls=AUTOTUNE)\n", @@ -833,9 +777,7 @@ "metadata": { "id": "kxrl0lGdnpRz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for image, label in train_ds.take(1):\n", " print(\"Image shape: \", image.numpy().shape)\n", @@ -872,9 +814,7 @@ "metadata": { "id": "uZmZJx8ePw_5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def configure_for_performance(ds):\n", " ds = ds.cache()\n", @@ -904,9 +844,7 @@ "metadata": { "id": "UN_Dnl72YNIj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "image_batch, label_batch = next(iter(train_ds))\n", "\n", @@ -936,9 +874,7 @@ "metadata": { "id": "Vm_bi7NKXOzW" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.fit(\n", " train_ds,\n", @@ -975,9 +911,7 @@ "metadata": { "id": "NTQ-53DNwv8o" }, - "outputs": [ - - ], + "outputs": [], "source": [ "(train_ds, val_ds, test_ds), metadata = tfds.load(\n", " 'tf_flowers',\n", @@ -1002,9 +936,7 @@ "metadata": { "id": "kJvt6qzF1i4L" }, - "outputs": [ - - ], + "outputs": [], "source": [ "num_classes = metadata.features['label'].num_classes\n", "print(num_classes)" @@ -1025,9 +957,7 @@ "metadata": { "id": "1lF3IUAO1ogi" }, - "outputs": [ - - ], + "outputs": [], "source": [ "get_label_name = metadata.features['label'].int2str\n", "\n", @@ -1051,9 +981,7 @@ "metadata": { "id": "AMV6GtZiwfGP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_ds = configure_for_performance(train_ds)\n", "val_ds = configure_for_performance(val_ds)\n", @@ -1089,9 +1017,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "images.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/load_data/text.ipynb b/site/ko/tutorials/load_data/text.ipynb index e86993431a..870495dcf9 100644 --- a/site/ko/tutorials/load_data/text.ipynb +++ b/site/ko/tutorials/load_data/text.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "AVV2e0XKbJeX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -74,9 +72,7 @@ "metadata": { "id": "sa6IKWvADqH7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install \"tensorflow-text==2.11.*\"" ] @@ -87,9 +83,7 @@ "metadata": { "id": "baYFZMW_bJHh" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import collections\n", "import pathlib\n", @@ -133,9 +127,7 @@ "metadata": { "id": "8ELgzA6SHTuV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "data_url = 'https://storage.googleapis.com/download.tensorflow.org/data/stack_overflow_16k.tar.gz'\n", "\n", @@ -154,9 +146,7 @@ "metadata": { "id": "jIrPl5fUH2gb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "list(dataset_dir.iterdir())" ] @@ -167,9 +157,7 @@ "metadata": { "id": "fEoV7YByJoWQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_dir = dataset_dir/'train'\n", "list(train_dir.iterdir())" @@ -192,9 +180,7 @@ "metadata": { "id": "Go1vTSGdJu08" }, - "outputs": [ - - ], + "outputs": [], "source": [ "sample_file = train_dir/'python/1755.txt'\n", "\n", @@ -250,9 +236,7 @@ "metadata": { "id": "qqyliMw8N-az" }, - "outputs": [ - - ], + "outputs": [], "source": [ "batch_size = 32\n", "seed = 42\n", @@ -284,9 +268,7 @@ "metadata": { "id": "_JMTyZ6Glt_C" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for text_batch, label_batch in raw_train_ds.take(1):\n", " for i in range(10):\n", @@ -309,9 +291,7 @@ "metadata": { "id": "gIpCS7YjmGkj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for i, label in enumerate(raw_train_ds.class_names):\n", " print(\"Label\", i, \"corresponds to\", label)" @@ -334,9 +314,7 @@ "metadata": { "id": "x7m6sCWJQuYt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Create a validation set.\n", "raw_val_ds = utils.text_dataset_from_directory(\n", @@ -353,9 +331,7 @@ "metadata": { "id": "BXMZc7fMQwKE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "test_dir = dataset_dir/'test'\n", "\n", @@ -406,9 +382,7 @@ "metadata": { "id": "voaC43rZR0jc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "VOCAB_SIZE = 10000\n", "\n", @@ -432,9 +406,7 @@ "metadata": { "id": "XWsY01Zl2aRe" }, - "outputs": [ - - ], + "outputs": [], "source": [ "MAX_SEQUENCE_LENGTH = 250\n", "\n", @@ -461,9 +433,7 @@ "metadata": { "id": "yTXsdDEqSf9e" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Make a text-only dataset (without labels), then call `TextVectorization.adapt`.\n", "train_text = raw_train_ds.map(lambda text, labels: text)\n", @@ -486,9 +456,7 @@ "metadata": { "id": "RngfPyArSsvM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def binary_vectorize_text(text, label):\n", " text = tf.expand_dims(text, -1)\n", @@ -501,9 +469,7 @@ "metadata": { "id": "_1W54wf0LhQ0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def int_vectorize_text(text, label):\n", " text = tf.expand_dims(text, -1)\n", @@ -516,9 +482,7 @@ "metadata": { "id": "Vi_sElMiSmXe" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Retrieve a batch (of 32 reviews and labels) from the dataset.\n", "text_batch, label_batch = next(iter(raw_train_ds))\n", @@ -533,9 +497,7 @@ "metadata": { "id": "UGukZoYv2v3v" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(\"'binary' vectorized question:\",\n", " binary_vectorize_text(first_question, first_label)[0])" @@ -547,9 +509,7 @@ "metadata": { "id": "Lu07FsIw2yH5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(\"'int' vectorized question:\",\n", " int_vectorize_text(first_question, first_label)[0])" @@ -572,9 +532,7 @@ "metadata": { "id": "WpBnTZilS8wt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(\"1289 ---> \", int_vectorize_layer.get_vocabulary()[1289])\n", "print(\"313 ---> \", int_vectorize_layer.get_vocabulary()[313])\n", @@ -598,9 +556,7 @@ "metadata": { "id": "46LeHmnD55wJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "binary_train_ds = raw_train_ds.map(binary_vectorize_text)\n", "binary_val_ds = raw_val_ds.map(binary_vectorize_text)\n", @@ -633,9 +589,7 @@ "metadata": { "id": "PabA9DFIfSz7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "AUTOTUNE = tf.data.AUTOTUNE\n", "\n", @@ -649,9 +603,7 @@ "metadata": { "id": "J8GcJLvb3JH0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "binary_train_ds = configure_dataset(binary_train_ds)\n", "binary_val_ds = configure_dataset(binary_val_ds)\n", @@ -681,9 +633,7 @@ "metadata": { "id": "2q8iAU-VMzaN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "binary_model = tf.keras.Sequential([layers.Dense(4)])\n", "\n", @@ -711,9 +661,7 @@ "metadata": { "id": "5ztw2XH_LbVz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def create_model(vocab_size, num_labels):\n", " model = tf.keras.Sequential([\n", @@ -731,9 +679,7 @@ "metadata": { "id": "s9rG1cFRL31Z" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# `vocab_size` is `VOCAB_SIZE + 1` since `0` is used additionally for padding.\n", "int_model = create_model(vocab_size=VOCAB_SIZE + 1, num_labels=4)\n", @@ -759,9 +705,7 @@ "metadata": { "id": "N8ViDXw99v_u" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(\"Linear model on binary vectorized data:\")\n", "print(binary_model.summary())" @@ -773,9 +717,7 @@ "metadata": { "id": "P9BOeoCwborD" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(\"ConvNet model on int vectorized data:\")\n", "print(int_model.summary())" @@ -796,9 +738,7 @@ "metadata": { "id": "5dTc4nZqf7fK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "binary_loss, binary_accuracy = binary_model.evaluate(binary_test_ds)\n", "int_loss, int_accuracy = int_model.evaluate(int_test_ds)\n", @@ -835,9 +775,7 @@ "metadata": { "id": "_bRe3KX8gRCX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "export_model = tf.keras.Sequential(\n", " [binary_vectorize_layer, binary_model,\n", @@ -868,9 +806,7 @@ "metadata": { "id": "GU53uRXz45iO" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def get_string_labels(predicted_scores_batch):\n", " predicted_int_labels = tf.math.argmax(predicted_scores_batch, axis=1)\n", @@ -893,9 +829,7 @@ "metadata": { "id": "BOR2MupW1_zS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "inputs = [\n", " \"how do I extract keys from a dict into a list?\", # 'python'\n", @@ -964,9 +898,7 @@ "metadata": { "id": "4YlKQthEYlFw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "DIRECTORY_URL = 'https://storage.googleapis.com/download.tensorflow.org/data/illiad/'\n", "FILE_NAMES = ['cowper.txt', 'derby.txt', 'butler.txt']\n", @@ -997,9 +929,7 @@ "metadata": { "id": "YIIWIdPXgk7I" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def labeler(example, index):\n", " return example, tf.cast(index, tf.int64)" @@ -1011,9 +941,7 @@ "metadata": { "id": "8Ajx7AmZnEg3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "labeled_data_sets = []\n", "\n", @@ -1038,9 +966,7 @@ "metadata": { "id": "6jAeYkTIi9-2" }, - "outputs": [ - - ], + "outputs": [], "source": [ "BUFFER_SIZE = 50000\n", "BATCH_SIZE = 64\n", @@ -1053,9 +979,7 @@ "metadata": { "id": "Qd544E-Sh63L" }, - "outputs": [ - - ], + "outputs": [], "source": [ "all_labeled_data = labeled_data_sets[0]\n", "for labeled_dataset in labeled_data_sets[1:]:\n", @@ -1080,9 +1004,7 @@ "metadata": { "id": "gywKlN0xh6u5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for text, label in all_labeled_data.take(10):\n", " print(\"Sentence: \", text.numpy())\n", @@ -1111,9 +1033,7 @@ "metadata": { "id": "v4DpQW-Y12rm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tokenizer = tf_text.UnicodeScriptTokenizer()" ] @@ -1124,9 +1044,7 @@ "metadata": { "id": "pz8xEj0ugu51" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def tokenize(text, unused_label):\n", " lower_case = tf_text.case_fold_utf8(text)\n", @@ -1139,9 +1057,7 @@ "metadata": { "id": "vzUrAzOq31QL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tokenized_ds = all_labeled_data.map(tokenize)" ] @@ -1161,9 +1077,7 @@ "metadata": { "id": "g2mkWri7LiGq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for text_batch in tokenized_ds.take(5):\n", " print(\"Tokens: \", text_batch.numpy())" @@ -1184,9 +1098,7 @@ "metadata": { "id": "YkHtbGnDh6mg" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tokenized_ds = configure_dataset(tokenized_ds)\n", "\n", @@ -1218,9 +1130,7 @@ "metadata": { "id": "kCBo2yFHD7y6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "keys = vocab\n", "values = range(2, len(vocab) + 2) # Reserve `0` for padding, `1` for OOV tokens.\n", @@ -1247,9 +1157,7 @@ "metadata": { "id": "HcIQ7LOTh6eT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def preprocess_text(text, label):\n", " standardized = tf_text.case_fold_utf8(text)\n", @@ -1273,9 +1181,7 @@ "metadata": { "id": "jgxPZaxUuTbk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "example_text, example_label = next(iter(all_labeled_data))\n", "print(\"Sentence: \", example_text.numpy())\n", @@ -1298,9 +1204,7 @@ "metadata": { "id": "KmQVsAgJ-RM0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "all_encoded_data = all_labeled_data.map(preprocess_text)" ] @@ -1331,9 +1235,7 @@ "metadata": { "id": "r-rmbijQh6bf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_data = all_encoded_data.skip(VALIDATION_SIZE).shuffle(BUFFER_SIZE)\n", "validation_data = all_encoded_data.take(VALIDATION_SIZE)" @@ -1345,9 +1247,7 @@ "metadata": { "id": "qTP0IwHBCn0Q" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_data = train_data.padded_batch(BATCH_SIZE)\n", "validation_data = validation_data.padded_batch(BATCH_SIZE)" @@ -1370,9 +1270,7 @@ "metadata": { "id": "kMslWfuwoqpB" }, - "outputs": [ - - ], + "outputs": [], "source": [ "sample_text, sample_labels = next(iter(validation_data))\n", "print(\"Text batch shape: \", sample_text.shape)\n", @@ -1396,9 +1294,7 @@ "metadata": { "id": "u21LlkO8QGRX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "vocab_size += 2" ] @@ -1418,9 +1314,7 @@ "metadata": { "id": "BpT0b_7mYRXV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_data = configure_dataset(train_data)\n", "validation_data = configure_dataset(validation_data)" @@ -1443,9 +1337,7 @@ "metadata": { "id": "QJgI1pow2YR9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = create_model(vocab_size=vocab_size, num_labels=3)\n", "\n", @@ -1463,9 +1355,7 @@ "metadata": { "id": "KTPCYf_Jh6TH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "loss, accuracy = model.evaluate(validation_data)\n", "\n", @@ -1497,9 +1387,7 @@ "metadata": { "id": "_ODkRXbk6aHb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "preprocess_layer = TextVectorization(\n", " max_tokens=vocab_size,\n", @@ -1517,9 +1405,7 @@ "metadata": { "id": "G-Cvd27y4qwt" }, - "outputs": [ - - ], + "outputs": [], "source": [ "export_model = tf.keras.Sequential(\n", " [preprocess_layer, model,\n", @@ -1537,9 +1423,7 @@ "metadata": { "id": "Pyg0B4zsc-UD" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Create a test dataset of raw strings.\n", "test_ds = all_labeled_data.take(VALIDATION_SIZE).batch(BATCH_SIZE)\n", @@ -1575,9 +1459,7 @@ "metadata": { "id": "-w1fQGJPD2Yh" }, - "outputs": [ - - ], + "outputs": [], "source": [ "inputs = [\n", " \"Join'd to th' Ionians with their flowing robes,\", # Label: 1\n", @@ -1619,9 +1501,7 @@ "metadata": { "id": "NzC65LOaVw0B" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Training set.\n", "train_ds = tfds.load(\n", @@ -1638,9 +1518,7 @@ "metadata": { "id": "XKGkgPBkFh0k" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Validation set.\n", "val_ds = tfds.load(\n", @@ -1666,9 +1544,7 @@ "metadata": { "id": "Bq1w8MnfWt2C" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for review_batch, label_batch in val_ds.take(1):\n", " for i in range(5):\n", @@ -1702,9 +1578,7 @@ "metadata": { "id": "UzT_t9ihZLH4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "vectorize_layer = TextVectorization(\n", " max_tokens=VOCAB_SIZE,\n", @@ -1722,9 +1596,7 @@ "metadata": { "id": "zz-Xrd_ZZ4tB" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def vectorize_text(text, label):\n", " text = tf.expand_dims(text, -1)\n", @@ -1737,9 +1609,7 @@ "metadata": { "id": "ycn0Itd6g5aF" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_ds = train_ds.map(vectorize_text)\n", "val_ds = val_ds.map(vectorize_text)" @@ -1751,9 +1621,7 @@ "metadata": { "id": "jc11jQTlZ5lj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Configure datasets for performance as before.\n", "train_ds = configure_dataset(train_ds)\n", @@ -1775,9 +1643,7 @@ "metadata": { "id": "B9IOTLkyZ-a7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = create_model(vocab_size=VOCAB_SIZE + 1, num_labels=1)\n", "model.summary()" @@ -1789,9 +1655,7 @@ "metadata": { "id": "xLnDs5dhaBAk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.compile(\n", " loss=losses.BinaryCrossentropy(from_logits=True),\n", @@ -1805,9 +1669,7 @@ "metadata": { "id": "rq59QpNzaDMa" }, - "outputs": [ - - ], + "outputs": [], "source": [ "history = model.fit(train_ds, validation_data=val_ds, epochs=3)" ] @@ -1818,9 +1680,7 @@ "metadata": { "id": "gCMWCEtyaEbR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "loss, accuracy = model.evaluate(val_ds)\n", "\n", @@ -1843,9 +1703,7 @@ "metadata": { "id": "yE9WZARZaZr1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "export_model = tf.keras.Sequential(\n", " [vectorize_layer, model,\n", @@ -1863,9 +1721,7 @@ "metadata": { "id": "bhF8tDH-afoC" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# 0 --> negative review\n", "# 1 --> positive review\n", @@ -1905,9 +1761,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "text.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/load_data/tfrecord.ipynb b/site/ko/tutorials/load_data/tfrecord.ipynb index 2b408b67f5..fea7666f55 100644 --- a/site/ko/tutorials/load_data/tfrecord.ipynb +++ b/site/ko/tutorials/load_data/tfrecord.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "uBDvXpYzYnGj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -92,9 +90,7 @@ "metadata": { "id": "Ja7sezsmnXph" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "\n", @@ -165,9 +161,7 @@ "metadata": { "id": "mbsPOUpVtYxA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# The following functions can be used to convert a value to a type compatible\n", "# with tf.train.Example.\n", @@ -211,9 +205,7 @@ "metadata": { "id": "hZzyLGr0u73y" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(_bytes_feature(b'test_string'))\n", "print(_bytes_feature(u'test_bytes'.encode('utf-8')))\n", @@ -239,9 +231,7 @@ "metadata": { "id": "5afZkORT5pjm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "feature = _float_feature(np.exp(1))\n", "\n", @@ -296,9 +286,7 @@ "metadata": { "id": "CnrguFAy3YQv" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# The number of observations in the dataset.\n", "n_observations = int(1e4)\n", @@ -332,9 +320,7 @@ "metadata": { "id": "RTCS49Ij_kUw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def serialize_example(feature0, feature1, feature2, feature3):\n", " \"\"\"\n", @@ -370,9 +356,7 @@ "metadata": { "id": "N8BtSx2RjYcb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# This is an example observation from the dataset.\n", "\n", @@ -397,9 +381,7 @@ "metadata": { "id": "dGim-mEm6vit" }, - "outputs": [ - - ], + "outputs": [], "source": [ "example_proto = tf.train.Example.FromString(serialized_example)\n", "example_proto" @@ -479,9 +461,7 @@ "metadata": { "id": "mXeaukvwu5_-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf.data.Dataset.from_tensor_slices(feature1)" ] @@ -501,9 +481,7 @@ "metadata": { "id": "H5sWyu1kxnvg" }, - "outputs": [ - - ], + "outputs": [], "source": [ "features_dataset = tf.data.Dataset.from_tensor_slices((feature0, feature1, feature2, feature3))\n", "features_dataset" @@ -515,9 +493,7 @@ "metadata": { "id": "m1C-t71Nywze" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Use `take(1)` to only pull one example from the dataset.\n", "for f0,f1,f2,f3 in features_dataset.take(1):\n", @@ -546,9 +522,7 @@ "metadata": { "id": "apB5KYrJzjPI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def tf_serialize_example(f0,f1,f2,f3):\n", " tf_string = tf.py_function(\n", @@ -564,9 +538,7 @@ "metadata": { "id": "lHFjW4u4Npz9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf_serialize_example(f0, f1, f2, f3)" ] @@ -586,9 +558,7 @@ "metadata": { "id": "VDeqYVbW3ww9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "serialized_features_dataset = features_dataset.map(tf_serialize_example)\n", "serialized_features_dataset" @@ -600,9 +570,7 @@ "metadata": { "id": "DlDfuh46bRf6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def generator():\n", " for features in features_dataset:\n", @@ -615,9 +583,7 @@ "metadata": { "id": "iv9oXKrcbhvX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "serialized_features_dataset = tf.data.Dataset.from_generator(\n", " generator, output_types=tf.string, output_shapes=())" @@ -629,9 +595,7 @@ "metadata": { "id": "Dqz8C4D5cIj9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "serialized_features_dataset" ] @@ -651,9 +615,7 @@ "metadata": { "id": "vP1VgTO44UIE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "filename = 'test.tfrecord'\n", "writer = tf.data.experimental.TFRecordWriter(filename)\n", @@ -688,9 +650,7 @@ "metadata": { "id": "6OjX6UZl-bHC" }, - "outputs": [ - - ], + "outputs": [], "source": [ "filenames = [filename]\n", "raw_dataset = tf.data.TFRecordDataset(filenames)\n", @@ -716,9 +676,7 @@ "metadata": { "id": "hxVXpLz_AJlm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for raw_record in raw_dataset.take(10):\n", " print(repr(raw_record))" @@ -739,9 +697,7 @@ "metadata": { "id": "zQjbIR1nleiy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Create a description of the features.\n", "feature_description = {\n", @@ -771,9 +727,7 @@ "metadata": { "id": "6Ob7D-zmBm1w" }, - "outputs": [ - - ], + "outputs": [], "source": [ "parsed_dataset = raw_dataset.map(_parse_function)\n", "parsed_dataset" @@ -794,9 +748,7 @@ "metadata": { "id": "x2LT2JCqhoD_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for parsed_record in parsed_dataset.take(10):\n", " print(repr(parsed_record))" @@ -853,9 +805,7 @@ "metadata": { "id": "MKPHzoGv7q44" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Write the `tf.train.Example` observations to the file.\n", "with tf.io.TFRecordWriter(filename) as writer:\n", @@ -870,9 +820,7 @@ "metadata": { "id": "EjdFHHJMpUUo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!du -sh {filename}" ] @@ -894,9 +842,7 @@ "metadata": { "id": "U3tnd3LerOtV" }, - "outputs": [ - - ], + "outputs": [], "source": [ "filenames = [filename]\n", "raw_dataset = tf.data.TFRecordDataset(filenames)\n", @@ -909,9 +855,7 @@ "metadata": { "id": "nsEAACHcnm3f" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for raw_record in raw_dataset.take(1):\n", " example = tf.train.Example()\n", @@ -943,9 +887,7 @@ "metadata": { "id": "Ziv9tiNE1l6J" }, - "outputs": [ - - ], + "outputs": [], "source": [ "result = {}\n", "# example.features.feature is the dictionary\n", @@ -996,9 +938,7 @@ "metadata": { "id": "3a0fmwg8lHdF" }, - "outputs": [ - - ], + "outputs": [], "source": [ "cat_in_snow = tf.keras.utils.get_file(\n", " '320px-Felis_catus-cat_on_snow.jpg',\n", @@ -1015,9 +955,7 @@ "metadata": { "id": "7aJJh7vENeE4" }, - "outputs": [ - - ], + "outputs": [], "source": [ "display.display(display.Image(filename=cat_in_snow))\n", "display.display(display.HTML('Image cc-by: Von.grzanka'))" @@ -1029,9 +967,7 @@ "metadata": { "id": "KkW0uuhcXZqA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "display.display(display.Image(filename=williamsburg_bridge))\n", "display.display(display.HTML('From Wikimedia'))" @@ -1061,9 +997,7 @@ "metadata": { "id": "kC4TS1ZEONHr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "image_labels = {\n", " cat_in_snow : 0,\n", @@ -1077,9 +1011,7 @@ "metadata": { "id": "c5njMSYNEhNZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# This is an example, just using the cat image.\n", "image_string = open(cat_in_snow, 'rb').read()\n", @@ -1120,9 +1052,7 @@ "metadata": { "id": "qcw06lQCOCZU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Write the raw image files to `images.tfrecords`.\n", "# First, process the two images into `tf.train.Example` messages.\n", @@ -1141,9 +1071,7 @@ "metadata": { "id": "yJrTe6tHPCfs" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!du -sh {record_file}" ] @@ -1165,9 +1093,7 @@ "metadata": { "id": "M6Cnfd3cTKHN" }, - "outputs": [ - - ], + "outputs": [], "source": [ "raw_image_dataset = tf.data.TFRecordDataset('images.tfrecords')\n", "\n", @@ -1203,9 +1129,7 @@ "metadata": { "id": "yZf8jOyEIjSF" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for image_features in parsed_image_dataset:\n", " image_raw = image_features['image_raw'].numpy()\n", diff --git a/site/ko/tutorials/quickstart/beginner.ipynb b/site/ko/tutorials/quickstart/beginner.ipynb index 8140bd2f8e..c02b711469 100644 --- a/site/ko/tutorials/quickstart/beginner.ipynb +++ b/site/ko/tutorials/quickstart/beginner.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "BZSlp3DAjdYf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -101,9 +99,7 @@ "metadata": { "id": "0trJmd6DjqBZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "print(\"TensorFlow version:\", tf.__version__)" @@ -130,9 +126,7 @@ "metadata": { "id": "7FP5258xjs-v" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mnist = tf.keras.datasets.mnist\n", "\n", @@ -157,9 +151,7 @@ "metadata": { "id": "h3IKyzTCDNGo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = tf.keras.models.Sequential([\n", " tf.keras.layers.Flatten(input_shape=(28, 28)),\n", @@ -190,9 +182,7 @@ "metadata": { "id": "OeOrNdnkEEcR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "predictions = model(x_train[:1]).numpy()\n", "predictions" @@ -213,9 +203,7 @@ "metadata": { "id": "zWSRnQ0WI5eq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf.nn.softmax(predictions).numpy()" ] @@ -244,9 +232,7 @@ "metadata": { "id": "RSkzdv8MD0tT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)" ] @@ -268,9 +254,7 @@ "metadata": { "id": "NJWqEVrrJ7ZB" }, - "outputs": [ - - ], + "outputs": [], "source": [ "loss_fn(y_train[:1], predictions).numpy()" ] @@ -290,9 +274,7 @@ "metadata": { "id": "9foNKHzTD2Vo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.compile(optimizer='adam',\n", " loss=loss_fn,\n", @@ -316,9 +298,7 @@ "metadata": { "id": "y7suUbJXVLqP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.fit(x_train, y_train, epochs=5)" ] @@ -338,9 +318,7 @@ "metadata": { "id": "F7dTAzgHDUh7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.fit(x_train, y_train, epochs=5)\n", "\n", @@ -371,9 +349,7 @@ "metadata": { "id": "rYb6DrEH0GMv" }, - "outputs": [ - - ], + "outputs": [], "source": [ "probability_model = tf.keras.Sequential([\n", " model,\n", @@ -387,9 +363,7 @@ "metadata": { "id": "cnqOZtUp1YR_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "probability_model(x_test[:5])" ] diff --git a/site/ko/tutorials/reinforcement_learning/actor_critic.ipynb b/site/ko/tutorials/reinforcement_learning/actor_critic.ipynb index 5540914230..668e54bdc2 100644 --- a/site/ko/tutorials/reinforcement_learning/actor_critic.ipynb +++ b/site/ko/tutorials/reinforcement_learning/actor_critic.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "V_sgB_5dx1f1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -128,9 +126,7 @@ "metadata": { "id": "13l6BbxKhCKp" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install gym[classic_control]\n", "!pip install pyglet" @@ -142,9 +138,7 @@ "metadata": { "id": "WBeQhPi2S4m5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%bash\n", "# Install additional packages for visualization\n", @@ -158,9 +152,7 @@ "metadata": { "id": "tT4N3qYviUJr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import collections\n", "import gym\n", @@ -209,9 +201,7 @@ "metadata": { "id": "aXKbbMC-kmuv" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class ActorCritic(tf.keras.Model):\n", " \"\"\"Combined actor-critic network.\"\"\"\n", @@ -238,9 +228,7 @@ "metadata": { "id": "nWyxJgjLn68c" }, - "outputs": [ - - ], + "outputs": [], "source": [ "num_actions = env.action_space.n # 2\n", "num_hidden_units = 128\n", @@ -288,9 +276,7 @@ "metadata": { "id": "5URrbGlDSAGx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Wrap Gym's `env.step` call as an operation in a TensorFlow function.\n", "# This would allow it to be included in a callable TensorFlow graph.\n", @@ -315,9 +301,7 @@ "metadata": { "id": "a4qVRV063Cl9" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def run_episode(\n", " initial_state: tf.Tensor, \n", @@ -391,9 +375,7 @@ "metadata": { "id": "jpEwFyl315dl" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def get_expected_return(\n", " rewards: tf.Tensor, \n", @@ -502,9 +484,7 @@ "metadata": { "id": "9EXwbEez6n9m" }, - "outputs": [ - - ], + "outputs": [], "source": [ "huber_loss = tf.keras.losses.Huber(reduction=tf.keras.losses.Reduction.SUM)\n", "\n", @@ -547,9 +527,7 @@ "metadata": { "id": "QoccrkF3IFCg" }, - "outputs": [ - - ], + "outputs": [], "source": [ "optimizer = tf.keras.optimizers.Adam(learning_rate=0.01)\n", "\n", @@ -611,9 +589,7 @@ "metadata": { "id": "kbmBxnzLiUJx" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%%time\n", "\n", @@ -673,9 +649,7 @@ "metadata": { "id": "qbIMMkfmRHyC" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Render an episode and save as a GIF file\n", "\n", @@ -723,9 +697,7 @@ "metadata": { "id": "TLd720SejKmf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow_docs.vis.embed as embed\n", "embed.embed_file(image_file)" diff --git a/site/ko/tutorials/structured_data/preprocessing_layers.ipynb b/site/ko/tutorials/structured_data/preprocessing_layers.ipynb index 3181ba4345..67e682c9d5 100644 --- a/site/ko/tutorials/structured_data/preprocessing_layers.ipynb +++ b/site/ko/tutorials/structured_data/preprocessing_layers.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "2mapZ9afGJ69" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -128,9 +126,7 @@ "metadata": { "id": "LklnLlt6yEqf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", @@ -145,9 +141,7 @@ "metadata": { "id": "TKU7RyoQGVKB" }, - "outputs": [ - - ], + "outputs": [], "source": [ "tf.__version__" ] @@ -169,9 +163,7 @@ "metadata": { "id": "qJ4Ajn-YyEqj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "dataset_url = 'http://storage.googleapis.com/download.tensorflow.org/data/petfinder-mini.zip'\n", "csv_file = 'datasets/petfinder-mini/petfinder-mini.csv'\n", @@ -196,9 +188,7 @@ "metadata": { "id": "3uiq4hoIGyXI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "dataframe.head()" ] @@ -224,9 +214,7 @@ "metadata": { "id": "wmMDc46-yEqq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# In the original dataset, `'AdoptionSpeed'` of `4` indicates\n", "# a pet was not adopted.\n", @@ -253,9 +241,7 @@ "metadata": { "id": "XvSinthO8oMj" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train, val, test = np.split(dataframe.sample(frac=1), [int(0.8*len(dataframe)), int(0.9*len(dataframe))])" ] @@ -266,9 +252,7 @@ "metadata": { "id": "U02Q1moWoPwQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(len(train), 'training examples')\n", "print(len(val), 'validation examples')\n", @@ -294,9 +278,7 @@ "metadata": { "id": "7r4j-1lRyEqw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def df_to_dataset(dataframe, shuffle=True, batch_size=32):\n", " df = dataframe.copy()\n", @@ -325,9 +307,7 @@ "metadata": { "id": "tYiNH-QI96Jo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "batch_size = 5\n", "train_ds = df_to_dataset(train, batch_size=batch_size)" @@ -339,9 +319,7 @@ "metadata": { "id": "nFYir6S8HgIJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "[(train_features, label_batch)] = train_ds.take(1)\n", "print('Every feature:', list(train_features.keys()))\n", @@ -400,9 +378,7 @@ "metadata": { "id": "D6OuEKMMyEq1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def get_normalization_layer(name, dataset):\n", " # Create a Normalization layer for the feature.\n", @@ -432,9 +408,7 @@ "metadata": { "id": "MpKgUDyk69bM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "photo_count_col = train_features['PhotoAmt']\n", "layer = get_normalization_layer('PhotoAmt', train_ds)\n", @@ -469,9 +443,7 @@ "metadata": { "id": "GmgaeRjlDoUO" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def get_category_encoding_layer(name, dataset, dtype, max_tokens=None):\n", " # Create a layer that turns strings into integer indices.\n", @@ -510,9 +482,7 @@ "metadata": { "id": "X2t2ff9K8PcT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "test_type_col = train_features['Type']\n", "test_type_layer = get_category_encoding_layer(name='Type',\n", @@ -536,9 +506,7 @@ "metadata": { "id": "7FjBioQ38oNE" }, - "outputs": [ - - ], + "outputs": [], "source": [ "test_age_col = train_features['Age']\n", "test_age_layer = get_category_encoding_layer(name='Age',\n", @@ -581,9 +549,7 @@ "metadata": { "id": "Rcv2kQTTo23h" }, - "outputs": [ - - ], + "outputs": [], "source": [ "batch_size = 256\n", "train_ds = df_to_dataset(train, batch_size=batch_size)\n", @@ -606,9 +572,7 @@ "metadata": { "id": "Q3RBa51VkaAn" }, - "outputs": [ - - ], + "outputs": [], "source": [ "all_inputs = []\n", "encoded_features = []\n", @@ -637,9 +601,7 @@ "metadata": { "id": "1FOMGfZflhoA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "age_col = tf.keras.Input(shape=(1,), name='Age', dtype='int64')\n", "\n", @@ -667,9 +629,7 @@ "metadata": { "id": "K8C8xyiXm-Ie" }, - "outputs": [ - - ], + "outputs": [], "source": [ "categorical_cols = ['Type', 'Color1', 'Color2', 'Gender', 'MaturitySize',\n", " 'FurLength', 'Vaccinated', 'Sterilized', 'Health', 'Breed1']\n", @@ -709,9 +669,7 @@ "metadata": { "id": "6Yrj-_pr6jyL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "all_features = tf.keras.layers.concatenate(encoded_features)\n", "x = tf.keras.layers.Dense(32, activation=\"relu\")(all_features)\n", @@ -736,9 +694,7 @@ "metadata": { "id": "GZDb_lJdelSg" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.compile(optimizer='adam',\n", " loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),\n", @@ -760,9 +716,7 @@ "metadata": { "id": "Y7Bkx4c7yEq5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Use `rankdir='LR'` to make the graph horizontal.\n", "tf.keras.utils.plot_model(model, show_shapes=True, rankdir=\"LR\")" @@ -783,9 +737,7 @@ "metadata": { "id": "OQfE3PC6yEq8" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.fit(train_ds, epochs=10, validation_data=val_ds)" ] @@ -796,9 +748,7 @@ "metadata": { "id": "T8N2uAdU2Cni" }, - "outputs": [ - - ], + "outputs": [], "source": [ "loss, accuracy = model.evaluate(test_ds)\n", "print(\"Accuracy\", accuracy)" @@ -823,9 +773,7 @@ "metadata": { "id": "QH9Zy1sBvwOH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.save('my_pet_classifier.keras')\n", "reloaded_model = tf.keras.models.load_model('my_pet_classifier.keras')" @@ -849,9 +797,7 @@ "metadata": { "id": "rKq4pxtdDa7i" }, - "outputs": [ - - ], + "outputs": [], "source": [ "sample = {\n", " 'Type': 'Cat',\n", @@ -908,9 +854,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "preprocessing_layers.ipynb", "toc_visible": true }, diff --git a/site/ko/xla/tutorials/autoclustering_xla.ipynb b/site/ko/xla/tutorials/autoclustering_xla.ipynb index 7ec775f996..654b74d351 100644 --- a/site/ko/xla/tutorials/autoclustering_xla.ipynb +++ b/site/ko/xla/tutorials/autoclustering_xla.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "vamNSA0vEP-m" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -73,9 +71,7 @@ "metadata": { "id": "R4xtYyOf78e3" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install -U -q tensorflow tensorflow_datasets" ] @@ -86,9 +82,7 @@ "metadata": { "id": "PH2HbLW65tmo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "import tensorflow_datasets as tfds" @@ -100,9 +94,7 @@ "metadata": { "id": "7vm2QsMisCxI" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Check that GPU is available: cf. https://colab.research.google.com/notebooks/gpu.ipynb\n", "assert(tf.test.gpu_device_name())\n", @@ -141,9 +133,7 @@ "metadata": { "id": "3ZRQSwoRsKM_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def generate_model():\n", " return tf.keras.models.Sequential([\n", @@ -187,9 +177,7 @@ "metadata": { "id": "UKCmrhF0tiMa" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def compile_model(model):\n", " opt = tf.keras.optimizers.RMSprop(learning_rate=0.0001)\n", @@ -232,9 +220,7 @@ "metadata": { "id": "jxU-Tzy4SX7p" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# We need to clear the session to enable JIT in the middle of the program.\n", "tf.keras.backend.clear_session()\n", @@ -259,9 +245,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "autoclustering_xla.ipynb", "toc_visible": true }, From 41a7ac61960b34a39166f831534bdab1c47568dc Mon Sep 17 00:00:00 2001 From: ilyaspiridonov Date: Sat, 4 Nov 2023 21:55:25 +0300 Subject: [PATCH 3/5] rm translated notebooks without EN counterparts --- .../lite/models/style_transfer/overview.ipynb | 503 ------- ...l_Inference_with_Multipart_Bijectors.ipynb | 1206 ----------------- .../tfx/tutorials/tfx/penguin_transform.ipynb | 854 ------------ 3 files changed, 2563 deletions(-) delete mode 100644 site/ko/lite/models/style_transfer/overview.ipynb delete mode 100644 site/ko/probability/examples/Variational_Inference_with_Multipart_Bijectors.ipynb delete mode 100644 site/ko/tfx/tutorials/tfx/penguin_transform.ipynb diff --git a/site/ko/lite/models/style_transfer/overview.ipynb b/site/ko/lite/models/style_transfer/overview.ipynb deleted file mode 100644 index 6b30c91714..0000000000 --- a/site/ko/lite/models/style_transfer/overview.ipynb +++ /dev/null @@ -1,503 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "g_nWetWWd_ns" - }, - "source": [ - "##### Copyright 2019 The TensorFlow Authors." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "cellView": "form", - "id": "2pHVBk_seED1" - }, - "outputs": [], - "source": [ - "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", - "# you may not use this file except in compliance with the License.\n", - "# You may obtain a copy of the License at\n", - "#\n", - "# https://www.apache.org/licenses/LICENSE-2.0\n", - "#\n", - "# Unless required by applicable law or agreed to in writing, software\n", - "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", - "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", - "# See the License for the specific language governing permissions and\n", - "# limitations under the License." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "M7vSdG6sAIQn" - }, - "source": [ - "# TensorFlow Lite를 사용한 예술적 스타일 전이" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "fwc5GKHBASdc" - }, - "source": [ - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TensorFlow.org에서 보기Google Colab에서 실행GitHub에서 소스 보기노트북 다운로드TF 허브 모델 보기
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "31O0iaROAw8z" - }, - "source": [ - "최근에 와서 딥 러닝에서 가장 흥미로운 발전 중 하나는 [예술적 스타일 전이](https://arxiv.org/abs/1508.06576) 또는 [파스티슈](https://en.wikipedia.org/wiki/Pastiche)라고 알려진 새로운 이미지를 만드는 기능인데, 이는 예술적 스타일을 표현하는 입력 이미지 하나와 그 내용을 나타내는 나머지 하나의 입력 이미지에 기반합니다.\n", - "\n", - "![스타일 전송 예](https://storage.googleapis.com/download.tensorflow.org/models/tflite/arbitrary_style_transfer/formula.png)\n", - "\n", - "이 기술을 사용하여 다양한 스타일의 아름다운 새 작품을 만들 수 있습니다.\n", - "\n", - "![스타일 전송 예](https://storage.googleapis.com/download.tensorflow.org/models/tflite/arbitrary_style_transfer/table.png)\n", - "\n", - "TensorFlow Lite를 처음 사용하고 Android로 작업하는 경우, 다음 예제 애플리케이션을 탐색하면 시작하는 데 도움이 됩니다.\n", - "\n", - "Android 예제 iOS 예제\n", - "\n", - "Android 또는 iOS 이외의 플랫폼을 사용 중이거나 TensorFlow Lite API에 이미 익숙한 경우 이 튜토리얼을 따라 사전 훈련된 TensorFlow Lite 모델로 콘텐츠 및 스타일 이미지 쌍에 스타일 전이를 적용하는 방법을 배울 수 있습니다. 모델을 사용하여 자신의 모바일 애플리케이션에 스타일 전이를 추가할 수 있습니다.\n", - "\n", - "모델은 [GitHub](https://github.com/tensorflow/magenta/tree/master/magenta/models/arbitrary_image_stylization#train-a-model-on-a-large-dataset-with-data-augmentation-to-run-on-mobile)에서 오픈 소스입니다. 다른 매개변수를 사용하여 모델을 다시 훈련할 수 있습니다(예: 출력 이미지가 콘텐츠 이미지처럼 보이도록 콘텐츠 레이어의 가중치를 높임)." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ak0S4gkOCSxs" - }, - "source": [ - "## 모델 아키텍처 이해하기" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "oee6G_bBCgAM" - }, - "source": [ - "![모델 아키텍처](https://storage.googleapis.com/download.tensorflow.org/models/tflite/arbitrary_style_transfer/architecture.png)\n", - "\n", - "해당 예술적 스타일 전이 모델은 두 개의 하위 모델로 구성됩니다.\n", - "\n", - "1. **스타일 예측 모델**: 입력 스타일 이미지를 100차원 스타일 병목 벡터로 가져오는 MobilenetV2 기반 신경망\n", - "2. **스타일 변환 모델**: 콘텐츠 이미지에 스타일 병목 벡터를 적용하고 스타일화된 이미지를 만드는 신경망\n", - "\n", - "앱에서 고정된 스타일 이미지 집합만 지원해야 하는 경우 해당 스타일 병목 벡터를 미리 계산하고 앱의 바이너리에서 스타일 예측 모델을 제외할 수 있습니다." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "a7ZETsRVNMo7" - }, - "source": [ - "## 설정" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "3n8oObKZN4c8" - }, - "source": [ - "종속성을 가져옵니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "xz62Lb1oNm97" - }, - "outputs": [], - "source": [ - "import tensorflow as tf\n", - "print(tf.__version__)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "1Ua5FpcJNrIj" - }, - "outputs": [], - "source": [ - "import IPython.display as display\n", - "\n", - "import matplotlib.pyplot as plt\n", - "import matplotlib as mpl\n", - "mpl.rcParams['figure.figsize'] = (12,12)\n", - "mpl.rcParams['axes.grid'] = False\n", - "\n", - "import numpy as np\n", - "import time\n", - "import functools" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "1b988wrrQnVF" - }, - "source": [ - "콘텐츠 및 스타일 이미지와 사전 훈련된 TensorFlow Lite 모델을 다운로드합니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "16g57cIMQnen" - }, - "outputs": [], - "source": [ - "content_path = tf.keras.utils.get_file('belfry.jpg','https://storage.googleapis.com/khanhlvg-public.appspot.com/arbitrary-style-transfer/belfry-2611573_1280.jpg')\n", - "style_path = tf.keras.utils.get_file('style23.jpg','https://storage.googleapis.com/khanhlvg-public.appspot.com/arbitrary-style-transfer/style23.jpg')\n", - "\n", - "style_predict_path = tf.keras.utils.get_file('style_predict.tflite', 'https://tfhub.dev/google/lite-model/magenta/arbitrary-image-stylization-v1-256/int8/prediction/1?lite-format=tflite')\n", - "style_transform_path = tf.keras.utils.get_file('style_transform.tflite', 'https://tfhub.dev/google/lite-model/magenta/arbitrary-image-stylization-v1-256/int8/transfer/1?lite-format=tflite')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "MQZXL7kON-gM" - }, - "source": [ - "## 입력 전처리하기\n", - "\n", - "- 콘텐츠 이미지와 스타일 이미지는 픽셀 값이 [0..1] 사이의 float32 숫자인 RGB 이미지여야 합니다.\n", - "- 스타일 이미지 크기는 (1, 256, 256, 3)이어야 합니다. 중앙에서 이미지를 자르고 크기를 조정합니다.\n", - "- 콘텐츠 이미지는 (1, 384, 384, 3)이어야 합니다. 중앙에서 이미지를 자르고 크기를 조정합니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "Cg0Vi-rXRUFl" - }, - "outputs": [], - "source": [ - "# Function to load an image from a file, and add a batch dimension.\n", - "def load_img(path_to_img):\n", - " img = tf.io.read_file(path_to_img)\n", - " img = tf.io.decode_image(img, channels=3)\n", - " img = tf.image.convert_image_dtype(img, tf.float32)\n", - " img = img[tf.newaxis, :]\n", - "\n", - " return img\n", - "\n", - "# Function to pre-process by resizing an central cropping it.\n", - "def preprocess_image(image, target_dim):\n", - " # Resize the image so that the shorter dimension becomes 256px.\n", - " shape = tf.cast(tf.shape(image)[1:-1], tf.float32)\n", - " short_dim = min(shape)\n", - " scale = target_dim / short_dim\n", - " new_shape = tf.cast(shape * scale, tf.int32)\n", - " image = tf.image.resize(image, new_shape)\n", - "\n", - " # Central crop the image.\n", - " image = tf.image.resize_with_crop_or_pad(image, target_dim, target_dim)\n", - "\n", - " return image\n", - "\n", - "# Load the input images.\n", - "content_image = load_img(content_path)\n", - "style_image = load_img(style_path)\n", - "\n", - "# Preprocess the input images.\n", - "preprocessed_content_image = preprocess_image(content_image, 384)\n", - "preprocessed_style_image = preprocess_image(style_image, 256)\n", - "\n", - "print('Style Image Shape:', preprocessed_style_image.shape)\n", - "print('Content Image Shape:', preprocessed_content_image.shape)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "xE4Yt8nArTeR" - }, - "source": [ - "## 입력 시각화하기" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "ncPA4esJRcEu" - }, - "outputs": [], - "source": [ - "def imshow(image, title=None):\n", - " if len(image.shape) > 3:\n", - " image = tf.squeeze(image, axis=0)\n", - "\n", - " plt.imshow(image)\n", - " if title:\n", - " plt.title(title)\n", - "\n", - "plt.subplot(1, 2, 1)\n", - "imshow(preprocessed_content_image, 'Content Image')\n", - "\n", - "plt.subplot(1, 2, 2)\n", - "imshow(preprocessed_style_image, 'Style Image')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "CJ7R-CHbjC3s" - }, - "source": [ - "## TensorFlow Lite로 스타일 전이 실행하기" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "euu00ldHjKwD" - }, - "source": [ - "### 스타일 예측" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "o3zd9cTFRiS_" - }, - "outputs": [], - "source": [ - "# Function to run style prediction on preprocessed style image.\n", - "def run_style_predict(preprocessed_style_image):\n", - " # Load the model.\n", - " interpreter = tf.lite.Interpreter(model_path=style_predict_path)\n", - "\n", - " # Set model input.\n", - " interpreter.allocate_tensors()\n", - " input_details = interpreter.get_input_details()\n", - " interpreter.set_tensor(input_details[0][\"index\"], preprocessed_style_image)\n", - "\n", - " # Calculate style bottleneck.\n", - " interpreter.invoke()\n", - " style_bottleneck = interpreter.tensor(\n", - " interpreter.get_output_details()[0][\"index\"]\n", - " )()\n", - "\n", - " return style_bottleneck\n", - "\n", - "# Calculate style bottleneck for the preprocessed style image.\n", - "style_bottleneck = run_style_predict(preprocessed_style_image)\n", - "print('Style Bottleneck Shape:', style_bottleneck.shape)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "00t8S2PekIyW" - }, - "source": [ - "### 스타일 변환" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "cZp5bCj8SX1w" - }, - "outputs": [], - "source": [ - "# Run style transform on preprocessed style image\n", - "def run_style_transform(style_bottleneck, preprocessed_content_image):\n", - " # Load the model.\n", - " interpreter = tf.lite.Interpreter(model_path=style_transform_path)\n", - "\n", - " # Set model input.\n", - " input_details = interpreter.get_input_details()\n", - " interpreter.allocate_tensors()\n", - "\n", - " # Set model inputs.\n", - " interpreter.set_tensor(input_details[0][\"index\"], preprocessed_content_image)\n", - " interpreter.set_tensor(input_details[1][\"index\"], style_bottleneck)\n", - " interpreter.invoke()\n", - "\n", - " # Transform content image.\n", - " stylized_image = interpreter.tensor(\n", - " interpreter.get_output_details()[0][\"index\"]\n", - " )()\n", - "\n", - " return stylized_image\n", - "\n", - "# Stylize the content image using the style bottleneck.\n", - "stylized_image = run_style_transform(style_bottleneck, preprocessed_content_image)\n", - "\n", - "# Visualize the output.\n", - "imshow(stylized_image, 'Stylized Image')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "vv_71Td-QtrW" - }, - "source": [ - "### 스타일 블렌딩\n", - "\n", - "콘텐츠 이미지의 스타일을 스타일화된 출력에 혼합하여 출력을 콘텐츠 이미지와 더 비슷하게 만들 수 있습니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "eJcAURXQQtJ7" - }, - "outputs": [], - "source": [ - "# Calculate style bottleneck of the content image.\n", - "style_bottleneck_content = run_style_predict(\n", - " preprocess_image(content_image, 256)\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "4S3yg2MgkmRD" - }, - "outputs": [], - "source": [ - "# Define content blending ratio between [0..1].\n", - "# 0.0: 0% style extracts from content image.\n", - "# 1.0: 100% style extracted from content image.\n", - "content_blending_ratio = 0.5 #@param {type:\"slider\", min:0, max:1, step:0.01}\n", - "\n", - "# Blend the style bottleneck of style image and content image\n", - "style_bottleneck_blended = content_blending_ratio * style_bottleneck_content \\\n", - " + (1 - content_blending_ratio) * style_bottleneck\n", - "\n", - "# Stylize the content image using the style bottleneck.\n", - "stylized_image_blended = run_style_transform(style_bottleneck_blended,\n", - " preprocessed_content_image)\n", - "\n", - "# Visualize the output.\n", - "imshow(stylized_image_blended, 'Blended Stylized Image')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "9k9jGIep8p1c" - }, - "source": [ - "## 성능 벤치마크\n", - "\n", - "성능 벤치마크 수치는 [여기에 설명된](https://www.tensorflow.org/lite/performance/benchmarks) 도구를 사용하여 생성됩니다.\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
모델명 모델 크기 기기 NNAPI CPU GPU
스타일 예측 모델(int8)2.8MbPixel 3(Android 10) 142ms14ms *
Pixel 4(Android 10) 5.2ms6.7ms *
iPhone XS(iOS 12.4.1) 10.7ms **
스타일 변환 모델(int8)0.2MbPixel 3(Android 10) 540ms *
Pixel 4(Android 10) 405ms *
iPhone XS(iOS 12.4.1) 251ms **
스타일 예측 모델(float16)4.7MbPixel 3(Android 10) 86ms28ms *9.1ms
Pixel 4(Android 10)32ms12ms *10ms
스타일 전송 모델(float16)0.4MbPixel 3(Android 10) 1095ms545ms *42ms
Pixel 4(Android 10)603ms377ms *42ms
\n", - "\n", - "** 4개의 스레드가 사용되었습니다.
*\n", - "*** 최상의 결과를 위해 iPhone에 2개의 스레드가 있습니다.*\n" - ] - } - ], - "metadata": { - "colab": { - "collapsed_sections": [], - "name": "overview.ipynb", - "toc_visible": true - }, - "kernelspec": { - "display_name": "Python 3", - "name": "python3" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/site/ko/probability/examples/Variational_Inference_with_Multipart_Bijectors.ipynb b/site/ko/probability/examples/Variational_Inference_with_Multipart_Bijectors.ipynb deleted file mode 100644 index 1f7de14e66..0000000000 --- a/site/ko/probability/examples/Variational_Inference_with_Multipart_Bijectors.ipynb +++ /dev/null @@ -1,1206 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "u3Zq5VrfiDqB" - }, - "source": [ - "##### Copyright 2021 The TensorFlow Authors.\n", - "\n", - "Licensed under the Apache License, Version 2.0 (the \"License\");" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "cellView": "form", - "id": "3jTEqPzFiHQ0" - }, - "outputs": [], - "source": [ - "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n", - "# you may not use this file except in compliance with the License.\n", - "# You may obtain a copy of the License at\n", - "#\n", - "# https://www.apache.org/licenses/LICENSE-2.0\n", - "#\n", - "# Unless required by applicable law or agreed to in writing, software\n", - "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", - "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", - "# See the License for the specific language governing permissions and\n", - "# limitations under the License." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "x97n3SaNmNpB" - }, - "source": [ - "# 결합 분포를 사용한 확률론적 그래픽 모델에 대한 변분 추론\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "
TensorFlow.org에서보기 Google Colab에서 실행하기\n", - "GitHub에서 소스 보기노트북 다운로드하기
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "SVcOch4u2bVS" - }, - "source": [ - "변분 추론(VI)은 거의 정확한 베이지안 추론을 최적화 문제로 제시하며 진정한 사후 확률 분포로 KL 발산을 최소화하는 '대체' 사후 확률 분포를 찾습니다. 그래디언트 기반 VI는 종종 MCMC 메서드보다 빠르며, 모델 매개변수의 최적화로 자연스럽게 구성되며, 모델 비교, 수렴 진단, 구성 가능한 추론에 직접 사용할 수 있는 모델 증거에 하한를 제공합니다.\n", - "\n", - "TensorFlow 확률은 TFP 스택에 자연스럽게 맞는 빠르고, 유연하며, 확장 가능한 VI를 위한 도구를 제공합니다. 이러한 도구를 사용하여 선형 변이 또는 정규화 흐름으로 유도된 공분산 구조의 대체 사후 확률을 구성할 수 있습니다.\n", - "\n", - "VI는 관심 결과에 대한 여러 처리 또는 관측된 기능의 영향을 추정하기 위한 회귀 모델의 매개변수에 대한 베이지안 [신용 구간](https://en.wikipedia.org/wiki/Credible_interval)을 추측하기 위해 사용될 수 있습니다. 신용 구간은 관측된 데이터에 따라 조건화되고 매개변수의 이전 분포에 대한 추정에 따라 특정 확률로 관측되지 않은 매개변수의 값을 한정합니다.\n", - "\n", - "이 Colab에서, VI를 사용하여 가정에서 측정된 라돈 수준에 대한 베이지안 선형 회귀 모델의 매개변수 신용 구간을 얻는 방법을 시연합니다([Gelman 등의(2007) 라돈 데이터세트](http://www.stat.columbia.edu/~gelman/arm/)) 사용, Stan의 [유사한 예시](https://mc-stan.org/users/documentation/case-studies/radon.html#Correlations-among-levels) 참조). TFP `JointDistribution`이 `bijectors`와 결합하여 표현 대체 사후 확률의 두 개 유형을 구축하고 맞추는 방법을 시연합니다.\n", - "\n", - "- 표준 정규 분포는 블록 행렬로 변환됩니다. 행렬은 사후 확률의 일부 구성 요소들 간의 독립성과 다른 요소들 간의 의존성을 반영하며, 평균장 또는 완전 공분산 사후 확률의 가정을 완화할 수 있습니다.\n", - "- 보다 복잡한 고용량의 [역 자기 회귀성 유동](https://arxiv.org/abs/1606.04934).\n", - "\n", - "대체 사후 확률은 헤밀토니언 몬테 카를로의 ground-truth 샘플과 마찬가지로 훈련되고 평균장 대체 사후 확률 기준선의 결과와 비교됩니다." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "pt5Lzw4hjd6A" - }, - "source": [ - "## 베이지안 변분 추론 개요\n", - "\n", - "$\\omega$는 결정론적 매개변수이고 $\\theta$는 무작위 매개변수를 나타내며 $x_i$는 기능이며 $y_i$는 관측된 데이터 지점 $i=1,\\ldots,n$에 대한 대상 값인 다음과 같은 생성 프로세스가 있다고 가정해 봅니다: \\begin{align*} &\\theta \\sim r(\\Theta) && \\text{(Prior)}\\ &\\text{for } i = 1 \\ldots n: \\nonumber \\ &\\quad y_i \\sim p(Y_i|x_i, \\theta, \\omega) && \\text{(Likelihood)} \\end{align*}\n", - "\n", - "VI는 다음과 같은 특성을 갖습니다: $\\newcommand{\\E}{\\operatorname{\\mathbb{E}}} \\newcommand{\\K}{\\operatorname{\\mathbb{K}}} \\newcommand{\\defeq}{\\overset{\\tiny\\text{def}}{=}} \\DeclareMathOperator*{\\argmin}{arg,min}$\n", - "\n", - "\\begin{align*} -\\log p({y_i}_i^n|{x_i}*i^n, \\omega) &\\defeq -\\log \\int \\textrm{d}\\theta, r(\\theta) \\prod_i^n p(y_i|x_i,\\theta, \\omega) && \\text{(Really hard integral)} \\ &= -\\log \\int \\textrm{d}\\theta, q(\\theta) \\frac{1}{q(\\theta)} r(\\theta) \\prod_i^n p(y_i|x_i,\\theta, \\omega) && \\text{(Multiply by 1)}\\ &\\le - \\int \\textrm{d}\\theta, q(\\theta) \\log \\frac{r(\\theta) \\prod_i^n p(y_i|x_i,\\theta, \\omega)}{q(\\theta)} && \\text{(Jensen's inequality)}\\ &\\defeq \\E*{q(\\Theta)}[ -\\log p(y_i|x_i,\\Theta, \\omega) ] + \\K[q(\\Theta), r(\\Theta)]\\ &\\defeq `\\text{expected negative log likelihood\"} + `\\text{kl regularizer\"} \\end{align*}\n", - "\n", - "(기술적으로 $q$는 $r$에 관하여 [절대 연속](https://en.wikipedia.org/wiki/Absolute_continuity#Absolute_continuity_of_measures)으로 추정됩니다. [젠센 부등식](https://en.wikipedia.org/wiki/Jensen%27s_inequality)도 참조합니다.)\n", - "\n", - "경계는 모든 q에 대해 성립하기 때문에 다음과 같은 경우에 확실히 가장 빠듯합니다.\n", - "\n", - "$$q^*,w^* = \\argmin_{q \\in \\mathcal{Q},\\omega\\in\\mathbb{R}^d} \\left\\{ \\sum_i^n\\E_{q(\\Theta)}\\left[ -\\log p(y_i|x_i,\\Theta, \\omega) \\right] + \\K[q(\\Theta), r(\\Theta)] \\right\\}$$\n", - "\n", - "용어에 관련해서는, 다음을 호출합니다.\n", - "\n", - "- \"대체 후속 확률\" $q^*$ 및\n", - "- \"대체 패밀리\" $\\mathcal{Q}$\n", - "\n", - "$\\omega^*$는 VI 손실에 대한 결정론적 매개변수의 최대 가능 값을 나타냅니다. 변분 추론에 대한 더 자세한 정보는 [이 설문 조사](https://arxiv.org/abs/1601.00670)를 참조하세요." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "pt532xMzBJiR" - }, - "source": [ - "## 예: 라돈 측정에 대한 베이지안 계층적 선형 회귀 분석\n", - "\n", - "라돈은 지면과의 접촉점을 통해 가정으로 유입되는 방사성 가스로, 비흡연자에게 폐암을 유발하는 주요 원인이 되는 발암물질입니다. 라돈 수치는 가정마다 크게 다릅니다.\n", - "\n", - "EPA는 80,000개 가정의 라돈 수준을 연구했습니다. 두 가지 중요한 예측 변수는 다음과 같습니다.\n", - "\n", - "- 측정이 수행된 층(지하에서 더 높은 라돈)\n", - "- 자치주 우라늄 수준(라돈 수준과 양성 상관 관계)\n", - "\n", - "자치주별로 그룹화된 가정 내 라돈 수준을 예측하는 것은 [Gelman 및 Hill (2006)](http://www.stat.columbia.edu/~gelman/arm/)이 소개한 베이지안 계층적 모델링의 전형적인 문제입니다. 가정의 라돈 측정치를 예측하기 위해 계층적 선형 모델을 구축할 것이며 이 계층은 자치주별 가정의 그룹입니다. 미네소타 내 가정의 라돈 수치에 대한 위치(자치주)의 효과에 대한 신뢰 곡선에 관심이 있습니다. 이 효과를 분리하기 위해, 층 및 우라늄 수준의 효과 또한 모델에 포함됩니다. 추가로, 자치주별로 측정이 수행된 보통의 층에 해당하는 맥락과 관련된 효과를 포함하여 측정이 수행된 층의 자치주에 변화가 있다면, 이는 자치주 효과로 인한 것이 아닙니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "i00BTGk5tiwe" - }, - "outputs": [], - "source": [ - "!pip3 install -q tf-nightly tfp-nightly" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "H9omoz32_Y9F" - }, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import seaborn as sns\n", - "import tensorflow as tf\n", - "import tensorflow_datasets as tfds\n", - "import tensorflow_probability as tfp\n", - "import warnings\n", - "\n", - "tfd = tfp.distributions\n", - "tfb = tfp.bijectors\n", - "\n", - "plt.rcParams['figure.facecolor'] = '1.'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "BFKYEEfY1FhB" - }, - "outputs": [], - "source": [ - "# Load the Radon dataset from `tensorflow_datasets` and filter to data from\n", - "# Minnesota.\n", - "dataset = tfds.as_numpy(\n", - " tfds.load('radon', split='train').filter(\n", - " lambda x: x['features']['state'] == 'MN').batch(10**9))\n", - "\n", - "# Dependent variable: Radon measurements by house.\n", - "dataset = next(iter(dataset))\n", - "radon_measurement = dataset['activity'].astype(np.float32)\n", - "radon_measurement[radon_measurement <= 0.] = 0.1\n", - "log_radon = np.log(radon_measurement)\n", - "\n", - "# Measured uranium concentrations in surrounding soil.\n", - "uranium_measurement = dataset['features']['Uppm'].astype(np.float32)\n", - "log_uranium = np.log(uranium_measurement)\n", - "\n", - "# County indicator.\n", - "county_strings = dataset['features']['county'].astype('U13')\n", - "unique_counties, county = np.unique(county_strings, return_inverse=True)\n", - "county = county.astype(np.int32)\n", - "num_counties = unique_counties.size\n", - "\n", - "# Floor on which the measurement was taken.\n", - "floor_of_house = dataset['features']['floor'].astype(np.int32)\n", - "\n", - "# Average floor by county (contextual effect).\n", - "county_mean_floor = []\n", - "for i in range(num_counties):\n", - " county_mean_floor.append(floor_of_house[county == i].mean())\n", - "county_mean_floor = np.array(county_mean_floor, dtype=log_radon.dtype)\n", - "floor_by_county = county_mean_floor[county]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "EU9ieWyOjddQ" - }, - "source": [ - "회귀 모델은 다음과 같이 지정됩니다.\n", - "\n", - "$\\newcommand{\\Normal}{\\operatorname{\\sf Normal}}$ \\begin{align*} &\\text{uranium_weight} \\sim \\Normal(0, 1) \\ &\\text{county_floor_weight} \\sim \\Normal(0, 1) \\ &\\text{for } j = 1\\ldots \\text{num_counties}:\\ &\\quad \\text{county_effect}*j \\sim \\Normal (0, \\sigma_c)\\ &\\text{for } i = 1\\ldots n:\\ &\\quad \\mu_i = ( \\ &\\quad\\quad \\text{bias} \\ &\\quad\\quad + \\text{county_effect}*{\\text{county}_i} \\ &\\quad\\quad +\\text{log_uranium}_i \\times \\text{uranium_weight} \\ &\\quad\\quad +\\text{floor_of_house}*i \\times \\text{floor_weight} \\ &\\quad\\quad +\\text{floor_by_county}*{\\text{county}_i} \\times \\text{county_floor_weight} ) \\ &\\quad \\text{log_radon}_i \\sim \\Normal(\\mu_i, \\sigma_y) \\end{align*} 여기서 $i$는 관측을 인덱싱하고 $\\text{context}_i$는 $i$번째 관찰이 수행된 자치주입니다.\n", - "\n", - "자치주 수준의 무작위 효과를 사용해 지리적 변화를 포착합니다. 매개변수 `uranium_weight` 및 `county_floor_weight`는 확률적으로 모델링 되며 `floor_weight` 및 상수 `bias`는 결정론적입니다. 이러한 모델링 선택은 대부분 임의적이며 합리적인 복잡성의 확률론적 모델에 대한 VI를 입증하기 위한 목적으로 이루어졌습니다. 라돈 데이터세트를 사용한 TFP 내 고정 및 무작위 효과를 사용하는 다층 모델링의 더욱 철저한 논의는, [다층 모델링 프라이머](https://github.com/tensorflow/probability/blob/main/tensorflow_probability/examples/jupyter_notebooks/Multilevel_Modeling_Primer.ipynb) 및 [변분 추론을 사용한 일반화된 선형 혼합 효과 모델 피팅](https://github.com/tensorflow/probability/blob/main/tensorflow_probability/examples/jupyter_notebooks/Linear_Mixed_Effects_Model_Variational_Inference.ipynb)을 참조합니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "awL6fCUh6OCF" - }, - "outputs": [], - "source": [ - "# Create variables for fixed effects.\n", - "floor_weight = tf.Variable(0.)\n", - "bias = tf.Variable(0.)\n", - "\n", - "# Variables for scale parameters.\n", - "log_radon_scale = tfp.util.TransformedVariable(1., tfb.Exp())\n", - "county_effect_scale = tfp.util.TransformedVariable(1., tfb.Exp())\n", - "\n", - "# Define the probabilistic graphical model as a JointDistribution.\n", - "@tfd.JointDistributionCoroutineAutoBatched\n", - "def model():\n", - " uranium_weight = yield tfd.Normal(0., scale=1., name='uranium_weight')\n", - " county_floor_weight = yield tfd.Normal(\n", - " 0., scale=1., name='county_floor_weight')\n", - " county_effect = yield tfd.Sample(\n", - " tfd.Normal(0., scale=county_effect_scale),\n", - " sample_shape=[num_counties], name='county_effect')\n", - " yield tfd.Normal(\n", - " loc=(log_uranium * uranium_weight + floor_of_house* floor_weight\n", - " + floor_by_county * county_floor_weight\n", - " + tf.gather(county_effect, county, axis=-1)\n", - " + bias),\n", - " scale=log_radon_scale[..., tf.newaxis],\n", - " name='log_radon') \n", - "\n", - "# Pin the observed `log_radon` values to model the un-normalized posterior.\n", - "target_model = model.experimental_pin(log_radon=log_radon)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "UlkQTJSlkjJ1" - }, - "source": [ - "## 표현적 대체 사후 확률\n", - "\n", - "다음으로 다음과 같은 두 가지 다른 유형의 대체 사후 확률로 VI를 사용하여 무작위 효과의 사후 확률 분포를 추정합니다.\n", - "\n", - "- 블럭화 행렬 변환에 의해 유도되는 공분산 구조를 갖는 제한된 다변량 정규 분포입니다.\n", - "- [역 자기 회귀성 유동](https://arxiv.org/abs/1606.04934)에 의해 변환된 다변량 표준 정규 분포는 사후 확률의 지원과 일치하도록 분할되고 재구성됩니다." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "3QG0scmDcdTw" - }, - "source": [ - "### 다변량 정규 대체 사후 확률" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "K8soBr2oBHSV" - }, - "source": [ - "이 대체 사후 확률을 구축하기 위해 훈련 가능한 선형 연산자가 사후 확률의 구성 요소 중 상관관계를 유도하는 데 사용됩니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "sJuvC5ykBAiK" - }, - "outputs": [], - "source": [ - "# Determine the `event_shape` of the posterior, and calculate the size of each\n", - "# `event_shape` component. These determine the sizes of the components of the\n", - "# underlying standard Normal distribution, and the dimensions of the blocks in\n", - "# the blockwise matrix transformation.\n", - "event_shape = target_model.event_shape_tensor()\n", - "flat_event_shape = tf.nest.flatten(event_shape)\n", - "flat_event_size = tf.nest.map_structure(tf.reduce_prod, flat_event_shape)\n", - "\n", - "# The `event_space_bijector` maps unconstrained values (in R^n) to the support\n", - "# of the prior -- we'll need this at the end to constrain Multivariate Normal\n", - "# samples to the prior's support.\n", - "event_space_bijector = target_model.experimental_default_event_space_bijector()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "LxLqBKBgsQPg" - }, - "source": [ - "벡터 값 표준 정규 구성 요소로 해당 이전 구성 요소에 의해 크기가 결정되는 `JointDistribution`을 구성합니다. 구성요소는 벡터 값이어야 선형 연산자로 변형될 수 있습니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "0ceaCfU8sPjg" - }, - "outputs": [], - "source": [ - "base_standard_dist = tfd.JointDistributionSequential(\n", - " [tfd.Sample(tfd.Normal(0., 1.), s) for s in flat_event_size])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "uu0d8uWS4luv" - }, - "source": [ - "훈련 가능한 블록화 하위 삼각형 선형 연산자를 구축합니다. 이를 표준 정규 분포에 적용하여 (훈련 가능한) 블록화 확률 변형에 구현하고 사후 확률의 연관 구조를 유도하겠습니다.\n", - "\n", - "블록화 선형 연산자에서, 훈련 가능한 완전 행렬 블록은 사후 확률의 두 구성 요소 사이의 완전 공분산을 나타냅니다. 반면 0 블록(또는 `None`)은 독립성을 나타냅니다. 대각선의 블록은 하위 삼각형 또는 대각선 행렬이므로, 전체 블록 구조는 하위 삼각형 행렬을 나타냅니다.\n", - "\n", - "이 bijector를 기저 분포 결과에 적용하면 평균 0 및 (숄레스키 분해된) 공분산이 하위 삼각형 블록 행렬과 동일한 다변량 정규 분포가 됩니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "dUCks9qg6nU2" - }, - "outputs": [], - "source": [ - "operators = (\n", - " (tf.linalg.LinearOperatorDiag,), # Variance of uranium weight (scalar).\n", - " (tf.linalg.LinearOperatorFullMatrix, # Covariance between uranium and floor-by-county weights.\n", - " tf.linalg.LinearOperatorDiag), # Variance of floor-by-county weight (scalar).\n", - " (None, # Independence between uranium weight and county effects.\n", - " None, # Independence between floor-by-county and county effects.\n", - " tf.linalg.LinearOperatorDiag) # Independence among the 85 county effects.\n", - " )\n", - "\n", - "block_tril_linop = (\n", - " tfp.experimental.vi.util.build_trainable_linear_operator_block(\n", - " operators, flat_event_size))\n", - "scale_bijector = tfb.ScaleMatvecLinearOperatorBlock(block_tril_linop)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "dHI0bziq44od" - }, - "source": [ - "선형 연산자를 표준 정규 분포에 적용한 후, 복수 `Shift` 평균이 0이 아닌 값을 취하도록 bijector를 적용합니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "ceS386lN448r" - }, - "outputs": [], - "source": [ - "loc_bijector = tfb.JointMap(\n", - " tf.nest.map_structure(\n", - " lambda s: tfb.Shift(\n", - " tf.Variable(tf.random.uniform(\n", - " (s,), minval=-2., maxval=2., dtype=tf.float32))),\n", - " flat_event_size))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "gLO_8C0_Hd7f" - }, - "source": [ - "규모 및 위치 bijector를 사용해 표준 정규 분포를 변환하여 얻은 다변량 정규 분포의 결과는 이전의 분포와 일치하도록 재형상 및 재구성되고 최종적으로 이전의 분포의 지지에 제한되어야 합니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "PnnU3lJ7H-pj" - }, - "outputs": [], - "source": [ - "# Reshape each component to match the prior, using a nested structure of\n", - "# `Reshape` bijectors wrapped in `JointMap` to form a multipart bijector.\n", - "reshape_bijector = tfb.JointMap(\n", - " tf.nest.map_structure(tfb.Reshape, flat_event_shape))\n", - "\n", - "# Restructure the flat list of components to match the prior's structure\n", - "unflatten_bijector = tfb.Restructure(\n", - " tf.nest.pack_sequence_as(\n", - " event_shape, range(len(flat_event_shape))))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "HK3n0iqc5Ei3" - }, - "source": [ - "자, 이제, 모든 것을 합쳐서, 훈련 가능한 bijector를 함께 묶고, 기본 표준 정규 분포에 적용하여 대체 사후 확률을 구성합니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "xlrIbELO5EWR" - }, - "outputs": [], - "source": [ - "surrogate_posterior = tfd.TransformedDistribution(\n", - " base_standard_dist,\n", - " bijector = tfb.Chain( # Note that the chained bijectors are applied in reverse order\n", - " [\n", - " event_space_bijector, # constrain the surrogate to the support of the prior\n", - " unflatten_bijector, # pack the reshaped components into the `event_shape` structure of the posterior\n", - " reshape_bijector, # reshape the vector-valued components to match the shapes of the posterior components\n", - " loc_bijector, # allow for nonzero mean\n", - " scale_bijector # apply the block matrix transformation to the standard Normal distribution\n", - " ]))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "bVmf3qld5oPP" - }, - "source": [ - "다변량 정규 대체 사후 확률을 훈련합니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "J5c5mhh-F9l-" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Multivariate Normal surrogate posterior ELBO: -1065.705322265625\n" - ] - }, - { - "data": { - "image/png": "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\neBARUY/9f4IYoj+gmvdcAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - } - ], - "source": [ - "optimizer = tf.optimizers.Adam(learning_rate=1e-2)\n", - "mvn_loss = tfp.vi.fit_surrogate_posterior(\n", - " target_model.unnormalized_log_prob,\n", - " surrogate_posterior,\n", - " optimizer=optimizer,\n", - " num_steps=10**4,\n", - " sample_size=16,\n", - " jit_compile=True)\n", - "\n", - "mvn_samples = surrogate_posterior.sample(1000)\n", - "mvn_final_elbo = tf.reduce_mean(\n", - " target_model.unnormalized_log_prob(*mvn_samples)\n", - " - surrogate_posterior.log_prob(mvn_samples))\n", - "\n", - "print('Multivariate Normal surrogate posterior ELBO: {}'.format(mvn_final_elbo))\n", - "\n", - "plt.plot(mvn_loss)\n", - "plt.xlabel('Training step')\n", - "_ = plt.ylabel('Loss value')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "_Wh2eps0fQCZ" - }, - "source": [ - "훈련된 대체 사후 확률은 TFP 분포이기 때문에, 샘플을 얻을 수 있고 처리하여 매개변수를 위한 사후 확률 신뢰 구간을 생성할 수 있습니다.\n", - "\n", - "아래 상자 그림은 두 개의 가장 큰 자치주의 자치주 효과와 토양 우라늄 측정 및 자치주별 평균 층의 회귀 가중치에 대한 50% 및 95%의 [신뢰 구간](https://en.wikipedia.org/wiki/Credible_interval)을 보여줍니다. 다른 변수를 고려한 후, 자치주 효과에 대한 사후 확률 신뢰 구간은 낮은 라돈 수준과 관련된 세인트루이스 자치주의 위치를 나타내며 헤너핀 자치주의 위치 효과는 중립에 가깝습니다.\n", - "\n", - "회귀 가중치에 대한 사후 확률 신뢰 구간은 높은 수준의 토양 우라늄이 더욱 높은 라돈 수준과 관련이 있음을 보여주며, 더욱 높은 층에서 측정이 이루어진 자치주(아마 가정에 지하가 없었기 때문에)는 라돈 수준이 더 높은 경향이 있으며, 이는 토양 특성과 건축된 건축물의 유형에 대한 영향과 관련이 있을 수 있습니다.\n", - "\n", - "층의 (결정론적) 계수가 음수이기 때문에 예상대로 낮은 층의 라돈 수치가 더 높다는 것을 알 수 있다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "600DiJ8xfQf-" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Bias is: 1.40\n", - "Floor fixed effect is: -0.72\n" - ] - }, - { - "data": { - "image/png": "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\n9NCWq6ursWjRIgwYMAC9e/fG+PHjUVVVpbNysTF/C1pz4wdXBweHJuXmjh0cHIxDhw7h559/hr+/\nP8LCwnD48GEcOXIECoUCbm5uBvWZRiUlJfDy8oJEItE+5u3trVOntT5DXdvevXu1f/P37t3b5PnW\nPk+1dg6+uS/ed9992gWoPv74Y+3jN/5e3niMls67UVFR2mNt3LgRRUVF6Nu3L1xcXPS+jxvjdHJy\ngqurq8GfC2/++wCgxX4SERGBXbt2AbiejDaXhDs4OECpVOLw4cP45ptvEBwcjDFjxuD777/XSWjP\nnDmDTz/9tMlF59LSUr3v9caf5819Xt/7scY+z4RWj9GjR6NHjx56O3MjmUyGM2fOaMt//vmn9uZ5\nR0dHVFdXa587e/asyTE1doZPP/0Uo0ePhpeXl9563t7eWL16tc4H0erqajzyyCMGvY63tzfef/99\nnfY1NTUYM2YMvL29cerUKb3tbjxBNicgIAB//PGH3ufs7e3xt7/9DQEBAfjtt98MPqYhZDIZKisr\ndT60//nnn9qfoTH/X4MGDUJSUhLOnTuHZ599Fg899BCuXr0K4PoCBwUFBRg+fHi7xE262C87v1+2\nFI8p76c5bm5ucHBwwO+//6497sWLF3VOrhcuXND2OUD3/9hYx48fZ3+1cv37928yqnL69GmdD6s3\n94M33ngDJ0+eRFZWFi5duoRvvvkGACCEMPr1O+LvSqMxY8bg5MmT2LNnD4KDgzF06FD8+eef+Oqr\nr7QfbA3pM42kUinUarXO+ywqKjI4nvY6J5P1au3zVEvnYKDp71BaWpp2AaobLwjf+Ht58zGaO+/G\nx8drj/X888/D29sblZWVemfh3Bzn1atXUVFRAS8vL+0F07b2a339ZM6cOUhJScGxY8dw/PhxvaPf\njYKDg/Gf//wHR48eRVBQEIKDg7F//35kZ2dj/PjxAK6fgx977DGdc/DVq1f1jr5KpVIUFxdry121\nzzOh1aNPnz54+eWXsWTJEuzduxfV1dWoq6tDWloannnmGQDAI488gldeeQXl5eU4f/48Xn75Ze02\nAcOHD8fvv/+O3NxcXLt2DevWrTPq9T09PfG///1P57EHH3wQP//8MzZv3oy5c+c223bhwoWIj49H\nVlYWhBC4evUqvvrqqyYjMM2JiorCq6++it9//x0AcPHiRe22IVOmTMHZs2fx9ttv46+//sLly5eR\n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\nsIZe+cFuNQAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - } - ], - "source": [ - "st_louis_co = 69 # Index of St. Louis, the county with the most observations.\n", - "hennepin_co = 25 # Index of Hennepin, with the second-most observations.\n", - "\n", - "def pack_samples(samples):\n", - " return {'County effect (St. Louis)': samples.county_effect[..., st_louis_co],\n", - " 'County effect (Hennepin)': samples.county_effect[..., hennepin_co],\n", - " 'Uranium weight': samples.uranium_weight,\n", - " 'Floor-by-county weight': samples.county_floor_weight}\n", - "\n", - "def plot_boxplot(posterior_samples):\n", - " fig, axes = plt.subplots(1, 4, figsize=(16, 4))\n", - "\n", - " # Invert the results dict for easier plotting.\n", - " k = list(posterior_samples.values())[0].keys()\n", - " plot_results = {\n", - " v: {p: posterior_samples[p][v] for p in posterior_samples} for v in k}\n", - " for i, (var, var_results) in enumerate(plot_results.items()):\n", - " sns.boxplot(data=list(var_results.values()), ax=axes[i],\n", - " width=0.18*len(var_results), whis=(2.5, 97.5))\n", - " # axes[i].boxplot(list(var_results.values()), whis=(2.5, 97.5))\n", - " axes[i].title.set_text(var)\n", - " fs = 10 if len(var_results) < 4 else 8\n", - " axes[i].set_xticklabels(list(var_results.keys()), fontsize=fs)\n", - "\n", - "results = {'Multivariate Normal': pack_samples(mvn_samples)}\n", - "\n", - "print('Bias is: {:.2f}'.format(bias.numpy()))\n", - "print('Floor fixed effect is: {:.2f}'.format(floor_weight.numpy()))\n", - "plot_boxplot(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "WnWb8WSDcjEK" - }, - "source": [ - "### 역 자기 회귀성 유동 대체 사후 확률" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "SUHcK4WzJ27o" - }, - "source": [ - "역 자기 회귀성 유동(IAF)은 신경망을 사용하여 분포의 구성요소 중 복합하고 비선형적인 종속성을 포착하는 흐름을 정규화합니다. 다음으로, IAF 대체 사후 확률을 구축하여 이 높은 용량, 더 유동적인 모델이 제한된 다변량 정규 모델을 능가하는지 확인합니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "R0FFLYnaGRrc" - }, - "outputs": [], - "source": [ - "# Build a standard Normal with a vector `event_shape`, with length equal to the\n", - "# total number of degrees of freedom in the posterior.\n", - "base_distribution = tfd.Sample(\n", - " tfd.Normal(0., 1.), sample_shape=[tf.reduce_sum(flat_event_size)])\n", - "\n", - "# Apply an IAF to the base distribution.\n", - "num_iafs = 2\n", - "iaf_bijectors = [\n", - " tfb.Invert(tfb.MaskedAutoregressiveFlow(\n", - " shift_and_log_scale_fn=tfb.AutoregressiveNetwork(\n", - " params=2, hidden_units=[256, 256], activation='relu')))\n", - " for _ in range(num_iafs)\n", - "]\n", - "\n", - "# Split the base distribution's `event_shape` into components that are equal\n", - "# in size to the prior's components.\n", - "split = tfb.Split(flat_event_size)\n", - "\n", - "# Chain these bijectors and apply them to the standard Normal base distribution\n", - "# to build the surrogate posterior. `event_space_bijector`,\n", - "# `unflatten_bijector`, and `reshape_bijector` are the same as in the\n", - "# multivariate Normal surrogate posterior.\n", - "iaf_surrogate_posterior = tfd.TransformedDistribution(\n", - " base_distribution,\n", - " bijector=tfb.Chain([\n", - " event_space_bijector, # constrain the surrogate to the support of the prior\n", - " unflatten_bijector, # pack the reshaped components into the `event_shape` structure of the prior\n", - " reshape_bijector, # reshape the vector-valued components to match the shapes of the prior components\n", - " split] + # Split the samples into components of the same size as the prior components\n", - " iaf_bijectors # Apply a flow model to the Tensor-valued standard Normal distribution\n", - " ))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "j4pzY9dPrBny" - }, - "source": [ - "IAF 대체 사후 확률을 훈련합니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "WyQayFhIz1Bq" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "IAF surrogate posterior ELBO: -1065.3663330078125\n" - ] - }, - { - "data": { - "image/png": "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\nuO222wzDGN4NyEbKhg0bjJ///OeGYRhGe3u70dDQMGbH7XK5jIiICKOlpcUwDMO48847jRdffHHM\njTfQm+nl5+cb3/72tw3DMIw9e/YYWVlZfteo8PjMoUOHjJtuusn7/ZNPPmk8+eSTI1jR0MrIyDB+\n97vfGQsXLjRqa2sNwzgfMAsDZSBBAAAHZklEQVQXLjQM4+Lx3nTTTcahQ4eM2tpaIyoqytv+n//5\nn0ZOTs7wFj9INTU1xsqVK40333zTGx5jebyGYRhnzpwxIiIijJ6engvax+q4XS6XYbfbjdOnTxud\nnZ3GbbfdZhw4cGBMjreqquqC8BjKMX5+jGEYRmdnpzF9+vSLfod80WWrz/S3IdVYUF1dzeHDh1m2\nbNmY3pDr/vvv50c/+hFm899/rcfyeAGOHz/OzJkz2bRpE9deey3f+ta3aG5uHrPjnjNnDg8//DDz\n5s3DZrMxZcoUbrrppjE73i8ayjF+sY/VamXKlCmcPn3ar3oUHp8x/Nx46nJx7tw5MjMzeeaZZ5g8\neXK/x/U3/svl5/L6668TFhY26FsUL/fxfq6rq4v333+f3NxcDh8+zMSJEwecr7vcx93Q0EBRURFV\nVVXU1tbS3NzM7t27+z3+ch/vYFzKGIdi/AqPz/S3IdXlrLOzk8zMTO666y5uv/12IPAbco2Ud999\nl9dee42IiAjWrl3LW2+9xfr168fseD9nt9ux2+0sW7YMgDvuuIP3339/zI774MGDREZGMnPmTIKC\ngrj99ts5dOjQmB3vFw3lGL/Yp6urizNnzjBt2jS/6lF4fGbp0qU4nU6qqqro6OigsLCQjIyMkS7r\nkhmGwT333EN0dDQPPvigt32sbsiVl5eHy+WiurqawsJCVq5cye7du8fseD83a9Ys5s6dy9/+9jcA\n3nzzTWJiYsbsuOfNm0dJSQktLS0YhsGbb75JdHT0mB3vFw3lGL/4Wq+88gorV670/8zLrxmSMe6N\nN94wFixYYMyfP9944oknRrqcf8g777xjAEZ8fLyxePFiY/HixcYbb7xhnDp1yli5cqXhcDiMlStX\nGqdPn/b2eeKJJ4z58+cbCxcuvODOk/fee8+IjY015s+fb3z3u9/1e2JtuP3+97/3TphfCeM9fPiw\nsWTJEiM+Pt5Ys2aNUV9fP6bH/dhjjxlRUVFGbGyssX79eqOtrW3MjXft2rXGrFmzDKvVasyZM8d4\n/vnnh3SMra2txh133GFcc801xtKlS41jx475XaNWmIuIiN902UpERPym8BAREb8pPERExG8KDxER\n8ZvCQ0RE/KbwkCvK6dOnSUxMJDExkVmzZjFnzhzv9x0dHYN6jU2bNnnXVfQnPz+fX/3qV0NRcp9e\nffVVPv7444C9vogvulVXrlhbt25l0qRJPPzwwxe0G+cfGHrBM7JGm/Xr13PHHXfwta99baRLkSvU\n6P3XITKMPvnkE+Li4vjOd75DUlISHo+HnJwckpOTiY2N5fHHH/cee/3111NRUUFXVxdTp05ly5Yt\nLF68mNTUVO/D6r7//e/zzDPPeI/fsmULKSkpREVFcejQIQCam5vJzMxk8eLFrFu3juTkZCoqKi6q\n7ZFHHiEmJoaEhAS+973v8c4777B//34eeOABEhMTqa6uxul0cvPNN7NkyRKWL1/O0aNHgfMhk5ub\ny5e//GUWLlzIb3/720D/KOUKYR3pAkRGiyNHjvDiiy/ys5/9DIBt27Yxbdo0urq6WLFiBXfccQcx\nMTEX9Dlz5gxf+cpX2LZtGw8++CC/+MUv2LJly0WvbRgGpaWlvPbaazz++OMUFxfz05/+lFmzZvHr\nX/+aDz74gKSkpIv6nThxgv3791NZWYnJZKKxsZGpU6dy6623XnDmsWLFCp5//nmuueYa3n33Xf7l\nX/6F3/3ud8D5jcH+8Ic/4HQ6ufHGG/nkk08ICQkZ6h+fXGF05iHymWuuuYalS5d6v9+zZw9JSUkk\nJSXx0UcfceTIkYv6jB8/nvT0dACWLFnS745snz+Y8ovH/PGPf2Tt2rUALF68mNjY2Iv6TZs2DbPZ\nzL333svevXuZOHHiRcc0NjZSUlJCZmYmiYmJfPe736W2ttb751lZWZjNZqKiopg7dy5Op3NwPxCR\nAejMQ+QzX/xgdjqdbN++ndLSUqZOncr69etpa2u7qE9wcLD3a4vFQldXV5+v/fn/9L94zGCmG4OC\ngigrK+O//uu/KCwsZMeOHd4zis8ZhsGMGTP6vOQFFz9q+3J99LiMLjrzEOlDU1MToaGhTJ48GY/H\nc8G+0EPl+uuv56WXXgLgr3/9a59nNmfPnqWpqYnVq1fz9NNPc/jwYQBCQ0M5e/YsAFdddRU2m429\ne/cC0NPTwwcffOB9jZdffhnDMDh69Cg1NTUsWLBgyMciVx6deYj0ISkpiZiYGOLi4pg/fz5f+tKX\nhvw9/vVf/5UNGzaQkJBAUlIScXFxTJky5YJjzpw5w+233057ezs9PT38+Mc/BmDdunV8+9vf5qmn\nnmLfvn0UFhaSm5vL1q1b6ejoYP369SxevBgAh8PB8uXLOXnyJAUFBRecLYlcKt2qKzJCurq66Orq\nYty4cTidTm666SacTidW69D9n0639Eqg6MxDZIScO3eOVatW0dXVhWEYPPfcc0MaHCKBpDMPERHx\nmybMRUTEbwoPERHxm8JDRET8pvAQERG/KTxERMRvCg8REfHb/wd/ug2lN6HG5gAAAABJRU5ErkJg\ngg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - } - ], - "source": [ - "optimizer=tf.optimizers.Adam(learning_rate=1e-2)\n", - "iaf_loss = tfp.vi.fit_surrogate_posterior(\n", - " target_model.unnormalized_log_prob,\n", - " iaf_surrogate_posterior,\n", - " optimizer=optimizer,\n", - " num_steps=10**4,\n", - " sample_size=4,\n", - " jit_compile=True)\n", - "\n", - "iaf_samples = iaf_surrogate_posterior.sample(1000)\n", - "iaf_final_elbo = tf.reduce_mean(\n", - " target_model.unnormalized_log_prob(*iaf_samples)\n", - " - iaf_surrogate_posterior.log_prob(iaf_samples))\n", - "print('IAF surrogate posterior ELBO: {}'.format(iaf_final_elbo))\n", - "\n", - "plt.plot(iaf_loss)\n", - "plt.xlabel('Training step')\n", - "_ = plt.ylabel('Loss value')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "tzrbAezxPLeB" - }, - "source": [ - "IAF 대체 사후 확률에 대한 신뢰 구간은 제한된 다변량 정규의 신뢰 구간과 유사한 것으로 보입니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "QmKl4G1BGIIl" - }, - "outputs": [ - { - "data": { - "image/png": "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\niEgXCoWiXfaTn3+rbn+++iSe7u0WDxERSYuJK5GZOHDgABQKBXx9fQEAU6dORWpqqlrymZqaimnT\npsHKygrDhg3D9evXUVRUhIKCgha3JSLSxYsvvtgu+4mLiwMArF27tl32Z2nO37bB6kNtb60GgOKK\nuhFl7va1esXRV68oiIjqMHElMhOFhYXw9vZWlb28vJCTk9NincLCQp22BYCkpCQkJSUBAEpKStr7\nIxARUTtor1bmqvx8AEDn3m3fX992jEdKug6n+e233zBs2DD8+9//xhNPPGHkKHVTWFgIm4obenfn\nbw82FaUoLKyROgzqIJi4NkPf8TntMTanPg6OzyFdaFov2crKSqc6umwLADExMYiJiQEABAUFtTVU\nMgOFhYUov6V/i057OHfLBg6FhVKHQWQy2OrdvnQdTqNUKvHaa69hzJgxEkVKZN6YuGrQHk8G22ds\nDsDxOaQrLy8vXLhwQVW+ePEiPDw8dKpTVVXV4rZERESWSJehOACwbt06TJ48Gb/99psUYerM09MT\nl+/aorJfpNShwO7PNHh6soGGdMPEVYP2eFLJp5T603d8TnuMzamPoyOMzwkODkZeXh7Onj0LT09P\npKSkYNu2bWp1oqKisH79ekydOhU5OTno3r075HI5XF1dW9yWqCFPT0/crSnCogdvSh0KVh/qhs6e\nnlKHQURmStehON988w1+/PFHrYkrh9wQwF5LbcXElUxSe7Qyt8fYHKDjjM+xtbXF+vXrMWbMGCiV\nSsyYMQP+/v5ITEwEAMTGxiIyMhJpaWlQKBSwt7fHpk2btG5rqkxlfA7H5hARmT9dhtO89NJLWLNm\nDWxsbLTui0NuiNqOiSuZJLZ6t01kZCQiI9W7/sTGxqr+bWVlhQ0bNui8LRERkaXTZShObm4upk6d\nCgC4evUq0tLSYGtri8cff9yosVLHwF5LbcPElYg6HFMZn8OxOURE5k+XoThnz55V/Xv69OkYN24c\nk1aidsbElYiIiIioGboMxSEiw2PiSkRERESkRUtDcRravHmzESIisjzWUgdAREREREREpA0TVyIi\nIiIiIjJpTFyJiIiIiIjIpDFxJSIiIiIiIpPGxJWIiIiIiIhMGhNXIiIiIiIiMmlMXImIiIiIiMik\nMXElIiIiIiIik8bElYiIiIiIiEwaE1ciIiIiIiIyaUxciYiIJJaRkYH7778fCoUCCQkJGutkZ2cj\n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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - } - ], - "source": [ - "results['IAF'] = pack_samples(iaf_samples)\n", - "plot_boxplot(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "IWKqLYPOZOO_" - }, - "source": [ - "### 기준선: 평균장 대체 사후 확률\n", - "\n", - "VI 대체 사후 확률은 종종 훈련 가능한 평균 및 분신이 있는 평균장(독립) 정규 분포로 추정되며, 이는 bijective 변환으로 선행의 지원에 제한됩니다. 두 개의 더욱 표현적인 대체 사후 확률에 더해 다변량 정규 대체 사후 확률로 동일한 공식을 사용해 평균장 대체 사후 확률을 정의합니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "GoPeLGAjZLbS" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Mean-field surrogate posterior ELBO: -1065.7652587890625\n" - ] - }, - { - "data": { - "image/png": "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\nAABJRU5ErkJggg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - } - ], - "source": [ - "# A block-diagonal linear operator, in which each block is a diagonal operator,\n", - "# transforms the standard Normal base distribution to produce a mean-field\n", - "# surrogate posterior.\n", - "operators = (tf.linalg.LinearOperatorDiag,\n", - " tf.linalg.LinearOperatorDiag,\n", - " tf.linalg.LinearOperatorDiag)\n", - "block_diag_linop = (\n", - " tfp.experimental.vi.util.build_trainable_linear_operator_block(\n", - " operators, flat_event_size))\n", - "mean_field_scale = tfb.ScaleMatvecLinearOperatorBlock(block_diag_linop)\n", - "\n", - "mean_field_loc = tfb.JointMap(\n", - " tf.nest.map_structure(\n", - " lambda s: tfb.Shift(\n", - " tf.Variable(tf.random.uniform(\n", - " (s,), minval=-2., maxval=2., dtype=tf.float32))),\n", - " flat_event_size))\n", - "\n", - "mean_field_surrogate_posterior = tfd.TransformedDistribution(\n", - " base_standard_dist,\n", - " bijector = tfb.Chain( # Note that the chained bijectors are applied in reverse order\n", - " [\n", - " event_space_bijector, # constrain the surrogate to the support of the prior\n", - " unflatten_bijector, # pack the reshaped components into the `event_shape` structure of the posterior\n", - " reshape_bijector, # reshape the vector-valued components to match the shapes of the posterior components\n", - " mean_field_loc, # allow for nonzero mean\n", - " mean_field_scale # apply the block matrix transformation to the standard Normal distribution\n", - " ]))\n", - "\n", - "optimizer=tf.optimizers.Adam(learning_rate=1e-2)\n", - "mean_field_loss = tfp.vi.fit_surrogate_posterior(\n", - " target_model.unnormalized_log_prob,\n", - " mean_field_surrogate_posterior,\n", - " optimizer=optimizer,\n", - " num_steps=10**4,\n", - " sample_size=16,\n", - " jit_compile=True)\n", - "\n", - "mean_field_samples = mean_field_surrogate_posterior.sample(1000)\n", - "mean_field_final_elbo = tf.reduce_mean(\n", - " target_model.unnormalized_log_prob(*mean_field_samples)\n", - " - mean_field_surrogate_posterior.log_prob(mean_field_samples))\n", - "print('Mean-field surrogate posterior ELBO: {}'.format(mean_field_final_elbo))\n", - "\n", - "plt.plot(mean_field_loss)\n", - "plt.xlabel('Training step')\n", - "_ = plt.ylabel('Loss value')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "qv3VzGvMX83Q" - }, - "source": [ - "이 경우, 표준장 대체 사후 확률은 더욱 표현적인 대체 사후 확률에 유사한 결과를 제공하므로, 이 더욱 단순한 모델이 추론 작업에 적합할 수 있음을 나타냅니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "3_P2nrNSGiG5" - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - } - ], - "source": [ - "results['Mean Field'] = pack_samples(mean_field_samples)\n", - "plot_boxplot(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "6FtKcJUyTToh" - }, - "source": [ - "### Ground truth: 헤밀토니언 몬테 카를로(HMC)\n", - "\n", - "대체 사후 확률의 결과와 비교를 위해 HMC를 사용하여 실제 사후 확률에서 \"ground truth\" 샘플을 생성합니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "bwTmpfxuC_A4" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Acceptance rate is 0.9008625149726868\n" - ] - } - ], - "source": [ - "num_chains = 8\n", - "num_leapfrog_steps = 3\n", - "step_size = 0.4\n", - "num_steps=20000\n", - "\n", - "flat_event_shape = tf.nest.flatten(target_model.event_shape)\n", - "enum_components = list(range(len(flat_event_shape)))\n", - "bijector = tfb.Restructure(\n", - " enum_components,\n", - " tf.nest.pack_sequence_as(target_model.event_shape, enum_components))(\n", - " target_model.experimental_default_event_space_bijector())\n", - "\n", - "current_state = bijector(\n", - " tf.nest.map_structure(\n", - " lambda e: tf.zeros([num_chains] + list(e), dtype=tf.float32),\n", - " target_model.event_shape))\n", - "\n", - "hmc = tfp.mcmc.HamiltonianMonteCarlo(\n", - " target_log_prob_fn=target_model.unnormalized_log_prob,\n", - " num_leapfrog_steps=num_leapfrog_steps,\n", - " step_size=[tf.fill(s.shape, step_size) for s in current_state])\n", - "\n", - "hmc = tfp.mcmc.TransformedTransitionKernel(\n", - " hmc, bijector)\n", - "hmc = tfp.mcmc.DualAveragingStepSizeAdaptation(\n", - " hmc,\n", - " num_adaptation_steps=int(num_steps // 2 * 0.8),\n", - " target_accept_prob=0.9)\n", - "\n", - "chain, is_accepted = tf.function(\n", - " lambda current_state: tfp.mcmc.sample_chain(\n", - " current_state=current_state,\n", - " kernel=hmc,\n", - " num_results=num_steps // 2,\n", - " num_burnin_steps=num_steps // 2,\n", - " trace_fn=lambda _, pkr:\n", - " (pkr.inner_results.inner_results.is_accepted),\n", - " ),\n", - " autograph=False,\n", - " jit_compile=True)(current_state)\n", - "\n", - "accept_rate = tf.reduce_mean(tf.cast(is_accepted, tf.float32))\n", - "ess = tf.nest.map_structure(\n", - " lambda c: tfp.mcmc.effective_sample_size(\n", - " c,\n", - " cross_chain_dims=1,\n", - " filter_beyond_positive_pairs=True),\n", - " chain)\n", - "\n", - "r_hat = tf.nest.map_structure(tfp.mcmc.potential_scale_reduction, chain)\n", - "hmc_samples = pack_samples(\n", - " tf.nest.pack_sequence_as(target_model.event_shape, chain))\n", - "print('Acceptance rate is {}'.format(accept_rate))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "GSRQTbT-T07X" - }, - "source": [ - "샘플 추적을 플롯하여 HMC 결과를 타당성 검사합니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "z34B7sa05KX1" - }, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAz4AAACOCAYAAADw6d0wAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzsnXmcFcXVsJ/uvvu9s2/MMAPIJoiC\nsohoFI2oCSiJy2vUaDSbGpKIid8bjRpJYoz5NMmbL2+iRpNoXBLXxC2gKCCLssi+w8ww+z5zt7lb\nr/X9cYc7DAwwCojBfvzND/t2ddXpququOnXqnJaEEAIbGxsbGxsbGxsbG5sTGPl4C2BjY2NjY2Nj\nY2NjY3OssRUfGxsbGxsbGxsbG5sTHlvxsbGxsbGxsbGxsbE54bEVHxsbGxsbGxsbGxubEx5b8bGx\nsbGxsbGxsbGxOeGxFR8bGxsbGxsbGxsbmxMeW/GxOeFIJpNcdtll5OTk8F//9V8A3HvvvRQWFjJo\n0KBjXv7ChQv58pe/fMzLOZrceuut3H///YdNd+aZZ7Jt27ZPQCIbGxubTxf22PLR+aTGlmHDhvHu\nu+8C8Mtf/pJvfetbHzuv/QkEAuzZsweAm266iXvvvfeo5T3Q+rE5igibzxRDhw4VNTU1mePVq1eL\nL37xiyInJ0fk5eWJKVOmiL/+9a/HXI7p06eLJ5544pjk/fTTT4spU6YIXdeFEELU19cLj8cj2tra\njijfJUuWiMGDBx823aRJk8TKlSszx6+++qqYMGGCyMrKEgUFBeLzn/98pg3mzZsnvvrVrw5Yhpqa\nGgFk7u2T5oUXXhBXXHFF5njJkiVi+vTp/aY93rLa2Nh8cthjy8fHHls+2tjSH0OHDhXvvPPORyrz\n4/SVG2+8Udxzzz0f6Zq9PPnkk+Kcc875WNfaHD1si89nmJUrV/L5z3+e6dOnU1VVRVdXF48++igL\nFiw43qIdEXV1dYwePRqHw5E5LigooLi4+JiX/eGHHxKJRDjrrLMAqKqq4mtf+xq/+c1viEQi1NTU\nMGfOHGT5P/PRmz17NkuWLKGlpeWo5GcYxlHJx8bG5tODPbYcfeyx5ZPHHp9OUI635mXzybLvqtw5\n55wj5syZc8j0jz/+uBgxYoTIy8sTl112mWhqahJC9L86tO/qyd6VjTvuuEPk5uaKYcOGifnz5wsh\nhLj77ruFLMvC7XYLv98vvvvd74o5c+aIH/7wh33KvvTSS8X//M//9CvXjh07xIwZM0ReXp4YPXq0\neOGFF4QQQtx3333C6XQKh8Mh/H6/eOyxx4TH4xGSJAm/3y9uvPFGIYQQK1euFNOmTRM5OTli/Pjx\nYsmSJZm8u7q6xE033SRKS0tFbm6u+NKXviRisViffPx+f6Yu9uVnP/uZ+OY3v5k5fumll8SECRP6\nvYcFCxb0kXX8+PGHagohxKFX5VKplJg7d64oLS0VpaWlYu7cuSKVSgkh+l9pAkRlZaUQou8qVkdH\nh5g1a1ZmpfZzn/ucME0zc92MGTPEU089JYQ49KpcRUWFADL19cEHH4gnn3xSnH322eL2228XeXl5\n4p577hFVVVXiggsuEPn5+aKgoEBcd911IhQKZfKpr68Xl19+uSgsLBT5+fniu9/9bubcX/7yFzFm\nzBiRm5srLr74YlFbW3vYOrSxsTn62GPLjUIIe2wR4tiPLUKkrW9DhgwR+fn54he/+EUfi8++1q5k\nMim++tWvivz8fJGTkyMmT54sWltb++0re2X/wx/+IEaOHCmGDRvW7/3ccsstYsaMGSIQCIjzzjsv\nM+4cqu9u375duN1uIcuy8Pv9Iicn54D6EeLgz8VeOR599FExcuRIkZubK+bMmSMsyzpoHdn0j634\nfEaJx+NClmWxePHig6ZZtGiRKCgoEOvWrROpVEp873vfE+eee64QYmCDk8PhEI8//rgwDEM88sgj\norS0NPOQ7m9iXr16tSgtLc28BDs6OoTX6xWtra0HyBWLxUR5ebn461//KnRdF+vWrRMFBQVi69at\nQogDTfz7byNobGwU+fn54t///rcwTVMsXLhQ5Ofni/b2diGEEDNnzhRXX321CAaDQtM08d577/Wb\nT39cddVV4qGHHsocV1dXC7fbLW6//XaxePFi0d3d3Sf90dyO8JOf/ERMnTpVtLW1ifb2djFt2jRx\n7733CiE+2uB01113iVtuuUVomiY0TRPLli3r83L9/ve/L37wgx98LFmffPJJoSiK+P3vfy90XReJ\nREJUVlaKhQsXilQqJdrb28W5554r5s6dK4QQwjAMMX78eHH77beLWCwmksmkWL58uRBCiH/9619i\nxIgRYvv27ULXdXH//feLadOmDbgubWxsjj722GKPLcd6bNm2bZvw+/1i6dKlIpVKiR/84AdCUZR+\n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\nR+JaEAtwngAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\nK7RlUwAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzwAAACOCAYAAAD0HA0NAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzsnWeYHcWVsN/uvmnu5KwwyhIgiSBA\nIpggbK+FESxebLJNWLAxu4BlDDY24vkMay947TUYDGtjDCJaJIERQhJZQiCUEwqjyTnemZtDx/p+\n9J07M5pRQAiE5X6fBzS3q7r6dHWoc+qcOi0JIQQODg4ODg4ODg4ODg5HIPLhFsDBwcHBwcHBwcHB\nweHzwjF4HBwcHBwcHBwcHByOWByDx8HBwcHBwcHBwcHhiMUxeBwcHBwcHBwcHBwcjlgcg8fBwcHB\nwcHBwcHB4YjFMXgcHBwcHBwcHBwcHI5YHIPH4Yhg+vTprFix4nCLccDk5ORQV1d3QHUlSaKmpuZz\nlsjBwcHBYTic8eXgWLFiBRUVFZnfh7Ifn3vuOebMmZP5fajP49P0ocM/Bo7B43BIGD9+PA0NDQCc\nc845/PWvfx1UvueL71CzY8cOzjnnnM+t/UNNLBZj4sSJn7mdJ598kjPPPHPQtmuvvZYnn3xy2Pp3\n33033/ve9z7zcR0cHBy+KJzx5dNxuMaX/XEg/djQ0IAkSRiGsc963/3ud3nrrbcOSo49Ge6eOlR9\n6PDlwTF4HA47+3uxOXxxCCGwLOtwi+Hg4OBwSHDGlyMP55o6HAyOweNwWJAkiUceeYQpU6YwZcoU\nAObNm8eYMWPIy8vj5JNPZtWqVZn6d999N5deeilXX301ubm5TJ8+nQ0bNmTKx48fzzvvvAPYM1B3\n3XVXpmzP2b/x48fzu9/9juOPP57s7Gyuv/56Ojs7Oe+888jNzeVf/uVfCAaDw8o9e/ZsFi1aBMCH\nH36IJEksXboUgHfeeYcZM2Zk6j7xxBNMnTqVwsJCzj33XBobGwedf5/7vaenh3/9138lLy+PWbNm\ncddddw2ZVXvnnXeYMmUKhYWF3HTTTQgh2LVrFzfeeCMff/wxOTk5FBQU7LPPly9fzr333ssLL7xA\nTk4OJ5xwAmDPbs2fP58zzjgDv99PXV0dCxYsYOrUqeTm5jJx4kQeffTRQW299tprzJgxg7y8PCZN\nmsTy5csBCIfDXH/99YwcOZLRo0dz1113YZrmPuVycHBwOJQ448sXP74AJJNJrr32WgoLC5k2bRrr\n168fVD6wH9etW8fMmTPJy8ujvLycn/zkJwCcffbZABQUFJCTk8PHH3/Mk08+yRlnnMGtt95KUVER\nd99997Dep6VLlzJx4kRKSkr46U9/mpm82zOyYaAXaf78+axatYqbb76ZnJwcbr755iF9GA6Hufrq\nqyktLWXcuHH8+te/zrTdJ8ftt99OYWEhEyZMYNmyZfvtK4cvHsfgcTgkNDQ0MH78+E+1z9///nfW\nrl3Lzp07AZg1axZbtmyht7eXK6+8kksuuYRUKpWpv3jxYi6//HJCoRAXXnhh5sV0MCxatIi3336b\nqqoqXn/9dc477zzuvfdeAoEAlmXx0EMPDbvf7NmzMzHIH3zwARMnTmTlypWZ37Nnz86c27333ssr\nr7xCd3c3Z511FldcccWwbd50001kZ2fT0dHBU089xVNPPTWkzpIlS1i/fj1bt27lxRdf5M0332Tq\n1Kn8+c9/5vTTTycWixEKhQD7BXzttdcOaeOb3/wmd955J5dddhmxWIytW7dmyp555hn+8pe/EI1G\nGTduHGVlZSxZsoRIJMKCBQu49dZb2bRpE2APVFdffTW/+93vCIVCfPDBB5lrf8011+ByuaipqWHz\n5s289dZbQ0IFHBwcHD4Nzvjy5R9fAO655x5qa2upra3lzTffHPZYfcybN4958+YRiUSora3l0ksv\nzZwnQCgUIhaLcfrppwOwdu1aJk6cSFdXF/Pnzx+2zVdffZUNGzawadMmXnvtNZ544om9Hr+P//7v\n/+ass87i4YcfJhaL8fDDDw+pc8sttxAOh6mrq2PlypU8/fTTLFiwIFO+du1ajj76aAKBAD/72c+4\n/vrrEULs99gOXyyOweNw2PjFL35BUVERWVlZAHzve9+juLgYl8vFbbfdhqqq7N69O1P/zDPPZO7c\nuSiKwlVXXTVIYf+03HLLLZSXlzN69GjOOussTj31VE488US8Xi8XXXQRmzdvHna/2bNnDxqAfvGL\nX2R+r1y5MjMgPfroo/ziF79g6tSpuFwu7rzzTrZs2TJoFg7ANE0WLVrEPffcg9/vZ9q0aVxzzTVD\njvvzn/+cgoICxo4dy1e/+lW2bNly0Oc+HNdeey3Tp0/H5XLhdrs5//zzmTRpEpIkMXv2bObMmZOZ\n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\nkO9Y70i8ek9i1nv+FrOeHqcG5HN4rpW/Px/B3+sPEgN/rz9IDEBiIK4v+Xz1jsSr9yRmvScx65x0\naRNCCCGEEEL4LEl4hBBCCCGEED5L/8Mf/vCH3i7E9TBu3DhvF8Gr/L3+IDHw9/qDxAAkBuL6ks9X\n70i8ek9i1nsSs4588h4eIYQQQgghhADp0iaEEEIIIYTwYZLwCCGEEEIIIXyWTyU8H330ESkpKVit\nVtasWePt4nhMUVER06dPJy0tDZvNxgsvvADA+fPnmTlzJiNHjmTmzJlUVVW511m9ejVWq5WUlBQ2\nb97snr5v3z4yMjKwWq08/vjj3Gg9Gp1OJ2PGjGHevHmAf8XgwoULLFmyhNTUVNLS0ti5c6df1R9g\n7dq12Gw20tPTWbZsGU1NTT4fgwceeIDo6GjS09Pd0zxZZ7vdzt13343VaiU3N9dvnr0jeq6nx9b8\n/Hz0ej3vvPNOP5Zu4OlJvLZu3Up2djY2m42bb765n0s48FwtZtXV1cyfP5+srCxsNhuvvfaaF0o5\ncHR2XGhPKcXjjz+O1WolMzOT/fv393MJByDlIxwOh7JYLOrkyZPKbrerzMxMdeTIEW8XyyNKS0vV\nvn37lFJK1dTUqJEjR6ojR46op556Sq1evVoppdTq1avV9773PaWUUkeOHFGZmZmqqalJnTp1Slks\nFuVwOJRSSuXk5KgdO3Yol8ul5syZo/7yl794p1J99POf/1wtW7ZMzZ07Vyml/CoGK1asUL/5zW+U\nUkrZ7XZVVVXlV/UvLi5WSUlJqqGhQSml1J133qlee+01n4/BZ599pvbt26dsNpt7mifr/Mtf/lJ9\n61vfUkop9ac//Unddddd/Vk9McD19NjqcDjU9OnT1a233qrefvttL5R0YOhJvKqqqlRaWpo6ffq0\nUkqpc+fOeaOoA0ZPYvbcc8+593NlZWVqyJAhym63e6O4A0Jnx4X2Nm3apObMmaNcLpfauXOnmjBh\nQj+XcODxmSs8e/bswWq1YrFYCAgIYOnSpeTl5Xm7WB4RFxfH2LFjAQgLCyMtLY2SkhLy8vK47777\nALjvvvt4//33AcjLy2Pp0qWYTCaSk5OxWq3s2bOHM2fOUFNTw0033YSmaaxYscK9zo2guLiYTZs2\nsXLlSvc0f4lBTU0Nn3/+OQ8++CAAAQEBDB482G/qf5HD4aCxsRGHw0FDQwPx8fE+H4OpU6cSERFx\n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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\ncLvdPP/88wCcPXuWiRMnMmTIECZOnEhZWZl/m8WLF+NyuUhNTeWTTz7xL9++fTuZmZm4XC4eeeQR\n+lJLRI/Hw/Dhw7n99tuBgRf/uXPnmDVrFsOGDSMtLY1NmzYNqHPw7LPP4na7ycjIYO7cudTU1PT7\n+B944AGio6PJyMjwL+vOmGtra7nnnntwuVyMHDlyQM19c7Vc7vNp0t41vTfr6P6qlOKRRx7B5XKR\nlZXFjh07eiCVV6ajGN966y2ysrLIyspi1KhR7N69uwdSeeUCzStt27YNvV7Pe++9dw1T1z0CiXHt\n2rXk5OTgdru56aabrnEKr1xHMZ4/f5477riD7Oxs3G43y5Yt64FUdl1b97/munzNUX1MQ0ODSklJ\nUYcOHVK1tbUqKytL7d27t6eT1S2+//57tX37dqWUUuXl5WrIkCFq79696vHHH1eLFy9WSim1ePFi\n9fOf/1wppdTevXtVVlaWqqmpUYcPH1YpKSmqoaFBKaVUXl6e2rhxo/J6vWry5Mlq9erVPRNUF/z+\n979Xc+fOVbfddptSSg24+O+77z715z//WSmlVG1trSorKxsw56C4uFgNGjRIVVVVKaWUmj17tlq2\nbFm/j3/dunVq+/btyu12+5d1Z8wvvfSS+uEPf6iUUuqdd95Rd99997UMr19q7/Nprr1rem8VyP11\n1apVavLkycrr9apNmzap/Pz8Hkpt1wQS44YNG9TZs2eVUkqtXr26z8WoVOB5pYaGBjV+/Hg1ZcoU\n9de//rUHUtp1gcRYVlam0tLS1JEjR5RSSp08ebInktplgcT41FNP+a8/p06dUmFhYaq2trYnktsl\nbd3/muvqNafP1eBs3boVl8tFSkoKJpOJOXPmsHLlyp5OVreIi4tjxIgRANhsNtLS0igpKWHlypUs\nWLAAgAULFvDBBx8AsHLlSubMmYPZbCY5ORmXy8XWrVs5fvw45eXl3HDDDWiaxn333effprcrLi5m\n1apVLFy40L9sIMVfXl7Ol19+yYMPPgiAyWTC4XAMqHPQ0NBAdXU1DQ0NVFVVER8f3+/jHzt2LOHh\n4S2WdWfMzfc1a9Ys1qxZ06trtPqC9j6f5tq7pvdWgdxfV65cyX333YemaRQUFHDu3DmOHz/eQynu\nvEBiHDVqFGFhYQAUFBRQXFzcE0m9IoHmlV544QVmzpxJdHR0D6TyygQS49tvv82MGTNISkoC6HNx\n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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_traces(var_name, samples):\n", - " fig, axes = plt.subplots(1, 2, figsize=(14, 1.5), sharex='col', sharey='col')\n", - " for chain in range(num_chains):\n", - " s = samples.numpy()[:, chain]\n", - " axes[0].plot(s, alpha=0.7)\n", - " sns.kdeplot(s, ax=axes[1], shade=False)\n", - " axes[0].title.set_text(\"'{}' trace\".format(var_name))\n", - " axes[1].title.set_text(\"'{}' distribution\".format(var_name))\n", - " axes[0].set_xlabel('Iteration')\n", - "\n", - "warnings.filterwarnings('ignore')\n", - "for var, var_samples in hmc_samples.items():\n", - " plot_traces(var, var_samples)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ioys0R7QYzH1" - }, - "source": [ - "신뢰 구간을 생성한 모든 세 개의 대체 사후 확률은 시각적으로 HMC 샘플과 유사하지만, 때때로 VI에서 흔히 볼 수 있듯이 ELBO 손실 효과로 인해 분산이 부족합니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "hZ1GUl1dJtpl" - }, - "outputs": [ - { - "data": { - "image/png": "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\nEj/88APy8vIAdCTuFVdc4fK7J06cwMMPP4yff/4ZX331lTR+vdPRo0dRVFSErVu34uLFi7j55pvd\nXv/yyy9Hamoqtm3bBqDjj+/aa69FaGgoYmJi8N///hdAxx9sdHS09HuJiYkAgKioKOn/YWFhcDgc\n2LdvH5588km0tbXh8OHDPZ6DqqoqHDt2DADQ3NwsPT4YwycAz5/l0aNHsW/fPrz++us4f/485s2b\n1+357nz/o0ePxtmzZ12eu+vwiT179kjPX11dLY3pvzRZ7HY7rr32WoSEhPhtj6m7774bTz/9NICO\nFtNON910E5544gmUlpaiqKhIiu3kyZOIi4vzSyz+whxljjJHlY05yhxljiobc5Q5yhz1v0GruG7d\nuhWTJk2SHrvyyiths9ngdDrd/ohDQ0PhcDjcnueOO+7Ao48+CpvNhhtvvBH79u3DuXPnsHPnTvzt\nb3+TJqZ7Gmv/17/+FStXroROp0NqaiqcTidCQ0Pxv//9D0DHBeCee+7Bww8/DADSZOSulixZguzs\nbCQmJiI8PBwNDQ1oa2tDU1MTrrzySo+vf+mFq+tFbM2aNdiwYQNGjx7d4x/A/v37kZeXh6eeegoA\nUFBQgC+//NLr7ww0T59lfHw80tPTMXv2bAAd52758uVu5xvw7SIeHx+PzMxMaf5H5/kGALVajW+/\n/RYOhwNffPHFgLzH3rrzzjtht9sxatQo6bE5c+bghRdewPr166FSqbBz506pxVTJmKPMUeaosjFH\nmaPMUWVjjjJHmaP+NygV17CwMLzxxhsuj82aNQt5eXkoKSnB1Vdf7fKzUaNG4cyZM7jjjjtchhRc\ne+21+Oabb6Tu6vj4eBw/fhwzZszAmDFjMHr06G5jmDlzJpYuXYobbrgBw4YNA9AxPn/BggU4dOgQ\nXnnlFTzwwAPScz/00EMeu+M1Go3UkhIcHIylS5diypQpCAoKwrp16/p8bvLy8pCbm4vk5GS389BV\n52pqnXQ6ncuKdIPB02dpMplw//3347XXXoPT6cSzzz7r8Xz7KikpCaNGjYJOp4NKpcK8efOQmZkJ\nAAgJCcG9996LW265ZdDnwfz617/GmjVrXB7Lzs7G0aNHMW3aNLS3t2PixIlCfOEyR7vHHO0Zc9T/\nmKPdY472jDnqf8zR7jFHe8Yc7R2Vs7dNAUREREREREQy8PviTERERERERET9wYorERERERERKRor\nrkRERERERKRorLgSERERERGRorHiSkRERERERIrGiisREREREREpGiuuREREREREpGj/B/xkcchL\nBGanAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - } - ], - "source": [ - "results['HMC'] = hmc_samples\n", - "plot_boxplot(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "V8Y-O_CsT7vH" - }, - "source": [ - "## 추가 결과\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "cellView": "form", - "id": "OUnECXkG42uZ" - }, - "outputs": [], - "source": [ - "#@title Plotting functions\n", - "\n", - "plt.rcParams.update({'axes.titlesize': 'medium', 'xtick.labelsize': 'medium'})\n", - "def plot_loss_and_elbo():\n", - " fig, axes = plt.subplots(1, 2, figsize=(12, 4))\n", - "\n", - " axes[0].scatter([0, 1, 2],\n", - " [mvn_final_elbo.numpy(),\n", - " iaf_final_elbo.numpy(),\n", - " mean_field_final_elbo.numpy()])\n", - " axes[0].set_xticks(ticks=[0, 1, 2])\n", - " axes[0].set_xticklabels(labels=[\n", - " 'Multivariate Normal', 'IAF', 'Mean Field'])\n", - " axes[0].title.set_text('Evidence Lower Bound (ELBO)')\n", - "\n", - " axes[1].plot(mvn_loss, label='Multivariate Normal')\n", - " axes[1].plot(iaf_loss, label='IAF')\n", - " axes[1].plot(mean_field_loss, label='Mean Field')\n", - " axes[1].set_ylim([1000, 4000])\n", - " axes[1].set_xlabel('Training step')\n", - " axes[1].set_ylabel('Loss (negative ELBO)')\n", - " axes[1].title.set_text('Loss')\n", - " plt.legend()\n", - " plt.show()\n", - "\n", - "plt.rcParams.update({'axes.titlesize': 'medium', 'xtick.labelsize': 'small'})\n", - "def plot_kdes(num_chains=8):\n", - " fig, axes = plt.subplots(2, 2, figsize=(12, 8))\n", - " k = list(results.values())[0].keys()\n", - " plot_results = {\n", - " v: {p: results[p][v] for p in results} for v in k}\n", - " for i, (var, var_results) in enumerate(plot_results.items()):\n", - " ax = axes[i % 2, i // 2]\n", - " for posterior, posterior_results in var_results.items():\n", - " if posterior == 'HMC':\n", - " label = posterior\n", - " for chain in range(num_chains):\n", - " sns.kdeplot(\n", - " posterior_results[:, chain],\n", - " ax=ax, shade=False, color='k', linestyle=':', label=label)\n", - " label=None\n", - " else:\n", - " sns.kdeplot(\n", - " posterior_results, ax=ax, shade=False, label=posterior)\n", - " ax.title.set_text('{}'.format(var))\n", - " ax.legend()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "WXzsxJcG1kPH" - }, - "source": [ - "### 증거 하한(ELBO)\n", - "\n", - "가장 크고 유연한 큰 대체 사후 확률인 IAF는 가장 높은 증거 하한(ELBO)으로 수렴합니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "cKf_nCvpxohJ" - }, - "outputs": [ - { - "data": { - "image/png": "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\n77z169czfPhwrrnmGlq0aEF8fDwAJ06c4J///Cd33HEHVquVe++91z5rCxWzkm5ubnTp0oX9+/cD\nsGbNGiZNmsQ111wDQOvWrS96nQv597//TUxMDN7e3nh4eHDnnXfy5Zdfct1113HixAmKiorYu3cv\n48eP58svv2T9+vX07duXXbt2sW3bNuLi4rBarcycOdNewwsVJQ/VOVcO8dNPPxEeHs7s2bMB+Prr\nrxk/fjwAv/3tb/nqq68uGn90dDT+/v64ublhtVrJy8tj586dBAYGEhwcjGEY3HXXXVWea7PZ8Pb2\nrjK2c6+mTZtecPxzpRo//fQTa9eu5Z///CemaVb5b/SX7e7u7jRu3JiioqKL3qOISH0697n0xhtv\nMHPmTPbu3YvVauXQoUOMHz+e5cuX07RpUwYNGmT/q5lIfXDpxLkmCgoKaN++vf29v78/BQUFAOze\nvZv169fTs2dP+vfvz7///W97v9zcXLp27Ur//v1Zv349AAcPHmTmzJmsWbOGb775hqioKF5++WX7\nOZMmTeK6665j586d59WkOoMxY8awZMkS1q1bR48ePfDy8qrUp6pEqry8nFatWp2XqH333Xf24+d+\n6QDsJQhVJWUXu86FnLtuVXr37s2CBQsICQmhb9++rF+/nq+//pqbbroJ0zQJDQ21j/ef//yHzz77\nzH5us2bNLjq2YRjcdtttfPnll9UeB/Dw8KC8vNwe79mzZ+19fvk9cnd3t9dU1+SXq6ZNm9pLLGqr\nefPmxMTE8NVXXxEUFMQPP/xQKSn+5ptvzquZPnPmDE2aNKmT8UVEaurGG28kPT0dgHfffddefrdn\nzx569uzJs88+S9u2bdm7dy/ff/89HTp0YOrUqcTHx7N161ZHhi4NnNMnzgMHDiQsLKzS69ys8cVU\nlXSdS1hKS0s5cuQIGzduZPbs2YwePRrTNLFYLPz4449s2bKFl19+mfHjx3P8+HE2btzIjh07uOmm\nm7BaraSlpfHDDz/Yr7tgwQL27dtH586dne6hqpiYGL755hv+3//7f1XOtPbr14+lS5dSXFxMUVER\nK1asACpm0gMDA3n//feBiu/nt99+e8GxbrnlFt566y37ShSHDx++rOuc07NnT7744gsOHjxIWVkZ\nixcvpn///va4X3zxRfr160fXrl35/PPP8fT0pGXLloSEhFBYWMjXX38NQElJCdu3b6/RmL/01Vdf\n0bFjR6D6D/OAgAA2b94MQEZGBiUlJRe8ZqdOncjNzWXPnj1ARQ13VTp37sx///vfS465KqWlpfzr\nX/+iY8eONGvWjMTERKZNm0ZZWRkAb7/9NqdOneLmm28G4NChQ3h7e9OoUaM6GV9EpCqnTp3C39/f\n/nr55Zd59dVXWbBgARERESxatMj+LMqjjz5qf96lX79+REZG8t577xEWFobVamXnzp1MmDDBwXck\nDZmHowO4mDVr1tTqfH9/f/bu3Wt/n5+fj5+fn/3YiBEjMAyD6Oho3NzcOHjwIN7e3vZZwu7du9Ox\nY0d2796NaZrExcVVm+RAxYzimDFjmD17NpMmTapV7JejuLgYq9Vqfz948GBSUlJwd3dn2LBhLFy4\nkLS0tErndevWjTFjxmC1Wrnhhhvo27ev/di7777LlClTmDlzJiUlJYwdO/aCD6sNHjyY7OxsoqKi\naNy4MUOHDuXPf/5zja+zcOFCli1bZn+/ceNGZs2axYABAzBNk6FDh9pLTfr27cvevXvp168f7u7u\ntG/fnk6dOgHQuHFjPvjgA6ZOncqxY8coLS3lwQcfJDQ09KLfx/fee4+vvvqK8vJy/P39WbhwIQCv\nvvoqkydPZvbs2Xh7e7NgwQIA7rnnHhISEoiOjiY2Nvais9lNmjQhNTWVW2+9lbZt29KnTx+2bdtW\nqV+nTp04duwYRUVF9r8SnIvtnL/85S/4+fmxa9eu8x6KmTNnDlDxg2bmzJmcPXuW2NhYRowYAcCs\nWbN45JFH+M1vfoObmxudOnVi6dKl9l8sP//8c4YOHXrR75WISG2c+2vdr1VVclHVg9RPPPEETzzx\nRJ3HJVIVw7zQ38FdRExMDC+++CJRUVGVjpWWlvKb3/yGtWvX0q5dO3r06MHf//53QkNDeeONN9i3\nbx/PPvssu3fvtq+ScPDgQVq3bo27uzvff/89ffv25T//+Q9lZWV0796ddevWERQUxKlTp8jPzyc4\nOJg9e/YQFBSEaZo8+uijAA5ZB1kanjlz5uDl5WVfy/lKGTFiBLNmzbrocwQiIiJXC6cv1biQpUuX\n4u/vz9dff82tt97KoEGDANi3b599pszDw4PXX3+dQYMG0blzZ0aPHm2fcZw8eTLff/89YWFhjB07\nlrS0NAzD4MsvvyQiIoLIyEhGjRrFG2+8QevWrfH29mbhwoWMGzeOiIgIevXqxc6dOzFNk8TERMLD\nwwkPD8dms/H000877PsiDcuUKVPOq5O+Es6ePcvtt9+upNlFlZWV0bVrV/umOocPHyYuLo7g4GDi\n4uI4cuSIve+sWbMICgoiJCSETz/91N6+efNmwsPDCQoKYurUqRd81kBE5GrRIGacRUTkf15++WWy\nsrI4fvw4H330EY899hitW7cmOTmZlJQUjhw5wvPPP8+OHTsYN24cmzZtYt++fQwcOJDdu3fj7u5O\ndHQ0c+fOpVevXgwdOpSpU6cyZMgQR9+aiIhDufSMs4iInC8/P5+PP/74vNKejIwMEhMTAUhMTLQ/\nQ5CRkcHYsWPx9PQkMDCQoKAgNm3ahM1m4/jx4/Tu3RvDMJgwYcJ5zx2IiFytnPrhwLZt2xIQEODo\nMERELlleXp59V84r6cEHH+SFF144b6nB/fv3Y7FYALBYLBw4cACoWK6zV69e9n7nluts1KjReQ+a\n/nIZz19LTU0lNTUVgJ07d9ofzq2pXUd20aJxCyzNLJd0nohIXarpZ7ZTJ84BAQEX3EpbRMRZVfWw\ncn376KOP8PHxoXv37mRmZl60f3XLdV5oGc9fS0pKIikpCai450v6zC4rIeb9mxnQrh9/6vtczc8T\nEaljNf3MdurEWUREam7Dhg0sX76clStXcvr0aY4fP85dd92Fr68vNpsNi8WCzWaz75Ja3XKd/v7+\n5+2y+ctlPOvUyUKMk4cwj+TW/bVFROqBapxFRBqIWbNmkZ+fT15eHunp6dx888288847xMfH29dv\nT0tLs6+DHh8fT3p6OmfOnCE3N5ecnByio6OxWCx4eXmxceNGTNPk7bfftp9T1wz0fLqIuA7NOIuI\nNHDJycmMHj2aN998k+uvv96+g2doaCijR4+mS5cueHh4MG/ePNzd3QGYP38+EydOpLi4mCFDhtTb\nihoGYCp5FhEXocRZRKQBiomJISYmBoA2bdqwdu3aKvtNnz6d6dOnV2qPioqqcjfL+qBFUaU+lJSU\nkJ+fz+nTpx0dijiRJk2a4O/vT6NGjS7rfCXOIiLiMJpxlvqSn5+Pl5cXAQEB1T7cKlcX0zQ5dOgQ\n+fn5BAYGXtY1VOMsIiIOYvycOIvUvdOnT9OmTRslzWJnGAZt2rSp1V8hlDiLiIjDaMZZ6pOSZvm1\n2v6bUOIsIiIOY5hoyllEXIYSZxERcRjNOEtDZhgGv/3tb+3vS0tL8fb2ZtiwYRc9t3nz5kDFjnZ/\n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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_loss_and_elbo()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "5ag72K8X3tpJ" - }, - "source": [ - "### 사후 확률 샘플\n", - "\n", - "각 대체 사후 확률의 샘플은 HMC ground truth 샘플(상자 슬롯에 표시된 샘플의 다른 시각화)과 비교됩니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "_yjwsHIoftLX" - }, - "outputs": [ - { - "data": { - "image/png": "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\n+v6oUaN0/7569SqjRo0iMTGRoqIimjVrprs2YMAADA0NMTQ0xNbWlqSkJF1cuheDBw8GwMvLi9zc\nXMzNzTE3N8fIyIjMzEwaNmyoK9uuXTtOnDhBTk4OhoaG+Pr6Eh4ezoEDB/jkk084cuQI0dHRuqVp\nRUVFBAQElGvv2LFjdO3aVfc7YcSIEeX28AwdOhSlUom7u7tuJl082WRJxhPKw8ODEydOVHpNq9VW\n+r6enh4ajUb3uqCgoNx1Q0NDoGzZQklJSaV1BAYGkpCQwL59+ygtLa10M5xGoyEsLIzIyEgiIyO5\ndu0a5ubmd3werVbL22+/rbvn/PnzPPfcc2i12ip/KVTF2Ni4wrM1b96cyZMns2fPHk6dOkVaWlq1\n6qyO2z/nf/bjlpkzZ7Jy5Ury8/Pp2LEjMTExuvLGxsa11jchRP1hZWWlWwp2S3p6um6CAcDU1FT3\n79dee40pU6Zw5swZvvzyy3Lx6Vb8h8p/B9zr7w+lUlmuLqVSWaEufX19XFxc+O677+jUqRNBQUHs\n3buXCxcu4ObmhlarpVevXrrfB9HR0XzzzTfl6qjq91xlz3O3suLJIAPmJ1T37t0pLCwsN8N7/Phx\n9u3bR5cuXVi/fj2lpaWkpKSwf/9+2rdvj7OzM9HR0RQWFpKVlcWePXvu2o65uXmF2eHx48czZsyY\nKjfr9e7dm08//VT3+tYmvzvp06cP3377rW6d2rVr10hOTqZHjx789NNPugFuenp6lf26xc3NjfPn\nz+teb926VRcw4+PjUalUNGzY8I513I2FhQWWlpa6tc+rV6/WzTa7uLjo/pipbKc2wIULF/Dy8uKt\nt97Cz89PN2COi4urkYwcQoj6z8zMjMaNG+tieXp6Ojt27KBz586Vls/KysLR0RGA77//vlpt3c/v\njzvp0qULixcvpkuXLgQFBfHFF1+gVqtRKBR07NiRQ4cO6eJ4Xl5ehQxQ7du3Z9++fWRkZFBSUsIv\nv/xy1zYfJOaLx58MmJ9QCoWCjRs3smvXLpo3b46Hhwfz58/HwcGBkJAQ3Sa57t27s2jRIuzt7WnS\npAkjR47E29ubsWPH6pY/3MmgQYPYuHFjuY1xY8eOJSMjgzFjxlR6zyeffEJ4eDje3t64u7tXuunj\nn3r37s3TTz9NQEAAXl5eDB8+nJycHDw8PJg9ezZdu3albdu2vPnmmwCMHj2aDz/8EB8fnwqb/vr1\n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\nT+32dO6Oyvgv9l+8WENPIoS4HxKzHz1arZYSTUmtDZhvrWOWbBmittRqHub6wtTUlKioKPLz8zE2\nNmbXrl04Ojo+lLY//PBDhg8fXu69bdu2PZS2H0carYbzmecZ1nJYpdf3xCThZJiPXkEmYMrMmTPZ\nu3cvGo2Gp556CkdHRwYMGADSfpQnAAAgAElEQVTAyJEjGTlyJAD5+fnk5eVhZWVVZdvdmnTjs8jP\nOJMeRmFJTwz1VDX+fEKIu5OY/egp1hSjRVtrA2Z7U3uaWTQj7HoYEzwm1Eob4skmM8z3qF+/fmzd\nuhUoO251zJgxums3b95k0qRJ+Pv74+Pjw2+//QZAQkICQUFB+Pr64uvry+HDZX/5hoaGEhwczPDh\nw2nTpg1jx46t1rqr22cifvzxR9q3b49areall16qdN3te++9R+vWrenZs6fu2Nv66mrOVfJL8itd\nv5xTUMzRi+mk/7GCgIAACgsL2bBhAz169GDTpk307duXa9euAZCdna37f1JaWkpgYCDPPvvsHdtu\nZdmKhgY2aI1jiLwi65iFqEsSsx8tt46urq0BM0BA4wBOJJ2gsLSw1toQT67Haob5g2MfEJMeU6N1\ntmnUhrfav3XXcqNHj+bdd99l4MCBnD59mkmTJnHgwAGgLLh1796db7/9lszMTNq3b0/Pnj2xtbVl\n165dGBkZER8fz5gxY3SnaJ08eZKzZ8/i4OBAYGAghw4donPnzhXanTFjBgsWLABg9erVeHl56a6d\nO3eO9evXc+jQIfT19XnllVf43//+x/jx43VlTpw4wbp16zh58iQlJSX4+vrSrl3NnbL0qInPKMuQ\n0cqyVYVrB+JTKdFo+eD9RejnXMfQ0BBHR0cCAwOZPXs2u3bt4u2338bNzY3ExERefvllZs+ejbm5\nOVOnTr3rDJVCoaCrUxc25W/h4IUbdHCtejZaiCeBxGyJ2bdUGDDfiIL4nWBmBx5DwcD0gdvo5NCJ\nNTFrOJl8ko6NOz5wfULc7rEaMNclb29vEhISWLt2Lf379y93befOnWzevFm3zqygoIArV67g4ODA\nlClTiIyMRKVSERcXp7unffv2ODk5AWXH0SYkJFQafCv7eu+WPXv2cOLECfz9/YGyZQO2tuVzCx84\ncICQkBBMTEwAGDx48H1+Ao+HuIw4FCho3rB5hWu7zt7AwlifwUE+lJZ4kpKSQq9evdBoNIwePRof\n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\nwJQAAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_kdes()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "45bp131ngAxT" - }, - "source": [ - "## 결론" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "0xXnCEkKgDa5" - }, - "source": [ - "이 Colab에서, 결합 분포 및 다중 bijector를 사용하여 VI 대체 사후 확률을 구축하고 라돈 데이터세트의 회귀 모델의 가중치에 대한 신리 구간을 추정하기 위해 이들을 맞췄습니다. 이 간단한 모델의 경우, 더욱 표현적인 대체 사후 확률은 평균장 대체 사후 확률과 유사하게 수행되었습니다. 하지만, 입증한 도구는 더욱 복잡한 모델에 적합한 광범위하고 유연한 대체 사후 확률을 구축하기 위해 사용될 수 있습니다. " - ] - } - ], - "metadata": { - "colab": { - "collapsed_sections": [], - "name": "Variational_Inference_with_Multipart_Bijectors.ipynb", - "toc_visible": true - }, - "kernelspec": { - "display_name": "Python 3", - "name": "python3" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/site/ko/tfx/tutorials/tfx/penguin_transform.ipynb b/site/ko/tfx/tutorials/tfx/penguin_transform.ipynb deleted file mode 100644 index 3e99933241..0000000000 --- a/site/ko/tfx/tutorials/tfx/penguin_transform.ipynb +++ /dev/null @@ -1,854 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "DjUA6S30k52h" - }, - "source": [ - "##### Copyright 2021 The TensorFlow Authors." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "cellView": "form", - "id": "SpNWyqewk8fE" - }, - "outputs": [], - "source": [ - "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", - "# you may not use this file except in compliance with the License.\n", - "# You may obtain a copy of the License at\n", - "#\n", - "# https://www.apache.org/licenses/LICENSE-2.0\n", - "#\n", - "# Unless required by applicable law or agreed to in writing, software\n", - "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", - "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", - "# See the License for the specific language governing permissions and\n", - "# limitations under the License." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "6x1ypzczQCwy" - }, - "source": [ - "# TFX 파이프라인 및 TensorFlow Transform을 사용한 특성 엔지니어링\n", - "\n", - "***TFX 파이프라인을 사용하여 입력 데이터를 변환하고 모델을 훈련합니다.***" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "HU9YYythm0dx" - }, - "source": [ - "참고: 설정이 필요하지 않은 Colab 노트북에서 이 튜토리얼을 실행하는 것이 좋습니다! \"Google Colab에서 실행\"을 클릭하기만 하면 됩니다.\n", - "\n", - "" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "_VuwrlnvQJ5k" - }, - "source": [ - "이 노트북 기반 튜토리얼에서는 TFX 파이프라인을 생성 및 실행하여 원시 입력 데이터를 수집하고 ML 훈련에 알맞게 전처리합니다. 이 노트북은 [TFX 파이프라인 및 TensorFlow 데이터 검증 튜토리얼을 사용하는 데이터 검증](https://www.tensorflow.org/tfx/tutorials/tfx/penguin_tfdv)에서 구축한 TFX 파이프라인을 기반으로 합니다. 해당 내용을 아직 읽지 않았다면 이 노트북을 계속 진행하기 전에 읽어야 합니다.\n", - "\n", - "특성 엔지니어링으로 데이터의 예측 품질을 높이거나 차원을 낮출 수 있습니다. TFX 사용의 이점 중 하나는 변환 코드를 한 번 작성하면 훈련/적용 불일치를 피할 수 있도록 변환 결과가 훈련과 적용 간에 일관성 있게 된다는 것입니다.\n", - "\n", - "파이프라인에 `Transform` 구성 요소를 추가합니다. Transform 구성 요소는 [tf.transform](https://www.tensorflow.org/tfx/transform/get_started) 라이브러리를 사용하여 구현됩니다.\n", - "\n", - "TFX의 다양한 개념에 대해 자세히 알아보려면 [TFX 파이프라인 이해하기](https://www.tensorflow.org/tfx/guide/understanding_tfx_pipelines)를 참조하세요." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Fmgi8ZvQkScg" - }, - "source": [ - "## 설정하기\n", - "\n", - "먼저 TFX Python 패키지를 설치하고 모델에 사용할 데이터세트를 다운로드해야 합니다.\n", - "\n", - "### Pip 업그레이드\n", - "\n", - "로컬에서 실행할 때 시스템에서 Pip을 업그레이드하지 않으려면 Colab에서 실행 중인지 확인해야 합니다. 물론 로컬 시스템은 별도로 업그레이드할 수 있습니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "as4OTe2ukSqm" - }, - "outputs": [], - "source": [ - "try:\n", - " import colab\n", - " !pip install --upgrade pip\n", - "except:\n", - " pass" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "MZOYTt1RW4TK" - }, - "source": [ - "### TFX 설치\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "iyQtljP-qPHY" - }, - "outputs": [], - "source": [ - "!pip install -U tfx" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "wQnYqtqOlA5l" - }, - "source": [ - "### shapely 설치 제거하기\n", - "\n", - "TODO(b/263441833) ImportError를 피하는 임시 솔루션입니다. 다른 추가 종속성을 제거하는 대신 최신 버전의 Bigquery를 지원하여 처리하는 것이 이상적입니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "3e8hUMPrlFXJ" - }, - "outputs": [], - "source": [ - "!pip uninstall shapely -y" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "EwT0nov5QO1M" - }, - "source": [ - "### 런타임을 다시 시작했습니까?\n", - "\n", - "Google Colab을 사용하는 경우, \"런타임 다시 시작\" 버튼을 클릭하거나 \"런타임 > 런타임 다시 시작...\" 메뉴를 사용하여 런타임을 다시 시작해야 합니다. 이는 Colab이 패키지를 로드하는 방식 때문입니다." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "BDnPgN8UJtzN" - }, - "source": [ - "TensorFlow 및 TFX 버전을 확인합니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "6jh7vKSRqPHb" - }, - "outputs": [], - "source": [ - "import tensorflow as tf\n", - "print('TensorFlow version: {}'.format(tf.__version__))\n", - "from tfx import v1 as tfx\n", - "print('TFX version: {}'.format(tfx.__version__))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "aDtLdSkvqPHe" - }, - "source": [ - "### 변수 설정하기\n", - "\n", - "파이프라인을 정의하는 데 사용되는 변수가 몇 가지 있습니다. 이러한 변수를 원하는 대로 사용자 정의할 수 있습니다. 기본적으로 파이프라인의 모든 출력은 현재 디렉터리 아래에 생성됩니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "EcUseqJaE2XN" - }, - "outputs": [], - "source": [ - "import os\n", - "\n", - "PIPELINE_NAME = \"penguin-transform\"\n", - "\n", - "# Output directory to store artifacts generated from the pipeline.\n", - "PIPELINE_ROOT = os.path.join('pipelines', PIPELINE_NAME)\n", - "# Path to a SQLite DB file to use as an MLMD storage.\n", - "METADATA_PATH = os.path.join('metadata', PIPELINE_NAME, 'metadata.db')\n", - "# Output directory where created models from the pipeline will be exported.\n", - "SERVING_MODEL_DIR = os.path.join('serving_model', PIPELINE_NAME)\n", - "\n", - "from absl import logging\n", - "logging.set_verbosity(logging.INFO) # Set default logging level." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "qsO0l5F3dzOr" - }, - "source": [ - "### 예제 데이터 준비하기\n", - "\n", - "TFX 파이프라인에서 사용할 예제 데이터세트를 다운로드합니다. 사용하는 데이터세트는 [Palmer Penguins 데이터세트](https://allisonhorst.github.io/palmerpenguins/articles/intro.html)입니다.\n", - "\n", - "다만 미리 전처리한 데이터세트를 사용한 이전 튜토리얼과는 달리 이번에는 **원시** Palmer Penguins 데이터세트를 사용합니다.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "11J7XiCq6AFP" - }, - "source": [ - "TFX ExampleGen 구성 요소는 디렉터리로부터 입력을 읽기 때문에 디렉터리를 생성한 후 데이터세트를 디렉터리에 복사해야 합니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "4fxMs6u86acP" - }, - "outputs": [], - "source": [ - "import urllib.request\n", - "import tempfile\n", - "\n", - "DATA_ROOT = tempfile.mkdtemp(prefix='tfx-data') # Create a temporary directory.\n", - "_data_path = 'https://storage.googleapis.com/download.tensorflow.org/data/palmer_penguins/penguins_size.csv'\n", - "_data_filepath = os.path.join(DATA_ROOT, \"data.csv\")\n", - "urllib.request.urlretrieve(_data_path, _data_filepath)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ASpoNmxKSQjI" - }, - "source": [ - "빠르게 원시 데이터의 형태를 살펴봅니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "-eSz28UDSnlG" - }, - "outputs": [], - "source": [ - "!head {_data_filepath}" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "OTtQNq1DdVvG" - }, - "source": [ - "`NA`로 표시되는 누락된 값이 있는 입력 항목이 있습니다. 이 튜토리얼에서는 해당 입력 항목만 삭제합니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "fQhpoaqff9ca" - }, - "outputs": [], - "source": [ - "!sed -i '/\\bNA\\b/d' {_data_filepath}\n", - "!head {_data_filepath}" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "z8EOfCy1dzO2" - }, - "source": [ - "펭귄을 묘사하는 7가지 특성을 볼 수 있어야 합니다. 이전 튜토리얼과 동일한 특성 세트('culmen_length_mm', 'culmen_depth_mm', 'flipper_length_mm', 'body_mass_g')를 사용하고 펭귄의 '종'을 예측할 것입니다.\n", - "\n", - "**유일한 차이점은 입력 데이터를 전처리하지 않는다는 것입니다.** 이 튜토리얼에서는 '섬' 또는 '성별'과 같은 다른 특성을 사용하지 않습니다." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Jtbrkjjc-IKA" - }, - "source": [ - "### 스키마 파일 준비하기\n", - "\n", - "[TFX 파이프라인 및 TensorFlow 데이터 검증을 사용한 데이터 검증](https://www.tensorflow.org/tfx/tutorials/tfx/penguin_tfdv)에 설명된 대로 데이터세트용 스키마 파일이 필요합니다. 데이터세트가 이전 튜토리얼과 다르기 때문에 다시 생성해야 합니다. 이 튜토리얼에서는 이러한 단계를 건너뛰고 준비된 스키마 파일만 사용합니다.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "EDoB97m8B9nG" - }, - "outputs": [], - "source": [ - "import shutil\n", - "\n", - "SCHEMA_PATH = 'schema'\n", - "\n", - "_schema_uri = 'https://raw.githubusercontent.com/tensorflow/tfx/master/tfx/examples/penguin/schema/raw/schema.pbtxt'\n", - "_schema_filename = 'schema.pbtxt'\n", - "_schema_filepath = os.path.join(SCHEMA_PATH, _schema_filename)\n", - "\n", - "os.makedirs(SCHEMA_PATH, exist_ok=True)\n", - "urllib.request.urlretrieve(_schema_uri, _schema_filepath)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "gKJ_HDJQB94b" - }, - "source": [ - "이 스키마 파일은 수동 변경한 사항이 없이 이전 튜토리얼과 동일한 파이프라인을 사용하여 생성되었습니다." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "nH6gizcpSwWV" - }, - "source": [ - "## 파이프라인 생성하기\n", - "\n", - "TFX 파이프라인은 Python API를 사용하여 정의합니다. [데이터 검증 튜토리얼](https://www.tensorflow.org/tfx/tutorials/tfx/penguin_tfdv)에서 생성한 파이프라인에 `Transform` 구성요소를 추가합니다.\n", - "\n", - "변환 구성 요소는 `ExampleGen` 구성 요소의 입력 데이터와 `SchemaGen` 구성 요소의 스키마를 필요로 하며 \"변환 그래프\"를 생성합니다. 출력 결과는 `Trainer` 구성 요소에서 사용합니다. 변환은 선택적으로 변환 후 구체화된 데이터인 \"변환된 데이터\"를 추가로 생성할 수 있습니다. 그러나 이 튜토리얼에서는 중간 변환 데이터를 구체화하지 않고 훈련 중에 데이터를 변환합니다.\n", - "\n", - "한 가지 주의할 점은 입력 데이터를 변환하는 방법을 설명하기 위해 Python 함수인 `preprocessing_fn`을 정의해야 한다는 것입니다. 이는 모델 정의를 위해 사용자 코드도 필요로 하는 Trainer 구성 요소와 유사합니다.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "lOjDv93eS5xV" - }, - "source": [ - "### 전처리 및 학습 코드 작성하기\n", - "\n", - "두 개의 Python 함수를 정의해야 합니다. 하나는 Transform이고 다른 하나는 Trainer입니다.\n", - "\n", - "#### preprocessing_fn\n", - "\n", - "Transform 구성 요소는 `Trainer` 구성 요소에서 수행한 작업과 같이 지정한 모듈 파일에서 `preprocessing_fn`이라는 함수를 찾습니다. Transform 구성 요소의 `preprocessing_fn` 매개변수를 사용하여 특정 함수를 지정할 수도 있습니다.\n", - "\n", - "이 예제에서는 두 종류의 변환을 수행합니다. `culmen_length_mm`과 `body_mass_g`와 같은 연속 숫자 특성의 경우 [tft.scale_to_z_score](https://www.tensorflow.org/tfx/transform/api_docs/python/tft/scale_to_z_score) 함수를 사용하여 이러한 값을 정규화합니다. 레이블 특성의 경우 문자열 레이블을 숫자 인덱스 값으로 변환해야 합니다. 변환에는 [`tf.lookup.StaticHashTable`](https://www.tensorflow.org/api_docs/python/tf/lookup/StaticHashTable)을 사용합니다.\n", - "\n", - "변환한 필드를 쉽게 식별하기 위해 변환한 특성 이름에 `_xf` 접미사를 추가합니다.\n", - "\n", - "#### run_fn\n", - "\n", - "모델 자체는 이전 튜토리얼과 거의 동일하지만 이번에는 Transform 구성 요소의 변환 그래프를 사용하여 입력 데이터를 변환합니다.\n", - "\n", - "이전 튜토리얼과 비교하여 한 가지 더 중요한 차이점은 이제는 모델의 계산 그래프뿐만 아니라 Transform 구성 요소에서 생성한 전처리용 변환 그래프를 포함하는 적용 모델도 내보낸다는 것입니다. 수신하는 요청을 적용하는 데 사용할 별도의 함수를 정의해야 합니다. 훈련 데이터와 적용 요청 모두에 동일한 함수 `_apply_preprocessing`이 사용되었음을 알 수 있습니다.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "aES7Hv5QTDK3" - }, - "outputs": [], - "source": [ - "_module_file = 'penguin_utils.py'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "Gnc67uQNTDfW" - }, - "outputs": [], - "source": [ - "%%writefile {_module_file}\n", - "\n", - "\n", - "from typing import List, Text\n", - "from absl import logging\n", - "import tensorflow as tf\n", - "from tensorflow import keras\n", - "from tensorflow_metadata.proto.v0 import schema_pb2\n", - "import tensorflow_transform as tft\n", - "from tensorflow_transform.tf_metadata import schema_utils\n", - "\n", - "from tfx import v1 as tfx\n", - "from tfx_bsl.public import tfxio\n", - "\n", - "# Specify features that we will use.\n", - "_FEATURE_KEYS = [\n", - " 'culmen_length_mm', 'culmen_depth_mm', 'flipper_length_mm', 'body_mass_g'\n", - "]\n", - "_LABEL_KEY = 'species'\n", - "\n", - "_TRAIN_BATCH_SIZE = 20\n", - "_EVAL_BATCH_SIZE = 10\n", - "\n", - "\n", - "# NEW: TFX Transform will call this function.\n", - "def preprocessing_fn(inputs):\n", - " \"\"\"tf.transform's callback function for preprocessing inputs.\n", - "\n", - " Args:\n", - " inputs: map from feature keys to raw not-yet-transformed features.\n", - "\n", - " Returns:\n", - " Map from string feature key to transformed feature.\n", - " \"\"\"\n", - " outputs = {}\n", - "\n", - " # Uses features defined in _FEATURE_KEYS only.\n", - " for key in _FEATURE_KEYS:\n", - " # tft.scale_to_z_score computes the mean and variance of the given feature\n", - " # and scales the output based on the result.\n", - " outputs[key] = tft.scale_to_z_score(inputs[key])\n", - "\n", - " # For the label column we provide the mapping from string to index.\n", - " # We could instead use `tft.compute_and_apply_vocabulary()` in order to\n", - " # compute the vocabulary dynamically and perform a lookup.\n", - " # Since in this example there are only 3 possible values, we use a hard-coded\n", - " # table for simplicity.\n", - " table_keys = ['Adelie', 'Chinstrap', 'Gentoo']\n", - " initializer = tf.lookup.KeyValueTensorInitializer(\n", - " keys=table_keys,\n", - " values=tf.cast(tf.range(len(table_keys)), tf.int64),\n", - " key_dtype=tf.string,\n", - " value_dtype=tf.int64)\n", - " table = tf.lookup.StaticHashTable(initializer, default_value=-1)\n", - " outputs[_LABEL_KEY] = table.lookup(inputs[_LABEL_KEY])\n", - "\n", - " return outputs\n", - "\n", - "\n", - "# NEW: This function will apply the same transform operation to training data\n", - "# and serving requests.\n", - "def _apply_preprocessing(raw_features, tft_layer):\n", - " transformed_features = tft_layer(raw_features)\n", - " if _LABEL_KEY in raw_features:\n", - " transformed_label = transformed_features.pop(_LABEL_KEY)\n", - " return transformed_features, transformed_label\n", - " else:\n", - " return transformed_features, None\n", - "\n", - "\n", - "# NEW: This function will create a handler function which gets a serialized\n", - "# tf.example, preprocess and run an inference with it.\n", - "def _get_serve_tf_examples_fn(model, tf_transform_output):\n", - " # We must save the tft_layer to the model to ensure its assets are kept and\n", - " # tracked.\n", - " model.tft_layer = tf_transform_output.transform_features_layer()\n", - "\n", - " @tf.function(input_signature=[\n", - " tf.TensorSpec(shape=[None], dtype=tf.string, name='examples')\n", - " ])\n", - " def serve_tf_examples_fn(serialized_tf_examples):\n", - " # Expected input is a string which is serialized tf.Example format.\n", - " feature_spec = tf_transform_output.raw_feature_spec()\n", - " # Because input schema includes unnecessary fields like 'species' and\n", - " # 'island', we filter feature_spec to include required keys only.\n", - " required_feature_spec = {\n", - " k: v for k, v in feature_spec.items() if k in _FEATURE_KEYS\n", - " }\n", - " parsed_features = tf.io.parse_example(serialized_tf_examples,\n", - " required_feature_spec)\n", - "\n", - " # Preprocess parsed input with transform operation defined in\n", - " # preprocessing_fn().\n", - " transformed_features, _ = _apply_preprocessing(parsed_features,\n", - " model.tft_layer)\n", - " # Run inference with ML model.\n", - " return model(transformed_features)\n", - "\n", - " return serve_tf_examples_fn\n", - "\n", - "\n", - "def _input_fn(file_pattern: List[Text],\n", - " data_accessor: tfx.components.DataAccessor,\n", - " tf_transform_output: tft.TFTransformOutput,\n", - " batch_size: int = 200) -> tf.data.Dataset:\n", - " \"\"\"Generates features and label for tuning/training.\n", - "\n", - " Args:\n", - " file_pattern: List of paths or patterns of input tfrecord files.\n", - " data_accessor: DataAccessor for converting input to RecordBatch.\n", - " tf_transform_output: A TFTransformOutput.\n", - " batch_size: representing the number of consecutive elements of returned\n", - " dataset to combine in a single batch\n", - "\n", - " Returns:\n", - " A dataset that contains (features, indices) tuple where features is a\n", - " dictionary of Tensors, and indices is a single Tensor of label indices.\n", - " \"\"\"\n", - " dataset = data_accessor.tf_dataset_factory(\n", - " file_pattern,\n", - " tfxio.TensorFlowDatasetOptions(batch_size=batch_size),\n", - " schema=tf_transform_output.raw_metadata.schema)\n", - "\n", - " transform_layer = tf_transform_output.transform_features_layer()\n", - " def apply_transform(raw_features):\n", - " return _apply_preprocessing(raw_features, transform_layer)\n", - "\n", - " return dataset.map(apply_transform).repeat()\n", - "\n", - "\n", - "def _build_keras_model() -> tf.keras.Model:\n", - " \"\"\"Creates a DNN Keras model for classifying penguin data.\n", - "\n", - " Returns:\n", - " A Keras Model.\n", - " \"\"\"\n", - " # The model below is built with Functional API, please refer to\n", - " # https://www.tensorflow.org/guide/keras/overview for all API options.\n", - " inputs = [\n", - " keras.layers.Input(shape=(1,), name=key)\n", - " for key in _FEATURE_KEYS\n", - " ]\n", - " d = keras.layers.concatenate(inputs)\n", - " for _ in range(2):\n", - " d = keras.layers.Dense(8, activation='relu')(d)\n", - " outputs = keras.layers.Dense(3)(d)\n", - "\n", - " model = keras.Model(inputs=inputs, outputs=outputs)\n", - " model.compile(\n", - " optimizer=keras.optimizers.Adam(1e-2),\n", - " loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n", - " metrics=[keras.metrics.SparseCategoricalAccuracy()])\n", - "\n", - " model.summary(print_fn=logging.info)\n", - " return model\n", - "\n", - "\n", - "# TFX Trainer will call this function.\n", - "def run_fn(fn_args: tfx.components.FnArgs):\n", - " \"\"\"Train the model based on given args.\n", - "\n", - " Args:\n", - " fn_args: Holds args used to train the model as name/value pairs.\n", - " \"\"\"\n", - " tf_transform_output = tft.TFTransformOutput(fn_args.transform_output)\n", - "\n", - " train_dataset = _input_fn(\n", - " fn_args.train_files,\n", - " fn_args.data_accessor,\n", - " tf_transform_output,\n", - " batch_size=_TRAIN_BATCH_SIZE)\n", - " eval_dataset = _input_fn(\n", - " fn_args.eval_files,\n", - " fn_args.data_accessor,\n", - " tf_transform_output,\n", - " batch_size=_EVAL_BATCH_SIZE)\n", - "\n", - " model = _build_keras_model()\n", - " model.fit(\n", - " train_dataset,\n", - " steps_per_epoch=fn_args.train_steps,\n", - " validation_data=eval_dataset,\n", - " validation_steps=fn_args.eval_steps)\n", - "\n", - " # NEW: Save a computation graph including transform layer.\n", - " signatures = {\n", - " 'serving_default': _get_serve_tf_examples_fn(model, tf_transform_output),\n", - " }\n", - " model.save(fn_args.serving_model_dir, save_format='tf', signatures=signatures)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "blaw0rs-emEf" - }, - "source": [ - "이제 TFX 파이프라인 구축에 필요한 모든 준비 단계를 완료했습니다." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "w3OkNz3gTLwM" - }, - "source": [ - "### 파이프라인 정의 작성하기\n", - "\n", - "TFX 파이프라인을 생성하는 함수를 정의합니다. `Pipeline` 객체는 TFX가 지원하는 파이프라인 오케스트레이션 시스템 중 하나를 사용하여 실행할 수 있는 TFX 파이프라인을 나타냅니다.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "M49yYVNBTPd4" - }, - "outputs": [], - "source": [ - "def _create_pipeline(pipeline_name: str, pipeline_root: str, data_root: str,\n", - " schema_path: str, module_file: str, serving_model_dir: str,\n", - " metadata_path: str) -> tfx.dsl.Pipeline:\n", - " \"\"\"Implements the penguin pipeline with TFX.\"\"\"\n", - " # Brings data into the pipeline or otherwise joins/converts training data.\n", - " example_gen = tfx.components.CsvExampleGen(input_base=data_root)\n", - "\n", - " # Computes statistics over data for visualization and example validation.\n", - " statistics_gen = tfx.components.StatisticsGen(\n", - " examples=example_gen.outputs['examples'])\n", - "\n", - " # Import the schema.\n", - " schema_importer = tfx.dsl.Importer(\n", - " source_uri=schema_path,\n", - " artifact_type=tfx.types.standard_artifacts.Schema).with_id(\n", - " 'schema_importer')\n", - "\n", - " # Performs anomaly detection based on statistics and data schema.\n", - " example_validator = tfx.components.ExampleValidator(\n", - " statistics=statistics_gen.outputs['statistics'],\n", - " schema=schema_importer.outputs['result'])\n", - "\n", - " # NEW: Transforms input data using preprocessing_fn in the 'module_file'.\n", - " transform = tfx.components.Transform(\n", - " examples=example_gen.outputs['examples'],\n", - " schema=schema_importer.outputs['result'],\n", - " materialize=False,\n", - " module_file=module_file)\n", - "\n", - " # Uses user-provided Python function that trains a model.\n", - " trainer = tfx.components.Trainer(\n", - " module_file=module_file,\n", - " examples=example_gen.outputs['examples'],\n", - "\n", - " # NEW: Pass transform_graph to the trainer.\n", - " transform_graph=transform.outputs['transform_graph'],\n", - "\n", - " train_args=tfx.proto.TrainArgs(num_steps=100),\n", - " eval_args=tfx.proto.EvalArgs(num_steps=5))\n", - "\n", - " # Pushes the model to a filesystem destination.\n", - " pusher = tfx.components.Pusher(\n", - " model=trainer.outputs['model'],\n", - " push_destination=tfx.proto.PushDestination(\n", - " filesystem=tfx.proto.PushDestination.Filesystem(\n", - " base_directory=serving_model_dir)))\n", - "\n", - " components = [\n", - " example_gen,\n", - " statistics_gen,\n", - " schema_importer,\n", - " example_validator,\n", - "\n", - " transform, # NEW: Transform component was added to the pipeline.\n", - "\n", - " trainer,\n", - " pusher,\n", - " ]\n", - "\n", - " return tfx.dsl.Pipeline(\n", - " pipeline_name=pipeline_name,\n", - " pipeline_root=pipeline_root,\n", - " metadata_connection_config=tfx.orchestration.metadata\n", - " .sqlite_metadata_connection_config(metadata_path),\n", - " components=components)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "mJbq07THU2GV" - }, - "source": [ - "## 파이프라인 실행하기\n", - "\n", - "이전 튜토리얼과 같이 `LocalDagRunner`를 사용합니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "fAtfOZTYWJu-" - }, - "outputs": [], - "source": [ - "tfx.orchestration.LocalDagRunner().run(\n", - " _create_pipeline(\n", - " pipeline_name=PIPELINE_NAME,\n", - " pipeline_root=PIPELINE_ROOT,\n", - " data_root=DATA_ROOT,\n", - " schema_path=SCHEMA_PATH,\n", - " module_file=_module_file,\n", - " serving_model_dir=SERVING_MODEL_DIR,\n", - " metadata_path=METADATA_PATH))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ppERq0Mj6xvW" - }, - "source": [ - "파이프라인이 성공적으로 완료되면 \"INFO:absl:Component Pusher is finished.\" 메시지가 표시됩니다.\n", - "\n", - "이전 단계에서 변수를 변경하지 않은 경우 푸셔 구성 요소는 훈련한 모델을 `serving_model/penguin-transform` 디렉터리인 `SERVING_MODEL_DIR`로 푸시합니다. Colab의 왼쪽 패널에서 혹은 다음 명령을 사용하여 파일 브라우저에서 결과를 볼 수 있습니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "NTHROkqX6yHx" - }, - "outputs": [], - "source": [ - "# List files in created model directory.\n", - "!find {SERVING_MODEL_DIR}" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "VTqM-WiZkPbt" - }, - "source": [ - "[`saved_model_cli` 도구](https://www.tensorflow.org/guide/saved_model#show_command)를 사용하여 생성한 모델의 서명을 확인할 수도 있습니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "YBfUzD_OkOq_" - }, - "outputs": [], - "source": [ - "!saved_model_cli show --dir {SERVING_MODEL_DIR}/$(ls -1 {SERVING_MODEL_DIR} | sort -nr | head -1) --tag_set serve --signature_def serving_default" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "DkAxFs_QszoZ" - }, - "source": [ - "자체 `serve_tf_examples_fn` 함수로 `serving_default`를 정의했기 때문에 서명이 단일 문자열을 사용하는 것으로 표시됩니다. 이 문자열은 tf.Examples의 직렬화된 문자열이며 앞에서 정의했듯이 [tf.io.parse_example()](https://www.tensorflow.org/api_docs/python/tf/io/parse_example) 함수를 사용하여 구문 분석됩니다(tf.Examples에 대한 자세한 내용은 [여기](https://www.tensorflow.org/tutorials/load_data/tfrecord)를 참조).\n", - "\n", - "내보내기를 수행한 모델을 로드하고 몇 개의 예제를 통해 추론을 일부 시도할 수 있습니다." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "Z1Yw5yYdvqKf" - }, - "outputs": [], - "source": [ - "# Find a model with the latest timestamp.\n", - "model_dirs = (item for item in os.scandir(SERVING_MODEL_DIR) if item.is_dir())\n", - "model_path = max(model_dirs, key=lambda i: int(i.name)).path\n", - "\n", - "loaded_model = tf.keras.models.load_model(model_path)\n", - "inference_fn = loaded_model.signatures['serving_default']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "xrOHIvnIv0-4" - }, - "outputs": [], - "source": [ - "# Prepare an example and run inference.\n", - "features = {\n", - " 'culmen_length_mm': tf.train.Feature(float_list=tf.train.FloatList(value=[49.9])),\n", - " 'culmen_depth_mm': tf.train.Feature(float_list=tf.train.FloatList(value=[16.1])),\n", - " 'flipper_length_mm': tf.train.Feature(int64_list=tf.train.Int64List(value=[213])),\n", - " 'body_mass_g': tf.train.Feature(int64_list=tf.train.Int64List(value=[5400])),\n", - "}\n", - "example_proto = tf.train.Example(features=tf.train.Features(feature=features))\n", - "examples = example_proto.SerializeToString()\n", - "\n", - "result = inference_fn(examples=tf.constant([examples]))\n", - "print(result['output_0'].numpy())" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "cri3mTgZ0SQ2" - }, - "source": [ - "'Gentoo'(젠투 펭귄) 종에 해당하는 세 번째 요소의 값이 셋 중에서 가장 클 것으로 예상됩니다." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "08R8qvweThRf" - }, - "source": [ - "## 다음 단계\n", - "\n", - "변환 구성 요소에 대해 자세히 알아보려면 [Transform 구성 요소 가이드](https://www.tensorflow.org/tfx/guide/transform)를 참조하세요. https://www.tensorflow.org/tfx/tutorials에서 더 많은 리소스를 확인할 수 있습니다.\n", - "\n", - "TFX의 다양한 개념에 대해 자세히 알아보려면 [TFX 파이프라인 이해하기](https://www.tensorflow.org/tfx/guide/understanding_tfx_pipelines)를 참조하세요.\n" - ] - } - ], - "metadata": { - "colab": { - "collapsed_sections": [ - "DjUA6S30k52h" - ], - "name": "penguin_transform.ipynb", - "toc_visible": true - }, - "kernelspec": { - "display_name": "Python 3", - "name": "python3" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} From a5654179b0be48d882d9075d10191ff25c4d1d44 Mon Sep 17 00:00:00 2001 From: ilyaspiridonov Date: Sun, 5 Nov 2023 10:39:54 +0300 Subject: [PATCH 4/5] minor updates KO --- site/ko/guide/dtensor_overview.ipynb | 133 +++++++++--- site/ko/tensorboard/image_summaries.ipynb | 48 +++-- .../tutorials/images/data_augmentation.ipynb | 196 +++++++++++++----- 3 files changed, 283 insertions(+), 94 deletions(-) diff --git a/site/ko/guide/dtensor_overview.ipynb b/site/ko/guide/dtensor_overview.ipynb index 44b39c15f6..61374bb6b0 100644 --- a/site/ko/guide/dtensor_overview.ipynb +++ b/site/ko/guide/dtensor_overview.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "tuOe1ymfHZPu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -88,7 +90,9 @@ "metadata": { "id": "OKaPw8vwwZAC" }, - "outputs": [], + "outputs": [ + + ], "source": [ "!pip install --quiet --upgrade --pre tensorflow" ] @@ -110,7 +114,9 @@ "metadata": { "id": "Q92lo0zjwej8" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import tensorflow as tf\n", "from tensorflow.experimental import dtensor\n", @@ -176,7 +182,9 @@ "metadata": { "id": "QLH5fgdBmA58" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mesh_1d = dtensor.create_mesh([('x', 6)], devices=DEVICES)\n", "print(mesh_1d)" @@ -199,7 +207,9 @@ "metadata": { "id": "op6TmKUQE-sZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mesh_2d = dtensor.create_mesh([('x', 3), ('y', 2)], devices=DEVICES)\n", "print(mesh_2d)" @@ -248,7 +258,9 @@ "metadata": { "id": "-a3EnmZag6x1" }, - "outputs": [], + "outputs": [ + + ], "source": [ "layout = dtensor.Layout([dtensor.UNSHARDED, dtensor.UNSHARDED], mesh_1d)" ] @@ -271,7 +283,9 @@ "metadata": { "id": "7BgqL0jUvV5a" }, - "outputs": [], + "outputs": [ + + ], "source": [ "layout = dtensor.Layout([dtensor.UNSHARDED, 'x'], mesh_1d)" ] @@ -291,6 +305,7 @@ "id": "Eyp_qOSyvieo" }, "source": [ + "\n", "\"메시 \n" ] }, @@ -300,7 +315,9 @@ "metadata": { "id": "p8OrehEuhPbS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "layout = dtensor.Layout(['y', 'x'], mesh_2d)" ] @@ -323,7 +340,9 @@ "metadata": { "id": "IkWe6mVl7uRb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "layout = dtensor.Layout([\"x\", dtensor.UNSHARDED], mesh_2d)" ] @@ -367,7 +386,9 @@ "metadata": { "id": "s6aws-b8dN9L" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def dtensor_from_array(arr, layout, shape=None, dtype=None):\n", " \"\"\"Convert a DTensor from something that looks like an array or Tensor.\n", @@ -410,7 +431,9 @@ "metadata": { "id": "mQu_nScGUvYH" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mesh = dtensor.create_mesh([(\"x\", 6)], devices=DEVICES)\n", "layout = dtensor.Layout([dtensor.UNSHARDED], mesh)\n", @@ -440,7 +463,9 @@ "metadata": { "id": "dCSFyaAjmzGu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(dtensor.fetch_layout(my_first_dtensor))\n", "assert layout == dtensor.fetch_layout(my_first_dtensor)" @@ -467,7 +492,9 @@ "metadata": { "id": "BGbjqVAOnXMk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for component_tensor in dtensor.unpack(my_first_dtensor):\n", " print(\"Device:\", component_tensor.device, \",\", component_tensor)" @@ -499,7 +526,9 @@ "metadata": { "id": "9lT-6qQwxOgf" }, - "outputs": [], + "outputs": [ + + ], "source": [ "packed_dtensor = dtensor.pack(\n", " [[0, 1], [0, 1], [0, 1],\n", @@ -528,7 +557,9 @@ "metadata": { "id": "KWb9Ae0VJ-Rc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mesh = dtensor.create_mesh([(\"x\", 3), (\"y\", 2)], devices=DEVICES)" ] @@ -553,7 +584,9 @@ "metadata": { "id": "ax_ZHouJp1MX" }, - "outputs": [], + "outputs": [ + + ], "source": [ "fully_sharded_dtensor = dtensor_from_array(\n", " tf.reshape(tf.range(6), (3, 2)),\n", @@ -583,7 +616,9 @@ "metadata": { "id": "xmyC6H6Ec90P" }, - "outputs": [], + "outputs": [ + + ], "source": [ "fully_replicated_dtensor = dtensor_from_array(\n", " tf.reshape(tf.range(6), (3, 2)),\n", @@ -620,7 +655,9 @@ "metadata": { "id": "DygnbkQ1Lu42" }, - "outputs": [], + "outputs": [ + + ], "source": [ "hybrid_sharded_dtensor = dtensor_from_array(\n", " tf.reshape(tf.range(6), (3, 2)),\n", @@ -658,7 +695,9 @@ "metadata": { "id": "hNdwmnL0jAXS" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(fully_replicated_dtensor.numpy())\n", "\n", @@ -734,7 +773,9 @@ "metadata": { "id": "TiZf2J9JNd2D" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mesh = dtensor.create_mesh([(\"x\", 6)], devices=DEVICES)\n", "layout = dtensor.Layout([dtensor.UNSHARDED, dtensor.UNSHARDED], mesh)\n", @@ -773,7 +814,9 @@ "metadata": { "id": "EyVAUvMePbms" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mesh = dtensor.create_mesh([(\"x\", 3), (\"y\", 2)], devices=DEVICES)\n", "a_layout = dtensor.Layout([dtensor.UNSHARDED, 'x'], mesh)\n", @@ -805,7 +848,9 @@ "metadata": { "id": "0PYqe0neiOpR" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mesh = dtensor.create_mesh([(\"x\", 3), (\"y\", 2)], devices=DEVICES)\n", "\n", @@ -843,7 +888,9 @@ "metadata": { "id": "J0jo_8NPtJiO" }, - "outputs": [], + "outputs": [ + + ], "source": [ "help(dtensor.call_with_layout)" ] @@ -876,7 +923,9 @@ "metadata": { "id": "G1CuKYSFtFeM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "help(tf.ones)" ] @@ -887,7 +936,9 @@ "metadata": { "id": "2m_EAwy-ozOh" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mesh = dtensor.create_mesh([(\"x\", 3), (\"y\", 2)], devices=DEVICES)\n", "ones = dtensor.call_with_layout(tf.ones, dtensor.Layout(['x', 'y'], mesh), shape=(6, 4))\n", @@ -911,7 +962,9 @@ "metadata": { "id": "H8BQSTRFtCih" }, - "outputs": [], + "outputs": [ + + ], "source": [ "help(tf.random.stateless_normal)" ] @@ -922,7 +975,9 @@ "metadata": { "id": "TvP81eYopSPm" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ones = dtensor.call_with_layout(\n", " tf.function(tf.random.stateless_normal),\n", @@ -947,7 +1002,9 @@ "metadata": { "id": "LbAtKrSkpOaq" }, - "outputs": [], + "outputs": [ + + ], "source": [ "ones = dtensor.call_with_layout(\n", " tf.function(tf.ones),\n", @@ -975,7 +1032,9 @@ "metadata": { "id": "awRPuR26P0Sc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "mesh = dtensor.create_mesh([(\"x\", 6)], devices=DEVICES)\n", "layout = dtensor.Layout([dtensor.UNSHARDED, dtensor.UNSHARDED], mesh)\n", @@ -1007,7 +1066,9 @@ "metadata": { "id": "adxFw9wJpqQQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "a = dtensor.call_with_layout(tf.ones, layout=layout, shape=(64, 32))\n", "b = v + a # add DVariable and DTensor\n", @@ -1029,7 +1090,9 @@ "metadata": { "id": "oYwfiyw5P94U" }, - "outputs": [], + "outputs": [ + + ], "source": [ "v.assign(a) # assign a DTensor to a DVariable\n", "print(a)" @@ -1050,7 +1113,9 @@ "metadata": { "id": "3pckUugYP_r-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# variable's layout is immutable.\n", "another_mesh = dtensor.create_mesh([(\"x\", 3), (\"y\", 2)], devices=DEVICES)\n", @@ -1077,7 +1142,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "dtensor_overview.ipynb", "toc_visible": true }, diff --git a/site/ko/tensorboard/image_summaries.ipynb b/site/ko/tensorboard/image_summaries.ipynb index a3dbd980c8..f71e32680d 100644 --- a/site/ko/tensorboard/image_summaries.ipynb +++ b/site/ko/tensorboard/image_summaries.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "su2RaORHpReL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -228,7 +230,9 @@ "metadata": { "id": "5yPh-7EWB8IK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Reshape the image for the Summary API.\n", "img = np.reshape(train_images[0], (-1, 28, 28, 1))" @@ -249,7 +253,9 @@ "metadata": { "id": "IJNpyVyxbVtT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Clear out any prior log data.\n", "!rm -rf logs\n", @@ -279,7 +285,9 @@ "metadata": { "id": "T_X-wIy-lD9f" }, - "outputs": [], + "outputs": [ + + ], "source": [ "%tensorboard --logdir logs/train_data" ] @@ -325,7 +333,9 @@ "metadata": { "id": "iHUjCXbetIpb" }, - "outputs": [], + "outputs": [ + + ], "source": [ "with file_writer.as_default():\n", " # Don't forget to reshape.\n", @@ -365,7 +375,9 @@ "metadata": { "id": "F5U_5WKt8bdQ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Clear out prior logging data.\n", "!rm -rf logs/plots\n", @@ -442,7 +454,9 @@ "metadata": { "id": "R74hPWJHzgvZ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = keras.models.Sequential([\n", " keras.layers.Flatten(input_shape=(28, 28)),\n", @@ -474,7 +488,9 @@ "metadata": { "id": "rBiXP8-UO8t6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def plot_confusion_matrix(cm, class_names):\n", " \"\"\"\n", @@ -530,7 +546,9 @@ "metadata": { "id": "utd-vH6hn5RY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Clear out prior logging data.\n", "!rm -rf logs/image\n", @@ -547,7 +565,9 @@ "metadata": { "id": "bXQ7-9CF0TPA" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def log_confusion_matrix(epoch, logs):\n", " # Use the model to predict the values from the validation dataset.\n", @@ -574,7 +594,9 @@ "metadata": { "id": "k6CV7dy-oJZu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Start TensorBoard.\n", "%tensorboard --logdir logs/image\n", @@ -621,7 +643,9 @@ ], "metadata": { "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "image_summaries.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/images/data_augmentation.ipynb b/site/ko/tutorials/images/data_augmentation.ipynb index e06ca45f87..88e73dae84 100644 --- a/site/ko/tutorials/images/data_augmentation.ipynb +++ b/site/ko/tutorials/images/data_augmentation.ipynb @@ -16,7 +16,9 @@ "cellView": "form", "id": "pkTRazeVRwDe" }, - "outputs": [], + "outputs": [ + + ], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -85,7 +87,9 @@ "metadata": { "id": "C2Q5rPenTAJP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", @@ -112,7 +116,9 @@ "metadata": { "id": "ytHhsYmO52zy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "(train_ds, val_ds, test_ds), metadata = tfds.load(\n", " 'tf_flowers',\n", @@ -137,7 +143,9 @@ "metadata": { "id": "wKwx7vQuspxz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "num_classes = metadata.features['label'].num_classes\n", "print(num_classes)" @@ -158,7 +166,9 @@ "metadata": { "id": "kXlx1lCr5Bip" }, - "outputs": [], + "outputs": [ + + ], "source": [ "get_label_name = metadata.features['label'].int2str\n", "\n", @@ -200,7 +210,9 @@ "metadata": { "id": "jMM3b85e3yhd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "IMG_SIZE = 180\n", "\n", @@ -234,7 +246,9 @@ "metadata": { "id": "X9OLuR1bC1Pd" }, - "outputs": [], + "outputs": [ + + ], "source": [ "result = resize_and_rescale(image)\n", "_ = plt.imshow(result)" @@ -255,7 +269,9 @@ "metadata": { "id": "DPTB8IQmSeKM" }, - "outputs": [], + "outputs": [ + + ], "source": [ "print(\"Min and max pixel values:\", result.numpy().min(), result.numpy().max())" ] @@ -293,7 +309,9 @@ "metadata": { "id": "Svu_5yfa_Jb7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "data_augmentation = tf.keras.Sequential([\n", " layers.RandomFlip(\"horizontal_and_vertical\"),\n", @@ -307,7 +325,9 @@ "metadata": { "id": "kfzEuaNg69iU" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Add the image to a batch.\n", "image = tf.cast(tf.expand_dims(image, 0), tf.float32)" @@ -319,7 +339,9 @@ "metadata": { "id": "eR4wwi5Q_UZK" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plt.figure(figsize=(10, 10))\n", "for i in range(9):\n", @@ -364,7 +386,9 @@ "metadata": { "id": "ULGJQjP6hHvu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = tf.keras.Sequential([\n", " # Add the preprocessing layers you created earlier.\n", @@ -413,7 +437,9 @@ "metadata": { "id": "r1Bt7w5VhVDY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "aug_ds = train_ds.map(\n", " lambda x, y: (resize_and_rescale(x, training=True), y))" @@ -473,7 +499,9 @@ "metadata": { "id": "R5fGVMqlFxF7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "batch_size = 32\n", "AUTOTUNE = tf.data.AUTOTUNE\n", @@ -504,7 +532,9 @@ "metadata": { "id": "N86SFGMBHcx-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_ds = prepare(train_ds, shuffle=True, augment=True)\n", "val_ds = prepare(val_ds)\n", @@ -530,7 +560,9 @@ "metadata": { "id": "IODSymGhq9N6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model = tf.keras.Sequential([\n", " layers.Conv2D(16, 3, padding='same', activation='relu'),\n", @@ -560,7 +592,9 @@ "metadata": { "id": "ZnRJr95WY68k" }, - "outputs": [], + "outputs": [ + + ], "source": [ "model.compile(optimizer='adam',\n", " loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n", @@ -582,7 +616,9 @@ "metadata": { "id": "i_sDl9uZY9Mh" }, - "outputs": [], + "outputs": [ + + ], "source": [ "epochs=5\n", "history = model.fit(\n", @@ -598,7 +634,9 @@ "metadata": { "id": "V9PSf4qgiQJG" }, - "outputs": [], + "outputs": [ + + ], "source": [ "loss, acc = model.evaluate(test_ds)\n", "print(\"Accuracy\", acc)" @@ -628,7 +666,9 @@ "metadata": { "id": "nMxEhIVXmAH0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def random_invert_img(x, p=0.5):\n", " if tf.random.uniform([]) < p:\n", @@ -644,7 +684,9 @@ "metadata": { "id": "C0huNpxdmDKu" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def random_invert(factor=0.5):\n", " return layers.Lambda(lambda x: random_invert_img(x, factor))\n", @@ -658,7 +700,9 @@ "metadata": { "id": "wAcOluP0TNG6" }, - "outputs": [], + "outputs": [ + + ], "source": [ "plt.figure(figsize=(10, 10))\n", "for i in range(9):\n", @@ -683,7 +727,9 @@ "metadata": { "id": "d11eExc-Ke-7" }, - "outputs": [], + "outputs": [ + + ], "source": [ "class RandomInvert(layers.Layer):\n", " def __init__(self, factor=0.5, **kwargs):\n", @@ -700,7 +746,9 @@ "metadata": { "id": "qX-VQgkRL6fc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "_ = plt.imshow(RandomInvert()(image)[0])" ] @@ -747,7 +795,9 @@ "metadata": { "id": "JB-lAS0z9ZJY" }, - "outputs": [], + "outputs": [ + + ], "source": [ "(train_ds, val_ds, test_ds), metadata = tfds.load(\n", " 'tf_flowers',\n", @@ -772,7 +822,9 @@ "metadata": { "id": "dDsPaAi8de_j" }, - "outputs": [], + "outputs": [ + + ], "source": [ "image, label = next(iter(train_ds))\n", "_ = plt.imshow(image)\n", @@ -794,7 +846,9 @@ "metadata": { "id": "sN1ykjJCHikc" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def visualize(original, augmented):\n", " fig = plt.figure()\n", @@ -833,7 +887,9 @@ "metadata": { "id": "1ZjVI24nIH0S" }, - "outputs": [], + "outputs": [ + + ], "source": [ "flipped = tf.image.flip_left_right(image)\n", "visualize(image, flipped)" @@ -856,7 +912,9 @@ "metadata": { "id": "ikaMj0guIRtL" }, - "outputs": [], + "outputs": [ + + ], "source": [ "grayscaled = tf.image.rgb_to_grayscale(image)\n", "visualize(image, tf.squeeze(grayscaled))\n", @@ -880,7 +938,9 @@ "metadata": { "id": "PHz-NosiInmz" }, - "outputs": [], + "outputs": [ + + ], "source": [ "saturated = tf.image.adjust_saturation(image, 3)\n", "visualize(image, saturated)" @@ -903,7 +963,9 @@ "metadata": { "id": "1hdG-j46I0nJ" }, - "outputs": [], + "outputs": [ + + ], "source": [ "bright = tf.image.adjust_brightness(image, 0.4)\n", "visualize(image, bright)" @@ -926,7 +988,9 @@ "metadata": { "id": "RWkK5GFHJUKT" }, - "outputs": [], + "outputs": [ + + ], "source": [ "cropped = tf.image.central_crop(image, central_fraction=0.5)\n", "visualize(image, cropped)" @@ -949,7 +1013,9 @@ "metadata": { "id": "b19KuAhkJKR-" }, - "outputs": [], + "outputs": [ + + ], "source": [ "rotated = tf.image.rot90(image)\n", "visualize(image, rotated)" @@ -1003,7 +1069,9 @@ "metadata": { "id": "-fFd1kh7Fr-_" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for i in range(3):\n", " seed = (i, 0) # tuple of size (2,)\n", @@ -1029,7 +1097,9 @@ "metadata": { "id": "GmcYoQHaUoke" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for i in range(3):\n", " seed = (i, 0) # tuple of size (2,)\n", @@ -1055,7 +1125,9 @@ "metadata": { "id": "vtZQbUw0VOm5" }, - "outputs": [], + "outputs": [ + + ], "source": [ "for i in range(3):\n", " seed = (i, 0) # tuple of size (2,)\n", @@ -1081,7 +1153,9 @@ "metadata": { "id": "xC80NQP809Uo" }, - "outputs": [], + "outputs": [ + + ], "source": [ "(train_datasets, val_ds, test_ds), metadata = tfds.load(\n", " 'tf_flowers',\n", @@ -1106,7 +1180,9 @@ "metadata": { "id": "1JKmx06lfcFr" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def resize_and_rescale(image, label):\n", " image = tf.cast(image, tf.float32)\n", @@ -1130,7 +1206,9 @@ "metadata": { "id": "KitLdvlpVxPa" }, - "outputs": [], + "outputs": [ + + ], "source": [ "def augment(image_label, seed):\n", " image, label = image_label\n", @@ -1165,7 +1243,9 @@ "metadata": { "id": "SZ6Qq0IWznfi" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Create a `Counter` object and `Dataset.zip` it together with the training set.\n", "counter = tf.data.experimental.Counter()\n", @@ -1187,7 +1267,9 @@ "metadata": { "id": "wQK9BDKk1_3N" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_ds = (\n", " train_ds\n", @@ -1204,7 +1286,9 @@ "metadata": { "id": "3AQoyA-k3ELk" }, - "outputs": [], + "outputs": [ + + ], "source": [ "val_ds = (\n", " val_ds\n", @@ -1220,7 +1304,9 @@ "metadata": { "id": "p2IQN3NN3G_M" }, - "outputs": [], + "outputs": [ + + ], "source": [ "test_ds = (\n", " test_ds\n", @@ -1250,7 +1336,9 @@ "metadata": { "id": "BQDvedZ33eAy" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Create a generator.\n", "rng = tf.random.Generator.from_seed(123, alg='philox')" @@ -1262,7 +1350,9 @@ "metadata": { "id": "eDEkO1nt2ta0" }, - "outputs": [], + "outputs": [ + + ], "source": [ "# Create a wrapper function for updating seeds.\n", "def f(x, y):\n", @@ -1286,7 +1376,9 @@ "metadata": { "id": "Pu2uB7k12xKw" }, - "outputs": [], + "outputs": [ + + ], "source": [ "train_ds = (\n", " train_datasets\n", @@ -1303,7 +1395,9 @@ "metadata": { "id": "e6caldPi2HAP" }, - "outputs": [], + "outputs": [ + + ], "source": [ "val_ds = (\n", " val_ds\n", @@ -1319,7 +1413,9 @@ "metadata": { "id": "ceaCdJnh2I-r" }, - "outputs": [], + "outputs": [ + + ], "source": [ "test_ds = (\n", " test_ds\n", @@ -1357,7 +1453,9 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], + "collapsed_sections": [ + + ], "name": "data_augmentation.ipynb", "toc_visible": true }, From 03623c2f4e711bdad908087f50a186f00768a532 Mon Sep 17 00:00:00 2001 From: ilyaspiridonov Date: Wed, 8 Nov 2023 20:54:20 +0300 Subject: [PATCH 5/5] nbfmt nblint --- site/ko/guide/dtensor_overview.ipynb | 133 +++--------- site/ko/tensorboard/image_summaries.ipynb | 48 ++--- .../tutorials/images/data_augmentation.ipynb | 196 +++++------------- 3 files changed, 94 insertions(+), 283 deletions(-) diff --git a/site/ko/guide/dtensor_overview.ipynb b/site/ko/guide/dtensor_overview.ipynb index 61374bb6b0..44b39c15f6 100644 --- a/site/ko/guide/dtensor_overview.ipynb +++ b/site/ko/guide/dtensor_overview.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "tuOe1ymfHZPu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -90,9 +88,7 @@ "metadata": { "id": "OKaPw8vwwZAC" }, - "outputs": [ - - ], + "outputs": [], "source": [ "!pip install --quiet --upgrade --pre tensorflow" ] @@ -114,9 +110,7 @@ "metadata": { "id": "Q92lo0zjwej8" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "from tensorflow.experimental import dtensor\n", @@ -182,9 +176,7 @@ "metadata": { "id": "QLH5fgdBmA58" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mesh_1d = dtensor.create_mesh([('x', 6)], devices=DEVICES)\n", "print(mesh_1d)" @@ -207,9 +199,7 @@ "metadata": { "id": "op6TmKUQE-sZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mesh_2d = dtensor.create_mesh([('x', 3), ('y', 2)], devices=DEVICES)\n", "print(mesh_2d)" @@ -258,9 +248,7 @@ "metadata": { "id": "-a3EnmZag6x1" }, - "outputs": [ - - ], + "outputs": [], "source": [ "layout = dtensor.Layout([dtensor.UNSHARDED, dtensor.UNSHARDED], mesh_1d)" ] @@ -283,9 +271,7 @@ "metadata": { "id": "7BgqL0jUvV5a" }, - "outputs": [ - - ], + "outputs": [], "source": [ "layout = dtensor.Layout([dtensor.UNSHARDED, 'x'], mesh_1d)" ] @@ -305,7 +291,6 @@ "id": "Eyp_qOSyvieo" }, "source": [ - "\n", "\"메시 \n" ] }, @@ -315,9 +300,7 @@ "metadata": { "id": "p8OrehEuhPbS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "layout = dtensor.Layout(['y', 'x'], mesh_2d)" ] @@ -340,9 +323,7 @@ "metadata": { "id": "IkWe6mVl7uRb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "layout = dtensor.Layout([\"x\", dtensor.UNSHARDED], mesh_2d)" ] @@ -386,9 +367,7 @@ "metadata": { "id": "s6aws-b8dN9L" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def dtensor_from_array(arr, layout, shape=None, dtype=None):\n", " \"\"\"Convert a DTensor from something that looks like an array or Tensor.\n", @@ -431,9 +410,7 @@ "metadata": { "id": "mQu_nScGUvYH" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mesh = dtensor.create_mesh([(\"x\", 6)], devices=DEVICES)\n", "layout = dtensor.Layout([dtensor.UNSHARDED], mesh)\n", @@ -463,9 +440,7 @@ "metadata": { "id": "dCSFyaAjmzGu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(dtensor.fetch_layout(my_first_dtensor))\n", "assert layout == dtensor.fetch_layout(my_first_dtensor)" @@ -492,9 +467,7 @@ "metadata": { "id": "BGbjqVAOnXMk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for component_tensor in dtensor.unpack(my_first_dtensor):\n", " print(\"Device:\", component_tensor.device, \",\", component_tensor)" @@ -526,9 +499,7 @@ "metadata": { "id": "9lT-6qQwxOgf" }, - "outputs": [ - - ], + "outputs": [], "source": [ "packed_dtensor = dtensor.pack(\n", " [[0, 1], [0, 1], [0, 1],\n", @@ -557,9 +528,7 @@ "metadata": { "id": "KWb9Ae0VJ-Rc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mesh = dtensor.create_mesh([(\"x\", 3), (\"y\", 2)], devices=DEVICES)" ] @@ -584,9 +553,7 @@ "metadata": { "id": "ax_ZHouJp1MX" }, - "outputs": [ - - ], + "outputs": [], "source": [ "fully_sharded_dtensor = dtensor_from_array(\n", " tf.reshape(tf.range(6), (3, 2)),\n", @@ -616,9 +583,7 @@ "metadata": { "id": "xmyC6H6Ec90P" }, - "outputs": [ - - ], + "outputs": [], "source": [ "fully_replicated_dtensor = dtensor_from_array(\n", " tf.reshape(tf.range(6), (3, 2)),\n", @@ -655,9 +620,7 @@ "metadata": { "id": "DygnbkQ1Lu42" }, - "outputs": [ - - ], + "outputs": [], "source": [ "hybrid_sharded_dtensor = dtensor_from_array(\n", " tf.reshape(tf.range(6), (3, 2)),\n", @@ -695,9 +658,7 @@ "metadata": { "id": "hNdwmnL0jAXS" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(fully_replicated_dtensor.numpy())\n", "\n", @@ -773,9 +734,7 @@ "metadata": { "id": "TiZf2J9JNd2D" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mesh = dtensor.create_mesh([(\"x\", 6)], devices=DEVICES)\n", "layout = dtensor.Layout([dtensor.UNSHARDED, dtensor.UNSHARDED], mesh)\n", @@ -814,9 +773,7 @@ "metadata": { "id": "EyVAUvMePbms" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mesh = dtensor.create_mesh([(\"x\", 3), (\"y\", 2)], devices=DEVICES)\n", "a_layout = dtensor.Layout([dtensor.UNSHARDED, 'x'], mesh)\n", @@ -848,9 +805,7 @@ "metadata": { "id": "0PYqe0neiOpR" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mesh = dtensor.create_mesh([(\"x\", 3), (\"y\", 2)], devices=DEVICES)\n", "\n", @@ -888,9 +843,7 @@ "metadata": { "id": "J0jo_8NPtJiO" }, - "outputs": [ - - ], + "outputs": [], "source": [ "help(dtensor.call_with_layout)" ] @@ -923,9 +876,7 @@ "metadata": { "id": "G1CuKYSFtFeM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "help(tf.ones)" ] @@ -936,9 +887,7 @@ "metadata": { "id": "2m_EAwy-ozOh" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mesh = dtensor.create_mesh([(\"x\", 3), (\"y\", 2)], devices=DEVICES)\n", "ones = dtensor.call_with_layout(tf.ones, dtensor.Layout(['x', 'y'], mesh), shape=(6, 4))\n", @@ -962,9 +911,7 @@ "metadata": { "id": "H8BQSTRFtCih" }, - "outputs": [ - - ], + "outputs": [], "source": [ "help(tf.random.stateless_normal)" ] @@ -975,9 +922,7 @@ "metadata": { "id": "TvP81eYopSPm" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ones = dtensor.call_with_layout(\n", " tf.function(tf.random.stateless_normal),\n", @@ -1002,9 +947,7 @@ "metadata": { "id": "LbAtKrSkpOaq" }, - "outputs": [ - - ], + "outputs": [], "source": [ "ones = dtensor.call_with_layout(\n", " tf.function(tf.ones),\n", @@ -1032,9 +975,7 @@ "metadata": { "id": "awRPuR26P0Sc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "mesh = dtensor.create_mesh([(\"x\", 6)], devices=DEVICES)\n", "layout = dtensor.Layout([dtensor.UNSHARDED, dtensor.UNSHARDED], mesh)\n", @@ -1066,9 +1007,7 @@ "metadata": { "id": "adxFw9wJpqQQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "a = dtensor.call_with_layout(tf.ones, layout=layout, shape=(64, 32))\n", "b = v + a # add DVariable and DTensor\n", @@ -1090,9 +1029,7 @@ "metadata": { "id": "oYwfiyw5P94U" }, - "outputs": [ - - ], + "outputs": [], "source": [ "v.assign(a) # assign a DTensor to a DVariable\n", "print(a)" @@ -1113,9 +1050,7 @@ "metadata": { "id": "3pckUugYP_r-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# variable's layout is immutable.\n", "another_mesh = dtensor.create_mesh([(\"x\", 3), (\"y\", 2)], devices=DEVICES)\n", @@ -1142,9 +1077,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "dtensor_overview.ipynb", "toc_visible": true }, diff --git a/site/ko/tensorboard/image_summaries.ipynb b/site/ko/tensorboard/image_summaries.ipynb index f71e32680d..a3dbd980c8 100644 --- a/site/ko/tensorboard/image_summaries.ipynb +++ b/site/ko/tensorboard/image_summaries.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "su2RaORHpReL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -230,9 +228,7 @@ "metadata": { "id": "5yPh-7EWB8IK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Reshape the image for the Summary API.\n", "img = np.reshape(train_images[0], (-1, 28, 28, 1))" @@ -253,9 +249,7 @@ "metadata": { "id": "IJNpyVyxbVtT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Clear out any prior log data.\n", "!rm -rf logs\n", @@ -285,9 +279,7 @@ "metadata": { "id": "T_X-wIy-lD9f" }, - "outputs": [ - - ], + "outputs": [], "source": [ "%tensorboard --logdir logs/train_data" ] @@ -333,9 +325,7 @@ "metadata": { "id": "iHUjCXbetIpb" }, - "outputs": [ - - ], + "outputs": [], "source": [ "with file_writer.as_default():\n", " # Don't forget to reshape.\n", @@ -375,9 +365,7 @@ "metadata": { "id": "F5U_5WKt8bdQ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Clear out prior logging data.\n", "!rm -rf logs/plots\n", @@ -454,9 +442,7 @@ "metadata": { "id": "R74hPWJHzgvZ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = keras.models.Sequential([\n", " keras.layers.Flatten(input_shape=(28, 28)),\n", @@ -488,9 +474,7 @@ "metadata": { "id": "rBiXP8-UO8t6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def plot_confusion_matrix(cm, class_names):\n", " \"\"\"\n", @@ -546,9 +530,7 @@ "metadata": { "id": "utd-vH6hn5RY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Clear out prior logging data.\n", "!rm -rf logs/image\n", @@ -565,9 +547,7 @@ "metadata": { "id": "bXQ7-9CF0TPA" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def log_confusion_matrix(epoch, logs):\n", " # Use the model to predict the values from the validation dataset.\n", @@ -594,9 +574,7 @@ "metadata": { "id": "k6CV7dy-oJZu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Start TensorBoard.\n", "%tensorboard --logdir logs/image\n", @@ -643,9 +621,7 @@ ], "metadata": { "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "image_summaries.ipynb", "toc_visible": true }, diff --git a/site/ko/tutorials/images/data_augmentation.ipynb b/site/ko/tutorials/images/data_augmentation.ipynb index 88e73dae84..e06ca45f87 100644 --- a/site/ko/tutorials/images/data_augmentation.ipynb +++ b/site/ko/tutorials/images/data_augmentation.ipynb @@ -16,9 +16,7 @@ "cellView": "form", "id": "pkTRazeVRwDe" }, - "outputs": [ - - ], + "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -87,9 +85,7 @@ "metadata": { "id": "C2Q5rPenTAJP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", @@ -116,9 +112,7 @@ "metadata": { "id": "ytHhsYmO52zy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "(train_ds, val_ds, test_ds), metadata = tfds.load(\n", " 'tf_flowers',\n", @@ -143,9 +137,7 @@ "metadata": { "id": "wKwx7vQuspxz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "num_classes = metadata.features['label'].num_classes\n", "print(num_classes)" @@ -166,9 +158,7 @@ "metadata": { "id": "kXlx1lCr5Bip" }, - "outputs": [ - - ], + "outputs": [], "source": [ "get_label_name = metadata.features['label'].int2str\n", "\n", @@ -210,9 +200,7 @@ "metadata": { "id": "jMM3b85e3yhd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "IMG_SIZE = 180\n", "\n", @@ -246,9 +234,7 @@ "metadata": { "id": "X9OLuR1bC1Pd" }, - "outputs": [ - - ], + "outputs": [], "source": [ "result = resize_and_rescale(image)\n", "_ = plt.imshow(result)" @@ -269,9 +255,7 @@ "metadata": { "id": "DPTB8IQmSeKM" }, - "outputs": [ - - ], + "outputs": [], "source": [ "print(\"Min and max pixel values:\", result.numpy().min(), result.numpy().max())" ] @@ -309,9 +293,7 @@ "metadata": { "id": "Svu_5yfa_Jb7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "data_augmentation = tf.keras.Sequential([\n", " layers.RandomFlip(\"horizontal_and_vertical\"),\n", @@ -325,9 +307,7 @@ "metadata": { "id": "kfzEuaNg69iU" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Add the image to a batch.\n", "image = tf.cast(tf.expand_dims(image, 0), tf.float32)" @@ -339,9 +319,7 @@ "metadata": { "id": "eR4wwi5Q_UZK" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plt.figure(figsize=(10, 10))\n", "for i in range(9):\n", @@ -386,9 +364,7 @@ "metadata": { "id": "ULGJQjP6hHvu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = tf.keras.Sequential([\n", " # Add the preprocessing layers you created earlier.\n", @@ -437,9 +413,7 @@ "metadata": { "id": "r1Bt7w5VhVDY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "aug_ds = train_ds.map(\n", " lambda x, y: (resize_and_rescale(x, training=True), y))" @@ -499,9 +473,7 @@ "metadata": { "id": "R5fGVMqlFxF7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "batch_size = 32\n", "AUTOTUNE = tf.data.AUTOTUNE\n", @@ -532,9 +504,7 @@ "metadata": { "id": "N86SFGMBHcx-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_ds = prepare(train_ds, shuffle=True, augment=True)\n", "val_ds = prepare(val_ds)\n", @@ -560,9 +530,7 @@ "metadata": { "id": "IODSymGhq9N6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model = tf.keras.Sequential([\n", " layers.Conv2D(16, 3, padding='same', activation='relu'),\n", @@ -592,9 +560,7 @@ "metadata": { "id": "ZnRJr95WY68k" }, - "outputs": [ - - ], + "outputs": [], "source": [ "model.compile(optimizer='adam',\n", " loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n", @@ -616,9 +582,7 @@ "metadata": { "id": "i_sDl9uZY9Mh" }, - "outputs": [ - - ], + "outputs": [], "source": [ "epochs=5\n", "history = model.fit(\n", @@ -634,9 +598,7 @@ "metadata": { "id": "V9PSf4qgiQJG" }, - "outputs": [ - - ], + "outputs": [], "source": [ "loss, acc = model.evaluate(test_ds)\n", "print(\"Accuracy\", acc)" @@ -666,9 +628,7 @@ "metadata": { "id": "nMxEhIVXmAH0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def random_invert_img(x, p=0.5):\n", " if tf.random.uniform([]) < p:\n", @@ -684,9 +644,7 @@ "metadata": { "id": "C0huNpxdmDKu" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def random_invert(factor=0.5):\n", " return layers.Lambda(lambda x: random_invert_img(x, factor))\n", @@ -700,9 +658,7 @@ "metadata": { "id": "wAcOluP0TNG6" }, - "outputs": [ - - ], + "outputs": [], "source": [ "plt.figure(figsize=(10, 10))\n", "for i in range(9):\n", @@ -727,9 +683,7 @@ "metadata": { "id": "d11eExc-Ke-7" }, - "outputs": [ - - ], + "outputs": [], "source": [ "class RandomInvert(layers.Layer):\n", " def __init__(self, factor=0.5, **kwargs):\n", @@ -746,9 +700,7 @@ "metadata": { "id": "qX-VQgkRL6fc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "_ = plt.imshow(RandomInvert()(image)[0])" ] @@ -795,9 +747,7 @@ "metadata": { "id": "JB-lAS0z9ZJY" }, - "outputs": [ - - ], + "outputs": [], "source": [ "(train_ds, val_ds, test_ds), metadata = tfds.load(\n", " 'tf_flowers',\n", @@ -822,9 +772,7 @@ "metadata": { "id": "dDsPaAi8de_j" }, - "outputs": [ - - ], + "outputs": [], "source": [ "image, label = next(iter(train_ds))\n", "_ = plt.imshow(image)\n", @@ -846,9 +794,7 @@ "metadata": { "id": "sN1ykjJCHikc" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def visualize(original, augmented):\n", " fig = plt.figure()\n", @@ -887,9 +833,7 @@ "metadata": { "id": "1ZjVI24nIH0S" }, - "outputs": [ - - ], + "outputs": [], "source": [ "flipped = tf.image.flip_left_right(image)\n", "visualize(image, flipped)" @@ -912,9 +856,7 @@ "metadata": { "id": "ikaMj0guIRtL" }, - "outputs": [ - - ], + "outputs": [], "source": [ "grayscaled = tf.image.rgb_to_grayscale(image)\n", "visualize(image, tf.squeeze(grayscaled))\n", @@ -938,9 +880,7 @@ "metadata": { "id": "PHz-NosiInmz" }, - "outputs": [ - - ], + "outputs": [], "source": [ "saturated = tf.image.adjust_saturation(image, 3)\n", "visualize(image, saturated)" @@ -963,9 +903,7 @@ "metadata": { "id": "1hdG-j46I0nJ" }, - "outputs": [ - - ], + "outputs": [], "source": [ "bright = tf.image.adjust_brightness(image, 0.4)\n", "visualize(image, bright)" @@ -988,9 +926,7 @@ "metadata": { "id": "RWkK5GFHJUKT" }, - "outputs": [ - - ], + "outputs": [], "source": [ "cropped = tf.image.central_crop(image, central_fraction=0.5)\n", "visualize(image, cropped)" @@ -1013,9 +949,7 @@ "metadata": { "id": "b19KuAhkJKR-" }, - "outputs": [ - - ], + "outputs": [], "source": [ "rotated = tf.image.rot90(image)\n", "visualize(image, rotated)" @@ -1069,9 +1003,7 @@ "metadata": { "id": "-fFd1kh7Fr-_" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for i in range(3):\n", " seed = (i, 0) # tuple of size (2,)\n", @@ -1097,9 +1029,7 @@ "metadata": { "id": "GmcYoQHaUoke" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for i in range(3):\n", " seed = (i, 0) # tuple of size (2,)\n", @@ -1125,9 +1055,7 @@ "metadata": { "id": "vtZQbUw0VOm5" }, - "outputs": [ - - ], + "outputs": [], "source": [ "for i in range(3):\n", " seed = (i, 0) # tuple of size (2,)\n", @@ -1153,9 +1081,7 @@ "metadata": { "id": "xC80NQP809Uo" }, - "outputs": [ - - ], + "outputs": [], "source": [ "(train_datasets, val_ds, test_ds), metadata = tfds.load(\n", " 'tf_flowers',\n", @@ -1180,9 +1106,7 @@ "metadata": { "id": "1JKmx06lfcFr" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def resize_and_rescale(image, label):\n", " image = tf.cast(image, tf.float32)\n", @@ -1206,9 +1130,7 @@ "metadata": { "id": "KitLdvlpVxPa" }, - "outputs": [ - - ], + "outputs": [], "source": [ "def augment(image_label, seed):\n", " image, label = image_label\n", @@ -1243,9 +1165,7 @@ "metadata": { "id": "SZ6Qq0IWznfi" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Create a `Counter` object and `Dataset.zip` it together with the training set.\n", "counter = tf.data.experimental.Counter()\n", @@ -1267,9 +1187,7 @@ "metadata": { "id": "wQK9BDKk1_3N" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_ds = (\n", " train_ds\n", @@ -1286,9 +1204,7 @@ "metadata": { "id": "3AQoyA-k3ELk" }, - "outputs": [ - - ], + "outputs": [], "source": [ "val_ds = (\n", " val_ds\n", @@ -1304,9 +1220,7 @@ "metadata": { "id": "p2IQN3NN3G_M" }, - "outputs": [ - - ], + "outputs": [], "source": [ "test_ds = (\n", " test_ds\n", @@ -1336,9 +1250,7 @@ "metadata": { "id": "BQDvedZ33eAy" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Create a generator.\n", "rng = tf.random.Generator.from_seed(123, alg='philox')" @@ -1350,9 +1262,7 @@ "metadata": { "id": "eDEkO1nt2ta0" }, - "outputs": [ - - ], + "outputs": [], "source": [ "# Create a wrapper function for updating seeds.\n", "def f(x, y):\n", @@ -1376,9 +1286,7 @@ "metadata": { "id": "Pu2uB7k12xKw" }, - "outputs": [ - - ], + "outputs": [], "source": [ "train_ds = (\n", " train_datasets\n", @@ -1395,9 +1303,7 @@ "metadata": { "id": "e6caldPi2HAP" }, - "outputs": [ - - ], + "outputs": [], "source": [ "val_ds = (\n", " val_ds\n", @@ -1413,9 +1319,7 @@ "metadata": { "id": "ceaCdJnh2I-r" }, - "outputs": [ - - ], + "outputs": [], "source": [ "test_ds = (\n", " test_ds\n", @@ -1453,9 +1357,7 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [ - - ], + "collapsed_sections": [], "name": "data_augmentation.ipynb", "toc_visible": true },