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

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

ただいまの
回答率

88.92%

Kerasを用いたニューラルネットワークのエラーについて

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 162

yui1020

score 7

前提・実現したいこと

python初心者です。
Kerasでニューラルネットワークを実装していますが下記のエラーが出ており困っております。
自分で用意した画像のデータセット(りんご、バナナ、オレンジ、桃)を使って画像認識のプログラムを作りたいです。
ディレクトリにはそれぞれ apple,peach,banana,orangeのフォルダがありそこに各画像が入っています。

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

assert_is_compatible_with
raise ValueError("Shapes %s and %s are incompatible" % (self, other))

ValueError: Shapes (None, 4) and (None, 2) are incompatible

該当のソースコード

import keras
from keras.utils import np_utils
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.preprocessing.image import array_to_img, img_to_array,load_img
import numpy as np

from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import os
import re
import glob

path=os.getcwd()
filelist=[]
imagelist=[]
x=[]
y=[]

for f in os.listdir(path):
    if os.path.isdir(os.path.join(path,f)):
        filelist.append(f)

for i in range(len(filelist)):
    path="./"+filelist[i]+"/*.jpg"
    image=glob.glob(path)
    imagelist.append(image)

    for k in range(len(imagelist[i])):
        pictures=imagelist[i][k]
        img=img_to_array(load_img(pictures,target_size=(64,64)))
        x.append(img)
        y.append(i)

x=np.asarray(x)
y=np.asarray(y)


#画素数を0から1へ変換、正規化
x=x.astype("float32")
x=x/255.0

#クラスの形式を変換、ラベルをベクトルに変換しないといけない
#今は0から3の四つ
y=np_utils.to_categorical(y,4)

#学習とテストに分けるテストサイズが3割指定
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.30,random_state=111)

model=Sequential()
model.add(Conv2D(32,(3,3),padding="same",
    input_shape=x_train.shape[1:]))
model.add(Activation("relu"))
model.add(Conv2D(32,(3,3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))

model.add(Conv2D(64,(3,3),padding="same"))
model.add(Activation("relu"))
model.add(Conv2D(64,(3,3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512))
model.add(Activation("relu"))
model.add(Dropout(0.5))
model.add(Dense(2))
model.add(Activation("softmax"))

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

history=model.fit(x_train,y_train,batch_size=5,epochs=200,
    validation_data=(x_test,y_test),verbose=0)

plt.plot(history.history["acc"])
plt.plot(history.history["val_acc"])
plt.title("model accuracy")
plt.xlabel("epoch")
plt.ylabel("accuracy")
plt.legend(["acc","val_acc"],loc="lower right")
plt.show()

試したこと

ネットで検索しても解決方法が見つからず困っており、回答いただけるとありがたいです。

補足情報(FW/ツールのバージョンなど)

python 3.7.0

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

エラーは「ValueError: Shapes (None, 4) and (None, 2) are incompatible」であり、どこに (None, 4) と (None, 2) のベクトルが生成していますか?と尋ねると、

(None, 4) は「りんご、バナナ、オレンジ、桃」の分類ベクトル

ではないでしょうか?と推測して、ここで生成したと思います:

#クラスの形式を変換、ラベルをベクトルに変換しないといけない
#今は0から3の四つ
y=np_utils.to_categorical(y,4)

では、どこで y が使われていますか?

#学習とテストに分けるテストサイズが3割指定
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.30,random_state=111)

history=model.fit(x_train,y_train,batch_size=5,epochs=200,
    validation_data=(x_test,y_test),verbose=0)

学習とテストに分けるだけではエラーが出るはずがありません。だとしたら、このエラーが出るのはトレーニングの時にしかありません。学習のデータに分類4つがありまして、(None, 4) のベクトルです。トレーニングの時はそのデータがモデルの出力と比較するはずです。モデルの出力はどんな形ですか?

model.add(Flatten())
model.add(Dense(512))
model.add(Activation("relu"))
model.add(Dropout(0.5))
model.add(Dense(2))
model.add(Activation("softmax"))

最後の Dense(2) によって、モデルの出力の形は (None, 2) になってしまいました。モデルの出力の形が学習のデータの分類の形 (None, 4) と一致していないので、エラーが出てしまいました。

最後の Dense(2) が Dense(4) にしてみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/21 19:27

    回答ありがとうございます。Dense(4)にしたところ次のようなエラーが発生してしまいました。
    line 58, in to_categorical
    categorical[np.arange(n), y] = 1
    IndexError: index 4 is out of bounds for axis 1 with size 4
    ご回答いただけましたら幸いです。

    キャンセル

  • 2020/07/21 20:02

    それは y の中に 0, 1, 2, 3 だけではなく、 4 もある時出るエラーです。このスクリプトを実行するところにはフォルダーが4つだけ、そして隠しフォルダーがないとご確認してください。

    キャンセル

0

とりあえずmodel.add(Dense(2))model.add(Dense(4))ではないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る