🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1366閲覧

TensorFlow初心者のチュートリアルに関する

DaiGuard

総合スコア159

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/02/13 07:59

はじめまして、先日からTensorflowを触りだした
初心者プログラマです

以下リンクのチュートリアルを進めている過程で疑問が発生したので
質問させてください

初心者のためのTensorFlow 2.0 入門

質問内容

以下が実際のコードですが
modelを定義している場所では(28 x 28)の行列を入力として
出力を(10)のベクトルを出力するよう定義しているが

mode.fit(), model.evaluate()の関数では(28 x 28)の行列を入力として
出力を(1)のベクトルとなっています

でも実際にはmodel()で推定を行うと(28 x 28)の行列を入力として
出力を(10)のベクトルとして出力してくれます

この違いはどこでどのような処理をしてくれているのでしょうか

python

1import tensorflow as tf 2import numpy as np 3 4if __name__ == '__main__': 5 mnist = tf.keras.datasets.mnist 6 7 (x_train, y_train), (x_test, y_test) = mnist.load_data() 8 x_train, x_test = x_train / 255.0, x_test / 255 9 10 # このモデルでは最後の出力結果は(N x 10)行列 11 model = tf.keras.models.Sequential([ 12 tf.keras.layers.Flatten(input_shape=(28, 28)), 13 tf.keras.layers.Dense(128, activation='relu'), 14 tf.keras.layers.Dropout(0.2), 15 tf.keras.layers.Dense(10) 16 ]) 17 18 loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) 19 20 model.compile(optimizer='adam', loss=loss_fn, metrics=['accuracy']) 21 model.fit(x_train, y_train, epochs=5) 22 23 # 入力(N x 28 x 28) ⇛ 出力(N) 24 model.evaluate(x_test, y_test, verbose=2) 25 26 print(y_test[:5]) 27 28 probability_model = tf.keras.Sequential([ 29 model, 30 tf.keras.layers.Softmax() 31 ]) 32 33 # 入力(N x 28 x 28) ⇛ 出力(N x 10) 34 ans = probability_model(x_test[:5]).numpy() 35 36 print(ans) 37

実際の出力

console

1# print(y_test[:5])  2[7 2 1 0 4] 3 4# print(ans) 5[[1.6118878e-07 2.4484972e-08 5.1145807e-06 2.2368744e-04 2.4622858e-11 6 4.2596776e-07 5.8544987e-13 9.9976856e-01 3.4579617e-07 1.6388203e-06] 7 [2.2706962e-08 6.7041372e-05 9.9992490e-01 7.6350261e-06 2.0046315e-12 8 3.5378790e-07 1.5796034e-07 1.1476339e-11 5.6065048e-08 5.7253244e-11] 9 [3.3690245e-07 9.9946076e-01 1.1417094e-04 4.4337116e-06 5.6784207e-05 10 2.9750072e-06 2.7395367e-06 2.8639822e-04 7.1094953e-05 2.3676076e-07] 11 [9.9996448e-01 3.6563709e-08 8.4685371e-06 7.8264009e-09 4.5565784e-07 12 1.4461138e-08 3.2253117e-06 1.1364364e-05 8.1827267e-10 1.1975261e-05] 13 [1.1635639e-06 3.2568303e-07 3.1758764e-06 6.8589991e-09 9.9955612e-01 14 9.3095359e-08 3.5744374e-06 3.3490895e-05 1.2255333e-06 4.0069365e-04]]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

質問意図として、「出力」をmode.fit(), model.evaluate()等の返り値ではなく、引数としての正解ラベルであるy_trainy_testを意味していると理解して、回答します。(関数の「出力」という言い方は、関数の返り値の意味にも取れるので、違う言い方がよいでしょう。モデルの入力・出力とか、レイヤーの入力・出力という言い方なら通じます)

実際のmodelDense(10)として10次元を出力しているのに、mode.fit(), model.evaluate()等の正解ラベルがカテゴリ値の1次元配列でよいのは、それらを結びつけて評価を計算する関数であるSparseCategoricalCrossentropyを使っているからです。

SparseCategoricalCrossentropyの定義はこちらを参照ください。

投稿2021/02/13 08:27

編集2021/02/13 08:35
toast-uz

総合スコア3266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DaiGuard

2021/02/13 08:41

回答いただきありがとうございます 今回、使用しているラベルの`y_train`, `y_test`は`[0-9]`で入力されているので `model`の最後のレイヤがDense(10)でサイズが合うということでしょうか たとえばラベルが`[0-19]`で表現されていたら Dense(20)に変える必要があるのでしょうか
DaiGuard

2021/02/13 08:53

ありがとうございます。 勉強になりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問