TensorFlow入門(5)

TensorFlow入門(5)

画像認識を行う深層学習(CNN)を作成してみよう(TensorFlow編)

Tutor 2018年4月24日

ディープラーニングの代表的手法「CNN」により画像認識を行う機械学習モデルを構築してみる。CNNによる深層学習がどのようなものか体験しよう。

安部晃生 DATUM STUDIO株式会社 安部 晃生

 前回はCNNの全体像を説明したので、本稿の手順で作業を始める前に一読してほしい。CNNの全体像が分かったところで、今回はいよいよCNNを使って深層学習を試してみよう。本稿のPythonコードは、Jupyter Notebook上で実行すればよい。

CNNの学習

 試すといっても、具体的に画像データセットから学習してモデルを作成し、新しいデータを与えたときに判別してくれるのでなければ意味がない。本節では、MNISTと呼ばれる手書き数字画像のデータセットを用いて学習を行う。すなわち、そのモデルを利用することで、新しい手書き数字画像を得たときに、その画像に記されている数字が何であるかを判別できるようにしてみよう。

MNISTデータの取得

 MNISTでは以下の4種類のファイルを配布している。

ファイル名用途内容データ数
train-images-idx3-ubyte.gz訓練画像データ60,000
train-labels-idx1-ubyte.gz訓練ラベル60,000
t10k-images-idx3-ubyte.gzテスト画像データ10,000
t10k-labels-idx1-ubyte.gzテストラベル10,000
表1 MNISTの4種類のファイル

 画像データには、09のいずれかの手書き数字が記されている、28×28ピクセルのグレースケールの画像で、各ピクセルは8 bitsの単一の値をとる。MNISTのページに詳細なファイルの仕様が記述されている。仕様に従い読み込んでもよいのだが、MNISTはよく利用されるデータなので、TensorFlowにもチュートリアルとして、データを読み込む関数があらかじめ用意されている。本稿ではこれを利用する(リスト1)。

Python
from tensorflow.examples.tutorials.mnist import input_data

# MNIST_dataディレクトリーにMNISTデータをダウンロードして読み込む
mnist = input_data.read_data_sets('MNIST_data/')
リスト1 MNISTデータセットの読み込み

 作成した変数mnistには、mnist.trainmnist.validationmnist.testの3つのデータが含まれる。mnist.trainmnist.validationは6万個の訓練用データを5万5000個と5000個に分割したもので、mnist.testは1万個のテスト(test)用データだ。

 機械学習においてモデルを作成する際には、モデルを作成するのに使ったデータを使って精度を測ると上振れしてしまう(過学習という)。これを防ぐために、精度検証(validation)用に訓練(train)用データの一部を取り出すのが普通であり、チュートリアルの関数でもそのようになっているというわけである。ただし、精度検証データは使わず、テストデータで精度検証を済ませる場合もある。本稿でも精度検証データは使用しない。

 mnist.XXX.imagesには、MNISTの数字画像データ(テンソル)が含まれている。テンソルのサイズはデータ数×784の行列形式で、例えばmnist.train.images55000×784のサイズである。78428×28で、2次元のピクセルデータが1次元に直列に配置されている。

 また、mnist.XXX.labelsには数字のラベル(画像が示す数字が何であるか)が含まれている。

 例として1つ目の画像を出力してみよう。実行にはまず、画像データを扱うためのpillowパッケージをターミナル上から導入する(リスト2)。

Bash
(introtensorflow) $ pip install pillow
リスト2 pillowパッケージをインストールするコマンド

 インストールが完了したら、リスト1のコードに続けて、リスト3のコードをJupyter Notebook上で実行してみよう。

Python
# pip install pillow
from PIL import Image

# 1枚目を28×28ピクセルの行列に変換
image_matrix = tf.reshape(mnist.train.images[0], [28, 28])
# 画像を8 bits整数値行列に変換する
image_matrix_uint8 = tf.cast(255 * image_matrix, tf.uint8)

# ラベルの表示
print(mnist.train.labels[0])
# グレースケール画像データの作成
Image.fromarray(image_matrix_uint8.eval(), 'L')
リスト3 MNISTの画像の確認

 すると、図1のような結果が表示されるはずだ。これが1つ目の訓練データのラベルと画像である。

図1 リスト3の実行結果

 筆者には3に見えるが、付けられているラベルは3ではなく7である。英語圏では7の真ん中に横線を入れる書き方が一般的だ。

ネットワークの定義

 本稿では説明のために、精度は追求せずに、以下の単純なCNN構造を定義する。

レイヤー処理メソッド入力サイズ出力サイズ処理詳細
1サイズ変更tf.nn.reshape78428×28畳み込みのための変形
2畳み込みtf.nn.conv2d28×289×9×10ランダム生成したサイズ4×4のカーネル、ストライド幅310個適用
3活性化関数tf.nn.relu9×9×109×9×10ReLU関数
4プーリングtf.nn.max_pool9×9×104×4×10ウィンドウサイズ3×3、ストライド幅2で最大値プーリング
5サイズ変更tf.reshape4×4×10160全結合のための変形
6全結合tf.matmul16040
7活性化関数tf.nn.relu4040ReLU関数
8全結合tf.matmul4010
9確率化tf.nn.softmax1010ソフトマックス関数
表2 本稿で用いるCNNのレイヤー構造

 活性化関数のReLU関数正規化線形関数Rectified Linear Unitの略)のみ初出なので補足を加える。ReLU関数は以下の式で定義される関数で、入力が0以下であれば0とし、入力が0より大きければ入力通りとする。

\[\mathrm{ReLU}(x) = \max(0, x)\]

 ReLU関数は、ニューラルネットワークを収束させる上で都合がよい性質(具体的には図2に示すように、 \(x=0\) で折れ曲がる構造)を持っており、深層学習によく用いられる。

図2 ReLU関数
図2 ReLU関数

損失関数の定義

 損失関数は、理想的な出力との距離を定義する関数だ。数学的に厳密に定義された距離である必要はないが、距離の値が小さいほど「理想的な出力に近い」と判断できるように定義する必要がある。この関数の値が小さくなるように、TensorFlowがパラメーターを調整する。

 上記で定義したネットワークの出力は、10要素からなるテンソルだ。もし、ある数字の画像から「09の数字」を判断するときに、各数字である確率が完全に等しければ、[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]という出力を得ることになり、これでは確率値から正解は判断できない。これは、理想的な出力との距離が遠い、つまり損失関数の値が大きすぎる状態である。

 正解の数字をより正確に判断できるようにするには、例えば3が正解の場合、どのような出力であることが理想だろうか。確率から出力を判断するとは、確率が最大であるものを選択するということであるから、[0, 0, 0, 1, 0, 0, 0, 0, 0, 0]のように3を示す要素が1で他の要素が0である場合が、最も良い出力であるといえよう。このような出力になるように、つまり損失関数の値が最小になるようにパラメーターを最適化していく必要があるわけだ。

 ちなみに、このような正解の要素のみ1で他の要素が0となるテンソル表現をワンホット表現One-hot representation)と呼び、損失関数の定義に便利である。後でコードで示すが、MNISTのチュートリアルデータの読み込み時に、ラベルをワンホット表現として読み込むこともできる。

 詳細は説明しないが、MNISTのような判別問題では、以下の交差エントロピーcross entropy)と呼ばれる損失関数がよく用いられる。

\[E = -\sum_{n=1}^{N}\sum_{i=1}^{C} t_{in} \log{p_{in}}\]

  \(N\) は学習に利用した画像の枚数、 \(C\) は判別クラス数(MNISTの場合は10)、 \(t_{in}\) はワンホット表現(正解ラベル)の \(i\) 番目の要素、 \(p_{in}\) はネットワークの出力の \(i\) 番目の要素を表す。

 定義に従えば、TensorFlowでは、以下のように交差エントロピーを計算できる。

Python
y = tf.nn.softmax(x)
entropy = -tf.reduce_sum(t * tf.log(y))
リスト4 交差エントロピーを計算するコード

xtは現段階では未定義なので、このコードは実行できない。実際の実行例はリスト6を参照。

 ソフトマックス関数と交差エントロピーの組み合わせはよく利用されるので、上記の処理は次のようにまとめることもできる。

Python
entropy = tf.nn.softmax_cross_entropy_with_logits_v2(labels=t, logits=x)
リスト5 ソフトマックス関数と交差エントロピーを組み合わせたコード

txは現段階では未定義なので、このコードは実行できない。実際の実行例はリスト6を参照。

 損失関数を最小化するのが、オプティマイザーoptimizer)と呼ばれる最適化手法を実装したクラス群だ。本稿では説明を行わないが、損失関数を最小化するために、損失関数とセットで現れるものだと思っておいて間違いない。TensorFlowでは、オプティマイザーを評価することで学習を進めることができる。

 オプティマイザーにもさまざまな種類があるが、ここではAdamtf.train.AdamOptimizerクラス)という手法を利用する。利用方法は次節のリスト6を参考にしてほしい。

学習の実行

 リスト6に、MNISTの訓練データを用いた学習の実行と、(今回は精度検証データではなく)テストデータを用いた精度推定を行うコードを示す。一部のテンソルに対してname引数で名前を付けているが、この理由は後で説明する。

Python
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

sess = tf.InteractiveSession()

# 再現性の確保のために乱数シードを固定(数値は何でもよい)
tf.set_random_seed(12345)

# 入力データ
# MNISTのワンホット表現での読み込み
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

# 0 入力画像
x = tf.placeholder(tf.float32, name='x')

# 1 サイズ変更
x_1 = tf.reshape(x, [-1, 28, 28, 1])

# 2 畳み込み
# ランダムカーネル
k_0 = tf.Variable(tf.truncated_normal([4, 4, 1, 10], mean=0.0, stddev=0.1))
# 畳み込み
x_2 = tf.nn.conv2d(x_1, k_0, strides=[1, 3, 3, 1], padding='VALID')

# 3 活性化関数
x_3 = tf.nn.relu(x_2)

# 4 プーリング
x_4 = tf.nn.max_pool(x_3, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='VALID')

# 5 サイズ変更
x_5 = tf.reshape(x_4, [-1, 160])

# 6 全結合
# 重みとバイアス
w_1 = tf.Variable(tf.zeros([160, 40]))
b_1 = tf.Variable([0.1] * 40)
# 全結合
x_6 = tf.matmul(x_5, w_1) + b_1

# 7 活性化関数
x_7 = tf.nn.relu(x_6)

# 8 全結合
# 重みとバイアス
w_2 = tf.Variable(tf.zeros([40, 10]))
b_2 = tf.Variable([0.1] * 10)
# 全結合
x_8 = tf.matmul(x_7, w_2) + b_2

# 9 確率化
y = tf.nn.softmax(x_8)

# 10 損失関数の最小化
# 正解ラベル
labels = tf.placeholder(tf.float32, name='labels')
# 損失関数(交差エントロピー)と最適化処理(Adam)
loss = -tf.reduce_sum(labels * tf.log(y))
optimizer = tf.train.AdamOptimizer().minimize(loss)

# 11 精度検証
prediction_match = tf.equal(tf.argmax(y, axis=1), tf.argmax(labels, axis=1))
accuracy = tf.reduce_mean(tf.cast(prediction_match, tf.float32), name='accuracy')

# パラメーター
# バッチサイズ
BATCH_SIZE = 32
# 学習回数
NUM_TRAIN = 10_000
# 学習中の出力頻度
OUTPUT_BY = 500

# 学習の実行
sess.run(tf.global_variables_initializer())
for i in range(NUM_TRAIN):
  batch = mnist.train.next_batch(BATCH_SIZE)
  inout = {x: batch[0], labels: batch[1]}
  if i % OUTPUT_BY == 0:
    train_accuracy = accuracy.eval(feed_dict=inout)
    print('step {:d}, accuracy {:.2f}'.format(i, train_accuracy))
  optimizer.run(feed_dict=inout)

# テストデータによる精度検証
test_accuracy = accuracy.eval(feed_dict={x: mnist.test.images, labels: mnist.test.labels})
print('test accuracy {:.2f}'.format(test_accuracy))
リスト6 CNNによるMNISTの学習

 実行してみると、恐らく35%前後の精度となるだろう。これは、数字画像が与えられたときにその数字を当てられるのが、およそ3回に1回程度ということだ。これでは使い物にならない。精度を上げるための工夫が必要になる。

バッチサイズ

 精度の改善を行う前に、バッチサイズの説明を行う。

 コード中にmnist.train.next_batch(BATCH_SIZE)という処理がある。前後のコードも併せると、この処理ではMNISTの訓練データから複数の画像データとラベルデータを取得していることが予想できると思う。実際にその通りで、複数の画像入出力データを用いて同時に最適化を行っている。

  • このようにデータを少しずつ学習させる方法をミニバッチ学習Mini-batch learning)という
  • これに対し、すべてのデータを同時に学習させる方法がバッチ学習Batch learning
  • 1つずつ学習させる方法はオンライン学習Online learning)という

 バッチサイズとは、ミニバッチにおける同時学習データサイズのことを指す。

ドロップアウト層の追加

 ディープニューラルネットワークの学習を効率化させるために、ドロップアウトDropout)と呼ばれるテクニックがある。

 ドロップアウトとは、学習時にニューラルネットワークの一部のニューロンを、一定の確率で非活性化させるテクニックである(図3)。全結合の状態では、周囲のニューロンの影響が強く、ニューロン単体が特徴量をうまく捉えられなくなる。そこで一部のニューロンを取り除くことにより、周囲のニューロンの影響が弱まり、個々のニューロンが特徴を捉えやすくなるのである。

図3 ドロップアウト

 ここでは表1の全結合レイヤー(リスト6の68)にドロップアウト処理を追加する。TensorFlowではtf.nn.dropoutメソッドによりドロップアウトを行うことができる。そのメソッドのkeep_prob引数にノードを残す割合を指定できる。

 リスト6からの変更点(ドロップアウト処理を追加した部分のみ抜粋)は次の通り。

Python
# ドロップアウト付きの全結合
def matmul_plus_bias_with_dropout(x, w, b, p):
  return tf.matmul(tf.nn.dropout(x, keep_prob=p), w) + b

# 6 全結合
# 重みとバイアス
w_1 = tf.Variable(tf.zeros([160, 40]))
b_1 = tf.Variable([0.1] * 40)
# ドロップアウト率
p_1 = tf.placeholder(1.0, name='p_1')
# 全結合
x_6 = matmul_plus_bias_with_dropout(x_5, w_1, b_1, p_1)


# 8 全結合
# 重みとバイアス
w_2 = tf.Variable(tf.zeros([40, 10]))
b_2 = tf.Variable([0.1] * 10)
# ドロップアウト率
p_2 = tf.placeholder(1.0, name='p_2')
# 全結合
x_8 = matmul_plus_bias_with_dropout(x_7, w_2, b_2, p_2)


# パラメーター
# バッチサイズ
BATCH_SIZE = 32
# 学習回数
NUM_TRAIN = 10_000
# 学習中の出力頻度
OUTPUT_BY = 500
# ドロップアウト率
DROPOUT_PROB_1 = 0.2
DROPOUT_PROB_2 = 0.5


# 学習の実行
sess.run(tf.global_variables_initializer())
dropout_prob = {p_1: DROPOUT_PROB_1, p_2: DROPOUT_PROB_2}
for i in range(NUM_TRAIN):
  batch = mnist.train.next_batch(BATCH_SIZE)
  inout = {x: batch[0], labels: batch[1]}
  if i % OUTPUT_BY == 0:
    train_accuracy = accuracy.eval(feed_dict={**inout, p_1: 1.0, p_2: 1.0})
    print('step {:d}, accuracy {:.2f}'.format(i, train_accuracy))
  optimizer.run(feed_dict={**inout, **dropout_prob})

# テストデータによる精度検証
test_accuracy = accuracy.eval(feed_dict={x: mnist.test.images, labels: mnist.test.labels, p_1: 1.0, p_2: 1.0})
print('test accuracy {:.2f}'.format(test_accuracy))
リスト7 CNNによるMNISTの学習(変更箇所のみ抜粋)

 今度は90%近くまで精度が上がったと思われる。まだまだ精度を上げられるが、本稿ではここでストップする。

さらなるチューニング

 本稿では割愛するが、さらに工夫を重ねることで99%以上の精度まで上げることができる。本稿までに説明した内容で行える工夫としては、以下のようなものがある。

  • ニューラルネットワークの層を深くする
  • ニューラルネットワークの層のニューロンの数を変える
  • 畳み込みやプーリングの回数を増やす
  • 畳み込みやプーリングのウィンドウサイズを変える
  • 畳み込みでゼロパディングを行う
  • バッチサイズ、学習回数、ドロップアウト率などのハイパーパラメーター(ニューラルネットワーク中で探索するパラメーターではなく、事前にユーザーが定義するパラメーターのこと)を変更する

 これ以外にも、入力データにノイズやゆがみを加えることで訓練データを水増しするような方法もある。WikipediaのMNISTのページには、さまざまな手法でのMNISTの精度が示されているので、その参考文献を当たってみるのもよいだろう。

モデルの保存と利用

 リスト6やリスト7では、学習したメモリー上のモデルをそのまま利用した。しかし実際のケースでは、モデル(すなわちデータフローグラフとパラメーター)を保存しておき、必要なタイミングで読み込める方がよい。ミニバッチ学習では段階的に学習していくため、その学習過程の歴史をスナップショットとして保存するようなこともできる。

 他にも、パブリッククラウド環境であれば、学習時は高パフォーマンスのVM(仮想マシン)インスタンスを利用し、学習済みモデルを用いた予測は低パフォーマンスのVMインスタンスで提供するといったこともできる。

 TensorFlowでは、モデルのファイル入出力はtf.train.Saverクラスが担う。モデルをファイルに出力する場合はsaveメソッドを、ファイルからモデルを入力する場合はrestoreメソッドを利用する。リスト7のコードを再利用して、学習のセッションと、ファイル経由の学習結果を利用する方法を次に示す。

保存

 まずは学習結果の保存だ。リスト6と7からの変更点(追加部分のみ抜粋)は次の通り。

Python
# カレントスレッドにデフォルトのグラフが残存していることがあるので(特にJupyter Notebookを使っている場合)、リセットしておく
tf.reset_default_graph()
sess = tf.InteractiveSession()


# 学習の実行
sess.run(tf.global_variables_initializer())
dropout_prob = {p_1: DROPOUT_PROB_1, p_2: DROPOUT_PROB_2}

saver = tf.train.Saver()

for i in range(NUM_TRAIN):
  batch = mnist.train.next_batch(BATCH_SIZE)
  inout = {x: batch[0], labels: batch[1]}
  if i % OUTPUT_BY == 0:
    train_accuracy = accuracy.eval(feed_dict={**inout, p_1: 1.0, p_2: 1.0})
    print('step {:d}, accuracy {:.2f}'.format(i, train_accuracy))
    # 過程の保存
    saver.save(sess, 'models/my-model', global_step=i)
  optimizer.run(feed_dict={**inout, **dropout_prob})

# 最終結果の保存
saver.save(sess, 'models/my-model')
リスト8 モデルの保存(変更箇所のみ抜粋)

 リスト8を実行してモデルを保存すると、指定した名前に.data-00000-of-00001.index.metaという3種類の拡張子が付いたファイル群とcheckpointファイルが作成される。

 リスト8で「過程の保存」とコメントしてある箇所では、<モデル名>-<ステップ数>.<拡張子>という名前で保存される。
 「最終結果の保存」とコメントしてある箇所では、<モデル名>.<拡張子>という名前で保存される。

利用

 次に学習結果の読み込みと利用だ。こちらは少しだけ処理が多い。なお今回は、既存のコードは再利用しないので、Jupyter Notebbokで新規ノートブックを作成して試してほしい。

Python
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

# MNISTデータ
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

# モデルの読み込み
saver = tf.train.import_meta_graph('models/my-model.meta')

# データフローグラフからプレースホルダーと精度測定処理ノードを取得
graph = tf.get_default_graph()
x = graph.get_tensor_by_name('x:0')
labels = graph.get_tensor_by_name('labels:0')
p_1 = graph.get_tensor_by_name('p_1:0')
p_2 = graph.get_tensor_by_name('p_2:0')
accuracy = graph.get_tensor_by_name('accuracy:0')

with tf.Session() as sess:
  # 変数初期化
  sess.run(tf.global_variables_initializer())

  # モデル読み込み
  saver.restore(sess, 'models/my-model')

  # テストデータによる精度検証
  test_accuracy = accuracy.eval(feed_dict={x: mnist.test.images, labels: mnist.test.labels, p_1: 1.0, p_2: 1.0})
  print('test accuracy {:.2f}'.format(test_accuracy))
リスト9 モデルの読み込み

.metaファイルは、メタグラフというデータフローグラフ構造などの情報を保存したものである。tf.train.import_meta_graphメソッドを用いることで読み込むことができる*1

 tf.train.import_metagraphメソッドによりグラフ構造を読み込んだだけでは、プレースホルダーなどのテンソルをPythonの変数として利用できない。データフローグラフから名前付きテンソルを取得しているのが3~9行目の一連の処理である。リスト6と7で(name='<変数名>'という引数指定で)一部のテンソルに名前を付けていたのはこのためである。名前の後ろに':0'という文字列が付いているが、これはTensorFlowによって自動で付加されるoutput_indexというもので、決まり文句のようなものだと思っておいて特に問題ないだろう。

 メタグラフにはテンソル要素の具体的な値は含まれていない。変数を初期化し、restoreメソッドを用いることで、学習したパラメーターを読み込むことができる。これでデータフローグラフ構造とテンソルの値が読み込まれたことになるので、テンソルの評価が行えるようになる。

さらなる学習のために

 本稿では単純なCNNの実行と学習の方法について示した。なぜ畳み込み、プーリング、ドロップアウトといった処理がニューラルネットワークの枠組みで学習できるのか、オプティマイザーとはどのような処理を行っているのか、といったことは示していない。CNNについて深く学習したい場合は、書籍やWeb記事を参考にするとよいだろう。

 また、TensorFlowのtf.kerasモジュールには、高レベルAPIと呼ばれる、学習やモデルの定義を容易にするAPI群が定義されている。もともとKerasはTensorFlowやそれ以外の計算ライブラリをバックエンドとした独立した深層学習ライブラリであったが、APIはTensorFlowに統合されている。よほど複雑なことを行うのでなければ、tf.kerasモジュールの提供するAPIを利用した方が、簡潔かつ直感的に深層学習のモデルコードを書くことができるだろう。

 本稿ではTensorFlowの計算骨格を説明するためにKerasについては取り扱わなかったが、深層学習を一般的な機械学習業務で利用するに当たっては、Kerasのような高レベルAPIを用いた方が開発スピードや保守の観点で推奨される。

 さて次回は、時系列データでよく使われる代表的な手法「RNN」について概観する。さらに次々回では、今回と同じにようにRNNを試しに使ってみることにしよう。

【TL;DR】CNNで行う画像認識

  • MNIST: 手書き数字画像のデータセット。28×28ピクセルのグレースケール画像で各ピクセルは8 bits値。TensorFlowには読み込み関数が用意されている
  • pillow: 画像データを扱うためのPythonパッケージ
  • CNNのネットワーク定義: 画像サイズ変更、畳み込み、活性化関数、プーリング、全結合などの層を重ねていき、最後にソフトマック関数で確率にする
  • ReLU関数: 代表的な活性化関数の一つ。0以下であれば「0」とし、入力が0より大きければ「入力通りの値」にする。ニューラルネットワークを収束させるのに有効
  • 損失関数: 理想的な出力との距離を定義する関数。この関数の値が小さいほど、理想的な出力に近い。代表的な損失関数の一つに「交差エントロピー」がある
  • ワンホット表現: 正解の要素のみ「1」で、他の要素は「0」となるテンソル表現
  • オプティマイザー: 最適化手法を実装したクラス群で、これを使って損失関数を最小化する。最適化手法の一つに「Adam」がある。
  • ミニバッチ学習: データを少しずつ学習させる方法。他には、すべて同時に学習させる「バッチ学習」や、1つずつ学習させる「オンライン学習」という方法がある
  • ドロップアウト: 学習時にニューラルネットワークの一部のニューロンを、一定の確率で非活性化させるテクニック。個々のニューロンが特徴を捉えやすくなるため、精度が向上する
  • モデルの保存と利用: tf.train.Saverクラスのsaveメソッドでモデルをファイルに出力して保存し、restoreメソッドでファイルからモデルを入力して利用できる
  • Keras: TensorFlowなどをバックエンドとして使用できる深層学習ライブラリ。簡潔かつ直感的に深層学習をコーディングできる
  • このエントリーをはてなブックマークに追加

※以下では、本稿の前後を合わせて5回分(第3回~第7回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載目次]を参照してください。

TensorFlow入門(5)
3. TensorFlowの基本構成要素:「テンソル」と「セッション」

TensorFlowによる深層学習を始める前に、TensorFlowの基本的な構成要素であるテンソルとセッションを理解しておこう。TensorFlowのコード例を示しながら、できるだけコンパクトにまとめる。

TensorFlow入門(5)
4. CNN(Convolutional Neural Network)を理解しよう(TensorFlow編)

画像認識でよく使われるディープラーニングの代表的手法「CNN」を解説。「畳み込み」「プーリング」「活性化関数」「CNNのネットワーク構成」「ソフトマックス関数」といった基礎と、注意点を押さえよう。

TensorFlow入門(5)
5. 【現在、表示中】≫ 画像認識を行う深層学習(CNN)を作成してみよう(TensorFlow編)

ディープラーニングの代表的手法「CNN」により画像認識を行う機械学習モデルを構築してみる。CNNによる深層学習がどのようなものか体験しよう。

TensorFlow入門(5)
6. RNN(Recurrent Neural Network)の概要を理解しよう(TensorFlow編)

時系列データの予測でよく使われるディープラーニングの代表的手法「RNN」を解説。そもそも時系列データとは何か? RNNの特徴や、通常のニューラルネットワークの相違点についても押さえよう。

TensorFlow入門(5)
7. 時系列データの予測を行う深層学習(RNN)を作成してみよう(TensorFlow編)

ディープラーニングの代表的手法「RNN」により時系列データの予測を行う機械学習モデルを構築してみる。RNNによる深層学習がどのようなものか体験しよう。

Deep Insider の SNS :