## Issue

I found this paper they present Convolutional Neural Network can get the best accuracy for non-image classify. So, I want to use CNN with non-image dataset. I download Early Stage Diabetes Risk Prediction Dataset form kaggle. I create CNN moldel like this code.

```
dataset = loadtxt('diabetes_data_upload.csv', delimiter=',')
# split into input (X) and output (y) variables
X = dataset[:,0:16]
Y = dataset[:,16]
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.3)
model = Sequential()
model.add(Conv1D(16,2, activation='relu', input_shape=(16, 1)))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=100, batch_size=10)
```

It show error like this.

```
ValueError: `logits` and `labels` must have the same shape, received ((None, 15, 1) vs (None,)).
```

How to fix it ?

## Solution

You can use `tf.keras.layers.Flatten()`

. Something like below can solve youe problem.

```
from sklearn.model_selection import train_test_split
import tensorflow as tf
import numpy as np
X = np.random.rand(100, 16)
Y = np.random.randint(0,2, size = 100) # <- Because you have two labels, I generate ranom 0,1
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.3)
model = tf.keras.Sequential()
model.add(tf.keras.layers.Conv1D(16,2, activation='relu', input_shape=(16, 1)))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=1, batch_size=10)
```

**Update** by thanks Ameya, we can solve this problem by only using `tf.keras.layers.GlobalAveragePooling1D()`

too.

(by thanks Djinn and his_comment, but consider: these are two different approaches that do different things. `Flatten()`

preserves all data, and just converts input tensors to a 1D tensor BUT `GlobalAveragePooling1D()`

tries to generalize and loses data. Pooling layers with non-image data can significantly affect performance but I’ve noticed AveragePooling does the least "damage,")

```
model = tf.keras.Sequential()
model.add(tf.keras.layers.Conv1D(16,2, activation='relu', input_shape=(16, 1)))
model.add(tf.keras.layers.GlobalAveragePooling1D())
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
```

```
7/7 [==============================] - 0s 2ms/step - loss: 0.6954 - accuracy: 0.0000e+00
```

Answered By – I'mahdi

**This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0 **