cicorias
6/28/2018 - 8:15 AM

Reshaping input data for convolution in Keras

Reshaping input data for convolution in Keras

# In Keras the Convolution layer requirest an additional dimension which will be used for the various filter.
# When we have eg. 2D dataset the shape is (data_points, rows, cols).
# But Convolution2D requires shape (data_points, rows, cols, 1).
# Otherwise it fails with eg. "Exception: Input 0 is incompatible with layer convolution2d_5: expected ndim=4, found ndim=3"
#
# Originally I reshaped the data beforehand but it only complicates things.
#
# An easier and more elegant solution is to add a Reshape layer at the input
# of the network!
#
# Docs: https://keras.io/layers/core/#reshape

from keras.models import Sequential, Model
from keras.layers import Input
from keras.layers.core import Activation, Reshape
from keras.layers.convolutional import Convolution2D

# eg. 100x100 px images
input_shape = (100, 100)

def create_model_sequential(input_shape):
  """For the classic sequential API..."""
  model = Sequential()

  # add one more dimension for convolution
  model.add(Reshape(input_shape + (1, ), input_shape=input_shape))

  model.add(Convolution2D(32, 3, 3))
  model.add(Activation('relu'))
  # ...

  return model

def create_model_functional(input_shape):
  """For the new functional API..."""
  inputs = Input(input_shape)

  # add one more dimension for convolution
  x = Reshape(input_shape + (1, ), input_shape=input_shape)(inputs)

  x = Convolution2D(32, 3, 3)(x)
  x = Activation('relu')(x)
  # ...

  return Model(inputs, x)