TensorFlow: Как использовать сверточный слой для табличных (1-D) объектов? - PullRequest
1 голос
/ 15 января 2020

Используя TensorFlow в Python, я создаю нейронную сеть, которая имеет одномерный массив в качестве входных данных. Я хотел бы добавить сверточный слой в сеть, но не могу заставить его работать.

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

n_samples = 20
length_feature = 10
features = np.random.random((n_samples, length_feature))
labels = np.array([1 if sum(e)>5 else 0 for e in features])

Если я создаю такую ​​нейронную сеть, как эта

model = keras.Sequential([
    keras.layers.Dense(10, activation='relu', input_shape=(length_feature, )),
    keras.layers.Dense(2, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

history = model.fit(features, labels, batch_size=5, validation_split = 0.2, epochs=10)

, и это прекрасно работает. Но если я добавлю сверточный слой, подобный этому

model = keras.Sequential([
    keras.layers.Dense(10, activation='relu', input_shape=(length_feature, )),
    keras.layers.Conv1D(kernel_size = 3, filters = 2),
    keras.layers.Dense(2, activation='softmax')
])

, я получу ошибку

ValueError: Input 0 of layer conv1d_4 is incompatible with the layer: expected ndim=3, found ndim=2. Full shape received: [None, 10]

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

1 Ответ

1 голос
/ 15 января 2020

Conv1D ожидает 3D-вывода (batch_size, width, channels). Но плотные слои дают двухмерный выход. Просто измените свою модель на следующую:

model = keras.Sequential([
    keras.layers.Dense(10, activation='relu', input_shape=(length_feature, )),
    keras.layers.Lambda(lambda x: K.expand_dims(x, axis=-1))
    keras.layers.Conv1D(kernel_size = 3, filters = 2),
    keras.layers.Dense(2, activation='softmax')
])

Где K равно keras.backend или tf.keras.backend в зависимости от того, какую модель вы использовали для получения слоев.

...