🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Keras

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

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

人工知能

人工知能とは、言語の理解や推論、問題解決などの知的行動を人間に代わってコンピューターに行わせる技術のことです。

Python

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

Q&A

1回答

386閲覧

画像認識AIでconv2dのエラーが直らない。

退会済みユーザー

退会済みユーザー

総合スコア0

Keras

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

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

人工知能

人工知能とは、言語の理解や推論、問題解決などの知的行動を人間に代わってコンピューターに行わせる技術のことです。

Python

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

0グッド

0クリップ

投稿2020/01/04 14:50

編集2020/01/04 17:47

前提・実現したいこと

現在、人工知能の勉強をしていて、『画像認識で「綾鷹を選ばせる」AIを作る』 (https://qiita.com/tomo_20180402/items/e8c55bdca648f4877188) を参考にプログラムを書いているのですが、エラーが発生したのですが、対処法がわからず先に進むことができません。

Anaconda3の環境です。
参考URL(https://qiita.com/tomo_20180402/items/e8c55bdca648f4877188)の「⑵予測モデルを構築/学習する」の「①シンプルにモデルを構築する」の四つ目です。

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

要素数が違うという問題みたいです。

Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (0, 1)

該当のソースコード

python

1#ラベリングによる学習/検証データの準備 2 3#import os 4#os.environ['KERAS_BACKEND']='tensorflow' 5# 6 7from PIL import Image 8import os, glob 9import numpy as np 10import random, math 11 12 13 14#画像が保存されているルートディレクトリのパス 15root_dir = "C:/animal_pic" 16# 商品名 17categories = ["pos", 18 "neg"] 19 20# 画像データ用配列 21X = [] 22# ラベルデータ用配列 23Y = [] 24 25#画像データごとにadd_sample()を呼び出し、X,Yの配列を返す関数 26def make_sample(files): 27 global X, Y 28 X = [] 29 Y = [] 30 for cat, fname in files: 31 add_sample(cat, fname) 32 return np.array(X), np.array(Y) 33 34#渡された画像データを読み込んでXに格納し、また、 35#画像データに対応するcategoriesのidxをY格納する関数 36def add_sample(cat, fname): 37 img = Image.open(fname) 38 img = img.convert("RGB") 39 #img = img.resize((150, 150)) 40 data = np.asarray(img) 41 X.append(data) 42 Y.append(cat) 43 44#全データ格納用配列 45allfiles = [] 46 47#カテゴリ配列の各値と、それに対応するidxを認識し、全データをallfilesにまとめる 48for idx, cat in enumerate(categories): 49 image_dir = root_dir + "/" + cat 50 files = glob.glob(image_dir + "/*.tif") 51 for f in files: 52 allfiles.append((idx, f)) 53 54#シャッフル後、学習データと検証データに分ける 55random.shuffle(allfiles) 56th = math.floor(len(allfiles) * 0.8) 57train = allfiles[0:th] 58test = allfiles[th:] 59X_train, y_train = make_sample(train) 60X_test, y_test = make_sample(test) 61xy = (X_train, X_test, y_train, y_test) 62#データを保存する 63np.save("animal_data.npy", xy)

###実行結果
表示なし

python

1#モデルの構築 2 3from keras import layers, models 4 5model = models.Sequential() 6model.add(layers.Conv2D(32,(3,3),activation="relu",input_shape=(150,150,3))) 7model.add(layers.MaxPooling2D((2,2))) 8model.add(layers.Conv2D(64,(3,3),activation="relu")) 9model.add(layers.MaxPooling2D((2,2))) 10model.add(layers.Conv2D(128,(3,3),activation="relu")) 11model.add(layers.MaxPooling2D((2,2))) 12model.add(layers.Conv2D(128,(3,3),activation="relu")) 13model.add(layers.MaxPooling2D((2,2))) 14model.add(layers.Flatten()) 15model.add(layers.Dense(512,activation="relu")) 16model.add(layers.Dense(2,activation="sigmoid")) #分類先の種類分設定 17 18#モデル構成の確認 19model.summary()

実行結果


Layer (type) Output Shape Param #

conv2d_5 (Conv2D) (None, 148, 148, 32) 896


max_pooling2d_5 (MaxPooling2 (None, 74, 74, 32) 0


conv2d_6 (Conv2D) (None, 72, 72, 64) 18496


max_pooling2d_6 (MaxPooling2 (None, 36, 36, 64) 0


conv2d_7 (Conv2D) (None, 34, 34, 128) 73856


max_pooling2d_7 (MaxPooling2 (None, 17, 17, 128) 0


conv2d_8 (Conv2D) (None, 15, 15, 128) 147584


max_pooling2d_8 (MaxPooling2 (None, 7, 7, 128) 0


flatten_2 (Flatten) (None, 6272) 0


dense_3 (Dense) (None, 512) 3211776


dense_4 (Dense) (None, 2) 1026

Total params: 3,453,634
Trainable params: 3,453,634
Non-trainable params: 0

python

1#モデルのコンパイル 2 3from keras import optimizers 4 5model.compile(loss="binary_crossentropy", 6 optimizer=optimizers.RMSprop(lr=1e-4), 7 metrics=["acc"])

###実行結果
表示なし

python

1#データの準備 2from keras.utils import np_utils 3import numpy as np 4 5categories = ["pos","neg"] 6nb_classes = len(categories) 7 8X_train, X_test, y_train, y_test = np.load("/animal_data.npy") 9 10#データの正規化 11X_train = X_train.astype("float") / 255 12X_test = X_test.astype("float") / 255 13 14#kerasで扱えるようにcategoriesをベクトルに変換 15y_train = np_utils.to_categorical(y_train, nb_classes) 16y_test = np_utils.to_categorical(y_test, nb_classes)

###実行結果
表示なし

python

1#モデルの学習 2 3model = model.fit(X_train, 4 y_train, 5 epochs=10, 6 batch_size=6, 7 validation_data=(X_test,y_test))

実行結果 ここでエラーがでてます。

ValueError Traceback (most recent call last)
<ipython-input-5-a383b561d91a> in <module>
4 epochs=10,
5 batch_size=6,
----> 6 validation_data=(X_test,y_test))

C:\ProgramData\Anaconda3\envs\PythonAI\lib\site-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

C:\ProgramData\Anaconda3\envs\PythonAI\lib\site-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:

C:\ProgramData\Anaconda3\envs\PythonAI\lib\site-packages\keras\engine\training_utils.py in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
126 ': expected ' + names[i] + ' to have ' +
127 str(len(shape)) + ' dimensions, but got array '
--> 128 'with shape ' + str(data_shape))
129 if not check_batch_axis:
130 data_shape = data_shape[1:]

ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (0, 1)

試したこと

pythonに詳しい知人にnp.resize使ったり、path見るように言われて、確認しましたが、前者は結局わからず、後者は問題が無いようでした。
エラー文で調べてプログラムを加えてもよくわかりませんでしたし、直せませんでした、知識不足で対処にミスをしているかもしれません。

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

Anaconda3環境下
python 3.7.3
keras 2.2.4
tensorflow 1.14.0
OpenCV 3.4.1

まだこれらの分野を勉強し始めたばかりで原因も対処法もよくわからないことだらけなので、回答をいただけたらすぐに試したいと思います。
よろしくお願いします。

実行できているソースなどをすべて記載しました。

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

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

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

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

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

frederick_1974

2020/01/04 17:30

質問者さんからすると、確かにその部分でエラーが発生しているのでしょうし、参考とされているページにも記載されているコードですが、そこだけ見ても誰もエラーは特定できないので、質問者さんが実際に実行したコードを全部示さないと回答は得られないと思います。 全部示して回答が得られる保証があるわけでもないですが、見ている人からは、X_trainやy_train、X_test、y_testが入っているのか全く分かりません。
WathMorks

2020/01/05 14:09

X_test.shape を確認してみてください
guest

回答1

0

行列の次元 (x.shape)がことなることによるえらーです

投稿2020/03/18 20:04

dark-eater-kei

総合スコア1248

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問