#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)))