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

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

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

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

機械学習

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

Python

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

解決済

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

FALLOT
FALLOT

総合スコア0

Keras

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

機械学習

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

Python

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

1回答

0評価

0クリップ

100閲覧

投稿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

#https://qiita.com/hiroeorz@github/items/ecb39ed4042ebdc0a957 from keras.models import Sequential from keras.layers import Activation, Dense, Dropout from keras.utils.np_utils import to_categorical from keras.optimizers import Adagrad from keras.optimizers import Adam from keras.models import load_model from keras.callbacks import EarlyStopping, ModelCheckpoint, CSVLogger import numpy as np from PIL import Image import os import time import csv start_time = time.time() print("開始時刻: " + str(start_time)) # 学習用のデータを作る. image_list = [] label_list = [] #ハイパーパラメータ #画像サイズ x = 120 y = 120 A = x*y #入力のノード数 #エポック数 B = 500 #バッチサイズ BATCH_SIZE = 32 #学習率 LR = 0.00001 #出力ノード数 output =9 # ./data/train 以下のa,b,cのディレクトリ以下の画像を読み込む。 for dir in os.listdir("data/train"): if dir == ".DS_Store": continue dir1 = "data/train/" + dir label = 0 if dir == "a": # 左下に最大応力:ラベル0 label = 0 elif dir == "b": # 右下に最大応力:ラベル1 label = 1 elif dir == "c": # 右下に最大応力:ラベル1 label = 2 elif dir == "d": # 右下に最大応力:ラベル1 label = 3 elif dir == "e": # 右下に最大応力:ラベル1 label = 4 elif dir == "f": # 右下に最大応力:ラベル1 label = 5 elif dir == "g": # 右下に最大応力:ラベル1 label = 6 elif dir == "h": # 右下に最大応力:ラベル1 label = 7 elif dir == "i": # 右下に最大応力:ラベル1 label = 8 for file in os.listdir(dir1): if file != ".DS_Store": label_list.append(label) #わからない filepath = dir1 + "/" + file image = np.array(Image.open(filepath).resize((x, y))) print(image.shape) print(filepath) image =np.reshape(image, A) print(image.shape) print('\n') image_list.append(image / 255.) # kerasに渡すためにnumpy配列に変換。 image_list = np.array(image_list) # ラベルの配列を1と0からなるラベル配列に変更 # 0 -> [1,0], 1 -> [0,1] という感じ。 Y = to_categorical(label_list) #わからない print("入力データの確認") print(image_list.shape) #np.savetxt("check/input_data_pixel.csv",image_list,delimiter=",") #print("ラベルデータの確認") print(image_list.shape) #np.savetxt("check/label_data.csv",Y,delimiter=",") # モデルを生成してニューラルネットを構築 model = Sequential() model.add(Dense(5000, input_dim=A,kernel_initializer='random_uniform',bias_initializer='zeros')) model.add(Activation("relu")) model.add(Dropout(0.5)) model.add(Dense(2000,kernel_initializer='random_uniform',bias_initializer='zeros')) model.add(Activation("relu")) model.add(Dropout(0.5)) model.add(Dense(1000,kernel_initializer='random_uniform',bias_initializer='zeros')) model.add(Activation("relu")) model.add(Dropout(0.5)) model.add(Dense(500,kernel_initializer='random_uniform',bias_initializer='zeros')) model.add(Activation("relu")) model.add(Dropout(0.5)) model.add(Dense(100,kernel_initializer='random_uniform',bias_initializer='zeros')) model.add(Activation("relu")) model.add(Dropout(0.5)) model.add(Dense(50,kernel_initializer='random_uniform',bias_initializer='zeros')) model.add(Activation("relu")) model.add(Dropout(0.5)) model.add(Dense(output)) model.add(Activation("softmax")) # オプティマイザ(最適化)にAdamを使用 opt = Adam(lr=LR) # モデルをコンパイル model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"]) #わからない #CSVに各エポックの学習結果の保存 csv_logger = CSVLogger('result/training.csv') # 学習を実行。20%はテストに使用。 history = model.fit(image_list, Y, nb_epoch=B,verbose=1,callbacks=[csv_logger], batch_size=BATCH_SIZE, validation_split=0.2) # テスト用ディレクトリ(./data/train/)の画像でチェック。正解率を表示する。 total = 0. ok_count = 0. #最終の学習結果の表示 loss, accuracy = model.evaluate(image_list, Y) print("\nloss:{} accuracy:{}".format(loss, accuracy)) #最終の学習結果を書き込む fp = open("result/RESULT.txt","w") fp.write("\nloss:{} accuracy:{}".format(loss, accuracy)) fp.close() #正解率の書き込み f = open("result/ANSWER.txt","w") for dir in os.listdir("data/train"): if dir == ".DS_Store": continue dir1 = "data/test/" + dir label = 0 if dir == "a": # 左下に最大応力:ラベル0 label = 0 elif dir == "b": # 右下に最大応力:ラベル1 label = 1 elif dir == "c": # 右下に最大応力:ラベル1 label = 2 elif dir == "d": # 右下に最大応力:ラベル1 label = 3 elif dir == "e": # 右下に最大応力:ラベル1 label = 4 elif dir == "f": # 右下に最大応力:ラベル1 label = 5 elif dir == "g": # 右下に最大応力:ラベル1 label = 6 elif dir == "h": # 右下に最大応力:ラベル1 label = 7 elif dir == "i": # 右下に最大応力:ラベル1 label = 8 for file in os.listdir(dir1): if file != ".DS_Store": label_list.append(label) filepath = dir1 + "/" + file image = np.array(Image.open(filepath).resize((x, y))) print(filepath) image =np.reshape(image, A) result = model.predict_classes(np.array([image / 255.])) print("label:", label, "result:", result[0]) L = label R = result[0] f.write(filepath) f.write("\nlabel:{} result:{}\n".format(L, R) ) total += 1. if label == result[0]: ok_count += 1. print("正答率: ", ok_count / total * 100, "%") SEIKAI =ok_count / total * 100 f.write("\n正答率:{}".format(SEIKAI)) end_time = time.time() print("終了時刻: ",end_time) print ("かかった時間: ", (end_time - start_time)) ttime = end_time - start_time fa = open("result/TIME.txt","w") fa.write("\nかかった時間:{} ".format(ttime)) fa.close()

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

tiitoi
tiitoi

2018/11/14 10:19

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

2018/11/14 10:36

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

2018/11/14 10:39 編集

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

2018/11/14 10:42

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

2018/11/14 10:49

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

2018/11/14 11:00

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

2018/11/14 11:12

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

2018/11/14 11:27

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

2018/11/14 11:32

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

2018/11/14 11:42

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

2018/11/14 11:46

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Keras

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

機械学習

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

Python

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