Подача вывода встраиваемого слоя в качестве начальных состояний в LSTM - PullRequest
0 голосов
/ 29 октября 2019

Я хотел бы передать выходные данные встраиваемого слоя как начальное состояние слоя 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

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