Keras временной режим весовой выборки для маскировки, несоответствие размеров - PullRequest
0 голосов
/ 13 марта 2020

Попытка реализовать веса выборки 2D для взвешивания данных временных рядов в простой сети LSTM в Керасе. В соответствии с тем, что я могу найти в Интернете, слой маскирования должен распространяться на вычисление функции потерь, чтобы ошибки в замаскированных временных шагах игнорировались. Это, похоже, НЕ имеет место, поскольку маскирование значений np.inf дает мне потери NAN. Поэтому я пытаюсь взвесить значения np.inf до нуля на этапе подгонки, но это дает ошибку:

ValueError: Can not squeeze dim[1], expected a dimension of 1, got 50 for 'loss/dense_4_loss/weighted_loss/Squeeze' (op: 'Squeeze') with input shapes: [50,50].

Вот простой пример с матрицей весов из всех, вызывающих ошибку:

import numpy as np

from sklearn.model_selection import train_test_split

from tensorflow.keras.models import Model, Sequential
from tensorflow.keras.layers import Dense, Input, LSTM, RepeatVector
import tensorflow as tf

import warnings
warnings.filterwarnings('ignore')

def create_sine_wave(amplitude=1, freq=5, n_timesteps=50):
    x = np.linspace(0, 5, n_timesteps)
    y = [amplitude*np.sin(2*np.pi*freq*xx) for xx in x]

    return y

n_timesteps = 50
n_samples = 1000
X = np.empty((n_samples, n_timesteps))

for i in range(n_samples):
    X[i, :] = create_sine_wave(n_timesteps=n_timesteps)

class MinMaxScale():
    def __init__(self, feature_min=-1, feature_max=1):
        self.feature_min = feature_min
        self.feature_max = feature_max
    def fit(self, X):
        self.X_min = X.min()
        self.X_max = X.max()
    def transform(self, X):
        X_std = (X - self.X_min)/(self.X_max - self.X_min)
        return X_std*(self.feature_max - self.feature_min) + self.feature_min

feature_max = 1
feature_min = -1

X_train, X_test, y_train, y_test = train_test_split(X, X, test_size=0.2, shuffle=False)

scaler = MinMaxScale(feature_min, feature_max)
_ = scaler.fit(X_train)

X_train = scaler.transform(X_train)
y_train = scaler.transform(y_train)
X_test = scaler.transform(X_test)
y_test = scaler.transform(y_test)

weights = np.ones((800, 50))

timesteps = n_timesteps
input_dim = 1
latent_dim = 10

model = Sequential()
model.add(Input(shape=(n_timesteps, 1)))
model.add(LSTM(10))
model.add(RepeatVector(n_timesteps))
model.add(LSTM(10, return_sequences=False))
model.add(Dense(n_timesteps))
model.compile(loss='mean_squared_error', optimizer='adam', sample_weight_mode='temporal')
history = model.fit(X_train[:, :, np.newaxis], X_train[:, :, np.newaxis], epochs=10, batch_size=50, verbose=1, sample_weight=weights)
...