Как добавить сверточный слой в модель Keras? - PullRequest
1 голос
/ 28 апреля 2020

Есть данные, которые содержат A, B, C. Значение C должно быть спрогнозировано из значений A и B.

enter image description here

Данные были разделены и масштабированы.

enter image description here

Модель без сверточного слоя.

from keras.models import Sequential
from keras.layers import Dense, Conv1D

features_count = len(X_train.columns)

model = Sequential([
    Dense(64, input_shape=(features_count,)),
    Activation('relu'),
    Dense(32),
    Activation('softmax'),
    Dense(1),
])

model.compile(optimizer="adam", loss='mse')
model.fit(X_train.values, y_train.values, epochs=10, batch_size=1, verbose=1)
model.evaluate(X_test, y_test, batch_size=1)

Результат : 1.0033315420150757

Добавлено Conv1D:

model = Sequential([
    Conv1D(filters=256, kernel_size=5, padding='same', activation='relu', input_shape=(features_count,)),
    Dense(64),
    Activation('relu'),
    Dense(32),
    Activation('softmax'),
    Dense(1),
])

Результат : вход 0 несовместим со слоем conv1d_3: ожидаемый ndim = 3, найденный ndim = 2

input_shape=(features_count,)

заменен на

input_shape=(features_count,1)

Результат : Ошибка при проверке ввода: ожидалось, что conv1d_4_input будет иметь 3 измерения, но получит массив с формой (3, 2)

Что не так с добавлением сверточного слоя таким образом? Как добавить сверточный слой в модель Keras?

1 Ответ

1 голос
/ 28 апреля 2020

Conv1D ожидает двухмерные данные, поскольку он может применять свертку для первого измерения вдоль второго измерения. Итак, ваши входные данные должны иметь форму (размер пакета, 1, 2). Но для слоя Dense требуется 1D, поэтому между Conv1D и Dense вам нужно добавить слой Flatten для преобразования данных в 1D.

from keras.models import Sequential
from keras.layers import Dense, Conv1D, Activation, Flatten
import numpy as np
X_train = np.array([[-1.0,-1.0], [1.0, -1.0], [1.0,1.0]])
y_train = np.array([[1.0], [-1.0], [0.0]])

X_test = np.array([[1.0,-1.0], [1.0, -1.0]])
y_test = np.array([[1.0], [-1.0]])

features_count = 2

model = Sequential([
    Conv1D(filters=256, kernel_size=5, padding='same', activation='relu', input_shape=(1,features_count)),
    Flatten(),
    Dense(64),
    Activation('relu'),
    Dense(32),
    Activation('softmax'),
    Dense(1),
])

X_train = X_train.reshape(X_train.shape[0], 1, X_train.shape[1])
X_test = X_test.reshape(X_test.shape[0], 1, X_test.shape[1])

model.compile(optimizer="adam", loss='mse')
model.fit(X_train, y_train, epochs=10, batch_size=1, verbose=1)
model.evaluate(X_test, y_test, batch_size=1)

Результат: 1.00140380859375

Надеюсь, это поможет вам.

...