質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

Python

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

Q&A

解決済

5回答

2395閲覧

MINISTデータ画像を使用した、予測について

aae_11

総合スコア178

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

Python

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

0グッド

0クリップ

投稿2020/02/11 09:33

編集2020/02/11 09:34

ゼロから作るDeepLearningという本にて、分からない部分がありました為、質問させて頂きました。
具体的には、以下のコードの内容となります。

# coding: utf-8 import sys, os sys.path.append('/Users/shinya/Desktop/DeepLearning/deep-learning-from-scratch/') # 親ディレクトリのファイルをインポートするための設定 # sys.path.append(os.pardir) # 親ディレクトリのファイルをインポートするための設定 sys.path.append('/Users/shinya/Desktop/DeepLearning/deep-learning-from-scratch/ch03/') import numpy as np import pickle from dataset.mnist import load_mnist from common.functions import sigmoid, softmax def get_data(): (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False) return x_test, t_test def init_network(): #学習済みの重みパラメータ読み込み with open("/Users/shinya/Desktop/DeepLearning/deep-learning-from-scratch/ch03/sample_weight.pkl", 'rb') as f: network = pickle.load(f) return network def predict(network, x): W1, W2, W3 = network['W1'], network['W2'], network['W3'] b1, b2, b3 = network['b1'], network['b2'], network['b3'] a1 = np.dot(x, W1) + b1 z1 = sigmoid(a1) a2 = np.dot(z1, W2) + b2 z2 = sigmoid(a2) a3 = np.dot(z2, W3) + b3 y = softmax(a3) return y x, t = get_data() network = init_network() accuracy_cnt = 0 for i in range(len(x)): y = predict(network, x[i]) p= np.argmax(y) # 最も確率の高い要素のインデックスを取得 # print(p) # ニュートラルネットワークが予測した答えと正解ラベルを比較し、正解した割合を # 認証制度(accuracy)とする if p == t[i]: accuracy_cnt += 1 print("Accuracy:" + str(float(accuracy_cnt) / len(x)))

こちらのコードの内容なのですが、MINIST画像を読み込みニュートラルネットワークにて、予測をする?といった内容らしいのですが、自分自身、処理の内容が把握しきれていない状況でございます...
y = predict(network, x[I])こちらの部分については、予測した結果の配列が入っているのですが、そもそもなのですが、ある数字のデータをpredict関数にかけてニュートラルネットワークにて処理を行うにしても、何故ニュートラルネットワークの部分では、入ってきたデータが数字であるということが分かり、その数字がどういうものであるかといったことを、導き出す必要があるといったことが分かるのでしょうか...?
機械学習の勉強をしていて、若干混乱してしまいました為、どなたか、ご助言頂けましたら幸いです...
よろしくお願いします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/02/11 09:58 編集

> 何故ニュートラルネットワークの部分では、入ってきたデータが数字であるということが分かり、 > その数字がどういうものであるかといったことを、導き出す必要があるといったことが分かるのでしょうか...? この一文は以下の2つの質問という理解でよろしいでしょうか? Q.1 どのようにして、ニューラルネットワークが「入力された画像(例えば8bitグレースケールや白黒画像)が数字だ」と言い切るのか?(数字ではない可能性を計算しないのか?) Q.2 どのようにして、ニューラルネットワークが入力された画像が数字かどうか評価するという人間の意図した動作をするように仕向けられているのか?(ニューラルネットワークが入力値と出力値の学習データを渡されただけで、どうして人が渡したデータを計算しなければならないと「理解」できるのか?)
aae_11

2020/02/11 10:03

はい。まさしく、おっしゃる通りの部分が疑問な点です...
guest

回答5

0

数字だと認識なんかしていない。

人間にA, B,C, D, E, Fを書かせてそれを予測させたら

A,C,Dは0だと
Bは8とか3だと
Eは2や5だと
Fは2や9や6だと
分類するだろう。

学習してないデータなので書き方のほんのちょっとした差で結果が変わる。(ACDは安定して0だろうけど)

学習した分類のどれに一番近いかを計算するだけ。

投稿2020/02/12 00:48

quickquip

総合スコア11029

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

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

0

例えば、このサイト http://myselph.de/neuralNet.html などで MNIST データに基づいた機械学習による識別を試すことができます。
試しに、真っ白のまま識別させたら 7 になり、真っ黒に塗りつぶしたら 8 になり、数字ではない文字や適当な落書きを識別させても何らかの数字が出てきました。
というわけで、無理やり数字だとしたら 0 〜 9 のどれに近いか? ということは答えてくれますが、数字かどうかの判定はできません。そのためには、数字でない画像をたくさん学習させる必要があるんだと思います。

投稿2020/02/12 16:15

hoshi-takanori

総合スコア7893

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

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

aae_11

2020/02/13 00:48

ご回答ありがとうございます。 なんとなく、感覚を掴むことができました!
guest

0

ベストアンサー

そもそもなのですが、ある数字のデータをpredict関数にかけてニュートラルネットワークにて処理を行うにしても、何故ニュートラルネットワークの部分では、入ってきたデータが数字であるということが分かり、その数字がどういうものであるかといったことを、導き出す必要があるといったことが分かるのでしょうか...?

ニューラルネットワークは、学習データを使って、識別するために必要な数字の特徴に反応するように、ニューロン間の重みが調整されます。
なので、学習データに含まれていない数字の画像が入ってきたとしても、そのデータに対して、ニューロンが反応するので、識別できます。

例えば、質問者さんが「画像に写っている果物がりんご、なしのどちらか当ててください」と言われたら、果物の色などに注目して判断すると思います。
このどこに注目すれば識別できるかというのをニューラルネットワークは学習を通して学びます。
もちろん、MNIST の学習を行ったニューラルネットワークにりんごの画像を渡したとしても、学習していないデータなので、それはりんごだと識別できません。
MNIST の学習を行ったニューラルネットワークで識別できるのは、学習した数字の画像だけです。

投稿2020/02/11 15:16

編集2020/02/11 15:21
tiitoi

総合スコア21954

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

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

aae_11

2020/02/12 04:47 編集

ご回答ありがとうございます。 自分が疑問だった部分が、ハッキリとしたのですが、ご回答くださいました「MNIST の学習を行ったニューラルネットワークで識別できるのは、」こちらなのですが、「MINISTの学習」 というのは、コードでいいますと、どの部分で行われているのでしょうか...?
tiitoi

2020/02/12 04:59

質問のコードには学習する処理はありません。 「#学習済みの重みパラメータ読み込み」とコメントがあるように、すでに学習した結果を読み込んで、それを使って推論しています。 学習する部分もその書籍を読みすすめていくと出てきたと思いますよ。
aae_11

2020/02/12 08:55

ご返信ありがとうございます >すでに学習した結果を読み込んで、それを使って推論しています。 もしかしたら、初歩的な質問となってしまうかもしれないのですが、「学習」というのは「重みパラメータ」に行い、入力データを推論する処理が行われる為、基本的には何かを学習させる処理というのは、重みパラメータを作成する処理であると言い換えられるのでしょうか...?
tiitoi

2020/02/12 09:20

> 基本的には何かを学習させる処理というのは、重みパラメータを作成する処理であると言い換えられるのでしょうか...? そのとおりです。 ディープラーニングの学習は学習データを使って、重みパラメータを作成することです。
aae_11

2020/02/12 09:56

そうだったのですね... 半ばもしかしたら違うかな...と思い、質問させて頂いたのですが、あっていたようで、安心しました... ご親切に教えて頂きありがとうございました
guest

0

お疲れ様です。
MNISTを使った問題では、入力画像を0~9の10種類に分類します。
ニューラルネットワークで、かなり、高精度に分類できます。
あまり特別な前提はありません。
この本で実際に動かせるのは、比較的簡単なコードですが、
複雑なニューラルネットワークを使えば、かなり、高精度に分類できます。

ここでの、
「network」が、数字が区別できるように仕上がっているというか、学習済みであるので、
predictできるのですが、そのあたりが、感じがよくからないということですかね。

投稿2020/02/11 11:44

編集2020/02/11 11:52
0kcal

総合スコア275

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

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

aae_11

2020/02/11 12:44

ご回答ありがとうございます。 >「network」が、数字が区別できるように仕上がっているというか、学習済みであるので、 predictできるのですが、そのあたりが、感じがよくからないということですかね。 はい...いまいち、そもそも、何故数字を区別するようになるのかと言った部分が疑問なんですよね...
0kcal

2020/02/11 13:13

お疲れ様です。 おそらく、他の方も含め、質問の意図が以下のどれかがうまくつかめていない気がします。 タイプ1、技術的に、なぜ、そのようなことができるのかが理解できない。 タイプ2、なぜ、そのようなことをする必要があるのかが理解できない。 タイプ3、何が実現されているのか?何をしているのかが理解できない。 どれでしょうか?
aae_11

2020/02/11 13:19 編集

ご返信ありがとうございます。 分かりづらく、申し訳ないです... タイプとしましては「1」かと思います。そもそも何故、predict関数内には、テスト用の数字データしか入れていないにも関わらず、それが数字だと認識し、分類しているのかと言った部分が疑問なんですよね...
0kcal

2020/02/11 13:25

これの場合は、10分類になっているので、かならず、0~9のどれかになります。 例えば、11分類にして、0~9でないというのを作っても、問題ありません。 尚、これの場合は、数字以外の入力は、普通、いれません。MNISTと並んでよく登場するデータセットにCIFAR-10というのがあるのですが、これは、猫とか車とか、10種類のものを分類するデータセットです。
guest

0

何故ニュートラルネットワークの部分では、入ってきたデータが数字であるということが分かり、その数字がどういうものであるかといったことを、導き出す必要があるといったことが分かるのでしょうか...?

どちらも、わかっていません。
まず、プログラムに意思はありません。理解しません。与えられた仕事をこなすのみです。
「データ配列を与えられる。それに一定の計算を行う。計算結果を出力する。」
これだけです。ですから、MNISTは数字ですが、アルファベットを与えてみてください。よく似ているとモデルが判別する数字が出てきます。「犬種」を覚えたモデルに唐揚げの画像を与えると、「トイプードル」と返ってきます。その程度の「認識」しかしていません。

投稿2020/02/11 11:25

Q71

総合スコア995

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

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

aae_11

2020/02/11 12:53

ご回答ありがとうございます。 自分の疑問としましては、そもそも何故、配列が与えられたら、数字を識別し、結果を出力するのかと言った部分なのですよね... と言いますのも、predict関数内には、テスト用の数字データしか入れていない為、どうやって、それが数字だと認識し、分類しているのかと言った部分が疑問なんですよね...
Q71

2020/02/14 04:06

いえ、ですから、「数字」とか認識していません。 画像認識のAIが行うのは判別です。この判別は、最も単純にすると y = ax + b の直線と比べて上にあるか、下にあるか、です。こういう判別ができる様に、aとbを求めます=学習します。 こうしてできた式にx、画像を入れて、出てきたyがどのあたりにあるかで、どの数字なのかを判別します。極々単純に説明したら、ですけど。 数字かどうかは認識していません。「A」を入れたからといって「数字じゃない」と拒否したりしません。xにどんな数字を入れてもyは計算できますよね。そういうことです。計算することしかできません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問