Модель Tensorflow с настраиваемой функцией потерь не обучается - PullRequest
1 голос
/ 05 августа 2020

Я создал настраиваемую функцию потерь, как показано ниже:

import tensorflow.keras.backend as K
def custom_loss(y_true, y_pred):
    y_true = K.cast(y_true, tf.float32)
    y_pred = K.cast(y_pred, tf.float32)

    mask = K.sign(y_true) * K.sign(y_pred)
    mask = ((mask * -1) + 1) / 2
    losses = K.abs(y_true * mask)

    return K.sum(losses)

Однако, когда я пытаюсь обучить модель с помощью этой функции потерь, обучение не выполняется. Модель нормально работает с другими функциями потерь, такими как mse и mae, и я перепробовал все скорости обучения и сложности модели.

Ниже показано, как я знаю, что обучение не проводится.

model = get_compiled_model()
print(model.predict(train_x)[:10])
model.fit(train_x, train_y, epochs=5, verbose=1)
print(model.predict(train_x)[:10])
model.fit(train_x, train_y, epochs=5, verbose=1)
print(model.predict(train_x)[:10])
[[0.19206487]
 [0.19201839]
 [0.19199933]
 [0.19199185]
 [0.19206186]
 [0.19208357]
 [0.1920282 ]
 [0.19203594]
 [0.1919941 ]
 [0.19202243]]
Epoch 1/5
1/1 [==============================] - 0s 1ms/step - loss: 0.0179
Epoch 2/5
1/1 [==============================] - 0s 2ms/step - loss: 0.0179
Epoch 3/5
1/1 [==============================] - 0s 1ms/step - loss: 0.0179
Epoch 4/5
1/1 [==============================] - 0s 1ms/step - loss: 0.0179
Epoch 5/5
1/1 [==============================] - 0s 2ms/step - loss: 0.0179
[[0.19206487]
 [0.19201839]
 [0.19199933]
 [0.19199185]
 [0.19206186]
 [0.19208357]
 [0.1920282 ]
 [0.19203594]
 [0.1919941 ]
 [0.19202243]]
Epoch 1/5
1/1 [==============================] - 0s 1ms/step - loss: 0.0179
Epoch 2/5
1/1 [==============================] - 0s 2ms/step - loss: 0.0179
Epoch 3/5
1/1 [==============================] - 0s 2ms/step - loss: 0.0179
Epoch 4/5
1/1 [==============================] - 0s 951us/step - loss: 0.0179
Epoch 5/5
1/1 [==============================] - 0s 1ms/step - loss: 0.0179
[[0.19206487]
 [0.19201839]
 [0.19199933]
 [0.19199185]
 [0.19206186]
 [0.19208357]
 [0.1920282 ]
 [0.19203594]
 [0.1919941 ]
 [0.19202243]]

2d-массив в приведенном выше коде - это первые 10 прогнозов модели, и он не меняется ни в малейшей степени даже после 5 эпох обучения.

Моя интуиция подсказывает мне, что что-то не так с функция потерь, но понятия не имею, какая.

Модель выглядит следующим образом

def get_compiled_model():
  model = tf.keras.Sequential([
    tf.keras.layers.Dense(10, input_dim=2*training_size+1, activation='softmax'),
    tf.keras.layers.Dense(10, activation='softmax'),
    tf.keras.layers.Dense(1, activation='tanh')
  ])

  opt = tf.keras.optimizers.Adam(learning_rate=0.0005)
  model.compile(optimizer=opt,
                loss=custom_loss,
                metrics=[])
  return model

1 Ответ

0 голосов
/ 06 августа 2020

Я играл с некоторыми поддельными данными, используя вашу модель и функцию потерь, и я хотел проверить производные .

if __name__=="__main__":
    m = get_compiled_model()
    x = numpy.random.random( (1000, 21))
    x = numpy.array(x, dtype="float32")
    exp_y = numpy.random.random( (1000, 1))
    exp_y = (exp_y>0.5)*1.0 
    
    
    with tf.GradientTape() as tape:
        y = m(x)
        loss = custom_loss(y, exp_y)
        #loss = keras.losses.mse(y, exp_y)
        grad = tape.gradient(loss, m.trainable_variables)
        for var, g in zip(m.trainable_variables, grad):
            print(f'{var.name}, shape: {K.sum(g*g)}')
   

Для функции потерь mse:

плотный / ядро: 0, форма: 2817.013671875 плотная / диагональ: 0, форма: 530.52197265625 плотный_1 / ядро: 0, форма: 3826.3974609375 плотный_1 / смещение: 0, форма: 25160.9375 плотное_2 / ядро: 0, форма: 125238.34375 плотный_2 / смещение: 0, форма: 1241268,5

Для пользовательской функции потерь

плотное / ядро: 0, форма: 34.87071228027344 плотный / уклон: 0, форма: 6.609962463378906 плотный_1 / ядро: 0, форма: 107.27591705322266 плотный_1 / смещение: 0, форма: 824.83740234375 плотное_2 / ядро: 0, форма: 5944.91796875 density_2 / bias: 0, shape: 59201.58203125

Мы видим, что суммы производных различаются на несколько порядков. Даже с этими случайными данными функция потерь MSE приведет к тому, что выходные данные модели будут изменяться со временем.

Это может быть только в случае с поддельными данными, которые я сделал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...