Ответ 1
тд; Если вам необходимо изменить ваши данные, чтобы иметь пространственное измерение для Conv1d
чтобы иметь смысл:
X = np.expand_dims(X, axis=2) # reshape (569, 30) to (569, 30, 1)
# now input can be set as
model.add(Conv1D(2,2,activation='relu',input_shape=(30, 1))
По сути, изменение формы набора данных, который выглядит следующим образом:
features
.8, .1, .3
.2, .4, .6
.7, .2, .1
Для того, чтобы:
[[.8
.1
.3],
[.2,
.4,
.6
],
[.3,
.6
.1]]
Пояснения и примеры
Обычно свертка работает в пространственных измерениях. Ядро "свернуто" по измерению, производящему тензор. В случае Conv1D ядро передается по измерению 'steps' каждого примера.
Вы увидите Conv1D, используемый для в НЛП, где количество steps
- это количество слов в предложении (дополненное до некоторой фиксированной максимальной длины). Слова могли бы быть закодированы как векторы длины 4.
Вот пример предложения:
jack .1 .3 -.52 |
is .05 .8, -.7 |<--- kernel is 'convolving' along this dimension.
a .5 .31 -.2 |
boy .5 .8 -.4 \|/
И способ, которым мы установили бы вход в conv в этом случае:
maxlen = 4
input_dim = 3
model.add(Conv1D(2,2,activation='relu',input_shape=(maxlen, input_dim))
В вашем случае вы будете рассматривать объекты как пространственное измерение, где каждый объект имеет длину 1. (см. Ниже)
Вот пример из вашего набора данных
att1 .04 |
att2 .05 | < -- kernel convolving along this dimension
att3 .1 | notice the features have length 1. each
att4 .5 \|/ example have these 4 featues.
И мы бы установили пример Conv1D как:
maxlen = num_features = 4 # this would be 30 in your case
input_dim = 1 # since this is the length of _each_ feature (as shown above)
model.add(Conv1D(2,2,activation='relu',input_shape=(maxlen, input_dim))
Как вы видите, ваш набор данных должен быть преобразован в (569, 30, 1) использование:
X = np.expand_dims(X, axis=2) # reshape (569, 30, 1)
# now input can be set as
model.add(Conv1D(2,2,activation='relu',input_shape=(30, 1))
Вот полноценный пример, который вы можете запустить (я буду использовать Функциональный API)
from keras.models import Model
from keras.layers import Conv1D, Dense, MaxPool1D, Flatten, Input
import numpy as np
inp = Input(shape=(5, 1))
conv = Conv1D(filters=2, kernel_size=2)(inp)
pool = MaxPool1D(pool_size=2)(conv)
flat = Flatten()(pool)
dense = Dense(1)(flat)
model = Model(inp, dense)
model.compile(loss='mse', optimizer='adam')
print(model.summary())
# get some data
X = np.expand_dims(np.random.randn(10, 5), axis=2)
y = np.random.randn(10, 1)
# fit model
model.fit(X, y)