I want to build a convolutional neural network and train it to recognise whether the digit is 0 or 1.
I now build a convolutional nerual network:
def addConvolutionalLayer(layer, newDepth = None): print(layer.get_shape().as_list()) if newDepth is None: newDepth = layer.get_shape().as_list() * 2 newLayer = Conv2D(newDepth, kernel_size = (3, 3), activation = 'relu', padding='same') (layer) newLayer = Dropout(0.2) (newLayer) return Conv2D(newDepth, kernel_size = (3, 3), activation = 'relu', padding='same') (newLayer) def buildModel(): s = Input((600, 800, 1)) d1 = addConvolutionalLayer(s, 32) d2 = addConvolutionalLayer(MaxPooling2D(4)(d1)) d3 = addConvolutionalLayer(MaxPooling2D(4)(d2)) d4 = addConvolutionalLayer(MaxPooling2D(4)(d3)) f = Flatten()(d4) dense = Dense(64, activation='relu') (f) o = Dense(1, activation='sigmoid') (dense) model = Model(inputs = [s], outputs = [o]) model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) return model model = buildModel() model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
In short, a network consists of multiple convolutional layers (with MaxPooling included), ending with a dense layer.
I then split the data into training and test sets:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
X_train, X_test are arrays of float values, each value corresponding to the pixel in the image (1.0 for white, 0.0 for black).
y_train, y_test are lists containing 0 or 1 depending on the digit in the corresponding image.
Finally, I run the model to train:
model.fit(X_train, y_train, epochs = 50, validation_split=0.2) model.save('prediction.h5')
The problem is that the model gets over-fitted: it reaches 100% accuracy on the training data, but does not perform well on the validation set:
Epoch 95/100 12/12 [==============================] - 0s 32ms/step - loss: 1.0640e-07 - acc: 1.0000 - val_loss: 10.7454 - val_acc: 0.3333
How to fix this issue?