Как обучить модель LSTM многомерному массиву? - PullRequest
0 голосов
/ 19 декабря 2018

Я недавно написал модель LSTM для прогнозирования последовательности:

    ############### BUILD MODEL ###############

''' HERE WE ARE CREATING THE LSTM MODEL '''

model = Sequential()
model.add(LSTM(128, input_shape=(X.shape[1:]), activation='relu', return_sequences=True))

model.add(Dropout(0.2))

model.add(LSTM(128,input_shape=(X.shape[1:]), activation='relu'))
model.add(Dropout(0.1))

model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))

model.add(Dense(10, activation='softmax'))

# In[8]:


'''HERE WE ARE CREATING AN OPTIMIZER AND THEN TRAINING OUR MODEL'''

opt = tf.keras.optimizers.Adam(lr=0.001, decay=1e-6)

model.compile(
    loss='sparse_categorical_crossentropy',
    optimizer=opt,
    metrics=['accuracy'],
)

model.fit(X, Y, batch_size=10, epochs=1)

, где np.shape(X) = (237, 30, 3) и np.shape(Y) = (237, 3).Но при подгонке этих данных к модели возвращается ошибка:

ValueError: Error when checking target: expected dense_1 to have shape (1,) but got array with shape (3,)

Что не так в этом коде?

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Если ваши фигуры данных примерно такие: np.shape (X) = (237, 30, 3) и np.shape (Y) = (237, 3), попробуйте эту сеть.

model = Sequential()
model.add(LSTM(32, input_shape=(X.shape[1:]), activation='relu', return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(32, activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(3, activation='softmax'))

opt = tf.keras.optimizers.Adam(lr=0.001, decay=1e-6)

model.compile(
    loss='categorical_crossentropy',
    optimizer=opt,
    metrics=['accuracy'],
)

model.fit(X, Y, batch_size=10, epochs=1)

Поскольку вы используете Keras Sequential Api , вам не нужно указывать вход для второго слоя LSTM, а на последнем плотном слое ваша форма "Y" имеет вид (237, 3), поэтому окончательныйПлотный слой также должен выдавать 3. 3. 1006 *

Вы также можете задать input_shape = (None, 3) для вашего первого слоя LSTM, если «3» (количество объектов) в вашем входе является постоянным для каждого семпла..

0 голосов
/ 19 декабря 2018

Кажется, вы закодировали ярлыки одним щелчком.Либо не используйте горячее кодирование их (т.е. пусть они будут разреженными метками) и используйте sparse_categorical_crossentropy в качестве функции потерь, либо, альтернативно, используйте горячее кодирование их и используйте categorical_crossentropy в качестве функции потерь.

В качестве примечания: вы уверены, что это задача классификации?Так как вы используете слой softmax в качестве последнего слоя с 10 единицами, но вы упомянули, что метки имеют 3 класса?!

...