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

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

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

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

Q&A

解決済

2回答

2045閲覧

ValueError: Error when checking model input: expected convolution2d_input_1 to have shape (None, 3,

smart-material

総合スコア12

Keras

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

0グッド

0クリップ

投稿2021/12/07 06:59

編集2021/12/09 06:11

前提・実現したいこと

実装ディープラーニングという書籍をTensorflowを用いて実行したいと考えております。 python 9_Layer_CNN.py trainを実行している際に、上記のエラーが発生しました。

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

Error when checking model input: expected convolution2d_input_1 to have shape (None, 3, 32, 32) but got array with shape (500, 32, 32, 3)

該当のソースコード

import numpy as np from numpy.random import permutation import os, glob, cv2, math, sys import pandas as pd from keras.models import Sequential, model_from_json from keras.layers.core import Dense, Dropout, Flatten from keras.layers.convolutional import Convolution2D, MaxPooling2D from keras.layers.advanced_activations import LeakyReLU from keras.callbacks import ModelCheckpoint from keras.optimizers import SGD from keras.utils import np_utils # seed値 np.random.seed(1) # 使用する画像サイズ img_rows, img_cols = 224, 224 # 画像データ 1枚の読み込みとリサイズを行う def get_im(path): img = cv2.imread(path) resized = cv2.resize(img, (img_cols, img_rows)) return resized # データの読み込み、正規化、シャッフルを行う def read_train_data(ho=0, kind='train'): train_data = [] train_target = [] # 学習用データ読み込み for j in range(0, 6): # 0~5まで path = '../../data/Caltech-101/' path += '%s/%i/*/%i/*.jpg'%(kind, ho, j) files = sorted(glob.glob(path)) for fl in files: flbase = os.path.basename(fl) # 画像 1枚 読み込み img = get_im(fl) img = np.array(img, dtype=np.float32) # 正規化(GCN)実行 img -= np.mean(img) img /= np.std(img) train_data.append(img) train_target.append(j) # 読み込んだデータを numpy の array に変換 train_data = np.array(train_data, dtype=np.float32) train_target = np.array(train_target, dtype=np.uint8) # (レコード数,縦,横,channel数) を (レコード数,channel数,縦,横) に変換 #train_data = train_data.transpose((0, 3, 1, 2)) # target を 6次元のデータに変換。 # ex) 1 -> 0,1,0,0,0,0 2 -> 0,0,1,0,0,0 train_target = np_utils.to_categorical(train_target, 6) # データをシャッフル perm = permutation(len(train_target)) train_data = train_data[perm] train_target = train_target[perm] return train_data, train_target # テストデータ読み込み def load_test(test_class, aug_i): path = '../../data/Caltech-101/test/%i/%i/*.jpg'%(aug_i, test_class) files = sorted(glob.glob(path)) X_test = [] X_test_id = [] for fl in files: flbase = os.path.basename(fl) img = get_im(fl) img = np.array(img, dtype=np.float32) # 正規化(GCN)実行 img -= np.mean(img) img /= np.std(img) X_test.append(img) X_test_id.append(flbase) # 読み込んだデータを numpy の array に変換 test_data = np.array(X_test, dtype=np.float32) # (レコード数,縦,横,channel数) を (レコード数,channel数,縦,横) に変換 #test_data = test_data.transpose((0, 3, 1, 2)) return test_data, X_test_id # 9層 CNNモデル 作成 def layer_9_model(): # KerasのSequentialをモデルの元として使用 ---① model = Sequential() # 畳み込み層(Convolution)をモデルに追加 ---② model.add(Convolution2D(32, 3, 3, border_mode='same', activation='linear', input_shape=(img_rows, img_cols, 3))) model.add(LeakyReLU(alpha=0.3)) model.add(Convolution2D(32, 3, 3, border_mode='same', activation='linear')) model.add(LeakyReLU(alpha=0.3)) # プーリング層(MaxPooling)をモデルに追加 ---③ model.add(MaxPooling2D((2, 2), strides=(2, 2))) model.add(Convolution2D(64, 3, 3, border_mode='same', activation='linear')) model.add(LeakyReLU(alpha=0.3)) model.add(Convolution2D(64, 3, 3, border_mode='same', activation='linear')) model.add(LeakyReLU(alpha=0.3)) model.add(MaxPooling2D((2, 2), strides=(2, 2))) model.add(Convolution2D(128, 3, 3, border_mode='same', activation='linear')) model.add(LeakyReLU(alpha=0.3)) model.add(Convolution2D(128, 3, 3, border_mode='same', activation='linear')) model.add(LeakyReLU(alpha=0.3)) model.add(MaxPooling2D((2, 2), strides=(2, 2))) # Flatten層をモデルに追加 -- ④ model.add(Flatten()) # 全接続層(Dense)をモデルに追加 --- ⑤ model.add(Dense(1024, activation='linear')) model.add(LeakyReLU(alpha=0.3)) # Dropout層をモデルに追加 --- ⑥ model.add(Dropout(0.5)) model.add(Dense(1024, activation='linear')) model.add(LeakyReLU(alpha=0.3)) model.add(Dropout(0.5)) # 最終的なアウトプットを作成。 --- ⑦ model.add(Dense(6, activation='softmax')) # ロス計算や勾配計算に使用する式を定義する。 --- ⑧ sgd = SGD(lr=1e-3, decay=1e-6, momentum=0.9, nesterov=True) model.compile(optimizer=sgd, loss='categorical_crossentropy', metrics=["accuracy"]) return model # モデルの構成と重みを読み込む def read_model(ho, modelStr='', epoch='00'): # モデル構成のファイル名 json_name = 'architecture_%s_%i.json'%(modelStr, ho) # モデル重みのファイル名 weight_name = 'model_weights_%s_%i_%s.h5'%(modelStr, ho, epoch) # モデルの構成を読込み、jsonからモデルオブジェクトへ変換 model = model_from_json(open(os.path.join('cache', json_name)).read()) # モデルオブジェクトへ重みを読み込む model.load_weights(os.path.join('cache', weight_name)) return model # モデルの構成を保存 def save_model(model, ho, modelStr=''): # モデルオブジェクトをjson形式に変換 json_string = model.to_json() # カレントディレクトリにcacheディレクトリがなければ作成 if not os.path.isdir('cache'): os.mkdir('cache') # モデルの構成を保存するためのファイル名 json_name = 'architecture_%s_%i.json'%(modelStr, ho) # モデル構成を保存 open(os.path.join('cache', json_name), 'w').write(json_string) def run_train(modelStr=''): # HoldOut 2回行う for ho in range(2): # モデルの作成 model = layer_9_model() # trainデータ読み込み t_data, t_target = read_train_data(ho, 'train') v_data, v_target = read_train_data(ho, 'valid') # CheckPointを設定。エポック毎にweightsを保存する。 cp = ModelCheckpoint('./cache/model_weights_%s_%i_{epoch:02d}.h5'%(modelStr, ho), monitor='val_loss', save_best_only=False) # train実行 print(t_data.shape) print(t_data.dtype) print(v_data.shape) print(v_data.dtype) print(t_target.shape) print(t_target.dtype) print(v_target.shape) print(v_target.dtype) model.fit(t_data, t_target, batch_size=64, nb_epoch=40, verbose=1, validation_data=(v_data, v_target), shuffle=True, callbacks=[cp]) # モデルの構成を保存 save_model(model, ho, modelStr) # テストデータのクラスを推測 def run_test(modelStr, epoch1, epoch2): # クラス名取得 columns = [] for line in open("../../data/Caltech-101/label.csv", 'r'): sp = line.split(',') for column in sp: columns.append(column.split(":")[1]) # テストデータが各クラスに分かれているので、 # 1クラスずつ読み込んで推測を行う。 for test_class in range(0, 6): yfull_test = [] # データ拡張した画像を読み込むために5回繰り返す for aug_i in range(0,5): # テストデータを読み込む test_data, test_id = load_test(test_class, aug_i) # HoldOut 2回繰り返す for ho in range(2): if ho == 0: epoch_n = epoch1 else: epoch_n = epoch2 # 学習済みモデルの読み込み model = read_model(ho, modelStr, epoch_n) # 推測の実行 test_p = model.predict(test_data, batch_size=128, verbose=1) yfull_test.append(test_p) # 推測結果の平均化 test_res = np.array(yfull_test[0]) for i in range(1,10): test_res += np.array(yfull_test[i]) test_res /= 10 # 推測結果とクラス名、画像名を合わせる result1 = pd.DataFrame(test_res, columns=columns) result1.loc[:, 'img'] = pd.Series(test_id, index=result1.index) # 順番入れ替え result1 = result1.ix[:,[6, 0, 1, 2, 3, 4, 5]] if not os.path.isdir('subm'): os.mkdir('subm') sub_file = './subm/result_%s_%i.csv'%(modelStr, test_class) # 最終推測結果を出力する result1.to_csv(sub_file, index=False) # 推測の精度を測定する。 # 一番大きい値が入っているカラムがtest_classであるレコードを探す one_column = np.where(np.argmax(test_res, axis=1)==test_class) print ("正解数  " + str(len(one_column[0]))) print ("不正解数 " + str(test_res.shape[0] - len(one_column[0]))) # 実行した際に呼ばれる if __name__ == '__main__': # 引数を取得 # [1] = train or test # [2] = test時のみ、使用Epoch数 1 # [3] = test時のみ、使用Epoch数 2 param = sys.argv if len(param) < 2: sys.exit ("Usage: python 9_Layer_CNN.py [train, test] [1] [2]") # train or test run_type = param[1] if run_type == 'train': run_train('9_Layer_CNN') elif run_type == 'test': # testの場合、使用するエポック数を引数から取得する if len(param) == 4: epoch1 = "%02d"%(int(param[2])-1) epoch2 = "%02d"%(int(param[3])-1) run_test('9_Layer_CNN', epoch1, epoch2) else: sys.exit ("Usage: python 9_Layer_CNN.py [train, test] [1] [2]") else: sys.exit ("Usage: python 9_Layer_CNN.py [train, test] [1] [2]")

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

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

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

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

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

jbpb0

2021/12/07 09:58 編集

# 畳み込み層(Convolution)をモデルに追加 ---② model.add(Convolution2D(32, 3, 3, border_mode='same', activation='linear', input_shape=(3, img_rows, img_cols))) の「input_shape=(3, img_rows, img_cols)」を「input_shape=(img_rows, img_cols, 3)」に変えてみてください
smart-material

2021/12/09 03:42

ご指摘ありがとうございます。 上記に変えたところ、 ValueError: Negative dimension size caused by subtracting 2 from 1 for 'max_pooling2d_2/MaxPool' (op: 'MaxPool') with input shapes: [?,112,1,64]. のようなエラーが再度発生してしまいます。
jbpb0

2021/12/09 04:03 編集

HRCo4さんの回答はやらずに、私が書いたことだけやるのですが、そうしてますか? 私が書いたのは、モデルをデータに合わせる方法です HRCo4さんの回答は、データをモデルに合わせる方法です だから、どちらかだけやります 両方やったらダメです
smart-material

2021/12/09 04:11

そうしております。 再度実行したのですが、 ValueError: Negative dimension size caused by subtracting 2 from 1 for 'max_pooling2d_2/MaxPool' (op: 'MaxPool') with input shapes: [?,112,1,64]. が出力されます。 書き換えたコードを、上記に追加させていただきました。
jbpb0

2021/12/09 05:28 編集

「~/.keras/keras.json」での設定が悪さしてるかもしれないので、ファイル名を適当なもの(何でもいい)に変えて「~/.keras/keras.json」というファイルが存在しない状態にしてから、コードを再度実行してみてください
smart-material

2021/12/09 05:21

先程よりも、プログラムが動きました。 上記に記載したものは、テンソルのエラーでしょうか。 ResourceExhaustedError (see above for traceback): OOM when allocating tensor with shape[100352,1024] [[Node: sub_28 = Sub[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/gpu:0"](add_14, mul_60)]]
jbpb0

2021/12/09 05:33 編集

# train実行 model.fit(... のすぐ上に(インデントを合わせて)下記を追加して、コードを実行したら何て表示されるかを教えてください print(t_data.shape) print(t_data.dtype) print(v_data.shape) print(v_data.dtype) print(t_target.shape) print(t_target.dtype) print(v_target.shape) print(v_target.dtype) あと、質問からコードが消えてますので、掲載してください (現状のエラーが出た状態のでいいです)
smart-material

2021/12/09 05:37

下記が表示されます。 W tensorflow/core/common_runtime/bfc_allocator.cc:274] **************************_********___**********************************************************xxxx W tensorflow/core/common_runtime/bfc_allocator.cc:275] Ran out of memory trying to allocate 392.00MiB. See logs for memory state. W tensorflow/core/framework/op_kernel.cc:993] Resource exhausted: OOM when allocating tensor with shape[100352,1024] Traceback (most recent call last): File "/home/a/libraries/anaconda3/envs/main/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1022, in _do_call return fn(*args) File "/home/a/libraries/anaconda3/envs/main/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1004, in _run_fn status, run_metadata) File "/home/a/libraries/anaconda3/envs/main/lib/python3.6/contextlib.py", line 88, in __exit__ next(self.gen) File "/home/a/libraries/anaconda3/envs/main/lib/python3.6/site-packages/tensorflow/python/framework/errors_impl.py", line 469, in raise_exception_on_not_ok_status pywrap_tensorflow.TF_GetCode(status)) tensorflow.python.framework.errors_impl.ResourceExhaustedError: OOM when allocating tensor with shape[100352,1024] [[Node: sub_28 = Sub[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/gpu:0"](add_14, mul_60)]] During handling of the above exception, another exception occurred: Traceback (most recent call last): File "n.py", line 307, in <module> run_train('9_Layer_CNN') File "n.py", line 216, in run_train callbacks=[cp]) File "/home/a/libraries/anaconda3/envs/main/lib/python3.6/site-packages/keras/models.py", line 870, in fit initial_epoch=initial_epoch) File "/home/a/libraries/anaconda3/envs/main/lib/python3.6/site-packages/keras/engine/training.py", line 1507, in fit initial_epoch=initial_epoch) File "/home/a/libraries/anaconda3/envs/main/lib/python3.6/site-packages/keras/engine/training.py", line 1156, in _fit_loop outs = f(ins_batch) File "/home/a/libraries/anaconda3/envs/main/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py", line 2269, in __call__ **self.session_kwargs) File "/home/a/libraries/anaconda3/envs/main/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 767, in run run_metadata_ptr) File "/home/a/libraries/anaconda3/envs/main/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 965, in _run feed_dict_string, options, run_metadata) File "/home/a/libraries/anaconda3/envs/main/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1015, in _do_run target_list, options, run_metadata) File "/home/a/libraries/anaconda3/envs/main/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1035, in _do_call raise type(e)(node_def, op, message) tensorflow.python.framework.errors_impl.ResourceExhaustedError: OOM when allocating tensor with shape[100352,1024] [[Node: sub_28 = Sub[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/gpu:0"](add_14, mul_60)]] Caused by op 'sub_28', defined at: File "n.py", line 307, in <module> run_train('9_Layer_CNN') File "n.py", line 216, in run_train callbacks=[cp]) File "/home/a/libraries/anaconda3/envs/main/lib/python3.6/site-packages/keras/models.py", line 870, in fit initial_epoch=initial_epoch) File "/home/a/libraries/anaconda3/envs/main/lib/python3.6/site-packages/keras/engine/training.py", line 1490, in fit self._make_train_function() File "/home/a/libraries/anaconda3/envs/main/lib/python3.6/site-packages/keras/engine/training.py", line 1014, in _make_train_function self.total_loss) File "/home/a/libraries/anaconda3/envs/main/lib/python3.6/site-packages/keras/optimizers.py", line 169, in get_updates new_p = p + self.momentum * v - lr * g File "/home/a/libraries/anaconda3/envs/main/lib/python3.6/site-packages/tensorflow/python/ops/math_ops.py", line 884, in binary_op_wrapper return func(x, y, name=name) File "/home/a/libraries/anaconda3/envs/main/lib/python3.6/site-packages/tensorflow/python/ops/gen_math_ops.py", line 2775, in _sub result = _op_def_lib.apply_op("Sub", x=x, y=y, name=name) File "/home/a/libraries/anaconda3/envs/main/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py", line 763, in apply_op op_def=op_def) File "/home/a/libraries/anaconda3/envs/main/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 2395, in create_op original_op=self._default_original_op, op_def=op_def) File "/home/a/libraries/anaconda3/envs/main/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 1264, in __init__ self._traceback = _extract_stack() ResourceExhaustedError (see above for traceback): OOM when allocating tensor with shape[100352,1024] [[Node: sub_28 = Sub[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/gpu:0"](add_14, mul_60)]]
jbpb0

2021/12/09 05:54 編集

追加した「print(...」の結果が表示されてないのですが、エラーが出た状態のまま再度実行してませんか? Pythonを完全に落として再起動させてから実行しても、そうなりますか? Pythonを再起動させてもそうなるなら、「print(...」を追加する場所を変えないといけないのですが、質問にコードが掲載されてないので、どうしたらいいか分からないです 質問にコードを掲載してください (現状のエラーが出た状態のでいいです) 【追記】 元々の質問のエラーも、削除しないで質問に残してください そうしないと、これまでのやり取りを他の人が見ても、チンプンカンプンになります teratail.comのようなところは、解決策を他の人が参照する、という役割もあるので
smart-material

2021/12/09 05:53

すべてを再起動させたところ、無事動かすことができました。 本当にありがとうございます!
jbpb0

2021/12/09 06:00

質問にコードを掲載してください 元々の質問に掲載されてたものでも、一度修正したものでも、どちらでもいいです 元々の質問のエラーも、削除しないで質問に残してください
guest

回答2

0

ベストアンサー

Error when checking model input: expected convolution2d_input_1 to have shape (None, 3, 224, 224) but got array with shape (1305, 224, 224, 3)

データのshapeに合わせて、下記のようにモデルのinput_shapeを変更してみてください

python

1# 畳み込み層(Convolution)をモデルに追加 ---② 2model.add(Convolution2D(32, 3, 3, border_mode='same', activation='linear', 3input_shape=(3, img_rows, img_cols)))

↓ 変更

python

1# 畳み込み層(Convolution)をモデルに追加 ---② 2model.add(Convolution2D(32, 3, 3, border_mode='same', activation='linear', 3input_shape=(img_rows, img_cols, 3)))

上記をやってもダメなら、「/.keras/keras.json」での設定が悪さしてるかもしれないので、ファイル名を適当なもの(何でもいい)に変えて「/.keras/keras.json」というファイルが存在しない状態にしてから、コードを再度実行してみてください

投稿2021/12/09 05:58

編集2021/12/09 06:05
jbpb0

総合スコア7651

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

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

0

tensorflow(keras)への入力は [batch, ch, height, width] でないといけません。
cv2 で読み込んだ直後は [height, width, ch] となっていますので、軸移動をしてあげましょう。

def get_im(path): img = cv2.imread(path) resized = cv2.resize(img, (img_cols, img_rows)) resized = resized.transpose(2, 0, 1) # 追加 (224,224,3) -> (3, 224, 224) return resized

投稿2021/12/07 08:20

HRCo4

総合スコア140

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

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

smart-material

2021/12/09 03:47

ご回答有り難うございます。 上記のコードに変更をかけたところ、 ValueError: Negative dimension size caused by subtracting 2 from 1 for 'max_pooling2d_2/MaxPool' (op: 'MaxPool') with input shapes: [?,112,1,64]. というエラーが発生しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問