Евгений СмирновНа сайте 11 лет и 9 месяцев (заходил 30 дней назад)
19
3690.83
|
Рейтинг
3690.83
|
Редактирование бюджета
|
|
10 Апреля 2024
По договоренности
Необходимо объяснить принцип формирования рекуррентного слоя принимающего на вход вектор (не последовательность векторов), выдающий последовательность векторов на выходе. И как чуть более сложная задача – рекуррентная сеть many-to-many с последовательностями на входе и выходе разной длины. На примере keras.
В обоих случаях получаю ошибку различной длины последовательности. Пример 1. Нужно подать на вход вектор длиной 2 (не последовательность), т.е. есть три входных образца x[0],x[1],x[2]. На выходе получаю последовательности 3 раза по 1 значению. 1) y[0][0],y[0][1],y[0][2]; 2)y[1][0],y[1][1],y[1][2]; 3) y[2][0],y[2][1],y[2][2] x = [[1,2],[3,4],[4,5]] y=[[1,2,3],[1,2,3],[1,2,3]] x = np.array(x) y = np.array(y) input = Input(input_shape=(1,2)) model = SimpleRNN(1, stateful=True, return_state=False,return_sequences=True)(input) output = Dense(1)(model) test = Model(input, output) test.compile(loss='mse', optimizer='adam') test.fit(x,y) Пример 2. many-to-many, такой что вход и выход различной длины На вход подаю последовательность из 10ти значений размерностью 1, на выходе ожидаю последовательность из 20ти значений размерностью 1 input_shape=(None, 1) model_input = Input(shape=input_shape) rnn = LSTM(20, return_sequences=False)(model_input) dense = Dense(10,activation='tanh')(rnn) input_shape2=(None, 1, 10) model_input2 = Input(shape=input_shape2) rnn2 = LSTM(20, return_sequences=True,stateful=True)(model_input2) dense2 = Dense(1,activation='sigmoid')(rnn2) encoder = keras.Model(model_input, dense, name="encoder") decoder = keras.Model(model_input2, dense2, name="decoder") model = keras.Model(model_input, decoder(encoder(model_input)), name="autoencoder") model.compile(optimizer='adam', loss='binary_crossentropy') |