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

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

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

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

解決済

画像認識を用いた回帰分析

FALLOT
FALLOT

総合スコア16

Keras

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

1回答

0評価

0クリップ

5932閲覧

投稿2018/10/23 05:38

編集2018/10/23 07:42

この画像が今回の入力データです
今回の入力データです.二値化しています.

誤差が減らない

kerasを用いて画像を用いた回帰分析をしています.
以下のコードでは誤差が下がりません.
結果はこんな感じです.

Epoch 84/500
1600/1600 [==============================] - 5s 3ms/step - loss: 14.8227 - val_loss: 5.6889
Epoch 85/500
1600/1600 [==============================] - 5s 3ms/step - loss: 15.6330 - val_loss: 6.1703
Epoch 86/500
1600/1600 [==============================] - 5s 3ms/step - loss: 15.7420 - val_loss: 6.5914
Epoch 87/500
1600/1600 [==============================] - 5s 3ms/step - loss: 15.3729 - val_loss: 3.6529

原因が分かる方は宜しくお願い致します.
今回用いているのは
活性化関数:LeakyReLU
損失関数:相対誤差

#最大応力の値の予測 from keras.models import Sequential from keras.layers import Activation, Dense, Dropout, LeakyReLU #from keras.layers.advanced_activations import LeakyReLU 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 import cv2 import math start_time = time.time() print("開始時刻: " + str(start_time)) #それぞれの画像の枚数を入力 A = 1000 B = 1000 sum =A+B # 学習用のデータを作る. image_list = [] location_list = [] #ハイパーパラメータ #画像サイズ x = 150 y = 75 Z = x*y #入力層のノード数 #エポック数 E = 500 #バッチサイズ BATCH_SIZE = 32 #学習率 LR = 0.00001 #訓練データの数 train=sum train=sum #画像の読み込み:読み込み→リサイズ→1列に変換→正規化 print("画像の読み込み 開始") count=1 for i in range(0,A): im = cv2.imread("data/image/a/"+str(i)+"a.png".format(i),1) #画像の読み込み print(str(i)+"a.png") image = np.array(Image.open("data/image/a/"+str(i)+"a.png").resize((x, y))) #画像をnum配列にしてリサイズ print(image.shape) image =np.reshape(image,Z) #2次元行列を1次元行列に変換 print(image.shape) image_list.append(image / 255.) #appendは追加:1枚ずつ足しこんでいく print(str(count)+"/"+str(train)) count +=1 print('\n') for i in range(0,B): im = cv2.imread("data/image/b/"+str(i)+"b.png".format(i),1) #画像の読み込み print(str(i)+"b.png") image = np.array(Image.open("data/image/b/"+str(i)+"b.png").resize((x, y))) #画像をnum配列にしてリサイズ print(image.shape) image =np.reshape(image,Z) #2次元行列を1次元行列に変換 print(image.shape) image_list.append(image / 255.) #appendは追加:1枚ずつ足しこんでいく print(str(count)+"/"+str(train)) count +=1 print('\n') print("画像の読み込み 終了") # kerasに渡すためにnumpy配列に変換。 image_list = np.array(image_list) #最大応力の位置_読み込み_表示 location = np.loadtxt("data/value/max_stress_value_a.csv",delimiter=",",skiprows=0) location_list.extend(location) location = np.loadtxt("data/value/max_stress_value_b.csv",delimiter=",",skiprows=0) location_list.extend(location) location_list = np.array(location_list) print("\n最大応力の値の行列の形") print(location_list.shape) #print(location_list) np.savetxt("data/value/max_stress_value_true.csv",location_list,delimiter=",") #最大応力の位置_読み込み_終了 # モデルを生成してニューラルネットを構築 model = Sequential() model.add(Dense(8000, input_dim=Z,kernel_initializer='random_uniform',bias_initializer='zeros')) #model.add(Activation("LeakyReLU")) model.add(LeakyReLU()) model.add(Dropout(0.5)) model.add(Dense(100,kernel_initializer='random_uniform',bias_initializer='zeros')) model.add(LeakyReLU()) model.add(Dropout(0.2)) model.add(Dense(50,kernel_initializer='random_uniform',bias_initializer='zeros')) model.add(LeakyReLU()) model.add(Dropout(0.2)) model.add(Dense(10,kernel_initializer='random_uniform',bias_initializer='zeros')) model.add(LeakyReLU()) model.add(Dropout(0.2)) model.add(Dense(1)) model.add(Activation("linear")) # オプティマイザ(最適化)にAdamを使用 opt = Adam(lr=LR) # モデルをコンパイル #最大応力位置の予測 誤差関数:二乗誤差 model.compile(loss="mean_absolute_percentage_error", optimizer=opt) #CSVに各エポックの学習結果の保存 csv_logger = CSVLogger('result/training_process.csv') # 学習を実行。20%はテストに使用 #最大応力位置の予測 モデルフィット history = model.fit(image_list, location_list, nb_epoch=E,verbose=1,callbacks=[csv_logger], batch_size=BATCH_SIZE, validation_split=0.2) #最大応力位置の予測 誤差の評価 loss = model.evaluate(image_list, location_list) #最終の学習結果を書き込む fp = open("result/RESULT.txt","w") fp.write("\nloss:{}".format(loss)) fp.close() #最終の誤差の表示 print("\nloss:{}\n".format(loss)) #予測値 predicted= model.predict(image_list) #print("NNの最大応力の値 予測値") #print(predicted) np.savetxt("result/max_stress_value_predict_result.csv",predicted,delimiter=",") end_time = time.time() print("\n終了時刻: ",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()

追記
出力層の活性化関数をlinearにしたところ誤差が25%まで下がりましたが,それ以降が下がらないです.

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

tabuu

2018/10/23 05:44

画像を認識して、何を分析したいのでしょうか?
FALLOT

2018/10/23 05:50

私の研究で,画像ごとに数値を与えて,画像のパターンごとに数値を予測するという形.
FALLOT

2018/10/23 05:51

詳しくいうと,複合材料を模式した画像から,中の物質の配置関係でどれくらい大きな内部の力が発生しているのか予測しています.

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Keras

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