Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dimension of shape in conv1D

I have tried to build a CNN with one layer, but I have some problem with it. Indeed, the compilator says me that

ValueError: Error when checking model input: expected conv1d_1_input to have 3 dimensions, but got array with shape (569, 30)

This is the code

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)) 
like image 317
protti Avatar asked Apr 13 '17 15:04

protti


People also ask

What is kernel size in Conv1D?

The kernel size is the size of the sequential window of the input. If the kernel size is set at 1, then each time interval will have its kernel and therefore, the output shape won't change from the (8, 16)[16 filters as above example].

What is a Conv1D layer?

1D convolution layer (e.g. temporal convolution). This layer creates a convolution kernel that is convolved with the layer input over a single spatial (or temporal) dimension to produce a tensor of outputs. If use_bias is True, a bias vector is created and added to the outputs.

What does Conv1D mean?

We can see that the 2D in Conv2D means each channel in the input and filter is 2 dimensional(as we see in the gif example) and 1D in Conv1D means each channel in the input and filter is 1 dimensional(as we see in the cat and dog NLP example).

What is stride in Conv1D?

From Conv1D, the default stride length is 1. Unless you have a concrete justification for another length, a stride length of 1 is usually appropriate.


2 Answers

td; lr you need to reshape you data to have a spatial dimension for Conv1d to make sense:

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)) 

Essentially reshaping a dataset that looks like this:

features     .8, .1, .3   .2, .4, .6   .7, .2, .1   

To:

[[.8 .1 .3],  [.2,  .4,  .6  ],  [.7,  .2,  .1]]   

Explanation and examples

Normally convolution works over spatial dimensions. The kernel is "convolved" over the dimension producing a tensor. In the case of Conv1D, the kernel is passed over the 'steps' dimension of every example.

You will see Conv1D used in NLP where steps is a number of words in the sentence (padded to some fixed maximum length). The words would be encoded as vectors of length 4.

Here is an example sentence:

jack   .1   .3   -.52   | is     .05  .8,  -.7    |<--- kernel is `convolving` along this dimension. a      .5   .31  -.2    | boy    .5   .8   -.4   \|/ 

And the way we would set the input to the conv in this case:

maxlen = 4 input_dim = 3 model.add(Conv1D(2,2,activation='relu',input_shape=(maxlen, input_dim)) 

In your case, you will treat the features as the spatial dimensions with each feature having length 1. (see below)

Here would be an example from your dataset

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. 

And we would set the Conv1D example as:

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)) 

As you see your dataset has to be reshaped in to (569, 30, 1) use:

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)) 

Here is a full-fledged example that you can run (I'll use the Functional 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) 
like image 177
parsethis Avatar answered Sep 21 '22 17:09

parsethis


I have mentioned this in other posts also:

To input a usual feature table data of shape (nrows, ncols) to Conv1d of Keras, following 2 steps are needed:

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

For example, taking first 4 features of iris dataset:

To see usual format and its shape:

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

The output shows usual format and its 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) 

Following code alters the format:

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

Output of above code data format and its 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) 

This works well for Conv1d of Keras. For input_shape (4,1) is needed.

like image 43
rnso Avatar answered Sep 22 '22 17:09

rnso