Skip to content
Permalink
Browse files

Merge pull request #623 from katoosky:ja_tutorial_image_intro_to_cnn

PiperOrigin-RevId: 252511106
  • Loading branch information...
Copybara-Service
Copybara-Service committed Jun 10, 2019
2 parents 2c22512 + e9f6425 commit 5633e3a4a9defb023fef5f53646a457497ed822e
Showing with 366 additions and 0 deletions.
  1. +366 −0 site/ja/beta/tutorials/images/intro_to_cnns.ipynb
@@ -0,0 +1,366 @@
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "intro_to_cnns.ipynb",
"version": "0.3.2",
"provenance": [],
"private_outputs": true,
"collapsed_sections": [],
"toc_visible": true
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"accelerator": "GPU"
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "x4HI2mpwlrcn",
"colab_type": "text"
},
"source": [
"##### Copyright 2019 The TensorFlow Authors."
]
},
{
"cell_type": "code",
"metadata": {
"id": "679Lmwt3l1Bk",
"colab_type": "code",
"cellView": "form",
"colab": {}
},
"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."
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "DSPCom-KmApV",
"colab_type": "text"
},
"source": [
"# 畳み込みニューラルネットワーク (Convolutional Neural Networks)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "klAltGp8ycek"
},
"source": [
"<table class=\"tfo-notebook-buttons\" align=\"left\">\n",
" <td>\n",
" <a target=\"_blank\" href=\"https://www.tensorflow.org/beta/tutorials/images/intro_to_cnns\">\n",
" <img src=\"https://www.tensorflow.org/images/tf_logo_32px.png\" />\n",
" View on TensorFlow.org</a>\n",
" </td>\n",
" <td>\n",
" <a target=\"_blank\" href=\"https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/beta/tutorials/images/intro_to_cnns.ipynb\">\n",
" <img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" />\n",
" Run in Google Colab</a>\n",
" </td>\n",
" <td>\n",
" <a target=\"_blank\" href=\"https://github.com/tensorflow/docs/blob/master/site/en/beta/tutorials/images/intro_to_cnns.ipynb\">\n",
" <img src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\" />\n",
" View source on GitHub</a>\n",
" </td>\n",
"</table>"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "qLGkt5qiyz4E"
},
"source": [
"このチュートリアルでは、MNIST の数の分類をするための、シンプルな[畳み込みニューラルネットワーク](https://developers.google.com/machine-learning/glossary/#convolutional_neural_network) (CNN: Convolutional Neural Network) の学習について説明します。このシンプルなネットワークは MNIST テストセットにおいて、99%以上の精度を達成します。このチュートリアルでは、[Keras Sequential API](https://www.tensorflow.org/guide/keras)を使用するため、ほんの数行のコードでモデルの作成と学習を行うことができます。\n",
"\n",
"Note: GPU を使うことで CNN をより早く学習させることができます。もし、このノートブックを Colab で実行しているならば、*編集 -> ノートブックの設定 -> ハードウェアアクセラレータ -> GPU* から無料のGPUを有効にすることができます。"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "m7KBpffWzlxH"
},
"source": [
"### TensorFlowのインポート"
]
},
{
"cell_type": "code",
"metadata": {
"colab_type": "code",
"id": "iAve6DCL4JH4",
"colab": {}
},
"source": [
"from __future__ import absolute_import, division, print_function, unicode_literals\n",
"\n",
"!pip install tensorflow-gpu==2.0.0-beta0\n",
"import tensorflow as tf\n",
"\n",
"from tensorflow.keras import datasets, layers, models"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "jRFxccghyMVo"
},
"source": [
"### MNISTデータセットのダウンロードと準備"
]
},
{
"cell_type": "code",
"metadata": {
"colab_type": "code",
"id": "JWoEqyMuXFF4",
"colab": {}
},
"source": [
"(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()\n",
"\n",
"train_images = train_images.reshape((60000, 28, 28, 1))\n",
"test_images = test_images.reshape((10000, 28, 28, 1))\n",
"\n",
"# ピクセルの値を 0~1 の間に正規化\n",
"train_images, test_images = train_images / 255.0, test_images / 255.0"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "Oewp-wYg31t9"
},
"source": [
"### 畳み込みの基礎部分の作成\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "3hQvqXpNyN3x"
},
"source": [
"下記の6行のコードは、一般的なパターンで畳み込みの基礎部分を定義しています: [Conv2D](https://www.tensorflow.org/api_docs/python/tf/keras/layers/Conv2D) と [MaxPooling2D](https://www.tensorflow.org/api_docs/python/tf/keras/layers/MaxPool2D) レイヤーのスタック。\n",
"\n",
"入力として、CNN はバッチサイズを無視して、shape (image_height, image_width, color_channels) のテンソルをとります。color channels について、MNIST は1つ (画像がグレースケールのため) の color channels がありますが、カラー画像には3つ (R, G, B) があります。この例では、MNIST 画像のフォーマットである shape (28, 28, 1) の入力を処理するように CNN を構成します。これを行うには、引数 `input_shape` を最初のレイヤーに渡します。\n",
"\n"
]
},
{
"cell_type": "code",
"metadata": {
"colab_type": "code",
"id": "L9YmGQBQPrdn",
"colab": {}
},
"source": [
"model = models.Sequential()\n",
"model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))\n",
"model.add(layers.MaxPooling2D((2, 2)))\n",
"model.add(layers.Conv2D(64, (3, 3), activation='relu'))\n",
"model.add(layers.MaxPooling2D((2, 2)))\n",
"model.add(layers.Conv2D(64, (3, 3), activation='relu'))"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "lvDVFkg-2DPm"
},
"source": [
"ここまでのモデルのアーキテクチャを表示してみましょう。"
]
},
{
"cell_type": "code",
"metadata": {
"colab_type": "code",
"id": "8-C4XBg4UTJy",
"colab": {}
},
"source": [
"model.summary()"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "_j-AXYeZ2GO5"
},
"source": [
"上記より、すべての Conv2D と MaxPooling2D レイヤーの出力は shape (height, width, channels) の 3D テンソルであることがわかります。width と height の寸法は、ネットワークが深くなるにつれて縮小する傾向があります。各 Conv2D レイヤーの出力チャネルの数は、第一引数 (例: 32 または 64) によって制御されます。通常、width とheight が縮小すると、各 Conv2D レイヤーにさらに出力チャネルを追加する余裕が (計算上) できます。"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "_v8sVOtG37bT"
},
"source": [
"### 上に Dense レイヤーを追加\n",
"モデルを完成するために、(shape (3, 3, 64) の) 畳み込みの基礎部分からの最後の出力テンソルを、1つ以上の Dense レイヤーに入れて分類を実行します。現在の出力は 3D テンソルですが、Dense レイヤーは入力としてベクトル (1D) を取ります。まず、3D 出力を 1D に平滑化 (または展開) してから、最上部に1つ以上の Dense レイヤーを追加します。MNIST は 10 個の出力クラスを持ちます。そのため、我々は最後の Dense レイヤーの出力を 10 にし、softmax関数を使用します。"
]
},
{
"cell_type": "code",
"metadata": {
"colab_type": "code",
"id": "mRs95d6LUVEi",
"colab": {}
},
"source": [
"model.add(layers.Flatten())\n",
"model.add(layers.Dense(64, activation='relu'))\n",
"model.add(layers.Dense(10, activation='softmax'))"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "ipGiQMcR4Gtq"
},
"source": [
"これが私たちのモデルの完全なアーキテクチャです。"
]
},
{
"cell_type": "code",
"metadata": {
"colab_type": "code",
"id": "8Yu_m-TZUWGX",
"colab": {}
},
"source": [
"model.summary()"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "xNKXi-Gy3RO-"
},
"source": [
"ご覧のとおり、2 つの Dense レイヤーを通過する前に、(3, 3, 64) の出力は shape (576) のベクターに平滑化されました。"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "P3odqfHP4M67"
},
"source": [
"### モデルのコンパイルと学習"
]
},
{
"cell_type": "code",
"metadata": {
"colab_type": "code",
"id": "MdDzI75PUXrG",
"colab": {}
},
"source": [
"model.compile(optimizer='adam',\n",
" loss='sparse_categorical_crossentropy',\n",
" metrics=['accuracy'])\n",
"\n",
"model.fit(train_images, train_labels, epochs=5)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "jKgyC5K_4O0d"
},
"source": [
"### モデルの評価"
]
},
{
"cell_type": "code",
"metadata": {
"colab_type": "code",
"id": "gtyDF0MKUcM7",
"colab": {}
},
"source": [
"test_loss, test_acc = model.evaluate(test_images, test_labels)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab_type": "code",
"id": "0LvwaKhtUdOo",
"colab": {}
},
"source": [
"print(test_acc)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "8cfJ8AR03gT5"
},
"source": [
"ご覧のとおり、我々のシンプルな CNN は 99% 以上のテスト精度を達成しています。数行のコードにしては悪くありません!違うスタイルでの CNN の書き方 (Keras Subclassing API や GradientTape を使ったもの) については[ここ](https://github.com/tensorflow/docs/blob/master/site/en/r2/tutorials/quickstart/advanced.ipynb)を参照してください。"
]
}
]
}

0 comments on commit 5633e3a

Please sign in to comment.
You can’t perform that action at this time.