下記のサイトを参考に機械学習をしようしていると、以下のようなエラー文が出ました。
https://qiita.com/hiroeorz@github/items/ecb39ed4042ebdc0a957
https://qiita.com/koshian2/items/6742c469e9775d672072
#エラー文
ValueError
1<ipython-input-3-df59987fa493> in <module> 2 84 model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"]) 3 85 # 学習を実行。10%はテストに使用。 4---> 86 model.fit(image_list, Y, nb_epoch=1500, batch_size=100, validation_split=0.1) 5 87 6 88 # テスト用ディレクトリ(./data/train/)の画像でチェック。正解率を表示する。 7 8~\anaconda3\envs\ban\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, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs) 9 1152 sample_weight=sample_weight, 10 1153 class_weight=class_weight, 11-> 1154 batch_size=batch_size) 12 1155 13 1156 # Prepare validation data. 14 15~\anaconda3\envs\ban\lib\site-packages\keras\engine\training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_array_lengths, batch_size) 16 577 feed_input_shapes, 17 578 check_batch_axis=False, # Don't enforce the batch size. 18--> 579 exception_prefix='input') 19 580 20 581 if y is not None: 21 22~\anaconda3\envs\ban\lib\site-packages\keras\engine\training_utils.py in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix) 23 133 ': expected ' + names[i] + ' to have ' + 24 134 str(len(shape)) + ' dimensions, but got array ' 25--> 135 'with shape ' + str(data_shape)) 26 136 if not check_batch_axis: 27 137 data_shape = data_shape[1:] 28 29ValueError: Error when checking input: expected input_3 to have 4 dimensions, but got array with shape (40, 1875)
コードは以下のとおりです。
#コード
import
1from keras.layers import Conv2D, BatchNormalization, Activation, AveragePooling2D, GlobalAveragePooling2D, Dense, Dropout, Input, Multiply 2from keras.models import Model 3from keras.optimizers import Adam 4import numpy as np 5from PIL import Image 6import os 7from keras.utils.np_utils import to_categorical 8 9# 学習用のデータを作る. 10image_list = [] 11label_list = [] 12# ./data/train 以下のorange,appleディレクトリ以下の画像を読み込む。 13for dir in os.listdir("data/training"): 14 if dir == ".DS_Store": 15 continue 16 17 dir1 = "data/training/" + dir 18 label = 0 19 20 if dir == "no": # appleはラベル0 21 label = 0 22 elif dir == "ok": # orangeはラベル1 23 label = 1 24 25 for file in os.listdir(dir1): 26 if file != ".DS_Store": 27 # 配列label_listに正解ラベルを追加(りんご:0 オレンジ:1) 28 label_list.append(label) 29 filepath = dir1 + "/" + file 30 # 画像を25x25pixelに変換し、1要素が[R,G,B]3要素を含む配列の25x25の2次元配列として読み込む。 31 # [R,G,B]はそれぞれが0-255の配列。 32 image = np.array(Image.open(filepath).resize((25, 25))) 33 print(filepath) 34 # 配列を変換し、[[Redの配列],[Greenの配列],[Blueの配列]] のような形にする。 35 image = image.transpose(2, 0, 1) 36 # さらにフラットな1次元配列に変換。最初の1/3はRed、次がGreenの、最後がBlueの要素がフラットに並ぶ。 37 image = image.reshape(1, image.shape[0] * image.shape[1] * image.shape[2]).astype("float32")[0] 38 # 出来上がった配列をi image_listに追加。 39 image_list.append(image / 255.) 40# kerasに渡すためにnumpy配列に変換。 41image_list = np.array(image_list) 42# ラベルの配列を1と0からなるラベル配列に変更 43# 0 -> [1,0], 1 -> [0,1] という感じ。 44Y = to_categorical(label_list) 45 46def create_new_conv(input, chs): 47 x = Conv2D(chs, 3, padding="same")(input) 48 x = BatchNormalization()(x) 49 return Activation("relu")(x) 50 51# Squeeze and Excitation 52def se_block(input, channels, r=8): 53 # Squeeze 54 x = GlobalAveragePooling2D()(input) 55 # Excitation 56 x = Dense(channels//r, activation="relu")(x) 57 x = Dense(channels, activation="sigmoid")(x) 58 return Multiply()([input, x]) 59 60def create_new_network(use_se_block): 61 input = Input((32,32,3)) 62 x = input 63 for i in range(3): 64 x = create_new_conv(x, 64) 65 if use_se_block: x = se_block(x, 64) 66 x = AveragePooling2D(2)(x) 67 for i in range(3): 68 x = create_new_conv(x, 128) 69 if use_se_block: x = se_block(x, 128) 70 x = AveragePooling2D(2)(x) 71 for i in range(3): 72 x = create_new_conv(x, 256) 73 if use_se_block: x = se_block(x, 256) 74 x = GlobalAveragePooling2D()(x) 75 x = Dense(10, activation="softmax")(x) 76 77 return Model(input, x) 78 79model = create_new_network(se_block) 80# オプティマイザにAdamを使用 81opt = Adam(lr=0.001) 82# モデルをコンパイル 83model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"]) 84 # 学習を実行。10%はテストに使用。 85model.fit(image_list, Y, nb_epoch=1500, batch_size=100, validation_split=0.1) 86 87# テスト用ディレクトリ(./data/train/)の画像でチェック。正解率を表示する。 88total = 0. 89ok_count = 0. 90 91for dir in os.listdir("data/training"): 92 if dir == ".DS_Store": 93 continue 94 95 dir1 = "data/validation/" + dir 96 label = 0 97 98 if dir == "no": 99 label = 0 100 elif dir == "ok": 101 label = 1 102 103 for file in os.listdir(dir1): 104 if file != ".DS_Store": 105 label_list.append(label) 106 filepath = dir1 + "/" + file 107 image = np.array(Image.open(filepath).resize((25, 25))) 108 print(filepath) 109 image = image.transpose(2, 0, 1) 110 image = image.reshape(1, image.shape[0] * image.shape[1] * image.shape[2]).astype("float32")[0] 111 result = model.predict_classes(np.array([image / 255.])) 112 print("label:", label, "result:", result[0]) 113 114 total += 1. 115 116 if label == result[0]: 117 ok_count += 1. 118 119print("seikai: ", ok_count / total * 100, "%") 120# モデルの可視化 121from IPython.display import SVG 122from keras.utils.vis_utils import model_to_dot 123 124SVG(model_to_dot(model).create(prog='dot', format='svg'))
エラー文を訳すと「入力チェック時のエラー:input_3は4次元であると予想されましたが、形状のある配列を取得しました(40、1875)」となっており、要は「4次元配列で入力してほしいのにこんな配列(40.1875の二次元)になってるよ」という意味かなと思っています。他のサイトでも似たような症状の方がいらっしゃり、そこで解決した際の手法を試しましたが結局解決に至りません。どこが悪くてどう変更すればいいのか全くわかりません。よろしくお願いします
あなたの回答
tips
プレビュー