#問題と実現したいこと
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
回答1件
あなたの回答
tips
プレビュー