Подтвердить что ты не робот

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

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

ЗначениеError: ошибка при проверке ввода модели: ожидается 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))
4b9b3361

Ответ 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)

Ответ 2

Я упоминал об этом и в других постах:

Чтобы ввести обычные данные таблицы характеристик формы (nrows, ncols) в Conv1d of Keras, необходимо выполнить 2 следующих шага:

xtrain.reshape(nrows, ncols, 1)
# For conv1d statement: 
input_shape = (ncols, 1)

Например, взяв первые 4 свойства набора данных iris:

Чтобы увидеть обычный формат и его форму:

iris_array = np.array(irisdf.iloc[:,:4].values)
print(iris_array[:5])
print(iris_array.shape)

Вывод показывает обычный формат и его форму:

[[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 [4.7 3.2 1.3 0.2]
 [4.6 3.1 1.5 0.2]
 [5.  3.6 1.4 0.2]]

(150, 4)

Следующий код изменяет формат:

nrows, ncols = iris_array.shape
iris_array = iris_array.reshape(nrows, ncols, 1)
print(iris_array[:5])
print(iris_array.shape)

Вывод вышеуказанного кода формата данных и его формы:

[[[5.1]
  [3.5]
  [1.4]
  [0.2]]

 [[4.9]
  [3. ]
  [1.4]
  [0.2]]

 [[4.7]
  [3.2]
  [1.3]
  [0.2]]

 [[4.6]
  [3.1]
  [1.5]
  [0.2]]

 [[5. ]
  [3.6]
  [1.4]
  [0.2]]]

(150, 4, 1)

Это хорошо работает для Conv1d из Keras. Для input_shape (4,1) необходимо.

Ответ 3

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

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

Ответ 4

В качестве входных данных у меня была разреженная матрица, поэтому я не мог изменить ее, не приведя к обычному массиву

Решением было использовать слой Keras Reshape:

from keras.layers.core import Reshape

...
model = Sequential()
model.add(Reshape((X.shape[1], 1), input_shape=(X.shape[1], )))
model.add(Conv1D(2,2,activation='relu'))
...