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

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

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

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

Q&A

0回答

1773閲覧

Kerasを使った簡単な画像分類ができるようになりたい

HirokiJapan

総合スコア12

Keras

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

0グッド

0クリップ

投稿2019/03/10 08:39

前提・実現したいこと

Kerasを使って簡単な画像分類ができるようになりたい。
ここに質問の内容を詳しく書いてください。
現在、Google ColaboratoryでKerasを用いて簡単な画像分類をしようと考えています。そこで、調べて見つけたコード(りんごとオレンジを分類する)のディレクトリの部分だけ変えて、自分で用意したファイルで実行してみました。
実行したコードは以下の通りです。

from keras.models import Sequential
from keras.layers import Activation, Dense, Dropout
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 = []

./data/train 以下のorange,appleディレクトリ以下の画像を読み込む。

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

dir1 = "data/train/" + dir label = 0 if dir == "apple": # appleはラベル0 label = 0 elif dir == "orange": # orangeはラベル1 label = 1 for file in os.listdir(dir1): if file != ".DS_Store": # 配列label_listに正解ラベルを追加(りんご:0 オレンジ:1) label_list.append(label) filepath = dir1 + "/" + file # 画像を25x25pixelに変換し、1要素が[R,G,B]3要素を含む配列の25x25の2次元配列として読み込む。 # [R,G,B]はそれぞれが0-255の配列。 image = np.array(Image.open(filepath).resize((25, 25))) print(filepath) # 配列を変換し、[[Redの配列],[Greenの配列],[Blueの配列]] のような形にする。 image = image.transpose(2, 0, 1) # さらにフラットな1次元配列に変換。最初の1/3はRed、次がGreenの、最後がBlueの要素がフラットに並ぶ。 image = image.reshape(1, image.shape[0] * image.shape[1] * image.shape[2]).astype("float32")[0] # 出来上がった配列をimage_listに追加。 image_list.append(image / 255.)

kerasに渡すためにnumpy配列に変換。

image_list = np.array(image_list)

ラベルの配列を1と0からなるラベル配列に変更

0 -> [1,0], 1 -> [0,1] という感じ。

Y = to_categorical(label_list)

モデルを生成してニューラルネットを構築

model = Sequential()
model.add(Dense(200, input_dim=1875))
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(2))
model.add(Activation("softmax"))

オプティマイザにAdamを使用

opt = Adam(lr=0.001)

モデルをコンパイル

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

学習を実行。10%はテストに使用。

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

テスト用ディレクトリ(./data/train/)の画像でチェック。正解率を表示する。

total = 0.
ok_count = 0.

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

dir1 = "data/test/" + dir label = 0 if dir == "apple": label = 0 elif dir == "orange": label = 1 for file in os.listdir(dir1): if file != ".DS_Store": label_list.append(label) filepath = dir1 + "/" + file image = np.array(Image.open(filepath).resize((25, 25))) print(filepath) image = image.transpose(2, 0, 1) image = image.reshape(1, image.shape[0] * image.shape[1] * image.shape[2]).astype("float32")[0] 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, "%")

これを実行したところ

ValueError Traceback (most recent call last)
<ipython-input-44-fc511eede129> in <module>()
67 model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"])
68 # 学習を実行。10%はテストに使用。
---> 69 model.fit(image_list, Y, nb_epoch=1500, batch_size=100, validation_split=0.1)
70
71 # テスト用ディレクトリ(./data/train/)の画像でチェック。正解率を表示する。

/usr/local/lib/python3.6/dist-packages/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, **kwargs)
950 sample_weight=sample_weight,
951 class_weight=class_weight,
--> 952 batch_size=batch_size)
953 # Prepare validation data.
954 do_validation = False

/usr/local/lib/python3.6/dist-packages/keras/engine/training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_array_lengths, batch_size)
749 feed_input_shapes,
750 check_batch_axis=False, # Don't enforce the batch size.
--> 751 exception_prefix='input')
752
753 if y is not None:

/usr/local/lib/python3.6/dist-packages/keras/engine/training_utils.py in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
136 ': expected ' + names[i] + ' to have shape ' +
137 str(shape) + ' but got array with shape ' +
--> 138 str(data_shape))
139 return data
140

ValueError: Error when checking input: expected dense_28_input to have shape (1875,) but got array with shape (1,)
SEARCH STACK OVERFLOW

というエラーメッセージが出ました。
一体どの部分がおかしいのか見当がつきません。
用いる画像の数を変えたりしたのですが、変化はなかったです。
回答よろしくお願いします

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問