Рассмотрим следующие данные:
t = 100
x = np.array(list(range(t))).reshape(1, t)
B = np.array([2,-2]).reshape(1,2)
y = x.T @ B + 10*np.vstack([np.sin(x), np.sin(x)]).T
x = x[0]
y = y.T
plt.clf()
plt.plot(x, y[0,:])
plt.plot(x, y[1,:])
Я хочу подобрать полупараметрическую модель, где LSTM изучает синусоидальную волну, иЛинейная регрессия изучает тренд для каждого временного ряда.
y = x * b + LSTM(x)
(N, t, 1) (t,p)(p,N) (N, t, 1)
Транспонируя первый член, мы получаем:
y = (x * b).T + LSTM(x)
(N, t, 1) (N,t) (N, t, 1)
Как я могу реализовать это в Керасе?Является ли это возможным?Я сталкиваюсь с проблемами, потому что x
имеет фиксированное измерение - это не то, что вы бы взяли мини-партии.
Аналогично, весовая матрица b
имеет фиксированный размер.N
постоянно в моей задаче - в мире есть фиксированное количество последовательностей, и их больше никогда не будет.
Если бы я делал это вручную, была бы очень очевидная форма градиентов.Но не совсем понятно, как вставить это во что-то, с чем может работать Керас.
Вот ошибка при кодировании:
y = y.reshape(2,t,1)
x = x.reshape(1,t,1)
Linp = Input(shape = (100,1))
xinp = Input(shape = (100,1))
lstm = LSTM(1, return_sequences = True)(Linp)
XB = Dense(2, use_bias = False)(xinp)
rs = Lambda(lambda x: K.reshape(x, (2,100,1)))(XB)
added = add([rs, lstm])
m = Model([xinp, Linp], added)
m.summary()
m.compile(optimizer = "Adam", loss = "mean_squared_error")
m.fit([x,np.vstack([x,x])], y)
Сбой с ошибкой
ValueError: All input arrays (x) should have the same number of samples. Got array shapes: [(1, 100, 1), (2, 100, 1)]