Пользовательская функция потерь работает для обычного NN, но не для LSTM - PullRequest
0 голосов
/ 11 ноября 2019

Итак, я создаю пользовательскую функцию потерь на основе tfp.stats.covariance(). Он отлично работает при работе с обычным NN, как показано ниже:

import numpy as np
import tensorflow as tf
import tensorflow_probability as tfp
import tensorflow.keras.backend as K

x = np.random.rand(100,1,180)
y = np.random.rand(100,15,12)

def sharpe_loss(y_true, y_pred):  

    cov = tf.cast(tfp.stats.covariance(y_true, sample_axis=1, event_axis=-1), tf.float32)

    return K.mean(y_pred)

model = tf.keras.models.Sequential([
  tf.keras.layers.Dense(12, activation=tf.nn.sigmoid)
])

model.compile(optimizer= 'Adam',
              loss=sharpe_loss)

fit_ = model.fit(x, y, epochs=5, batch_size = 28) 

Но при построении LSTM, как показано ниже

import numpy as np
import tensorflow as tf
import tensorflow_probability as tfp
import tensorflow.keras.backend as K

x = np.random.rand(100,1,180)
y = np.random.rand(100,15,12)

def sharpe_loss(y_true, y_pred):  

    cov = tf.cast(tfp.stats.covariance(y_true, sample_axis=1, event_axis=-1), tf.float32)

    return K.mean(y_pred)

model = tf.keras.models.Sequential([
  tf.keras.layers.LSTM(1),
  tf.keras.layers.Dense(12, activation=tf.nn.sigmoid)
])

model.compile(optimizer= 'Adam',
              loss=sharpe_loss)

fit_ = model.fit(x, y, epochs=5, batch_size = 28) 

, я получаю ValueError: sample_axis ([1]) and event_axis ([1]) overlapped. Что странно, поскольку фигура, которая входит в функцию потерь для y_pred, имеет вид [batch_size, 15,12], а при запуске

y_true = tf.constant(np.random.rand(28,15,12), tf.float32)
tf.cast(tfp.stats.covariance(y_true, sample_axis=1, event_axis=-1), tf.float32)

Ошибка не возникает. Я что-то не так понял с моделью LSTM, или что здесь не так?

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

...