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

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

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

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

Python

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

Q&A

解決済

2回答

444閲覧

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

yui1020

総合スコア7

Keras

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

Python

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

0グッド

0クリップ

投稿2020/07/21 07:34

前提・実現したいこと

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

該当のソースコード

python

1import keras 2from keras.utils import np_utils 3from keras.layers.convolutional import Conv2D, MaxPooling2D 4from keras.models import Sequential 5from keras.layers.core import Dense, Dropout, Activation, Flatten 6from keras.preprocessing.image import array_to_img, img_to_array,load_img 7import numpy as np 8 9from sklearn.model_selection import train_test_split 10import matplotlib.pyplot as plt 11import os 12import re 13import glob 14 15path=os.getcwd() 16filelist=[] 17imagelist=[] 18x=[] 19y=[] 20 21for f in os.listdir(path): 22 if os.path.isdir(os.path.join(path,f)): 23 filelist.append(f) 24 25for i in range(len(filelist)): 26 path="./"+filelist[i]+"/*.jpg" 27 image=glob.glob(path) 28 imagelist.append(image) 29 30 for k in range(len(imagelist[i])): 31 pictures=imagelist[i][k] 32 img=img_to_array(load_img(pictures,target_size=(64,64))) 33 x.append(img) 34 y.append(i) 35 36x=np.asarray(x) 37y=np.asarray(y) 38 39 40#画素数を0から1へ変換、正規化 41x=x.astype("float32") 42x=x/255.0 43 44#クラスの形式を変換、ラベルをベクトルに変換しないといけない 45#今は0から3の四つ 46y=np_utils.to_categorical(y,4) 47 48#学習とテストに分けるテストサイズが3割指定 49x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.30,random_state=111) 50 51model=Sequential() 52model.add(Conv2D(32,(3,3),padding="same", 53 input_shape=x_train.shape[1:])) 54model.add(Activation("relu")) 55model.add(Conv2D(32,(3,3))) 56model.add(Activation("relu")) 57model.add(MaxPooling2D(pool_size=(2,2))) 58model.add(Dropout(0.25)) 59 60model.add(Conv2D(64,(3,3),padding="same")) 61model.add(Activation("relu")) 62model.add(Conv2D(64,(3,3))) 63model.add(Activation("relu")) 64model.add(MaxPooling2D(pool_size=(2,2))) 65model.add(Dropout(0.25)) 66 67model.add(Flatten()) 68model.add(Dense(512)) 69model.add(Activation("relu")) 70model.add(Dropout(0.5)) 71model.add(Dense(2)) 72model.add(Activation("softmax")) 73 74model.compile(loss="categorical_crossentropy", 75 optimizer="SGD", 76 metrics=["accuracy"]) 77 78history=model.fit(x_train,y_train,batch_size=5,epochs=200, 79 validation_data=(x_test,y_test),verbose=0) 80 81plt.plot(history.history["acc"]) 82plt.plot(history.history["val_acc"]) 83plt.title("model accuracy") 84plt.xlabel("epoch") 85plt.ylabel("accuracy") 86plt.legend(["acc","val_acc"],loc="lower right") 87plt.show() 88 89 90

試したこと

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

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

python 3.7.0

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

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

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

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

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

guest

回答2

0

ベストアンサー

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

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

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

python

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

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

python

1#学習とテストに分けるテストサイズが3割指定 2x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.30,random_state=111) 3 4history=model.fit(x_train,y_train,batch_size=5,epochs=200, 5 validation_data=(x_test,y_test),verbose=0)

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

python

1model.add(Flatten()) 2model.add(Dense(512)) 3model.add(Activation("relu")) 4model.add(Dropout(0.5)) 5model.add(Dense(2)) 6model.add(Activation("softmax"))

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

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

投稿2020/07/21 08:12

YufanLou

総合スコア463

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

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

yui1020

2020/07/21 10: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 ご回答いただけましたら幸いです。
YufanLou

2020/07/21 11:02

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

0

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

投稿2020/07/21 08:09

can110

総合スコア38262

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問