Как правильно изменить форму данных для ConvLSTM в python?

#python #pandas #numpy #machine-learning #lstm

#python #pandas #numpy #машинное обучение #lstm

Вопрос:

Я пытаюсь следовать этому руководству здесь, но я столкнулся с проблемой с моделью ConvLSTM.

Итак, в руководстве у них есть массив [10,20,30,40,50,60,70,80,90], и они разделяют его на

 [[10,20,30]
 [20,30,40]
 [30,40,50]
 [40,50,60]
 [50,60,70]
 [60,70,80]
 [70,80,90]
  

и когда они изменяют его с помощью

 n_features = 1
n_seq = 2
n_steps = 2
X = X.reshape((X.shape[0], n_seq, n_steps, n_features))
  

это выглядит примерно так

 [[[10]
  [20]
  [30]]

 [[20]
  [30]
  [40]] ...
  

и моя проблема в том, что когда я пытаюсь импортировать свои данные и использовать их, мои данные имеют форму (133460,20) , подобную этой

 [[1,2,3...20]
 [1,2,3....20]]
  

ошибка, с которой я сталкиваюсь, заключается в

Ошибка значения: не удается преобразовать массив размером 2001900 в форму (1000095,2,2,1)

и я просто немного смущен всем этим и тем, как правильно изменить форму моих данных. Вот полный код с примечанием о том, где мой код терпит неудачу.

Это код руководства, но мне не нужна splitSequence() функция, потому что мои данные уже разделены (то же самое с разделением на поезд / тест.

ОБУЧАЮЩИЙ КОД

 
# split a univariate sequence into samples
def split_sequence(sequence, n_steps):
    X, y = list(), list()
    for i in range(len(sequence)):
        # find the end of this pattern
        end_ix = i   n_steps
        # check if we are beyond the sequence
        if end_ix > len(sequence)-1:
            break
        # gather input and output parts of the pattern
        seq_x, seq_y = sequence[i:end_ix], sequence[end_ix]
        X.append(seq_x)
        y.append(seq_y)
    return array(X), array(y)

# define input sequence
raw_seq = [10, 20, 30, 40, 50, 60, 70, 80, 90]
# choose a number of time steps
n_steps = 4
# split into samples
X, y = split_sequence(raw_seq, n_steps)
# reshape from [samples, timesteps] into [samples, subsequences, timesteps, features]
n_features = 1
n_seq = 2
n_steps = 2
X = X.reshape((X.shape[0], n_seq, n_steps, n_features))
# define model
model = Sequential()
model.add(TimeDistributed(Conv1D(filters=64, kernel_size=1, activation='relu'), input_shape=(None, n_steps, n_features)))
model.add(TimeDistributed(MaxPooling1D(pool_size=2)))
model.add(TimeDistributed(Flatten()))
model.add(LSTM(50, activation='relu'))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
# fit model
model.fit(X, y, epochs=500, verbose=0)
# demonstrate prediction
x_input = array([60, 70, 80, 90])
x_input = x_input.reshape((1, n_seq, n_steps, n_features))
yhat = model.predict(x_input, verbose=0)
print(yhat)
>> [[101.69263]]

  

МОЙ КОД

 # reshape from [samples, timesteps] into [samples, subsequences, timesteps, features]
n_features = 1
n_seq = 2
n_steps = 2
X = X_train.reshape((X_train.shape[0], n_seq, n_steps, n_features)) <<<<< My code fails here
# define model
model = Sequential()
model.add(TimeDistributed(Conv1D(filters=64, kernel_size=1, activation='relu'), input_shape=(None, n_steps, n_features)))
model.add(TimeDistributed(MaxPooling1D(pool_size=2)))
model.add(TimeDistributed(Flatten()))
model.add(LSTM(50, activation='relu'))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
# fit model
model.fit(X, y, epochs=500, verbose=0)
  

все это довольно ново, поэтому любая помощь (особенно в отношении формирования данных) была бы очень признательна

Ответ №1:

Извините, но я запустил ваш код, и он совпал с результатами кода из руководства. Хотя я был вынужден заменить X_train на X, поскольку X_train не был определен в вашем коде. Итак, если бы мне пришлось сказать, что ваша проблема связана с X_train, извините, я не смог бы вам больше помочь. Если вы уточните, что такое X_train, или, более конкретно, чем он отличается от X, я могу предоставить более конкретное решение.

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

1. X train — это просто мои данные, которые были разделены из разделения на поезд / тест. Итак, мой X_train — это всего лишь небольшая часть моих данных X, которая имеет форму (133460,20) . в приведенном выше руководстве их X — это массив. В моем коде my X_train — это другой набор данных с разными измерениями

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