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

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

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

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

機械学習

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

Python

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

Q&A

解決済

1回答

4852閲覧

val_lossが下がらない(特徴量が小さい画像判別)

FALLOT

総合スコア16

Keras

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

機械学習

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

Python

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

0グッド

0クリップ

投稿2018/11/14 10:11

多分,過学習かもしれませんが質問です.

入力データの画像

上の白丸9つが微妙に動き,そこでどこで一番高い応力がでるのか検討しています.

ざっくりとですが1つの丸に対して
上下12,左右12ぐらい動けるので1つの丸で144パターン
9つのため144の9乗といった途方もないパターンがあります.

kerasを用いて画像判別を行いました
訓練データ10万
テストデータ900
で検証したのですが
Epoch 64/500
80000/80000 [==============================] - 245s 3ms/step - loss: 0.7258 - acc: 0.7475 - val_loss: 8.9855 - val_acc: 0.0000e+00
Epoch 65/500
80000/80000 [==============================] - 245s 3ms/step - loss: 0.7175 - acc: 0.7532 - val_loss: 9.0057 - val_acc: 0.0000e+00
Epoch 66/500
80000/80000 [==============================] - 245s 3ms/step - loss: 0.7196 - acc: 0.7528 - val_loss: 8.8146 - val_acc: 0.0000e+00
Epoch 67/500
80000/80000 [==============================] - 245s 3ms/step - loss: 0.7114 - acc: 0.7526 - val_loss: 8.7844 - val_acc: 0.0000e+00
Epoch 68/500
80000/80000 [==============================] - 245s 3ms/step - loss: 0.7045 - acc: 0.7560 - val_loss: 9.1766 - val_acc: 0.0000e+00
Epoch 69/500
80000/80000 [==============================] - 245s 3ms/step - loss: 0.6987 - acc: 0.7586 - val_loss: 9.0322 - val_acc: 0.0000e+00
Epoch 70/500
80000/80000 [==============================] - 245s 3ms/step - loss: 0.6981 - acc: 0.7593 - val_loss: 8.9527 - val_acc: 0.0000e+00
Epoch 71/500
80000/80000 [==============================] - 246s 3ms/step - loss: 0.6975 - acc: 0.7568 - val_loss: 8.9176 - val_acc: 0.0000e+00
Epoch 72/500
80000/80000 [==============================] - 245s 3ms/step - loss: 0.6880 - acc: 0.7599 - val_loss: 9.1155 - val_acc: 0.0000e+00
という感じで予測誤差が下がっていない状態です.これは過学習と決め付けてよいのでしょうか?
コードも下記に示してあるので原因など分かる方がいらっしゃればご教授お願いします.

引用テキスト

Python

1 2#https://qiita.com/hiroeorz@github/items/ecb39ed4042ebdc0a957 3 4from keras.models import Sequential 5from keras.layers import Activation, Dense, Dropout 6from keras.utils.np_utils import to_categorical 7from keras.optimizers import Adagrad 8from keras.optimizers import Adam 9from keras.models import load_model 10from keras.callbacks import EarlyStopping, ModelCheckpoint, CSVLogger 11import numpy as np 12from PIL import Image 13import os 14import time 15import csv 16 17 18start_time = time.time() 19print("開始時刻: " + str(start_time)) 20 21# 学習用のデータを作る. 22image_list = [] 23label_list = [] 24 25#ハイパーパラメータ 26#画像サイズ 27x = 120 28y = 120 29A = x*y #入力のノード数 30#エポック数 31B = 500 32#バッチサイズ 33BATCH_SIZE = 32 34#学習率 35LR = 0.00001 36#出力ノード数 37output =9 38 39 40# ./data/train 以下のa,b,cのディレクトリ以下の画像を読み込む。 41for dir in os.listdir("data/train"): 42 if dir == ".DS_Store": 43 continue 44 45 dir1 = "data/train/" + dir 46 label = 0 47 48 if dir == "a": # 左下に最大応力:ラベル0 49 label = 0 50 elif dir == "b": # 右下に最大応力:ラベル1 51 label = 1 52 elif dir == "c": # 右下に最大応力:ラベル1 53 label = 2 54 elif dir == "d": # 右下に最大応力:ラベル1 55 label = 3 56 elif dir == "e": # 右下に最大応力:ラベル1 57 label = 4 58 elif dir == "f": # 右下に最大応力:ラベル1 59 label = 5 60 elif dir == "g": # 右下に最大応力:ラベル1 61 label = 6 62 elif dir == "h": # 右下に最大応力:ラベル1 63 label = 7 64 elif dir == "i": # 右下に最大応力:ラベル1 65 label = 8 66 67 68 for file in os.listdir(dir1): 69 if file != ".DS_Store": 70 label_list.append(label) #わからない 71 filepath = dir1 + "/" + file 72 image = np.array(Image.open(filepath).resize((x, y))) 73 print(image.shape) 74 print(filepath) 75 image =np.reshape(image, A) 76 print(image.shape) 77 print('\n') 78 image_list.append(image / 255.) 79 80 81# kerasに渡すためにnumpy配列に変換。 82image_list = np.array(image_list) 83 84 85 86 87# ラベルの配列を1と0からなるラベル配列に変更 88# 0 -> [1,0], 1 -> [0,1] という感じ。 89Y = to_categorical(label_list) #わからない 90 91print("入力データの確認") 92print(image_list.shape) 93#np.savetxt("check/input_data_pixel.csv",image_list,delimiter=",") 94#print("ラベルデータの確認") 95print(image_list.shape) 96#np.savetxt("check/label_data.csv",Y,delimiter=",") 97 98 99# モデルを生成してニューラルネットを構築 100model = Sequential() 101 102model.add(Dense(5000, input_dim=A,kernel_initializer='random_uniform',bias_initializer='zeros')) 103model.add(Activation("relu")) 104model.add(Dropout(0.5)) 105 106 107 108model.add(Dense(2000,kernel_initializer='random_uniform',bias_initializer='zeros')) 109model.add(Activation("relu")) 110model.add(Dropout(0.5)) 111 112model.add(Dense(1000,kernel_initializer='random_uniform',bias_initializer='zeros')) 113model.add(Activation("relu")) 114model.add(Dropout(0.5)) 115 116model.add(Dense(500,kernel_initializer='random_uniform',bias_initializer='zeros')) 117model.add(Activation("relu")) 118model.add(Dropout(0.5)) 119 120model.add(Dense(100,kernel_initializer='random_uniform',bias_initializer='zeros')) 121model.add(Activation("relu")) 122model.add(Dropout(0.5)) 123 124model.add(Dense(50,kernel_initializer='random_uniform',bias_initializer='zeros')) 125model.add(Activation("relu")) 126model.add(Dropout(0.5)) 127 128model.add(Dense(output)) 129model.add(Activation("softmax")) 130 131# オプティマイザ(最適化)にAdamを使用 132opt = Adam(lr=LR) 133# モデルをコンパイル 134model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"]) #わからない 135#CSVに各エポックの学習結果の保存 136csv_logger = CSVLogger('result/training.csv') 137# 学習を実行。20%はテストに使用。 138history = model.fit(image_list, Y, nb_epoch=B,verbose=1,callbacks=[csv_logger], batch_size=BATCH_SIZE, validation_split=0.2) 139 140 141 142# テスト用ディレクトリ(./data/train/)の画像でチェック。正解率を表示する。 143total = 0. 144ok_count = 0. 145#最終の学習結果の表示 146loss, accuracy = model.evaluate(image_list, Y) 147print("\nloss:{} accuracy:{}".format(loss, accuracy)) 148#最終の学習結果を書き込む 149fp = open("result/RESULT.txt","w") 150fp.write("\nloss:{} accuracy:{}".format(loss, accuracy)) 151fp.close() 152#正解率の書き込み 153f = open("result/ANSWER.txt","w") 154 155for dir in os.listdir("data/train"): 156 if dir == ".DS_Store": 157 continue 158 159 dir1 = "data/test/" + dir 160 label = 0 161 162 if dir == "a": # 左下に最大応力:ラベル0 163 label = 0 164 elif dir == "b": # 右下に最大応力:ラベル1 165 label = 1 166 elif dir == "c": # 右下に最大応力:ラベル1 167 label = 2 168 elif dir == "d": # 右下に最大応力:ラベル1 169 label = 3 170 elif dir == "e": # 右下に最大応力:ラベル1 171 label = 4 172 elif dir == "f": # 右下に最大応力:ラベル1 173 label = 5 174 elif dir == "g": # 右下に最大応力:ラベル1 175 label = 6 176 elif dir == "h": # 右下に最大応力:ラベル1 177 label = 7 178 elif dir == "i": # 右下に最大応力:ラベル1 179 label = 8 180 181 182 for file in os.listdir(dir1): 183 if file != ".DS_Store": 184 label_list.append(label) 185 filepath = dir1 + "/" + file 186 image = np.array(Image.open(filepath).resize((x, y))) 187 print(filepath) 188 image =np.reshape(image, A) 189 result = model.predict_classes(np.array([image / 255.])) 190 print("label:", label, "result:", result[0]) 191 L = label 192 R = result[0] 193 f.write(filepath) 194 f.write("\nlabel:{} result:{}\n".format(L, R) ) 195 total += 1. 196 197 if label == result[0]: 198 ok_count += 1. 199 200 201 202 203print("正答率: ", ok_count / total * 100, "%") 204SEIKAI =ok_count / total * 100 205f.write("\n正答率:{}".format(SEIKAI)) 206 207end_time = time.time() 208print("終了時刻: ",end_time) 209print ("かかった時間: ", (end_time - start_time)) 210 211ttime = end_time - start_time 212fa = open("result/TIME.txt","w") 213fa.write("\nかかった時間:{} ".format(ttime)) 214fa.close() 215 216

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

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

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

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

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

tiitoi

2018/11/14 10:19

画像ならCNNを使うべきだと思います。全結合層に流すときに flatten したら位置の情報は消えてしまうので、全結合層オンリーのモデルは今回のタスクには向いてないのでは。
can110

2018/11/14 10:36

そもそもなのですが、OpenCVなりで各円を検出、中心(重心)を求め、応力なし時の各中心位置からのズレを求める手法ではダメですか?
FALLOT

2018/11/14 10:39 編集

tiitoiさん 前回に引き続き,回答して頂き真にありがとうございます.CNNにしない理由は,いくつかあり,1つ目は今回の研究の先行例がないのでとりあえずMLPでいけるところまでいきたい,2つ目は丸の移動が微少であり1ピクセル分しか移動しないパターンもあるのでCNNはどうかなという懸念,3つ目は研究でDLを学び始めて若輩者なのでCNNを実装できない(ネットみると決まった入力の画像サイズのアルゴリズムばっかりなので自分の対象に適応させるのが難しいと判断)
FALLOT

2018/11/14 10:42

can110さん そうですね.周期境界条件といったややこしい拘束条件があるのでちょっといけるかどうか分からないです.ただ,私の研究室でDLをやるのがはじめてなので何もかも手探りで,とりあえずMLPでなんかできたらいいなと考えています.
can110

2018/11/14 10:49

まずは「各円の基準位置からのズレで応力は求まる(まずズレが知りたい)」という前提があると理解しました。そのズレを求める手段としてはMLPだろうが手動だろうが関係ないと思うのですが、間違った理解をしていますか?あるいは、周期境界条件の制約を含めてMLPに学習させようという意図(研究テーマ)があるのでしょうか?
FALLOT

2018/11/14 11:00

具体的な話をすると,丸がバラバラに点在する大量データから丸の位置関係の特徴?をニューラルが読み取って,それぞれの画像データの最大応力の値・位置を予測する.というの概要です.
can110

2018/11/14 11:12

なるほど。おそらく従来は逆(境界値)問題として研究していたテーマだと思われます。実測値(境界値)と理想値(FEMで算出)のズレから最小二乗法で最も妥当な応力分布を求めることができますが、それをMLPでやると。ちょっとアプローチが違いすぎて私には回答できませんが、面白そうですね。
FALLOT

2018/11/14 11:27

そのような感じですね。FEMをご存知なんですね。これは一方向の繊維強化複合材料を想定しており、白丸が繊維で繊維が変動係数0.05で移動しているものとしています。それぞれの画像データには正解データとして最大応力のセル番号、座標、値を与えており、それぞれ出力データにして検証しています。
can110

2018/11/14 11:32

卒論がまさにそんな感じのテーマだったので。今はDL手法も使うんですね。隔世の感です。ちなみに一方向にひっぱったらふつうは垂直方向は縮みますが、理論上は膨らむ素材もありえるとか習った覚えがあります(質問に関係ないレス失礼)
FALLOT

2018/11/14 11:42

そうでしたか。私は諸事情で急遽DL手法を勉強したので付け焼き刃でなかなか大変です。繊維が横方向しか変動しない場合引張方向は比較的高精度にセルと値が出るのですが座標は誤差20%以上なので厳しいです。今回は縦方向の繊維の変動を考慮しているのでデータ不足なのか上手くいかないですね。ところで、今回の件は過学習していると判断しても大丈夫ですか?
can110

2018/11/14 11:46

すみません。DL素人なので過学習かの判断はできません。。
guest

回答1

0

ベストアンサー

具体的な話をすると,丸がバラバラに点在する大量データから丸の位置関係の特徴?をニューラルが読み取って,それぞれの画像データの最大応力の値・位置を予測する.というの概要です.

最大応力を決めるのは丸の位置関係ということですよね?
そうであれば、ハフ変換を使った円の検出でまず円の中心座標を検出して、その座標 (円の数, 2) をニューラルネットワークの入力データにしたほうがよいのではと思います。

python

1import cv2 2import matplotlib.pyplot as plt 3import numpy as np 4 5img = cv2.imread('7877811ba3b2e5c84bab5e02c4705974.png') 6 7def detect_circles(img): 8 # グレースケールに変換 9 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 10 # ハフ変換による円検出 11 circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, dp=1, minDist=20, 12 param1=200, param2=20, minRadius=5, maxRadius=100) 13 14 if circles is not None: 15 circles = np.squeeze(circles, axis=0) # (1, N, 3) -> (N, 3) 16 17 return circles 18 19# 描画する。 20################################################# 21circles = detect_circles(img) 22if circles is not None: 23 for x, y, radius in np.rint(circles).astype(int): 24 print('center: ({}, {}), radius: {}'.format(x, y, radius)) 25 cv2.circle(img, (x, y), radius, (0, 255, 0), 2) 26 cv2.circle(img, (x, y), 2, (0, 0, 255), 2) 27 28plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) 29plt.axis('off') 30plt.show()

イメージ説明

検出結果

入力を画像で、CNN を使わない今のやり方ではうまくいかないでしょう。
画像処理を組み合わせて問題を簡単にしましょう。

投稿2018/11/14 11:21

tiitoi

総合スコア21956

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

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

FALLOT

2018/11/14 11:32

tiitoiさん ありがとうございます!大変有り難いのですが、同研究室の他の学生が、丸の変動量を入力データして研究しているんですよね……笑笑 なので、私はあくまでも入力データは画像データからのピクセルを入力データとする縛りがあるんですよね。
FALLOT

2018/11/14 11:36

あくまで、MLPでやるとなれば層やノードとかのハイパーパラメータをいじるしかないですよね。 CNNを作れればよかったんですけどね……
tiitoi

2018/11/14 11:45

入力が円の座標であれば、問題が簡単なのでニューラルネットワークの表現力なら多分うまくいくんですけど、他の方がやられているので被ってしまうということなんですね。。 入力データを円の座標でなく、画像データにするということは、ネットワークが応力を予測するのに、画像中の円に注目すればいいということまで学習しなければならなくなるので、問題が非常に難しくなるでしょう。 どうしてもその方向でやりたいというのであれば、質問者さんの研究なので、とめはしませんが。。 ちなみにデータ数はどのくらい用意できるのでしょうか? > CNNを作れればよかったんですけどね…… 画像中の"位置"が重要なのであれば、全結合層だけというのはパラメータ調整しても難しいと思いますよ。 今から CNN を使ったモデルに変えるのは期間的な問題で難しいということでしょうか? CNN を作る際は、微小の位置情報が重要なのであれば、プーリングは入れないほうがよいかもしれません。
tiitoi

2018/11/14 11:46

MLP だけでやるなら画像でなく、数値データがいいです。 他になにか良さそうな入力はないのでしょうか?
FALLOT

2018/11/14 11:51

今回の研究において、画像ではニューラルに学ばせるのは難しいという知見も得られるので、まあしょうがないかと割り切ってます。 データは、モンテカルロ法で10万回で10万データ作っているので作ろうと思えばいくらでも作れます。ただ、先程も申し上げよつに、私が研究室で始めてDLを始めたのでGPUもそこまで性能が高くなく、メモリも15GBなのでこれ以上増やすとメモリもたないかなぁと思ってます。 今回の問題でなら、プーリングなしのNNってどんな感じになりますか?
FALLOT

2018/11/14 11:55

同研究室の他の学生が同じ問題で、入力データは円の変動量の数値データを使っています。今回でいうと、9つの円で縦横あるので、入力データは18でやってますね。自分は、画像データという縛りがあるので画像データで極力精度上げれるように頑張りたいですね笑
tiitoi

2018/11/14 16:04 編集

> 私が研究室で始めてDLを始めたのでGPUもそこまで性能が高くなく、メモリも15GBなのでこれ以上増やすとメモリもたないかなぁと思ってます。 全結合層のほうが畳み込み層よりパラメータ数が多く、メモリが必要ですよ。 畳み込み層は疎結合なので、パラメータも全結合よりずっと少ない、つまり使用メモリも少ないです。 メモリ15GとはGPUのメモリですか? GPUの性能は高性能にこしたことはありませんが、GTX1070ぐらいあれば十分です。 > プーリングなしのNNってどんな感じになりますか? Keras でCNNモデルを作る情報はネット上にたくさんあるので、MLPをCNNに変えるのは難しくはないと思います。 https://qiita.com/sasayabaku/items/9e376ba8e38efe3bcf79 プーリングなしは単にプーリング層をなくせばよいだけです。
FALLOT

2018/11/14 23:58

なるほど 研究も落とし所を決める時期なのでCNNはできたらやるスタンスでいきます.もし,やってわからないことがあれば別で立てるので宜しくお願いします. 今使っているのは,GeForce GTX 1060 6GB ですね.他で継ぎ足し状態です.
FALLOT

2018/11/15 09:07

tiitoiさん CNNで質問があるので立ててさせて頂いたので宜しくお願い致します.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問