From 73b8760930bb875fc89c4b3257278771d4554d77 Mon Sep 17 00:00:00 2001 From: Haesun Park Date: Mon, 2 Aug 2021 12:34:33 +0900 Subject: [PATCH] =?UTF-8?q?=EB=85=B8=ED=8A=B8=EB=B6=81=20=EB=B2=88?= =?UTF-8?q?=EC=97=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 14_deep_computer_vision_with_cnns.ipynb | 166 ++++++++++++------------ 1 file changed, 85 insertions(+), 81 deletions(-) diff --git a/14_deep_computer_vision_with_cnns.ipynb b/14_deep_computer_vision_with_cnns.ipynb index 3e4f3954f..e41a9b41e 100644 --- a/14_deep_computer_vision_with_cnns.ipynb +++ b/14_deep_computer_vision_with_cnns.ipynb @@ -4,14 +4,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Chapter 14 – Deep Computer Vision Using Convolutional Neural Networks**" + "**14장 – 합성곱 신경망을 사용한 컴퓨터 비전**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "_This notebook contains all the sample code in chapter 14._" + "_이 노트북은 14장에 있는 모든 샘플 코드와 연습문제 해답을 가지고 있습니다._" ] }, { @@ -20,7 +20,7 @@ "source": [ "\n", " \n", "
\n", - " Run in Google Colab\n", + " 구글 코랩에서 실행하기\n", "
" ] @@ -29,14 +29,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Setup" + "# 설정" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "First, let's import a few common modules, ensure MatplotLib plots figures inline and prepare a function to save the figures. We also check that Python 3.5 or later is installed (although Python 2.x may work, it is deprecated so we strongly recommend you use Python 3 instead), as well as Scikit-Learn ≥0.20 and TensorFlow ≥2.0." + "먼저 몇 개의 모듈을 임포트합니다. 맷플롯립 그래프를 인라인으로 출력하도록 만들고 그림을 저장하는 함수를 준비합니다. 또한 파이썬 버전이 3.5 이상인지 확인합니다(파이썬 2.x에서도 동작하지만 곧 지원이 중단되므로 파이썬 3을 사용하는 것이 좋습니다). 사이킷런 버전이 0.20 이상인지와 텐서플로 버전이 2.0 이상인지 확인합니다." ] }, { @@ -45,36 +45,36 @@ "metadata": {}, "outputs": [], "source": [ - "# Python ≥3.5 is required\n", + "# 파이썬 ≥3.5 필수\n", "import sys\n", "assert sys.version_info >= (3, 5)\n", "\n", - "# Scikit-Learn ≥0.20 is required\n", + "# 사이킷런 ≥0.20 필수\n", "import sklearn\n", "assert sklearn.__version__ >= \"0.20\"\n", "\n", - "# Is this notebook running on Colab?\n", + "# 코랩에서 실행되는 노트북인가요?\n", "IS_COLAB = \"google.colab\" in sys.modules\n", "\n", - "# TensorFlow ≥2.0 is required\n", + "# 텐서플로 ≥2.0 필수\n", "import tensorflow as tf\n", "from tensorflow import keras\n", "assert tf.__version__ >= \"2.0\"\n", "\n", "if not tf.config.list_physical_devices('GPU'):\n", - " print(\"No GPU was detected. CNNs can be very slow without a GPU.\")\n", + " print(\"감지된 GPU가 없습니다. GPU가 없으면 CNN은 매우 느릴 수 있습니다.\")\n", " if IS_COLAB:\n", - " print(\"Go to Runtime > Change runtime and select a GPU hardware accelerator.\")\n", + " print(\"런타임 > 런타임 유형 변경 메뉴를 선택하고 하드웨어 가속기로 GPU를 고르세요.\")\n", "\n", - "# Common imports\n", + "# 골통 모듈 임포트\n", "import numpy as np\n", "import os\n", "\n", - "# to make this notebook's output stable across runs\n", + "# 노트북 실행 결과를 동일하게 유지하기 위해\n", "np.random.seed(42)\n", "tf.random.set_seed(42)\n", "\n", - "# To plot pretty figures\n", + "# 깔끔한 그래프 출력을 위해\n", "%matplotlib inline\n", "import matplotlib as mpl\n", "import matplotlib.pyplot as plt\n", @@ -82,7 +82,7 @@ "mpl.rc('xtick', labelsize=12)\n", "mpl.rc('ytick', labelsize=12)\n", "\n", - "# Where to save the figures\n", + "# 그림을 저장할 위치\n", "PROJECT_ROOT_DIR = \".\"\n", "CHAPTER_ID = \"cnn\"\n", "IMAGES_PATH = os.path.join(PROJECT_ROOT_DIR, \"images\", CHAPTER_ID)\n", @@ -90,7 +90,7 @@ "\n", "def save_fig(fig_id, tight_layout=True, fig_extension=\"png\", resolution=300):\n", " path = os.path.join(IMAGES_PATH, fig_id + \".\" + fig_extension)\n", - " print(\"Saving figure\", fig_id)\n", + " print(\"그림 저장\", fig_id)\n", " if tight_layout:\n", " plt.tight_layout()\n", " plt.savefig(path, format=fig_extension, dpi=resolution)" @@ -100,7 +100,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "A couple utility functions to plot grayscale and RGB images:" + "흑백 이미지와 컬러 이미지 출력을 위한 유틸리티 함수:" ] }, { @@ -122,7 +122,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# What is a Convolution?" + "# 합성곱이란 무엇인가?" ] }, { @@ -147,21 +147,21 @@ "import numpy as np\n", "from sklearn.datasets import load_sample_image\n", "\n", - "# Load sample images\n", + "# 샘플 이미지를 로드합니다.\n", "china = load_sample_image(\"china.jpg\") / 255\n", "flower = load_sample_image(\"flower.jpg\") / 255\n", "images = np.array([china, flower])\n", "batch_size, height, width, channels = images.shape\n", "\n", - "# Create 2 filters\n", + "# 2개의 필터를 만듭니다.\n", "filters = np.zeros(shape=(7, 7, channels, 2), dtype=np.float32)\n", - "filters[:, 3, :, 0] = 1 # vertical line\n", - "filters[3, :, :, 1] = 1 # horizontal line\n", + "filters[:, 3, :, 0] = 1 # 수직선\n", + "filters[3, :, :, 1] = 1 # 수평선\n", "\n", "outputs = tf.nn.conv2d(images, filters, strides=1, padding=\"SAME\")\n", "\n", - "plt.imshow(outputs[0, :, :, 1], cmap=\"gray\") # plot 1st image's 2nd feature map\n", - "plt.axis(\"off\") # Not shown in the book\n", + "plt.imshow(outputs[0, :, :, 1], cmap=\"gray\") # 첫 번째 이미지의 두 번째 특성맵을 그립니다.\n", + "plt.axis(\"off\") # 책에는 없습니다.\n", "plt.show()" ] }, @@ -317,14 +317,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Convolutional Layer" + "## 합성곱 층" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Let's create a 2D convolutional layer, using `keras.layers.Conv2D()`:" + "`keras.layers.Conv2D()`를 사용해 2D 합성곱 층을 만들어 보죠:" ] }, { @@ -344,7 +344,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Let's call this layer, passing it the two test images:" + "두 개의 테스트 이미지로 이 층을 호출합니다:" ] }, { @@ -372,14 +372,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The output is a 4D tensor. The dimensions are: batch size, height, width, channels. The first dimension (batch size) is 2 since there are 2 input images. The next two dimensions are the height and width of the output feature maps: since `padding=\"SAME\"` and `strides=1`, the output feature maps have the same height and width as the input images (in this case, 427×640). Lastly, this convolutional layer has 2 filters, so the last dimension is 2: there are 2 output feature maps per input image." + "출력은 4D 텐서입니다. 차원은 배치 크기, 높이, 너비, 채널입니다. 2개의 이미지를 입력으로 사용했기 때문에 첫 번째 차원(배치 크기)는 2입니다. 다음 두 차원은 출력 특성맵의 높이와 너비입니다. `padding=\"SAME\"`와 `strides=1`로 설정했기 때문에 출력 특성맵의 높이와 너비는 입력 이미지와 같습니다(이 경우 427×640). 마지막으로 이 합성곱 층은 2개의 필터를 사용합니다. 따라서 마지막 차원의 크기는 2입니다. 즉 입력 이미지마다 2개의 특성맵이 출력됩니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Since the filters are initialized randomly, they'll initially detect random patterns. Let's take a look at the 2 output features maps for each image:" + "필터는 초기에 랜덤하게 초기화되기 때문에 처음에는 랜덤한 패턴을 감지합니다. 이미지마다 출력된 2개의 특성맵을 확이해 보죠:" ] }, { @@ -413,14 +413,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Although the filters were initialized randomly, the second filter happens to act like an edge detector. Randomly initialized filters often act this way, which is quite fortunate since detecting edges is quite useful in image processing." + "필터가 초기에 랜덤하게 초기화되엇지만 두 번째 필터는 에지를 감지한 것처럼 보입니다. 랜덤하게 초기화된 필터는 종종 이런 식으로 동작합니다. 에지 감지는 이미지 처리에 매우 유용하기 때문에 운이 좋습니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "If we want, we can set the filters to be the ones we manually defined earlier, and set the biases to zeros (in real life we will almost never need to set filters or biases manually, as the convolutional layer will just learn the appropriate filters and biases during training):" + "원한다면 필터를 앞에서 수동으로 정의한 필터를 사용하고 편향을 0으로 지정할 수 있습니다(합성곱 층이 훈련하는 동안 적절한 필터와 편향을 학습하기 때문에 실제로는 수동으로 필터와 편향을 지정할 필요가 거의 없습니다):" ] }, { @@ -436,7 +436,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now let's call this layer again on the same two images, and let's check that the output feature maps do highlight vertical lines and horizontal lines, respectively (as earlier):" + "이제 이 층을 동일한 두 이미지에서 다시 호출해 보죠. 그다음 출력 특성맵이 (앞에서처럼) 수직선과 수평선을 부각하는지 확인해 보겠습니다:" ] }, { @@ -491,7 +491,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## VALID vs SAME padding" + "## VALID vs SAME 패딩" ] }, { @@ -542,7 +542,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Using `\"SAME\"` padding is equivalent to padding manually using `manual_same_padding()` then using `\"VALID\"` padding (confusingly, `\"VALID\"` padding means no padding at all):" + "`\"SAME\"` 패딩을 사용하는 것은 `manual_same_padding()`을 사용해 수동으로 패딩하고 `\"VALID\"` 패딩을 사용하는 것과 동일합니다(혼동될 수 있지만 `\"VALID\"` 패딩은 전혀 패딩을 하지 않는다는 뜻입니다):" ] }, { @@ -559,10 +559,10 @@ "\n", "valid_output = conv_valid(manual_same_padding(images, kernel_size, strides))\n", "\n", - "# Need to call build() so conv_same's weights get created\n", + "# conv_same의 가중치를 생성하기 위해 build() 메서드를 호출해야 합니다.\n", "conv_same.build(tf.TensorShape(images.shape))\n", "\n", - "# Copy the weights from conv_valid to conv_same\n", + "# conv_valid의 가중치를 conv_same으로 복사합니다.\n", "conv_same.set_weights(conv_valid.get_weights())\n", "\n", "same_output = conv_same(images.astype(np.float32))\n", @@ -574,14 +574,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Pooling layer" + "# 풀링 층" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Max pooling" + "## 최대 풀링" ] }, { @@ -634,11 +634,11 @@ "\n", "ax1 = fig.add_subplot(gs[0, 0])\n", "ax1.set_title(\"Input\", fontsize=14)\n", - "ax1.imshow(cropped_images[0]) # plot the 1st image\n", + "ax1.imshow(cropped_images[0]) # 첫 번째 이미지 그리기\n", "ax1.axis(\"off\")\n", "ax2 = fig.add_subplot(gs[0, 1])\n", "ax2.set_title(\"Output\", fontsize=14)\n", - "ax2.imshow(output[0]) # plot the output for the 1st image\n", + "ax2.imshow(output[0]) # 첫 번째 이미지 출력 그리기\n", "ax2.axis(\"off\")\n", "save_fig(\"china_max_pooling\")\n", "plt.show()" @@ -648,7 +648,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Depth-wise pooling" + "## 깊이 방향(depth-wise) 풀링" ] }, { @@ -690,7 +690,7 @@ ], "source": [ "depth_pool = DepthMaxPool(3)\n", - "with tf.device(\"/cpu:0\"): # there is no GPU-kernel yet\n", + "with tf.device(\"/cpu:0\"): # 아직 GPU 커널이 없습니다.\n", " depth_output = depth_pool(cropped_images)\n", "depth_output.shape" ] @@ -699,7 +699,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Or just use a `Lambda` layer:" + "또는 `Lambda` 층을 사용합니다:" ] }, { @@ -721,7 +721,7 @@ "source": [ "depth_pool = keras.layers.Lambda(lambda X: tf.nn.max_pool(\n", " X, ksize=(1, 1, 1, 3), strides=(1, 1, 1, 3), padding=\"VALID\"))\n", - "with tf.device(\"/cpu:0\"): # there is no GPU-kernel yet\n", + "with tf.device(\"/cpu:0\"): # 아직 GPU 커널이 없습니다.\n", " depth_output = depth_pool(cropped_images)\n", "depth_output.shape" ] @@ -748,10 +748,10 @@ "plt.figure(figsize=(12, 8))\n", "plt.subplot(1, 2, 1)\n", "plt.title(\"Input\", fontsize=14)\n", - "plot_color_image(cropped_images[0]) # plot the 1st image\n", + "plot_color_image(cropped_images[0]) # 첫 번째 이미지 그리기\n", "plt.subplot(1, 2, 2)\n", "plt.title(\"Output\", fontsize=14)\n", - "plot_image(depth_output[0, ..., 0]) # plot the output for the 1st image\n", + "plot_image(depth_output[0, ..., 0]) # 첫 번째 이미지 출력 그리기\n", "plt.axis(\"off\")\n", "plt.show()" ] @@ -760,7 +760,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Average pooling" + "## 평균 풀링" ] }, { @@ -805,11 +805,11 @@ "\n", "ax1 = fig.add_subplot(gs[0, 0])\n", "ax1.set_title(\"Input\", fontsize=14)\n", - "ax1.imshow(cropped_images[0]) # plot the 1st image\n", + "ax1.imshow(cropped_images[0]) # 첫 번째 이미지 그리기\n", "ax1.axis(\"off\")\n", "ax2 = fig.add_subplot(gs[0, 1])\n", "ax2.set_title(\"Output\", fontsize=14)\n", - "ax2.imshow(output_avg[0]) # plot the output for the 1st image\n", + "ax2.imshow(output_avg[0]) # 첫 번째 이미지 출력 그리기\n", "ax2.axis(\"off\")\n", "plt.show()" ] @@ -818,7 +818,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Global Average Pooling" + "## 전역 평균 풀링" ] }, { @@ -871,7 +871,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Tackling Fashion MNIST With a CNN" + "# CNN으로 패션 MNIST 문제 풀기" ] }, { @@ -962,7 +962,7 @@ "model.compile(loss=\"sparse_categorical_crossentropy\", optimizer=\"nadam\", metrics=[\"accuracy\"])\n", "history = model.fit(X_train, y_train, epochs=10, validation_data=(X_valid, y_valid))\n", "score = model.evaluate(X_test, y_test)\n", - "X_new = X_test[:10] # pretend we have new images\n", + "X_new = X_test[:10] # 새로운 이미지처럼 사용합니다\n", "y_pred = model.predict(X_new)" ] }, @@ -1104,7 +1104,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Using a Pretrained Model" + "## 사전 훈련된 모델 사용하기" ] }, { @@ -1300,7 +1300,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Pretrained Models for Transfer Learning" + "## 전이 학습을 위한 사전 훈련된 모델" ] }, { @@ -1409,7 +1409,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Warning:** TFDS's split API has evolved since the book was published. The [new split API](https://www.tensorflow.org/datasets/splits) (called S3) is much simpler to use:" + "**경고:** TFDS의 split API는 책이 출간된 후에 바뀌었습니다. [새로운 split API](https://www.tensorflow.org/datasets/splits)(S3 슬라이싱 API)는 사용하기 훨씬 간단합니다:" ] }, { @@ -1459,7 +1459,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Basic preprocessing:" + "기본 전처리:" ] }, { @@ -1478,7 +1478,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Slightly fancier preprocessing (but you could add much more data augmentation):" + "조금 더 정교한 전처리 (하지만 훨씬 많은 데이터 증식을 할 수 있습니다):" ] }, { @@ -1826,7 +1826,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Classification and Localization" + "# 분류와 위치 추정" ] }, { @@ -1843,7 +1843,7 @@ "model = keras.models.Model(inputs=base_model.input,\n", " outputs=[class_output, loc_output])\n", "model.compile(loss=[\"sparse_categorical_crossentropy\", \"mse\"],\n", - " loss_weights=[0.8, 0.2], # depends on what you care most about\n", + " loss_weights=[0.8, 0.2], # 어떤 것을 중요하게 생각하느냐에 따라\n", " optimizer=optimizer, metrics=[\"accuracy\"])" ] }, @@ -1894,7 +1894,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Mean Average Precision (mAP)" + "### mAP(Mean Average Precision)" ] }, { @@ -1946,7 +1946,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Transpose convolutions:" + "전치 합성곱:" ] }, { @@ -2001,11 +2001,11 @@ "\n", "ax1 = fig.add_subplot(gs[0, 0])\n", "ax1.set_title(\"Input\", fontsize=14)\n", - "ax1.imshow(X[0]) # plot the 1st image\n", + "ax1.imshow(X[0]) # 첫 번째 이미지 그리기\n", "ax1.axis(\"off\")\n", "ax2 = fig.add_subplot(gs[0, 1])\n", "ax2.set_title(\"Output\", fontsize=14)\n", - "ax2.imshow(normalize(output[0, ..., :3]), interpolation=\"bicubic\") # plot the output for the 1st image\n", + "ax2.imshow(normalize(output[0, ..., :3]), interpolation=\"bicubic\") # 첫 번째 이미지 출력 그리기\n", "ax2.axis(\"off\")\n", "plt.show()" ] @@ -2071,7 +2071,7 @@ "\n", "ax1 = fig.add_subplot(gs[0, 0])\n", "ax1.set_title(\"Input\", fontsize=14)\n", - "ax1.imshow(X[0]) # plot the 1st image\n", + "ax1.imshow(X[0]) # 첫 번째 이미지 그리기\n", "ax1.axis(\"off\")\n", "ax2 = fig.add_subplot(gs[0, 1])\n", "ax2.set_title(\"Upscaled\", fontsize=14)\n", @@ -2079,7 +2079,7 @@ "ax2.axis(\"off\")\n", "ax3 = fig.add_subplot(gs[0, 2])\n", "ax3.set_title(\"Output\", fontsize=14)\n", - "ax3.imshow(normalize(manual_output[0, ..., :3]), interpolation=\"bicubic\") # plot the output for the 1st image\n", + "ax3.imshow(normalize(manual_output[0, ..., :3]), interpolation=\"bicubic\") # 첫 번째 이미지 출력 그리기\n", "ax3.axis(\"off\")\n", "plt.show()" ] @@ -2108,7 +2108,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Exercises" + "# 연습문제" ] }, { @@ -2122,22 +2122,22 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "See appendix A." + "부록 A 참조." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 9. High Accuracy CNN for MNIST\n", - "_Exercise: Build your own CNN from scratch and try to achieve the highest possible accuracy on MNIST._" + "## 9. MNIST에서 높은 정확도를 내는 CNN 만들기\n", + "_연습문제: 자신만의 CNN을 만들고 MNIST 데이터셋에서 가능한 최대 정확도를 달성해보세요._" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "The following model uses 2 convolutional layers, followed by 1 pooling layer, then dropout 25%, then a dense layer, another dropout layer but with 50% dropout, and finally the output layer. It reaches about 99.2% accuracy on the test set. This places this model roughly in the top 20% in the [MNIST Kaggle competition](https://www.kaggle.com/c/digit-recognizer/) (if we ignore the models with an accuracy greater than 99.79% which were most likely trained on the test set, as explained by Chris Deotte in [this post](https://www.kaggle.com/c/digit-recognizer/discussion/61480)). Can you do better? To reach 99.5 to 99.7% accuracy on the test set, you need to add image augmentation, batch norm, use a learning schedule such as 1-cycle, and possibly create an ensemble." + "다음 모델은 2개의 합성곱 층과 1개의 풀링 층을 사용합니다. 그다음 25% 드롭아웃하고 이어서 밀집 층을 놓고 50% 드롭아웃을 다시 적용합니다. 마지막에 출력층을 놓습니다. 이 모델은 테스트 세트에서 약 99.2% 정확도를 냅니다. 이 모델은 [MNIST 캐글 경연대회](https://www.kaggle.com/c/digit-recognizer/)에서 상위 20위 안에 포함되는 수준입니다(Chris Deotte가 [이 포스트](https://www.kaggle.com/c/digit-recognizer/discussion/61480)에서 설명했듯이 테스트 세트에서 훈련된 것 같은 99.79%보다 높은 정확도를 가진 모델은 무시합니다). 더 높일 수 있을까요? 테스트 세트에서 99.5~99.7% 사이의 정확도를 달성하려면 이미지 증식, 배치 정규화를 추가하고 1-cycle 같은 학습률 스케줄을 사용하고 앙상블 모델을 만들어야 합니다." ] }, { @@ -2227,26 +2227,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 10. Use transfer learning for large image classification" + "## 10. 전이 학습을 사용한 대규모 이미지 분류" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "_Exercise: Use transfer learning for large image classification, going through these steps:_\n", + "_연습문제: 다음 단계를 따라 전이 학습을 사용해 대규모 이미지 분류를 수행해보세요:_\n", "\n", - "* _Create a training set containing at least 100 images per class. For example, you could classify your own pictures based on the location (beach, mountain, city, etc.), or alternatively you can use an existing dataset (e.g., from TensorFlow Datasets)._\n", - "* _Split it into a training set, a validation set, and a test set._\n", - "* _Build the input pipeline, including the appropriate preprocessing operations, and optionally add data augmentation._\n", - "* _Fine-tune a pretrained model on this dataset._" + "* _클래스마다 최소한 100개의 이미지가 들어 있는 훈련 세트를 만드세요. 예를 들어 위\n", + "치에 따라(해변, 산, 도심 등) 자신의 사진을 분류하거나, 기존의 데이터셋(예를 들\n", + "면, 텐서플로 데이터셋)을 사용할 수도 있습니다._\n", + "* _이를 훈련 세트와 검증 세트, 테스트 세트로 나눕니다._\n", + "* _적절한 전처리 연산과 선택적으로 데이터 증식을 수행하는 입력 파이프라인을 만듭\n", + "니다._\n", + "* _이 데이터셋에서 사전훈련된 모델을 세부 튜닝합니다._" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "See the Flowers example above." + "Flowers 예제를 참고하세요." ] }, { @@ -2254,20 +2257,21 @@ "metadata": {}, "source": [ "## 11.\n", - "_Exercise: Go through TensorFlow's [Style Transfer tutorial](https://homl.info/styletuto). It is a fun way to generate art using Deep Learning._\n" + "_연습문제: 텐서플로의 [스타일 전이 튜토리얼](https://homl.info/styletuto)을 살펴보세요. 딥러\n", + "닝을 사용해 재미있는 그림을 생성할 수 있습니다._" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Simply open the Colab and follow its instructions." + "코랩을 사용해 튜토리얼을 따라해 보세요." ] } ], "metadata": { "kernelspec": { - "display_name": "TensorFlow 2.4 on Python 3.8 & CUDA 11.1", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -2281,7 +2285,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.8" + "version": "3.7.3" }, "nav_menu": {}, "toc": {