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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

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

機械学習

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

Python

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

Q&A

解決済

2回答

2985閲覧

CNNを用いた2値分類のデータのラベル付けについて

---stax---

総合スコア148

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

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

機械学習

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

Python

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

0グッド

1クリップ

投稿2019/02/26 13:45

表題の件で質問させてください。
画像データを用いた分類問題の学習をしております。
使用しているフレームワークはkerasです。

以下のリンクを参考にさせていただいています。
Kerasを使って2クラス分類のCNN

その中で以下のコードの部分で訓練データ、検証データの読み込みやサイズ変更を行っていると思うのですが、
class_mode='binary' というパラメータには2値のラベルが必要とあります。

python

1from tensorflow.python.keras.preprocessing.image import ImageDataGenerator 2 3# すべての画像を1/255でスケーリング 4train_datagen = ImageDataGenerator(rescale=1./255) 5test_datagen = ImageDataGenerator(rescale=1./255) 6 7# ImageDataGeneratorを使ってディレクトリから画像を読み込む 8train_generator = train_datagen.flow_from_directory( 9 train_dir, # ターゲットディレクトリ 10 target_size=(120, 40), # すべての画像サイズを120*40に変更 11 color_mode='grayscale', # ここを追加 12 batch_size=20, # バッチサイズ 13 class_mode='binary') # binary_crossentropyを使用するため2値のラベルが必要 14validation_generator = test_datagen.flow_from_directory( 15 validation_dir, 16 target_size=(120, 40), 17 color_mode='grayscale', 18 batch_size=20, 19 class_mode='binary')

記事に掲載されているコードがすべてではないのかもしれませんが、
良品、不良品の画像データが混じったtrain_dirからデータを読み込んでいるなかで、
この画像は良品、この画像は不良といった正解ラベルのデータがないように思います。

知識も浅くkeras自体も初めて触るのでわかっていないだけかもしれませんが、画像データに対する正解データの
作成の仕方、また利用方法はどのようにすればよいのでしょうか?

今回のような2値分類であれば0、1で正解は表現できると思うのですが画像を読み込む際に、この画像は0、この画像は1というように割り振るのでしょうか?(これはやり方が想像つきません...)
それとも良品、不良品のデータ数分だけ0の配列、1の配列を作るのでしょうか?(良品、不良品が混じったフォルダからデータを読み出す場合は配列のデータと画像データの紐づけが分かりません...)

かなり的外れな質問をしているかもしれませんがアドバイス宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

公式リファレンス を確認するのが一番よいです。

Keras の flow_from_directory は、以下のようなフォルダ構成を仮定しています。
各サブフォルダが1クラスに該当するので、そのクラスの画像を入れておくと読み込んだ際に flow_from_directory() 内でラベル付けしてくれます。

例: 猫、犬、鳥の3クラス分類の場合

dataset ├─cat │ ├─1.png │ ├─2.png │ ... ├─dog └─bird

python

1from tensorflow.python.keras.preprocessing.image import ImageDataGenerator 2 3train_datagen = ImageDataGenerator(rescale=1./255) 4 5train_generator = train_datagen.flow_from_directory( 6 'dataset', 7 target_size=(224, 224), # モデルの入力サイズ 8 color_mode='grayscale', # 読み込み形式 9 batch_size=20, # バッチサイズ 10 class_mode='categorical')

例: 良品、不良品の場合

dataset ├─positive: 不良品の画像 │ ├─1.png │ ├─2.png │ ... └─negative: 良品の画像

python

1from tensorflow.python.keras.preprocessing.image import ImageDataGenerator 2 3train_datagen = ImageDataGenerator(rescale=1./255) 4 5train_generator = train_datagen.flow_from_directory( 6 'dataset', 7 target_size=(224, 224), # モデルの入力サイズ 8 color_mode='grayscale', # 読み込み形式 9 batch_size=20, # バッチサイズ 10 class_mode='binary')

投稿2019/02/26 14:06

編集2019/02/26 14:18
tiitoi

総合スコア21956

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

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

---stax---

2019/02/26 14:57 編集

回答ありがとうございます。 そういう仕組みになっていたのですね。 回答いただいた例でいうと、catフォルダ内のすべての画像が0、dogフォルダ内のすべての画像が1、birdフォルダ内のすべての画像が2のようなラベルが振られるという理解でよいでしょうか? そうだとするとdatasetフォルダ内はtrain,validation,testのような階層にしてしまうとtrainが0、validationが1、のようにラベルが振られてしまうということですよね… 以下のような階層にして各flow_from_directory()のターゲットディレクトリをtrainやvalidation、testと個別に指定すればtrainのフォルダ内は0、1でラベルが付き、validationやtestのフォルダ内もそれぞれ0、1が付くという理解でよいでしょうか? おかしな理解をしていたらすいません。 dataset ├─train │ ├─ok │ │ ├─1.png │ │ ├─2.png │ │ │ ├─ng │   ├─1.png │   ├─2.png │ ├─validation │ ├─ok │ │ ├─5.png │ │ ├─6.png │ │ │ ├─ng │   ├─7.png │   ├─8.png │ ├─test │ ├─ok │ │ ├─9.png │ │ ├─10.png │ │ │ ├─ng │   ├─11.png │   ├─12.png
tiitoi

2019/02/26 15:04 編集

上記のようなフォルダ構成にして、以下のように指定するのが正解なので、その認識であっています。 train_gen = train_datagen.flow_from_directory('dataset/train') val_gen = train_datagen.flow_from_directory('dataset/validation') test_gen = train_datagen.flow_from_directory('dataset/test') フォルダ名がそのままクラス名と解釈されるので、ok, ng という名前は train/validation/test ですべて同じにしてください
---stax---

2019/02/26 15:26

回答ありがとうございます。 内容理解できました。ありがとうございます。 つたない返答で申し訳ありませんでした。 先ほどの返答でのフォルダ階層だとあらかじめtrain,validation,testに画像を分けているのでtrainに何枚、testに何枚というような指定をコード内でする必要はないかと思います。 tiitoi様が追記して頂いた(例: 良品、不良品の場合)のような階層でflow_from_directory()のターゲットディレクトリもdatasetとした場合はすべてのデータがpositiveとnegativeに格納されているので train,validation,testにそれぞれ割り当てるデータ数を指定する必要があるかと思うのですがこのような場合はどの部分でデータの割り振りを行うのでしょうか? (パラメータをまだ調べれていないのでそこで指定できるのであればすいません。。。)
tiitoi

2019/02/26 15:44 編集

flow_from_directory() を使うのであれば、23:55 のコメントにあるようなフォルダ構成に予めしておく必要があります。 元のデータセットを以下のような構成にしておいて ├─ok │ ├─1.png │ ├─2.png │ └──ng   ├─1.png   └─2.png そこから 23:55 のコメントにあるように train,validation,test を分けるようなスクリプトを書けばいいかと思います。(そこは自分で作る必要がありますが、数行で書ける話かと思います。) Model クラスにジェネレーターを引数にとる関数があるので、学習時は fit_generator(train_gen, validation_data=val_gen) テスト時は predict_generator(test_gen) などとジェネレーターを渡してあげます。
tiitoi

2019/02/26 15:44

これまでの話は flow_from_directory() を使うなら ということなので、通常の fit() 関数を使うのであれば、YutaSaito さんが回答くださってるようにデータを読み込んで、ラベル作ってといった処理を自分で書くことになります。
---stax---

2019/02/28 02:11

返答遅くなり申し訳ありません。 アドバイスいただいたとおりに階層を分けると無事に学習開始させることができました。 keras自体の扱い方を勉強しながら進めていきます。 ありがとうございました。
guest

0

ご推測の通り、識別問題であれば正解ラベルを用意する必要があります。
一般に提供されているデータセットでは、画像とそれに対応する正解がセットとなっているものがほとんどです。

提供されているデータセットなのであれば、答えとなっているファイルがどこかに存在していると思われるので、それを読み込めば大丈夫です。
もしくはフォルダ名が正解になっているのではないでしょうか?

最終的な配列の構造としては

python

1X = [[image1], [image2], ...] #trainもしくはvalidationの入力 2Y = [0,1, ...] #正解ラベルの配列 3len(X) == len(Y)

となっていることが必須となります。

わかりにくい点があればなんなりと申し付けください

投稿2019/02/26 14:05

YutaSaito

総合スコア36

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

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

---stax---

2019/02/26 15:31

回答ありがとうございます。 やはりラベルは必要なのですね。 自分が取り組んでいる内容のデータではOK、NGという画像はありますがラベルデータはないのでフォルダ名をラベルに出来るよう進めてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問