投稿

Translate

#83 トレーニングされたモデルを使用する

イメージ
 最後に、体験したトレーニング済みモデルを使って、ある1個の画像に対する予測を行ってみましょう。 1.予測する画像の選択 テスト用データセットの2番目の画像を選択します。 念のため、選んだ『test_image[1]』の縦・横のピクセル数を確認してみると、縦28ピクセル × 横28ピクセルで、トレーニング済みモデルで予測することが可能であることが確認できました。 この確認作業は、予測をする際に重要です。今回は、同じデータセットをトレーニング用とテスト用に分割したので、縦・横のピクセル数が揃っていることはわかっていますが、実際の場面では、予測用の新たなデータを使うことが多いので、このような確認作業をルーティンにしていきましょう。 2.予測する画像の目視 選んだ画像がどんなものか、Section 4『データの前処理』のところで書いたコードを活用して、実物を見てみます。 3.予測する画像の前処理 今回のKeras のモデルは、『 3次元テンソル 』 を予測するように作ってきました。そのため、内部では常に『3次元テンソル』のデータを待ち受けています。 もし、次元を追加せずに1枚の画像を probability_model.predict(img) に渡してしまうと、モデルは「データの形が違う!」とエラーを起こしてしまいます。 そのため、「1枚だけの画像だけど、形の上では『枚数が1のデータの塊』ですよ」と見せかけるために、『 np.expand_dims 』を使って先頭に次元を追加します。 『 np.expand_dims(配列, 軸の番号) 』は、指定した位置に、長さ「1」(すなわち枚数が1)の新しい次元(軸)を追加する NumPy の関数です。 4.予測結果  さて、予測するデータの次元を『3次元テンソル』 にできたところで、予測をしてみましょう。 上記の結果は直感的にわかりにくいので、『f文字列』を使って、通常の小数に変換してみます。 この際、『for p in predictions_single:』でループを回すと、エラーが出てしまいます。 この原因は、『predictions_single』が、2次元の配列(形が (1, 10))になっているためです。 先ほどのステップで『np.expand_dims()』を使って画像にバッチの次元を追加したため...

#82 予測結果の図示と検証

イメージ
『np.argmax(predictions[数字])』で、画像が何かを予測できるようになりました。 これ以降は、下図のように『予測結果の一部を一覧で表示し、確率をグラフで図示する』コードを体験していきましょう。 1.予測結果の図示 画像と確率がグラフで分かりやすいですね。出来上がったモデルをプレゼンテーションする際に、非常に説得力のある図ですので、さっそくコードを見ていきましょう。 ※ Matplotlib が中心になりますので、興味のある方は、下記を参照してください。 【参考】 matplotlib – GridSpec で図の中に複数のグラフを作成する方法 興味が湧かない方は、こういうコードもあると頭の片隅にでも記憶しておいて、使う場面があったらコピペしましょう。 2.自作の関数 さて、ここでは、自作の関数を作成し、『予測結果の一部を一覧で表示し、確率をグラフで図示する』コードを書いていきます。  def 関数名(引数):          処理内容 関数名は自由に決めることができますが、慣習として すべて小文字 にします。関数名に複数の単語を使う時は、単語の間に『 _ 』を使います。 下記に、簡単な例を挙げておきます。 『 while 』は、条件を満たさなくなったら繰返し処理(ループ)を終了するものです。以前解説した『 forループ 』では、指定された回数繰り返すと終了でしたので、繰返し処理(ループ)の条件が異なりますね。 【参考】 #35 データの結合 3.画像と予測ラベルを表示する関数 チュートリアルのコードを見てみましょう。前半の部分は、自作の関数『 plot_image 』を定義したもので、それは、指定した1枚の画像を表示し、その下に『予測結果』、『確率(%)』、『実際の正解』をテキストで表示させる関数です。 4.10個のクラスの予測確率を棒グラフで表示する関数  後半の部分は、自作の関数『 plot_value_array 』を定義したもので、それは、モデルが出力した10個のクラスごとの確率を、0~1の範囲の棒グラフで可視化させるものです。 5.予測を検証する では、予測を検証するために、テスト用データセットの最初の画像(インデックス 0)について、モデルの予測画像と各クラスの予測確率の棒グラフを左右...

#81 予測

イメージ
このSectionでは、トレーニングされたモデルを使用して、テストデータのいくつかの画像に関する予測を行っていきます。 公式チュートリアルでは、下記の流れで予測を行い、確認をしています。本Sectionでも、この流れに沿って、Keras3に書き換えて体験していきましょう。   1.出力層にすべてのラベルの確率を出力するレイヤーを追加した予測用のモデルを新たに作る 2.そのモデルを用いて、テスト画像(10,000枚)に対する予測を一括で行う 3.特定のサンプルの結果を見てみる 4.どのラベルが一番確信度が高いかを出力する 1.出力層にすべてのラベルの確率を出力するレイヤーを追加した予測用のモデルを新たに作る 出力層にすべてのラベルの確率を出力するレイヤーを追加した予測用のモデルを『probability_model』と宣言します。 公式チュートリアルでは、①のコードを使っていますが、Keras3で書き換えるために『tf.keras』の部分を『keras』に変更します。 このコードは、元のモデルの出力(ロジット)を、人間にとって直感的に理解しやすい『確率(0%〜100% / 合計が1.0)』に変換する新しい予測専用モデルを作成するという処理を行っています。 2.そのモデルを用いて、テスト画像(10,000枚)に対する予測を一括で行う 次に、下記を用います。 モデル名.predict(データ名) 作成した確率変換用モデル『probability_model』を使い、テスト画像(10,000枚)に対する分類予測を一括で実行し、その結果(確率)を取得する処理を行います。結果は、『predictions』と宣言します。 『predictions』と宣言しなくてもいいのですが、他のメンバーにもわかるように、 『predictions』に近い表現をすることをお勧めします。 結果は、下記のようになります。 Kerasの predict() メソッドのデフォルトのバッチサイズ(1回にまとめて処理する画像枚数)は32枚です。10,000枚を32 枚ずつ処理すると、10000/32=312.5となり、端数を切り上げて合計313回のステップ(バッチ処理)で全10,000枚の予測を完了したことを表しています。 3.特定のサンプルの結果を見てみる 『probability_model』が...

#80 モデルのコンパイル、トレーニング、評価

イメージ
今回は、『#78 レイヤーの設定』で作成したモデルに対して、コンパイル、トレーニングを行い、さらにトレーニング済みのモデルを評価することを体験します。 コンパイルとは、後述しますが、トレーニングを進める方法や評価基準をどうするかというルールを設定して、モデルのトレーニングの準備することです。  その前に、ディープラーニングのしくみについて、簡単に説明しておきます。  1.ディープラーニングのしくみ 複数の 隠れ層 ( 中間層 )を持つ ニューラルネットワーク 、すなわち ディープラーニング は、神経細胞をモデルにシステム上で動くように設計されたものです。神経細胞のニューロンに対応した人工ニューロンを ノード と呼びます。下記のスライド図1では、〇で表されているところです。 このノードを拡大すると、図2のようになります。入力、入力の数、重み、バイアス、活性化関数、出力によって表されます。 ノードの構成する要素を簡単に説明すると下記のようになります。 重み → 入力情報の重要度を決定する倍率(係数)です。 → トレーニング前はランダムな初期値ですが、model.fit() によって最適な値に書き換えられていきます。 バイアス → ノードの感度・発火のしやすさを調整する閾値(定数)です。 → 重みと入力の積の総和に対して、ノード1個に対して1個の定数値として足し算されます。重みと同様にトレーニングによって自動更新されます。 活性化関数 → 生物学的なニューロンにおける「一定以上の刺激を受けると発火する」動作を再現するスイッチの役割を担っています。 → この関数を用いて出力を算出するのですが、ニューラルネットワークやディープラーニングでは、この関数を用いることにより単なる一次関数ではなく、複雑な曲線や境界線(非線形なパターン)を学習する表現力を獲得することになります。 出力 → ノードの最終計算結果、すなわち次の層への入力値となります。 ★「会議の発言がどう伝わるか」で考えるたとえ話が秀逸です! 【参考】 AI がざっくりわかる    https://note.com/nice_sable4056/n/nd989bea2c114 ************* ノードを構成している入力、入力の数、重み、バイアス、活性化関数を用いると出力は一つの数式で...

#79 【参考】インスタンス

イメージ
Keras3の公式APIドキュメントには、Input関数について、次のように記載されています。 (Google翻訳で和訳しました) https://keras.io/api/layers/core_layers/input/ "Kerasテンソルをインスタンス化するために使用されます。 Kerasテンソルは、テンソルに似たシンボリックなオブジェクトです。これには特定の属性が追加されており、モデルの入出力さえ分かればKerasモデルを構築できるようになっています。 例えば、a、b、cがKerasテンソルである場合、『model = Model(input=[a, b], output=c)』といった記述が可能になります。" Pythonはオブジェクト指向言語ですが、オブジェクト指向を理解する上で重要な『インスタンス』について理解を深めていきましょう。 Pythonでは、文字列や数値等のデータ、機械学習の際のデータの一つ一つに、重複しないID(識別番号)がつけられています。 IDをつけて管理されるデータの一つ一つを インスタンス と言います。 インスタンスが持つ 値 を出力するためには print関数 を使ってきましたが、インスタンスの ID を出力するためには、 id関数 を使用します。具体的にコードを書いて、違いを見てみましょう。 数値一つ一つがインスタンスであって、変数はインスタンスの所在地情報を持っているに過ぎないことがわかると思います。 今度は、リストの例を見てみましょう。 値が等しいかどうかを見るためには『 == 』、インスタンスのIDが等しいかどうかを見るためには『 is演算子 』が使われます。p、q、rのリストの値とIDを見てみましょう。 ④を見ると、pとqの値も、IDも異なっています。 一方、⑤では、pとrの値は同じですが、IDは異なっています。 変数の値が同じことを『 同値 』であると言い、IDが同じことを『 同一 』であると言います。 このように、Pythonでは、数値一つ一つがインスタンスであって、変数はインスタンスの所在地情報を持っているに過ぎないことを理解しておきましょう。 詳しく知りたい方は、下記の書籍をお勧めします。 【参考書籍】 Python ゼロからはじめるプログラミング さて、前述の『Kerasテンソルをインスタ...

#78 レイヤーの設定

イメージ
データの前処理が終わり、分析するデータが用意できたところで、今度は、モデルを作っていきます。 Section1で解説したように、多数の層からなるニューラルネットワークの学習のことをディープラーニングと呼び、 入力層 、 隠れ層(中間層) 、 出力層 を レイヤー と呼びます。ディープラーニングのモデルを作るにあたって、まずは、これらのレイヤーを設計、構築することが必要となります。 今回の体験するコードは、下記のスライドのように、 ①layersモジュールを取り込み 、 ②データを順番に流す処理 、 ③様々な種類を使ったレイヤーの構築 を行うものとなります。順を追って、説明していきます。 ① from keras import layers 何度も出てきたモジュールのインポート処理です。このTensorFlow公式サイトのチュートリアル『はじめてのニューラルネットワーク:分類問題の初歩』では、layersモジュールの取り込みを行っていないため、コードが、長くなっています(青字を付け加えなくてはなりません…)。 model = tf.keras.Sequential([     tf.keras. layers.Flatten(input_shape=(28, 28)),     tf.keras. layers.Dense(128, activation='relu'),     tf.keras. layers.Dense(10) ]) ② model = keras.Sequential() 今回のチュートリアルでは、『 Sequential Model 』を作成します。 ディープラーニングのモデルは、レイヤーで構成されており、各レイヤーは前のレイヤーからの入力を受け取り、出力を生成します。 Sequential Modelは、レイヤーを一直線に繋げて構成されるもっとも単純なモデルであり、一つの入力から一つの出力を生成することができます。 ( )内は、[ ]を付け、選択したレイヤーをカンマで区切って順番に並べていきます。 例えば、今回のチュートリアルのような画像分類の問題では、画像を入力とし、それがどのクラスに属するかを出力することができます。 Kerasには、『 Sequential Model 』の...

#77 データの前処理

イメージ
データがどのようなものかを観察したら、次は、データの前処理を行います。 1.データの目視 トレーニングの前に、データを前処理する必要があります。前処理はピクセルの値がどのようになっているかにより変わってきますので、画像の目視をしながら確認していきましょう。 Matplotlibを使って画像を描画します。コードは下記のようになります。  plt.figure()  plt.imshow(train_images[ 0 ])  plt.colorbar()  plt.grid( False )  plt.show() ここからは、コードの解説です。 ① plt.figure()  グラフや画像を書き込むための「白いキャンバス(外枠)」を新しく準備する際に使います。今回は引数がありませんが、( )内に次のような引数を指定することができます。 figsize : (width, height)のタプルを渡す。単位はインチ/dpi: 1インチあたりのドット数 facecolor : 背景色/edgecolor: 枠線の色 ② plt.imshow(train_images[0])  imshow は、数字の羅列である画像データを、私たちが目で見られる画像に変換してキャンバスに貼り付ける処理を行います。 ( )内の『train_images[0] 』は、訓練用データセットの「0番目(最初)の画像データ」を指しています。 ③ plt.colorbar()  画像の横にカラーバー(色と数値の対応表)を表示します。コンピュータにとって画像は『ピクセルごとの数値の集まり』です。このチュートリアルの画像は、各ピクセルが 0(黒・背景)から 255(白・衣類の部分)までの数値で表されているため、どの色がどの数値に対応しているかを視覚的に分かりやすくしてくれます。 ④ plt.grid(False)  画像の上に重なるグリッド線(網目状の補助線)を「非表示」にします。True にすると写真の上に方眼紙のような線が引かれてしまい、画像が見づらくなることがあるため、ここでは False にしてすっきりさせています。 ⑤ plt.show()  ここまで準備したキャンバスを、実際に画面として表示させます。1〜4行目までは「こういう画面を作れ」という命...