Размер формы в 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 ответа:
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)