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

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

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

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

深層学習

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

Q&A

解決済

1回答

240閲覧

tensorflow+kerasでの分類

fica

総合スコア12

Keras

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

深層学習

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

0グッド

0クリップ

投稿2018/01/10 10:22

###前提・実現したいこと
data/testのフォルダの中に三つのフォルダがあり、それぞれアウター、パンツ、シャツの画像を入れています。
この三つの種類の画像自体を一つのフォルダにまとめて、分類するにはどうすればいいですか?

###発生している問題・エラーメッセージ

エラーメッセージ

###該当のソースコード
from keras.models import Sequential
from keras.layers import Activation, Dense, Dropout, Convolution2D, Flatten, MaxPooling2D
from keras.utils.np_utils import to_categorical
from keras.optimizers import Adagrad
from keras.optimizers import Adam
import numpy as np
from PIL import Image
import os

image_list = []
label_list = []

for dir in os.listdir("data/train"):
if dir == ".DS_Store":
continue

dir1 = "data/train/" + dir label = 0 if dir == "outerwear": label = 0 elif dir == "pants": label = 1 elif dir == "shirt": label = 2 for file in os.listdir(dir1): if file != ".DS_Store": label_list.append(label) filepath = dir1 + "/" + file image = np.array(Image.open(filepath).resize((100, 100))) print(filepath) image = image.transpose(2, 0, 1) print(image.shape) image_list.append(image / 255.)

image_list = np.array(image_list)

Y = to_categorical(label_list)

model = Sequential()
model.add(Convolution2D(32, 3, 3, border_mode='same', input_shape=(3, 100, 100)))
model.add(Activation("relu"))
model.add(Convolution2D(32, 3, 3))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2), border_mode=("same")))
model.add(Dropout(0.25))

model.add(Flatten())

model.add(Dense(200))
model.add(Activation("relu"))
model.add(Dropout(0.2))

model.add(Dense(200))
model.add(Activation("relu"))
model.add(Dropout(0.2))

model.add(Dense(3))
model.add(Activation("softmax"))

opt = Adam(lr=0.0001)

model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"])

model.fit(image_list, Y, nb_epoch=100, batch_size=25, validation_split=0.1)

total = 0.
ok_count = 0.

for dir in os.listdir("data/test"):
if dir == ".DS_Store":
continue

dir1 = "data/test/" + dir label = 0 if dir == "outerwear": label = 0 elif dir == "pants": label = 1 elif dir == "shirt": label = 2 for file in os.listdir(dir1): if file != ".DS_Store": label_list.append(label) filepath = dir1 + "/" + file image = np.array(Image.open(filepath).resize((100, 100))) print(filepath) image = image.transpose(2, 0, 1) result = model.predict_classes(np.array([image / 255.])) print("label:", label, "result:", result[0]) total += 1. if label == result[0]: ok_count += 1.

print("seikai: ", ok_count / total * 100, "%")
###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

guest

回答1

0

ベストアンサー

何のために3つのディレクトリに分けているかを考えれば、ほかのやり方がいろいろあることに気が付くと思います。分けている理由は正解かどうかを自動判定するためにあらかじめディレクトリ名に正解を指定してあるわけです。

してみれば、別にディレクトリでなくても、以下のようなテキストファイルに画像ファイル名とラベルの組の一覧であってもいいわけです。

csv

1aaaa.png,1 2bbbb.png,2 3cdef.png,0 4xyz.png,2

また、もっと単純に、data/testの中に、outerwear,pants,shirtで始まるファイルがたくさん入っていることにしてもかまいません。例えば、pants-0153.pngようなものです。これを前提にすれば、後半の2重ループは、以下のような単ループになることがわかるでしょう。

python

1total = 0. 2ok_count = 0. 3dir = "data/test" 4for file in os.listdir(dir): 5 if file != ".DS_Store": 6 if file.startswith("outerwear"): 7 label = 0 8 elif file.startswith("pants"): 9 label = 1 10 elif file.startswith("shirt"): 11 label = 2 12 filepath = dir + "/" + file 13 image = np.array(Image.open(filepath).resize((100, 100))) 14 print(filepath) 15 image = image.transpose(2, 0, 1) 16 result = model.predict_classes(np.array([image / 255.])) 17 print("label:", label, "result:", result[0]) 18 19 total += 1. 20 21 if label == result[0]: 22 ok_count += 1. 23 24print("seikai: ", ok_count / total * 100, "%")

投稿2018/01/10 11:08

編集2018/01/10 11:49
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

fica

2018/01/10 11:34

詳しく解説していただいでありがとうございました。 一つ質問なんですが最後に正解率が表示されていたのですが、書いていただいたソースに変えたところ 0%になってしまいました。こちらの表示を正確に出すことはできなくなってしまったのでしょうか?
退会済みユーザー

退会済みユーザー

2018/01/10 11:43

コードは回答のために暫定的に抜粋加工したものですので、動作確認はしていません。 ちなみに比較の結果はどのようになっていますか。 totalとok_countをprint()して、状況を確認されてはいかがですか。
退会済みユーザー

退会済みユーザー

2018/01/10 11:46

おそらくこのコードの前に以下の2行を入れていないためでしょう。 total = 0. ok_count = 0.
mkgrei

2018/01/10 13:14

ファイル名が正しくないせいでラベルが拾えなくて if label == result[0] が常に偽であるためではないでしょうか? totalが足されてないと0割りエラーになるかと。
fica

2018/01/11 04:28

大変よく理解することができました。お二人ともありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問