python - example - keras sequential
DimensiĆ³n de forma en conv1D (4)
He intentado construir una CNN con una capa, pero tengo algún problema. De hecho, el compilador me dice que
ValueError: error al comprobar la entrada del modelo: se esperaba que conv1d_1_input tuviera 3 dimensiones, pero se obtuvo una matriz con forma (569, 30)
Este es el codigo
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))
Sin poder ver más detalles, sus datos no están en la forma correcta después del preprocesamiento.
Reformar X para tener 3 dimensiones:
np.reshape(X, (1, X.shape[0], X.shape[1]))
También he mencionado esto en otras publicaciones:
Para ingresar una tabla de características de datos de forma
(nrows, ncols)
a Conv1d of Keras, se necesitan los siguientes 2 pasos:
xtrain.reshape(nrows, ncols, 1)
# For conv1d statement:
input_shape = (ncols, 1)
Por ejemplo, tomando las primeras 4 características del conjunto de datos de iris:
Para ver el formato habitual y su forma:
iris_array = np.array(irisdf.iloc[:,:4].values)
print(iris_array[:5])
print(iris_array.shape)
La salida muestra el formato habitual y su forma:
[[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)
El siguiente código altera el formato:
nrows, ncols = iris_array.shape
iris_array = iris_array.reshape(nrows, ncols, 1)
print(iris_array[:5])
print(iris_array.shape)
Salida del formato de datos de código anterior y su forma:
[[[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)
Esto funciona bien para Conv1d of Keras.
Para
input_shape (4,1)
es necesario.
Tenía una matriz dispersa como entrada, por lo que no podía volver a darle forma sin convertirla en la matriz habitual
La solución fue usar la capa 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''))
...
td;
Necesitas cambiar la forma de tus datos para tener una dimensión
espacial
para que
Conv1d
tenga sentido:
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))
Esencialmente remodelar un conjunto de datos que se ve así:
features
.8, .1, .3
.2, .4, .6
.7, .2, .1
A:
[[.8
.1
.3],
[.2,
.4,
.6
],
[.3,
.6
.1]]
Explicación y ejemplos.
Normalmente la convolución funciona sobre dimensiones espaciales. El núcleo está "enredado" sobre la dimensión produciendo un tensor. En el caso de Conv1D, el núcleo se pasa por encima de la dimensión ''pasos'' de cada ejemplo.
Verá Conv1D utilizado en PNL donde los
steps
son el número de palabras en la oración (rellenadas con una longitud máxima fija).
Las palabras podrían codificarse como vectores de longitud 4.
Aquí hay una oración de ejemplo:
jack .1 .3 -.52 |
is .05 .8, -.7 |<--- kernel is `convolving` along this dimension.
a .5 .31 -.2 |
boy .5 .8 -.4 /|/
Y la forma en que estableceríamos la entrada a la conv en este caso:
maxlen = 4
input_dim = 3
model.add(Conv1D(2,2,activation=''relu'',input_shape=(maxlen, input_dim))
En su caso, tratará las entidades como una dimensión espacial con cada entidad que tenga una longitud 1. (ver más abajo)
Este sería un ejemplo de su conjunto de datos.
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.
Y pondríamos el ejemplo de Conv1D como:
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))
Como puede ver, su conjunto de datos debe ser reformado para (569, 30, 1) usar:
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))
Aquí hay un ejemplo completo que puedes ejecutar (usaré la API funcional )
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)