как подогнать train CNN к соответствующей форме ввода?

#python #keras #conv-neural-network

#python #keras #conv-нейронная сеть

Вопрос:

Я пытаюсь обучить сеть CNN и LSTM с помощью набора данных S amp; P 500. Это форма моего набора данных train:

форма xtrain: (6445, 16) форма ytrain: (6445,)

это форма ввода, которую я предоставил CNN:

 model.add(TimeDistributed(Conv1D(filters=64, kernel_size=1, activation='relu'), input_shape=(None,16)))
  

с параметром формы ввода, показанным в коде, я получаю эту ошибку:

Ошибка значения: ввод 0 слоя conv1d_8 несовместим со слоем: : ожидаемый min_ndim= 3, найденный ndim = 2. Получена полная форма: [Нет, 16]

Ответ №1:

expected min_ndim=3, found ndim=2.

Keras ожидает трехмерные массивы при работе с Conv1D: ожидаемая форма [batch_size, sequence_length, feature_dimension] . В вашем случае у вас есть только одно функциональное измерение, я подозреваю, что цена, но представьте, что вы также хотели бы передать данные об объемах торгов, у вас были бы xtrain.shape == (6445,16,2) . Последнее измерение будет содержать информацию о цене и объеме.

Чтобы решить вашу проблему, вам нужно изменить свой xtrain на

 (batch_size, sequence_length, feature_dimension=(6445,16,1)
  

Для этого вы можете использовать tensorflow:

 xtrain = tf.expand_dims(xtrain, axis=-1) # -1 means expand the LAST axis
  

или с помощью numpy:

 xtrain = np.expand_dims(xtrain, axis=-1) # -1 means expand the LAST axis
  

Эта функция просто делает то, что следует из названия: она добавляет новую ось в положение, указанное axis . В результате xtrain получается форма, которую мы хотели, теперь вы можете просто продолжить работу с вашей моделью, например:

 model = keras.models.Sequential()
model.add(keras.layers.TimeDistributed(keras.layers.Conv1D(filters=64, kernel_size=1, activation='relu'), input_shape=(None,16,1)))