前提・実現したいこと
https://qiita.com/neet-AI/items/2b3d7f743e4d6c6d8e10
こちらのサイトを元に画像分類を練習している者です。
サイト内でic_module.pyとして保存したモジュールのimportの際にこのようなエラーが出てしまいこの問題の解決策を探しています。
5つのクラスに分けた画像分類がしたく少し改変をしていますが大まかな流れなどはいじっていません、初心者の質問で申し訳ないのですが、どうか教えていただけると幸いです。
発生している問題・エラーメッセージ
エラーメッセージ --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-16-0ccab3d1f85d> in <module> 3 4 i = 0 ----> 5 for filename in ic.filenames : 6 # ディレクトリ名入力 7 while True : AttributeError: module 'ic_module' has no attribute 'filenames'
該当のソースコード
コード
python
1import ic_module as ic 2import os.path as op 3 4i = 0 5for filename in ic.filenames : 6 7 while True : 8 dirname = input(">>「" + ic.ClassNames[i] + "」の画像のあるディレクトリ : ") 9 if op.isdir(dirname) : 10 break 11 print(">> そのディレクトリは存在しません!") 12 13 ic.PreProcess(dirname, filename, var_amount=3) 14 i += 1 15 16```読み込むモジュールであるic_module.pyは以下のコードを保存したものです 17```python 18コードimport glob 19import numpy as np 20 21from keras.preprocessing.image import load_img, img_to_array, array_to_img 22from keras.preprocessing.image import random_rotation, random_shift, random_zoom 23from keras.layers.convolutional import Conv2D 24from keras.layers.pooling import MaxPooling2D 25from keras.layers.core import Activation 26from keras.layers.core import Dense 27from keras.layers.core import Dropout 28from keras.layers.core import Flatten 29from keras.models import Sequential 30from keras.models import model_from_json 31from keras.callbacks import LearningRateScheduler 32from keras.callbacks import ModelCheckpoint 33from tensorflow.keras.optimizers import Adam 34from keras.utils import np_utils 35 36FileNames = ["1.npy", "2.npy", "3.npy","4.npy","5.npy"] 37ClassNames = ["s1","s2", "s3", "s4","s5"] 38hw = {"height":32, "width":32} 39 40 41#画像データの前処理 42def PreProcess(dirname, filename, var_amount=3): 43 num = 0 44 arrlist = [] 45 files = glob.glob(dirname + "/*.jpg") 46 47 for imgfile in files: 48 img = load_img(imgfile, target_size=(hw["height"], hw["width"])) # 画像ファイルの読み込み 49 array = img_to_array(img) / 255 # 画像ファイルのnumpy化 50 arrlist.append(array) # numpy型データをリストに追加 51 for i in range(var_amount-1): 52 arr2 = array 53 arr2 = random_rotation(arr2, rg=360) 54 arrlist.append(arr2) # numpy型データをリストに追加 55 num += 1 56 57 nplist = np.array(arrlist) 58 np.save(filename, nplist) 59 print(">> " + dirname + "から" + str(num) + "個のファイル読み込み成功") 60 61 62#モデルの構築 63def BuildCNN(ipshape=(32, 32, 3), num_classes=3): 64 model = Sequential() 65 66 model.add(Conv2D(24, 3, padding='same', input_shape=ipshape)) 67 model.add(Activation('relu')) 68 69 model.add(Conv2D(48, 3)) 70 model.add(Activation('relu')) 71 model.add(MaxPooling2D(pool_size=(2, 2))) 72 model.add(Dropout(0.5)) 73 74 model.add(Conv2D(96, 3, padding='same')) 75 model.add(Activation('relu')) 76 77 model.add(Conv2D(96, 3)) 78 model.add(Activation('relu')) 79 model.add(MaxPooling2D(pool_size=(2, 2))) 80 model.add(Dropout(0.5)) 81 82 model.add(Flatten()) 83 model.add(Dense(128)) 84 model.add(Activation('relu')) 85 model.add(Dropout(0.5)) 86 87 model.add(Dense(num_classes)) 88 model.add(Activation('softmax')) 89 90 adam = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08) 91 model.compile(loss='categorical_crossentropy', 92 optimizer=adam, 93 metrics=['accuracy']) 94 return model 95 96 97#学習 98def Learning(tsnum=30, nb_epoch=50, batch_size=8, learn_schedule=0.9): 99 X_TRAIN_list = []; Y_TRAIN_list = []; X_TEST_list = []; Y_TEST_list = []; 100 target = 0 101 for filename in FileNames : 102 data = np.load(filename) # 画像のnumpyデータを読み込み 103 trnum = data.shape[0] - tsnum 104 X_TRAIN_list += [data[i] for i in range(trnum)] # 画像データ 105 Y_TRAIN_list += [target] * trnum # 分類番号 106 X_TEST_list += [data[i] for i in range(trnum, trnum+tsnum)] # 学習しない画像データ 107 Y_TEST_list += [target] * tsnum; # 学習しない分類番号 108 target += 1 109 110 X_TRAIN = np.array(X_TRAIN_list + X_TEST_list) # 連結 111 Y_TRAIN = np.array(Y_TRAIN_list + Y_TEST_list) # 連結 112 print(">> 学習サンプル数 : ", X_TRAIN.shape) 113 y_train = np_utils.to_categorical(Y_TRAIN, target) # 自然数をベクトルに変換 114 valrate = tsnum * target * 1.0 / X_TRAIN.shape[0] 115 116 # 学習率の変更 117 class Schedule(object): 118 def __init__(self, init=0.001): # 初期値定義 119 self.init = init 120 def __call__(self, epoch): # 現在値計算 121 lr = self.init 122 for i in range(1, epoch+1): 123 lr *= learn_schedule 124 return lr 125 126 def get_schedule_func(init): 127 return Schedule(init) 128 129 lrs = LearningRateScheduler(get_schedule_func(0.001)) 130 mcp = ModelCheckpoint(filepath='best.hdf5', monitor='val_loss', verbose=1, save_best_only=True, mode='auto') 131 model = BuildCNN(ipshape=(X_TRAIN.shape[1], X_TRAIN.shape[2], X_TRAIN.shape[3]), num_classes=target) 132 133 print(">> 学習開始") 134 hist = model.fit(X_TRAIN, y_train, 135 batch_size=batch_size, 136 verbose=1, 137 epochs=nb_epoch, 138 validation_split=valrate, 139 callbacks=[lrs, mcp]) 140 141 json_string = model.to_json() 142 json_string += '##########' + str(ClassNames) 143 open('model.json', 'w').write(json_string) 144 model.save_weights('last.hdf5') 145 146 model.save('./ic_module.h5') 147 148 149#試行・実験 150def TestProcess(imgname): 151 modelname_text = open("model.json").read() 152 json_strings = modelname_text.split('##########') 153 textlist = json_strings[1].replace("[", "").replace("]", "").replace("\'", "").split() 154 model = model_from_json(json_strings[0]) 155 model.load_weights("last.hdf5") # best.hdf5 で損失最小のパラメータを使用 156 img = load_img(imgname, target_size=(hw["height"], hw["width"])) 157 TEST = img_to_array(img) / 255 158 159 pred = model.predict(np.array([TEST]), batch_size=1, verbose=0) 160 print(">> 計算結果↓\n" + str(pred)) 161 print(">> この画像は「" + textlist[np.argmax(pred)].replace(",", "") + "」です。")
試したこと
当サイトにも過去同じコードに対してのコードの短縮を目指した質問がありましたのでそちらを参照しましたが解決には至りませんでした。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/30 16:04