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

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

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

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

機械学習

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

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Q&A

0回答

1887閲覧

kerasで損失関数を自作

roundell

総合スコア0

Keras

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

機械学習

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

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

0グッド

0クリップ

投稿2021/12/11 14:27

やりたいこと

ある9×120行列X=x_j(j=1,…,9)に対して、損失関数(目的関数)
-1/9Σ[j=1..9][-1/0.8exp(-0.8I(X))]
を最小化するようなI(X)の関数形をニューラルネットワークで導出しようとしています。

言うなれば、Xをニューラルネットワークに入力した時、出力されるI(X)は活性化関数fと重みωを用いて
I(X)=f(ωX)
と表されるため(実際は中間層があるのでもっと複雑ですが)、その重みωを求めたいといった感じです。

該当のソースコード

import numpy as np import pandas as pd import csv from keras.models import Sequential from keras.layers import Dense, Activation from pandas import DataFrame import tensorflow as tf from tensorflow.keras import backend as K from tensorflow.keras.losses import Loss import os #CSVファイルの読み込み csvdata = pd.read_csv("行列.csv", header=None) x_train = DataFrame(csvdata) #CSVから読んだデータをnumpyの行列に入れる myarray = np.array myarray = csvdata.values x_train = np.asarray(x_train).astype(np.float32) #乱数シード固定 import random def set_seed(seed=200): tf.random.set_seed(seed) np.random.seed(seed) random.seed(seed) os.environ["PYTHONHASHSEED"] = str(seed) #ニューラルネットワーク作成(64ノードの中間層1つ) set_seed(0) model = Sequential() model.add(Dense(64, input_dim=120)) model.add(Activation('relu')) model.add(Dense(1, input_dim=64)) model.add(Activation('relu')) #損失関数作成 def custom_loss(y_pred): U = -np.exp(-0.8*y_pred)/0.8 return K.mean( U ) #自作した損失関数クラスを実装 class CustomLoss(Loss): def __init__(self, name="custom_loss", **kwargs): super(CustomLoss, self).__init__(name=name, **kwargs) def call(self, y_pred): y_pred = tf.convert_to_tensor(y_pred) return custom_loss(y_pred) #念のためTensor化 #最適化 model.compile(optimizer='SGD', loss=custom_loss, metrics=['accuracy']) #重みを出力 print(model.layers[0].get_weights()[0])

発生している問題

損失関数を別の関数に変更しても、なんなら損失関数を全部削除して

def custom_loss(y_pred): return

にしても、同じ値の重みしか出力されません。
引数にy_trueを含めていないのも問題だと思うのですが、どのように含めたらいいか分からないです。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問