Размер формы в conv1D


Я пытался построить CNN с одним слоем, но у меня возникли некоторые проблемы с ним. Действительно, компилятор говорит мне, что

ValueError: ошибка при проверке входных данных модели: ожидаемый conv1d_1_input иметь 3 измерения, но получить массив с формой (569, 30)

Это код

import numpy
from keras.models import Sequential
from keras.layers.convolutional import Conv1D
numpy.random.seed(7)
datasetTraining = numpy.loadtxt("CancerAdapter.csv",delimiter=",")
X = datasetTraining[:,1:31]
Y = datasetTraining[:,0]
datasetTesting = numpy.loadtxt("CancereEvaluation.csv",delimiter=",")
X_test = datasetTraining[:,1:31]
Y_test = datasetTraining[:,0]
model = Sequential()
model.add(Conv1D(2,2,activation='relu',input_shape=X.shape))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X, Y, epochs=150, batch_size=5)
scores = model.evaluate(X_test, Y_test)
print("n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
2 29

2 ответа:

Td; lr вам нужно изменить ваши данные, чтобы иметь пространственное измерение для 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 ядро передается по измерению "шагов" каждого примера.

Вы увидите 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)

Не имея возможности увидеть больше деталей, ваши данные не находятся в правильной форме после предварительной обработки.
Изменить форму X, чтобы иметь 3 измерения:

np.reshape(X, (1, X.shape[0], X.shape[1]))