Ошибка значения: не удается преобразовать массив размером 78543360 в форму (51135,4,32,32)

#python #tensorflow #time-series #conv-neural-network #lstm

#python #тензорный поток #временные ряды #conv-нейронная сеть #lstm

Вопрос:

Следуя этому руководству из https://machinelearningmastery.com/how-to-develop-rnn-models-for-human-activity-recognition-time-series-classification/

Я пытаюсь реализовать сетевую модель CNN-LSTM на своих данных временных рядов.

 verbose, epochs, batch_size = 0, 25, 64
n_timesteps, n_features, n_outputs = 
X_train.shape[1], X_train.shape[2], y_train.shape[1]
# reshape data into time steps of sub-sequences
n_steps, n_length = 4, 32
X_train = X_train.reshape((X_train.shape[0], n_steps, 
n_length, n_features))
X_test = X_test.reshape((X_test.shape[0], n_steps, 
n_length, n_features))
# define model
model = Sequential()
model.add(TimeDistributed(Conv1D(filters=64, 
kernel_size=3, activation='relu'), input_shape= 
(None,n_length,n_features)))
model.add(TimeDistributed(Conv1D(filters=64, 
kernel_size=3, activation='relu')))
model.add(TimeDistributed(Dropout(0.5)))
model.add(TimeDistributed(MaxPooling1D(pool_size=2)))
model.add(TimeDistributed(Flatten()))
model.add(LSTM(100))
model.add(Dropout(0.5))
model.add(Dense(100, activation='relu'))
model.add(Dense(n_outputs, activation='sigmoid'))
model.compile(loss='binary_crossentropy', 
optimizer='adam', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=epochs, 
batch_size=batch_size, verbose=verbose)
 

Вот формы перед использованием reshape:

 print(X_train.shape, y_train.shape, X_test.shape, 
y_test.shape)
(51135, 128, 12) (51135, 1) (21915, 128, 12) (21915, 1)
 

Вот раздел кода, с которым у меня возникла ошибка:
ValueError: cannot reshape array of size 78543360 into shape (51135, 4,32,32) .

Как мне это исправить?

Ответ №1:

У меня не было доступа к вашим данным, поэтому я создал фиктивные массивы np.zero для данных с указанными вами размерами. Запустил его, чтобы посмотреть, что происходит с размерами. Не столкнулся с ошибкой, которую вы описываете. Код, который я использовал, приведен ниже. Выполняется и обучается, поэтому размеры кажутся правильными.

 X_train=np.zeros((51135, 128, 12))
y_train=np.zeros((51135, 1))
X_test=np.zeros((21915, 128, 12))
y_test=np.zeros((21915, 1))
print(X_train.shape, y_train.shape, X_test.shape,y_test.shape)
verbose, epochs, batch_size = 0, 25, 64
n_timesteps, n_features, n_outputs = X_train.shape[1], X_train.shape[2], y_train.shape[1]
print(n_timesteps, n_features, n_outputs)
# reshape data into time steps of sub-sequences
n_steps, n_length = 4, 32
X_train = X_train.reshape((X_train.shape[0], n_steps, n_length, n_features))
X_test = X_test.reshape((X_test.shape[0], n_steps,n_length, n_features))
print (X_train.shape, X_test.shape)
# define model
model = Sequential()
model.add(TimeDistributed(Conv1D(filters=64, 
kernel_size=3, activation='relu'), input_shape= 
(None,n_length,n_features)))
model.add(TimeDistributed(Conv1D(filters=64, 
kernel_size=3, activation='relu')))
model.add(TimeDistributed(Dropout(0.5)))
model.add(TimeDistributed(MaxPooling1D(pool_size=2)))
model.add(TimeDistributed(Flatten()))
model.add(LSTM(100))
model.add(Dropout(0.5))
model.add(Dense(100, activation='relu'))
model.add(Dense(n_outputs, activation='sigmoid'))
model.compile(loss='binary_crossentropy',optimizer='adam', metrics=['accuracy'])
model.summary()
model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size, verbose=1)
 

Вот данные, которые выводятся на печать. Конечно, со всеми нулями обучающие данные бессмысленны, но размеры соответствуют модели.подходит для выполнения

 (51135, 128, 12) (51135, 1) (21915, 128, 12) (21915, 1)
128 12 1
(51135, 4, 32, 12) (21915, 4, 32, 12)
Epoch 1/25
799/799 [==============================] - 9s 11ms/step - loss: 0.6051 - accuracy: 1.0000
Epoch 2/25
799/799 [==============================] - 5s 6ms/step - loss: 0.3479 - accuracy: 1.0000
 

Ответ №2:

Вы пытаетесь преобразовать X_train в (51135, 4,32,32). Это невозможно, потому что форма X_train равна (51135, 128, 12). 51135 x 128 x 12 ! = 51135 x 4 x 32 x 32

Комментарии:

1. Привет @Andrey, спасибо за ответ. Можете ли вы подсказать мне, что мне следует сделать, чтобы исправить эту ошибку?

2. @Alanda Что такое X_train? Почему он имеет такую форму?