0

i need to build a CNN model on a dataset which has 65536 rows (represent 1 image for each), 49 columns (7x7 image) and binary class(50th column). (7800 rows for test set)

I am referencing examples on performing CNN using mnist dataset but i failed to build the train model.

Here is my Code:

from __future__ import print_function
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.utils import np_utils
from keras import backend as K
K.set_image_dim_ordering('th')
import pandas as pd
import numpy as np



# input image dimensions
img_rows, img_cols = 7, 7

# fix random seed for reproducibility
seed = 7
np.random.seed(seed)

x_train = pd.read_csv('palm_3x3_test.csv')
x_train.drop(['class'],axis=1,inplace=True)

x_train = x_train.as_matrix().reshape( -1,7, 7)

y_train = pd.read_csv('palm_3x3_test.csv')
y_train = y_train[['class']]


x_test = pd.read_csv('palm_3x3_data.csv')
x_test.drop(['class'],axis=1,inplace=True)
x_test = x_test.as_matrix().reshape( -1,7, 7)

y_test = pd.read_csv('palm_3x3_data.csv')
y_test = y_test[['class']]


# reshape to be [samples][pixels][width][height]
x_train_final = x_train.reshape(x_train.shape[0],1,7,7).astype('float32')
x_test_final = x_test.reshape(x_test.shape[0],1,7, 7).astype('float32')

print(x_train.shape)
print(x_test.shape)
print(x_train_final.shape)
print(x_test_final.shape)
print(y_train.shape)
print(y_test.shape)

# normalize inputs from 0-255 to 0-1
x_train_final = x_train_final / 255
x_test_final = x_test_final / 255

# one hot encode outputs
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
num_classes = y_test.shape[1]

print (y_test.shape)
print(y_train.shape)

def baseline_model():
#     create model

    model = Sequential()
    model.add(Conv2D(30,(5,5), padding='valid',  activation='relu',input_shape=(1,7,7)))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Conv2D(15 ,(3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.2))
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dense(50, activation='relu'))
    model.add(Dense(num_classes, activation='softmax'))

    # Compile model
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

# build the model
model = baseline_model()
# Fit the model
model.fit(x_train_final,y_train, validation_data=(x_test_final,y_test), nb_epoch=10, batch_size=200,verbose=2)
# Final evaluation of the model
scores = model.evaluate(x_test,y_test, verbose=0)
print("CNN Error: %.2f%%" % (100-scores[1]*100))

I am using Theano and the output shape for my data is :

x_train.shape = (65536L, 7L, 7L)
x_test.shape = (7800L, 7L, 7L)
x_train_final.shape = (65536L, 1L, 7L, 7L)
x_test_final.shape = (7800L, 1L, 7L, 7L)
y_train.shape = (65536L, 2L)
y_test.shape = (7800L, 2L)

while i running it error prompt :

ValueError: CorrMM: impossible output shape
  bottom shape: 200 x 30 x 1 x 1
  weights shape: 15 x 30 x 3 x 3
  top shape: 200 x 15 x -1 x -1
soapho
  • 31
  • 2
  • 7

1 Answers1

1

Your input to the second convolution layer is smaller that the filter you wish to apply. Your input image is (7,7); if you use valid padding with a (5,5) filter, you will have a filtered image that is (3,3) . After applying max pooling, you will be left with a (1,1) image that is incompatible with your secondary convolution layer that has a filter size of (3,3).

You can see the output shapes of each layer by running model.summary() after compiling your model. Negative shapes result in the impossible output shape error you see.

Change padding='valid' to padding='same' in the first convolutional layer. This won't solve your problem completely, you will also need to change the padding of your second convolutional layer to ensure there are outputs for your fully-connected layers. Given the small size of your images, you may want to re-consider the use of max pooling.

This question is a good explanation of the difference between valid and same padding.

Community
  • 1
  • 1
dhinckley
  • 2,115
  • 17
  • 16