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

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

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

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

Python

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

Q&A

0回答

2704閲覧

kerasで損失関数をいじる.(損失関数を自作?)

FALLOT

総合スコア16

Keras

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

Python

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

0グッド

0クリップ

投稿2018/11/22 10:31

今までは
model.compile(loss='mean_absolute_percentage_error', optimizer=opt)
のようにいきなり損失化数を代入しただけでした.
kerasでデフォルトで
y_true: 正解ラベル.TensorFlow/Theano テンソル
y_pred: 予測値.y_trueと同じshapeのTensorFlow/Theano テンソル
となっていますが,
loss_fun = mean_absolute_error(y_true/width, y_pred/width)
という感じに書き直したいのですがうまくできません.
どのようにすればよいですか.

python

1 2#最大応力の値の予測 3from keras.models import Sequential 4from keras.layers import Activation, Dense, Dropout, LeakyReLU 5#from keras.layers.advanced_activations import LeakyReLU 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 11from sklearn.model_selection import train_test_split 12from sklearn import datasets 13import numpy as np 14from PIL import Image 15import os 16import time 17import csv 18import cv2 19import math 20 21 22start_time = time.time() 23print("開始時刻: " + str(start_time)) 24#それぞれの画像の枚数を入力 25A = 50 26B = 50 27sum =A+B 28# 学習用のデータを作る. 29image_list = [] 30location_list = [] 31#ハイパーパラメータ 32#画像サイズ 33x = 150 34y = 75 35Z = x*y #入力層のノード数 36#エポック数 37E = 100 38#バッチサイズ 39BATCH_SIZE = 32 40#学習率 41LR = 0.00001 42#訓練データの数 train=sum 43train=sum 44 45#画像の読み込み:読み込み→リサイズ→1列に変換→正規化 46print("画像の読み込み 開始") 47count=1 48for i in range(0,A): 49 im = cv2.imread("data/image/a/"+str(i)+"a.png".format(i),1) #画像の読み込み 50 print(str(i)+"a.png") 51 image = np.array(Image.open("data/image/a/"+str(i)+"a.png").resize((x, y))) #画像をnum配列にしてリサイズ 52 print(image.shape) 53 image =np.reshape(image,Z) #2次元行列を1次元行列に変換 54 print(image.shape) 55 image_list.append(image / 255.) #appendは追加:1枚ずつ足しこんでいく 56 print(str(count)+"/"+str(train)) 57 count +=1 58 print('\n') 59 60for i in range(0,B): 61 im = cv2.imread("data/image/b/"+str(i)+"b.png".format(i),1) #画像の読み込み 62 print(str(i)+"b.png") 63 image = np.array(Image.open("data/image/b/"+str(i)+"b.png").resize((x, y))) #画像をnum配列にしてリサイズ 64 print(image.shape) 65 image =np.reshape(image,Z) #2次元行列を1次元行列に変換 66 print(image.shape) 67 image_list.append(image / 255.) #appendは追加:1枚ずつ足しこんでいく 68 print(str(count)+"/"+str(train)) 69 count +=1 70 print('\n') 71 72print("画像の読み込み 終了") 73 74# kerasに渡すためにnumpy配列に変換。 75image_list = np.array(image_list) 76 77#最大応力の位置_読み込み_表示 78location = np.loadtxt("data/value/max_stress_value_a.csv",delimiter=",",skiprows=0) 79location_list.extend(location) 80location = np.loadtxt("data/value/max_stress_value_b.csv",delimiter=",",skiprows=0) 81location_list.extend(location) 82location_list = np.array(location_list) 83print("\n最大応力の値の行列の形") 84print(location_list.shape) 85np.savetxt("data/value/max_stress_value_true.csv",location_list,delimiter=",") 86#最大応力の位置_読み込み_終了 87 88# モデルを生成してニューラルネットを構築 89model = Sequential() 90 91model.add(Dense(5000, input_dim=Z,kernel_initializer='random_uniform',bias_initializer='zeros')) 92model.add(LeakyReLU()) 93model.add(Dropout(0.2)) 94 95model.add(Dense(100,kernel_initializer='random_uniform',bias_initializer='zeros')) 96model.add(LeakyReLU()) 97model.add(Dropout(0.075)) 98 99model.add(Dense(10,kernel_initializer='random_uniform',bias_initializer='zeros')) 100model.add(LeakyReLU()) 101model.add(Dropout(0.0)) 102 103model.add(Dense(5,kernel_initializer='random_uniform',bias_initializer='zeros')) 104model.add(LeakyReLU()) 105model.add(Dropout(0.0)) 106 107model.add(Dense(1)) 108model.add(Activation("linear")) 109 110# オプティマイザ(最適化)にAdamを使用 111opt = Adam(lr=LR) 112 113width =3.45 114def loss_function(y_true,y_pred): 115 return abs(y_pred-y_true)/width*100 116 117#loss_fun = mean_absolute_error(y_true/width, y_pred/width) 118 119# モデルをコンパイル 120#最大応力位置の予測 誤差関数:相対誤差 121#model.compile(loss="mean_absolute_percentage_error", optimizer=opt) 122model.compile(loss='mean_absolute_error(y_true/width, y_pred/width)', optimizer=opt) 123 124#CSVに各エポックの学習結果の保存 125csv_logger = CSVLogger('result/training_process.csv') 126 127# 学習を実行。20%はテストに使用 128#最大応力位置の予測 モデルフィット 129history = model.fit(image_list, location_list, nb_epoch=E,verbose=1,callbacks=[csv_logger], batch_size=BATCH_SIZE, validation_split=0.2) 130 131#最大応力位置の予測 誤差の評価 132loss = model.evaluate(image_list, location_list) 133 134#最終の学習結果を書き込む 135fp = open("result/RESULT.txt","w") 136fp.write("\nloss:{}".format(loss)) 137fp.close() 138 139#最終の誤差の表示 140print("\nloss:{}\n".format(loss)) 141 142 143image_list = np.array(image_list) 144location_list = np.array(location_list) 145 146 147def get_batch(x, y, batch_size, shuffle=False): 148 '''ミニバッチを生成するジェネレーター関数 149 ''' 150 num_samples = len(x) 151 if shuffle: 152 indices = np.random.permutation(num_samples) 153 else: 154 indices = np.arange(num_samples) 155 156 num_steps = np.ceil(num_samples / batch_size).astype(int) 157 # ステップ数 = ceil(サンプル数 / バッチサイズ) 158 # 例 np.ceil(10 / 3) = np.ceil(3.33333333...) = 4 159 160 for itr in range(num_steps): 161 start = batch_size * itr 162 excerpt = indices[start:start + batch_size] 163 yield x[excerpt], y[excerpt] 164 165# 保存用ディレクトリ 166out_dirpath = 'prediction' 167os.makedirs(out_dirpath, exist_ok=True) 168 169# 学習する。 170epochs = E 171for i in range(epochs): # エポック数分ループする。 172 for x_batch, y_batch in get_batch(image_list, location_list, batch_size=BATCH_SIZE, shuffle=True): 173 # 1バッチ分学習する 174 model.train_on_batch(x_batch, y_batch) 175 print('training... epoch {}'.format(i)) 176 177 # エポックごとにテストデータで推論する。 178 y_pred = model.predict(image_list) 179 result = np.c_[y_pred, location_list] 180 181 # 推論結果を保存する。 182 filepath = os.path.join(out_dirpath, 'prediction_{}.csv'.format(i)) 183 np.savetxt(filepath, result, fmt='%.6f', delimiter=',') 184 185end_time = time.time() 186print("\n終了時刻: ",end_time) 187print ("かかった時間: ", (end_time - start_time)) 188ttime = end_time - start_time 189fa = open("result/TIME.txt","w") 190fa.write("\nかかった時間:{} ".format(ttime)) 191fa.close() 192 193

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問