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

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

新規登録して質問してみよう
ただいま回答率
85.48%
機械学習

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

Python

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

Q&A

解決済

1回答

2779閲覧

Tensorflowで自作の誤差関数を用いて学習をしたい

tei_lvl

総合スコア0

機械学習

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

Python

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

0グッド

0クリップ

投稿2020/10/03 16:18

編集2020/10/03 16:20

#問題と実現したいこと
Tensorflowでlossがnanとなったため、誤差関数を用いることで解決しようと考えました。
しかし、自作の誤差関数で学習を行った結果、まったく学習が進みません。
間違っているとことがあれば指摘をしていただきたいです。
#実装したコード

from tensorflow.keras.preprocessing.image import ImageDataGenerator import matplotlib.pyplot as plt import tensorflow as tf import datetime datagen = ImageDataGenerator( rescale=1./255, #rescale で正規化 validation_split=0.3 #validation_split で検証用データセット分割可能 ) aug_datagen = ImageDataGenerator( rescale = 1./255, #rescale で正規化 rotation_range = 20, # ランダムに±20度範囲で回転 width_shift_range = 10, # ランダムに±8px範囲で左右方向移動 height_shift_range = 10 # ランダムに±4px範囲で上下方向移動 ) batch_size=10 train_generator = datagen.flow_from_directory( '/content/drive/My Drive/my_data_set/train/', target_size=(224, 224), class_mode='categorical', batch_size=batch_size, subset='training', ) aug_train_generator = aug_datagen.flow_from_directory( '/content/drive/My Drive/my_data_set/train/', target_size=(224, 224), class_mode='categorical', batch_size=batch_size, subset='training', ) val_generator = datagen.flow_from_directory( '/content/drive/My Drive/my_data_set/train/', target_size=(224, 224), class_mode='categorical', batch_size=batch_size, subset='validation' ) %load_ext tensorboard os.chdir('/content/drive/My Drive/my_data_set/') !rm -rf ./logs/ class MyModel(tf.keras.Model): def __init__(self): super(MyModel, self).__init__() self.conv1 = tf.keras.layers.Conv2D(8,(1,1),activation='relu',input_shape = (224, 224 ,3)) self.conv1_2 = tf.keras.layers.Conv2D(32,(5,5),activation='relu') self.conv2 = tf.keras.layers.Conv2D(16,(1,1),activation='relu') self.conv2_2 = tf.keras.layers.Conv2D(64,(3,3),activation='relu') self.conv3 = tf.keras.layers.Conv2D(32,(1,1),activation='relu') self.conv3_2 = tf.keras.layers.Conv2D(128,(3,3),activation='relu') self.pooling1 = tf.keras.layers.MaxPooling2D((2,2), strides=None, padding='valid') self.pooling2 = tf.keras.layers.MaxPooling2D((2,2), strides=None, padding='valid') self.flatten = tf.keras.layers.Flatten() self.fc1 = tf.keras.layers.Dense(256, activation='relu') self.fc2 = tf.keras.layers.Dense(9, activation='relu') self.dropout = tf.keras.layers.Dropout(0.2) def call(self, x, training=False): x = self.conv1(x) x = self.conv1_2(x) x = self.pooling1(x) x = self.conv2(x) x = self.conv2_2(x) x = self.pooling2(x) x = self.conv3(x) x = self.conv3_2(x) x = self.pooling2(x) x = self.flatten(x) x = self.fc1(x) x = self.dropout(x, training=training) x = self.fc2(x) return x model = MyModel() Adam =tf.keras.optimizers.Adam(learning_rate=0.001,clipvalue=1.0) def custom_loss(y_true, y_pred): error = -tf.reduce_sum(y_true*tf.math.log(tf.nn.softmax(y_pred) + 1e-10)) return error model.compile(optimizer=Adam, loss=custom_loss, metrics=['accuracy']) log_dir = "logs/fit/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S") tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1,write_graph=True) early_stopping_call_back = tf.keras.callbacks.EarlyStopping(monitor='accuracy', patience=10, verbose=0, mode='auto') set_seed(0) model.fit(train_generator,epochs=40) history = model.fit( aug_train_generator, epochs = 50, validation_data = val_generator, callbacks=[tensorboard_callback,early_stopping_call_back], )

#試してみたこと
多クラス分類に対応したなんらかの追加・変更が必要なのかとも考えましたが、現在は解決法の見当がつきません。

#実行環境
googlecolab
tensorflow 2.3.0

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

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

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

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

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

meg_

2020/10/04 00:49

> Tensorflowでlossがnanとなったため nanとなった原因は判明しているのでしょうか?
aokikenichi

2020/10/04 05:06

meg_さんと同じかと思いますが lossがnanとなった原因がわからないまま誤差関数の自作は無謀と思います。 まずはその原因を明らかにするところからだと思います。
tei_lvl

2020/10/04 08:42

meg さん aokikenichiさん回答ありがとうございます。 確かに原因がはっきりさせることが重要ですね。 そこで、調べてみるとtfdbg やtf.Printの活用が例として出てくるのですが、 活用法が分かりません。特にtfdbgはhttps://qiita.com/keisuke-nakata/items/5d6918678e8099b565d0 を参考にデバッカ部分を実行してみたのですが、特にメッセージが出てくるようでもないようです。 また、tf.Printは上記のようなネットワークに関して使用している例が見つかりませんでした。 google colabにおけるtfdbgの正しい使用方法、tf.Printの活用方法または、原因の正しい究明方法があれば、ご教授いただければ幸いです。
guest

回答1

0

自己解決

tesorflowにおいて誤差関数でsoftmaxが含まれていないようでネットワーク定義において最後にsoftmax関数を追加することで解決いたしました。

投稿2020/10/27 09:16

tei_lvl

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問