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

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

詳細はこちら
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

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

Python

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

Q&A

解決済

1回答

4196閲覧

機械学習のプログラムが遅くなる

misaki-singo

総合スコア9

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

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

Python

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

0グッド

1クリップ

投稿2019/12/31 10:01

機械学習の勉強中です

https://github.com/deer-dslab/keras-example/tree/master/fine-tuning
のfine-tuning/predict.pyを参考に以下のプログラムを実行しようとしています

python3

1import os 2import sys 3from keras.applications.vgg16 import VGG16 4from keras.models import Sequential, Model 5from keras.layers import Input, Activation, Dropout, Flatten, Dense 6from keras.preprocessing import image 7import numpy as np 8 9f=open('test_labels.txt','r') 10line = f.readline() 11 12while line: 13 print(line) 14 filename = (line.strip()) 15 line = f.readline() 16 17 result_dir = 'dataset/results' 18 19 classes = ['art','nat'] 20 nb_classes = len(classes) 21 22 img_height, img_width = 150, 150 23 channels = 3 24 25 # VGG16 26 input_tensor = Input(shape=(img_height, img_width, channels)) 27 vgg16 = VGG16(include_top=False, weights='imagenet', input_tensor=input_tensor) 28 29 # FC 30 fc = Sequential() 31 fc.add(Flatten(input_shape=vgg16.output_shape[1:])) 32 fc.add(Dense(256, activation='relu')) 33 fc.add(Dropout(0.5)) 34 fc.add(Dense(nb_classes, activation='softmax')) 35 36# VGG16とFCを接続 37 model = Model(input=vgg16.input, output=fc(vgg16.output)) 38 39# 学習済みの重みをロード 40 model.load_weights(os.path.join(result_dir, 'finetuning.h5')) 41 42 model.compile(loss='categorical_crossentropy', 43 optimizer='adam', 44 metrics=['accuracy']) 45 # model.summary() 46 47# 画像を読み込んで4次元テンソルへ変換 48 img = image.load_img(filename, target_size=(img_height, img_width)) 49 x = image.img_to_array(img) 50 x = np.expand_dims(x, axis=0) 51 52# 学習時にImageDataGeneratorのrescaleで正規化したので同じ処理が必要! 53# これを忘れると結果がおかしくなるので注意 54 x = x / 255.0 55 56# print(x) 57# print(x.shape) 58 59# クラスを予測 60# 入力は1枚の画像なので[0]のみ 61 pred = model.predict(x)[0] 62 63#result_fileを読み込む 64#file_name = "./result_data.txt" 65 66# 予測確率が高いトップを出力 67 top = 1 68 top_indices = pred.argsort()[-top:][::-1] 69 result = [(classes[i], pred[i]) for i in top_indices] 70 file = open('result_predict.txt', 'a') 71 file.write(str(result[0]) + str(line)) 72 file.close() 73 74f.close() 75

一行ごとにテスト画像の場所が書いてあるtest_labels.txtから一行づつ読み込み二値分類の結果を./result_data.txtに書き出すのプログラムになっています

実行自体は上手くいき、最初は順調に2~3秒で1行ほど排出してくれるのですがだんだんと動作が遅くなり半分ほど進んだところで強制終了してしまいました・・・
原因・改善方法をご教授ください

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/12/31 10:28

result_dir = 'dataset/results'からmodel.compile(***)までは都度読みださなくても、初めの一回だけwhileの外で呼び出せばよさそうです。一度これらをくくりだしてどうなるか試していただけませんか?
misaki-singo

2020/01/01 06:31

ご指摘の通り毎度呼び出しをしているせいで速度が低下しているみたいでした・・・ 修正したところ凄まじく処理速度が上がりました!ありがとうございます
guest

回答1

0

ベストアンサー

コメント欄で片付いてしまいましたが、今後検索してヒットした人が困らないように解決策まで回答します。


遅くなっていた原因

  • whileループの中で1行ずつデータを読み出す際に、ネットワークも再定義されていた。
  • 結果、ループするたびに処理が重くなり、途中でフリーズしていた。

対策

  • whileループの外側にネットワークの定義をくくり出した。

Python3

1import os 2import sys 3from keras.applications.vgg16 import VGG16 4from keras.models import Sequential, Model 5from keras.layers import Input, Activation, Dropout, Flatten, Dense 6from keras.preprocessing import image 7import numpy as np 8 9f=open('test_labels.txt','r') 10line = f.readline() 11 12####################################### 13## くくり出したネットワークの定義部分 # 14####################################### 15result_dir = 'dataset/results' 16 17classes = ['art','nat'] 18nb_classes = len(classes) 19 20img_height, img_width = 150, 150 21channels = 3 22 23# VGG16 24input_tensor = Input(shape=(img_height, img_width, channels)) 25vgg16 = VGG16(include_top=False, weights='imagenet', input_tensor=input_tensor) 26 27# FC 28fc = Sequential() 29fc.add(Flatten(input_shape=vgg16.output_shape[1:])) 30fc.add(Dense(256, activation='relu')) 31fc.add(Dropout(0.5)) 32fc.add(Dense(nb_classes, activation='softmax')) 33 34# VGG16とFCを接続 35model = Model(input=vgg16.input, output=fc(vgg16.output)) 36 37# 学習済みの重みをロード 38model.load_weights(os.path.join(result_dir, 'finetuning.h5')) 39 40model.compile(loss='categorical_crossentropy', 41 optimizer='adam', 42 metrics=['accuracy']) 43# model.summary() 44####################################### 45 46 47while line: 48 print(line) 49 filename = (line.strip()) 50 line = f.readline() 51 52 ## #################################### 53 ## # くくり出すネットワークの定義部分 # 54 ## #################################### 55 ## result_dir = 'dataset/results' 56 ## 57 ## classes = ['art','nat'] 58 ## nb_classes = len(classes) 59 ## 60 ## img_height, img_width = 150, 150 61 ## channels = 3 62 ## 63 ## # VGG16 64 ## input_tensor = Input(shape=(img_height, img_width, channels)) 65 ## vgg16 = VGG16(include_top=False, weights='imagenet', input_tensor=input_tensor) 66 ## 67 ## # FC 68 ## fc = Sequential() 69 ## fc.add(Flatten(input_shape=vgg16.output_shape[1:])) 70 ## fc.add(Dense(256, activation='relu')) 71 ## fc.add(Dropout(0.5)) 72 ## fc.add(Dense(nb_classes, activation='softmax')) 73 ## 74 ## # VGG16とFCを接続 75 ## model = Model(input=vgg16.input, output=fc(vgg16.output)) 76 ## 77 ## # 学習済みの重みをロード 78 ## model.load_weights(os.path.join(result_dir, 'finetuning.h5')) 79 ## 80 ## model.compile(loss='categorical_crossentropy', 81 ## optimizer='adam', 82 ## metrics=['accuracy']) 83 ## # model.summary() 84 ## ##################################### 85 86 # 画像を読み込んで4次元テンソルへ変換 87 img = image.load_img(filename, target_size=(img_height, img_width)) 88 x = image.img_to_array(img) 89 x = np.expand_dims(x, axis=0) 90 91 # 学習時にImageDataGeneratorのrescaleで正規化したので同じ処理が必要! 92 # これを忘れると結果がおかしくなるので注意 93 x = x / 255.0 94 95 # print(x) 96 # print(x.shape) 97 98 # クラスを予測 99 # 入力は1枚の画像なので[0]のみ 100 pred = model.predict(x)[0] 101 102 #result_fileを読み込む 103 #file_name = "./result_data.txt" 104 105 # 予測確率が高いトップを出力 106 top = 1 107 top_indices = pred.argsort()[-top:][::-1] 108 result = [(classes[i], pred[i]) for i in top_indices] 109 file = open('result_predict.txt', 'a') 110 file.write(str(result[0]) + str(line)) 111 file.close() 112 113f.close()

投稿2020/01/01 07:50

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問