1
https://zenn.dev/hiroe_orz17/articles/53af65f491122e
2
https://teratail.com/questions/158340
この二つを参考に画像判別システムを作成してみたのですが,エラーが発生します。
JupyterNotebook
Python 3.7
を使用しています。
ソースコード
python
1import tensorflow as tf 2from tensorflow import keras 3from tensorflow.keras.models import Sequential 4from tensorflow.keras.layers import Activation, Dense, Dropout,Flatten 5from tensorflow.keras.layers import Conv2D 6from tensorflow.keras.layers import MaxPool2D 7from tensorflow.keras.utils import to_categorical 8from tensorflow.keras.optimizers import Adagrad 9from tensorflow.keras.optimizers import Adam 10import numpy as np 11from PIL import Image 12import os 13from tensorflow.keras import datasets, layers, models 14import time 15import csv 16from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint, CSVLogger 17import matplotlib.pyplot as plt 18 19# 学習用のデータを作る. 20image_list = [] 21label_list = [] 22 23#ハイパーパラメータ 24#画像サイズ 25x = 50 26y = 50 27A = x*y #入力のノード数 28#エポック数 29B = 50 30#バッチサイズ 31BATCH_SIZE = 100 32#学習率 33LR = 0.00001 34#出力ノード数 35output =4 36 37for dir in os.listdir("ramen/train"): 38 if dir == ".DS_Store": 39 continue 40 41 dir1 = "data/train/" + dir 42 label = 0 43 44 if dir == "nonfavorite": 45 label = 0 46 elif dir == "favorite": 47 label = 1 48 49 for file in os.listdir(dir1): 50 if file != ".DS_Store": 51 label_list.append(label) 52 filepath = dir1 + "/" + file 53 image = np.array(Image.open(filepath).resize((x, y))) 54 print(image.shape) 55 print(filepath) 56 #image =np.reshape(image, A) 57 image_list.append(image / 255.) 58 59image_list = np.array(image_list) 60 61Y = to_categorical(label_list) 62 63print("入力データの確認") 64print(image_list.shape) 65print("ラベルデータの確認") 66print(Y.shape) 67 68 69# モデルを生成してニューラルネットを構築 70model = Sequential() 71 72model.add(Conv2D(32,3,input_shape=(x,y,1),kernel_initializer='random_uniform',bias_initializer='zeros')) 73model.add(layers.MaxPooling2D((2, 2))) 74model.add(Activation('relu')) 75model.add(Dropout(0.2)) 76 77model.add(Conv2D(32,3,kernel_initializer='random_uniform',bias_initializer='zeros')) 78model.add(layers.MaxPooling2D((2, 2))) 79model.add(Activation('relu')) 80 81model.add(Conv2D(64,3,kernel_initializer='random_uniform',bias_initializer='zeros')) 82model.add(layers.MaxPooling2D((2, 2))) 83model.add(Activation('relu')) 84 85model.add(Flatten()) 86model.add(Dense(810)) 87model.add(Activation('relu')) 88model.add(Dropout(0.2)) 89 90 91model.add(Dense(output)) 92model.add(Activation("softmax")) 93model.summary() 94 95# オプティマイザ(最適化)にAdamを使用 96opt = Adam(lr=LR) 97# モデルをコンパイル 98model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"]) #わからない 99#CSVに各エポックの学習結果の保存 100csv_logger = CSVLogger('result/training.csv') 101# 学習を実行。20%はテストに使用。 102history = model.fit(image_list, 103 Y, 104 epochs=B, 105 verbose=1, 106 callbacks=[csv_logger], 107 batch_size=BATCH_SIZE, 108 validation_split=0.2) 109 110 111 112# テスト用ディレクトリ(./data/train/)の画像でチェック。正解率を表示する。 113total = 0. 114ok_count = 0. 115#最終の学習結果の表示 116loss, accuracy = model.evaluate(image_list, Y) 117print("\nloss:{} accuracy:{}".format(loss, accuracy)) 118#最終の学習結果を書き込む 119fp = open("result/RESULT.txt","w") 120fp.write("\nloss:{} accuracy:{}".format(loss, accuracy)) 121fp.close() 122#正解率の書き込み 123f = open("result/ANSWER.txt","w") 124 125for dir in os.listdir("ramen/train"): 126 if dir == ".DS_Store": 127 continue 128 129 dir1 = "data/test/" + dir 130 label = 0 131 132 if dir == "nonfavorite": # 左下に最大応力:ラベル0 133 label = 0 134 elif dir == "favorite": # 右下に最大応力:ラベル1 135 label = 1 136 137 for file in os.listdir(dir1): 138 if file != ".DS_Store": 139 label_list.append(label) 140 filepath = dir1 + "/" + file 141 image = np.array(Image.open(filepath).resize((x, y))) 142 print(filepath) 143 image =np.reshape(image, A) 144 result = model.predict_classes(np.array([image / 255.])) 145 print("label:", label, "result:", result[0]) 146 L = label 147 R = result[0] 148 f.write(filepath) 149 f.write("\nlabel:{} result:{}\n".format(L, R) ) 150 total += 1. 151 152 if label == result[0]: 153 ok_count += 1. 154 155 156 157 158print("正答率: ", ok_count / total * 100, "%") 159SEIKAI =ok_count / total * 100 160f.write("\n正答率:{}".format(SEIKAI)) 161 162end_time = time.time() 163print("終了時刻: ",end_time) 164print ("かかった時間: ", (end_time - start_time)) 165 166ttime = end_time - start_time 167fa = open("result/TIME.txt","w") 168fa.write("\nかかった時間:{} ".format(ttime)) 169fa.close() 170 171
エラー内容
python
1ValueError Traceback (most recent call last) 2<ipython-input-80-6ff6d86090ba> in <module> 3 118 csv_logger = CSVLogger('result/training.csv') 4 119 # 学習を実行。20%はテストに使用。 5--> 120 history = model.fit(image_list, 6 121 Y, 7 122 epochs=B, 8 9ValueError: in user code: 10 11 12 ValueError: Input 0 of layer sequential_54 is incompatible with the layer: expected axis -1 of input shape to have value 1 but received input with shape [100, 50, 50, 3]
1のリンクをそのまま模してconv2dを使用するとエラーが出て、色々調べて2のリンクにたどり着きました。
エラー分を見ると、history = model.fit(image_list, このimage_listにconv2dが求めている入力が出来てないと思っています。
python
1(50, 50, 3) 2data/train/favorite/fav_train (1).jpg 3~ 4一部省略 5~ 6(50, 50, 3) 7data/train/nonfavorite/nonfav_train (99).jpg 8入力データの確認 9(1000, 50, 50, 3) 10ラベルデータの確認 11(1000, 2)
このように入力データが確認できてます。
ValueError Input 0 of layer sequential_54 is incompatible with the layer: expected axis -1 of input shape to have value 1 but received input with shape [100, 50, 50, 3]
このエラーを読む限り、チャネルが求められたものとあっていないのかと思っています。
もし解決策がわかる方がいればよろしくお願いします。
※文字数の関係で一部エラーコードを掲載してません