Если вы внимательно прочитаете источник вашего вдохновения , вы обнаружите, что он говорит о данных "decoder_input".
Он говорит о технике "принуждения учителя", которая состоит изподача декодера с некоторыми задержанными данными.Но также говорит, что это не очень хорошо работает в его случае, поэтому он устанавливает исходное состояние декодера в группу 0, так как эта строка показывает :
decoder_input = np.zeros((decoder_output.shape[0], decoder_output.shape[1], 1))
в егоВ дизайне авто-кодера они представлены двумя отдельными моделями, которые имеют разные входы, затем он связывает их со статистикой RNN друг от друга.
Я вижу, что вы пытались сделать то же самое, но вы добавили np.array([x_encoder, x_decoder])
, где вы должны были сделать [np.array(x_encoder), np.array(x_decoder)]
.Каждый вход в сеть должен быть массивом numpy, который вы помещаете в список входов, а не один большой массив numpy.
Я также нашел некоторые опечатки в вашем коде, вы добавляете y
к себе, где вместо этого вы должны создать Y
переменную
def getXY():
X_encoder, X_decoder, Y = list(), list(), list()
for _ in range(100):
x_encoder = [random.random() for _ in range(input_sequence_length)]
# the decoder input is a sequence of 0's same length as target seq
x_decoder = [0]*len(target_sequence_length)
y = [random.random() for _ in range(target_sequence_length)]
X_encoder.append(x_encoder)
# Not really optimal but will work
X_decoder.append(x_decoder)
Y.append(y)
return [np.array(X_encoder), np.array(X_decoder], np.array(Y)
теперь, когда вы делаете:
X, Y = getXY()
вы получаете X, представляющий собой список из 2-х числовых массивов (как запрашивает ваша модель), и Y, представляющий собой единый массив-пустышку.
Надеюсь, это поможет
EDIT
Действительно, в коде, который генерирует набор данных, вы можете видеть, что они создают 3 np массива для ввода.Для RNN нужны 3-мерные входные данные :-)
Следующий код должен решить проблему формы:
def getXY():
X_encoder, X_decoder, Y = list(), list(), list()
for _ in range(100):
x_encoder = [random.random() for _ in range(input_sequence_length)]
# the decoder input is a sequence of 0's same length as target seq
x_decoder = [0]*len(target_sequence_length)
y = [random.random() for _ in range(target_sequence_length)]
X_encoder.append(x_encoder)
# Not really optimal but will work
X_decoder.append(x_decoder)
Y.append(y)
# Make them as numpy arrays
X_encoder = np.array(X_encoder)
X_decoder = np.array(X_decoder)
Y = np.array(Y)
# Make them 3 dimensional arrays (with third dimension being of size 1) like the 1d vector: [1,2] can become 2 de vector [[1,2]]
X_encoder = np.expand_dims(X_encoder, axis=2)
X_decoder = np.expand_dims(X_decoder, axis=2)
Y = np.expand_dims(Y, axis=2)
return [X_encoder, X_decoder], Y