Я хотел бы передать выходные данные встраиваемого слоя как начальное состояние слоя LSTM. Конечно, это относится только к batch_size = 1
, потому что я знаю, что состояния LSTM имеют размер [batch_size, num_units]
, где num_units
- это количество нейронов в LSTM. Кроме того, я использую embedding_size = 1
.
. Для этого минимального примера у меня есть 1000 наблюдений, 20 временных шагов и 3 числовых объекта, и каждое наблюдение (строка) представлено customer_id
, что в данном случае Iесть 3 клиентов. Поэтому, когда я тренируюсь на одном отдельном примере, я буду использовать вывод слоя внедрения (который будет иметь размер [1, 1, 1]
). Тем не менее, сначала я изменяю форму, а затем разбиваю ее на части, чтобы иметь размер num_units
во втором измерении.
Это один минимальный пример
import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow import keras
print(tf.__version__)
# 2.00
num_obs = 1000
n_steps = 20
n_numerical_feats = 3
cat_size = 15
embedding_size = 1
num_units = 64
target = np.random.random(size=(num_obs,1))
print(target.shape)
#(1000, 1)
#3 numerical variable
num_data = np.random.random(size=(num_obs*n_steps,n_numerical_feats))
print(num_data.shape)
#(20000, 1)
#Reshaping numeric features to fit into an LSTM network
X_numeric = num_data.reshape(-1,n_steps,n_numerical_feats)
print(X_numeric.shape)
#(1000, 20, 1)
unique_customer_ids = 3
customer_id = np.random.randint(0, unique_customer_ids, num_obs).reshape(-1,1)
print(customer_id.shape)
#(1000, 1)
customer_id_input = keras.layers.Input(shape=(1,), name='customer_id_input')
#<tf.Tensor 'cat_input:0' shape=(None, 1) dtype=float32>
customer_id_embedded = keras.layers.Embedding(input_dim=unique_customer_ids, output_dim = 1, embeddings_initializer='uniform')(customer_id_input)
#<tf.Tensor 'embedding/Identity:0' shape=(None, 1, 1) dtype=float32>
customer_id_embedded_reshape = tf.squeeze(customer_id_embedded, [1])
# <tf.Tensor 'Squeeze:0' shape=(None, 1) dtype=float32>
state = tf.tile(customer_id_embedded_reshape, [-1, num_units])
#<tf.Tensor 'Tile:0' shape=(None, 64) dtype=float32>
numerical_inputs = keras.layers.Input(shape=(n_steps, n_numerical_feats), name='numerical_inputs')
#<tf.Tensor 'numeri cal_inputs:0' shape=(None, 20, 1) dtype=float32>
lstm_out, state_h, state_c = keras.layers.LSTM(units = num_units, return_sequences=False, return_state=True,kernel_initializer='glorot_uniform', recurrent_initializer='glorot_uniform', bias_initializer='zeros')(numerical_inputs, initial_state=[state, state])
#<tf.Tensor 'lstm/strided_slice_7:0' shape=(?, 64) dtype=float32>
Dense_layer1 = keras.layers.Dense(32, activation='relu', use_bias=True)(lstm_out)
Dense_layer2 = keras.layers.Dense(1, activation='linear', use_bias=True)(Dense_layer1 )
model = keras.models.Model(inputs=[numerical_inputs] + [customer_id_input], outputs=Dense_layer2)
model.summary()
keras.utils.plot_model(model, to_file='model.png', show_shapes = True, show_layer_names = True)
#compile model
optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)
model.compile(loss='mse',
optimizer=optimizer,
metrics=['mae', 'mse'])
EPOCHS = 1000
#fit the model
#you can use input layer names instead
history = model.fit({'numerical_inputs': X_numeric,
'customer_id_input': customer_id},
y = target,
batch_size=1,
epochs=EPOCHS,
verbose=1,
initial_epoch=0)
Но я получаю эту ошибку, котораяЯ не мог найти ничего о. Кажется, все в порядке, просто не могу понять, где я ошибаюсь.
![enter image description here](https://i.stack.imgur.com/FNhfr.png)