def autoencoder(summary=False):
        """ Return the Keras model of the network
            Autoencoder reduces the dimensions of data
            from (56, 64, 24) to 487
        """
        input_shape = (56, 64, 24, 1)
        input_img = Input(shape=input_shape)

        # x = ZeroPadding3D(padding=((2, 3),(2, 1),(1, 0)))(input_img)
        x = Conv3D(16, (3, 3, 3), activation='relu', padding='same')(input_img)
        x = MaxPooling3D((2, 2, 2), padding='same')(x)
        x = Conv3D(8, (3, 3, 3), activation='relu', padding='same')(x)

        x = MaxPooling3D((2, 2, 2), padding='same')(x)
        x = Conv3D(8, (3, 3, 3), activation='relu', padding='same')(x)

        encoded = MaxPooling3D((2, 2, 2), padding='same')(x)

        x = Conv3D(8, (3, 3, 3), activation='relu', padding='same')(encoded)
        x = UpSampling3D((2, 2, 2))(x)
        x = Conv3D(8, (3, 3, 3), activation='relu', padding='same')(x)
        x = UpSampling3D((2, 2, 2))(x)
        x = Conv3D(16, (3, 3, 3), activation='relu', padding='same')(x)
        x = UpSampling3D((2, 2, 2))(x)
        decoded = Conv3D(1, (3, 3, 3), activation='relu', padding='same')(x)

        autoencoder = Model(input_img, decoded)
        autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')
        if summary:
            print(autoencoder.summary())
        return autoencoder
    def conv_3d(self):
        """
        Build a 3D convolutional network, based loosely on C3D.
            https://arxiv.org/pdf/1412.0767.pdf
        """
        model = Sequential()
        model.add(
            Conv3D(32, (3, 3, 3),
                   activation='relu',
                   input_shape=self.input_shape))
        model.add(MaxPooling3D(pool_size=(1, 2, 2), strides=(1, 2, 2)))
        model.add(Conv3D(64, (3, 3, 3), activation='relu'))
        model.add(MaxPooling3D(pool_size=(1, 2, 2), strides=(1, 2, 2)))
        model.add(Conv3D(128, (3, 3, 3), activation='relu'))
        model.add(Conv3D(128, (3, 3, 3), activation='relu'))
        model.add(MaxPooling3D(pool_size=(1, 2, 2), strides=(1, 2, 2)))
        model.add(Conv3D(256, (2, 2, 2), activation='relu'))
        model.add(Conv3D(256, (2, 2, 2), activation='relu'))
        model.add(MaxPooling3D(pool_size=(1, 2, 2), strides=(1, 2, 2)))

        model.add(Flatten())
        model.add(Dense(1024))
        model.add(Dropout(0.5))
        # model.add(Dense(1024))
        # model.add(Dropout(0.5))
        model.add(Dense(self.nb_classes, activation='softmax'))

        return model
Exemple #3
0
    def build_conv_3d():
        model = Sequential()

        model.add(
            Conv3D(8,
                   kernel_size=(3, 3, 3),
                   input_shape=(train_data.shape[1:]),
                   border_mode='same'))
        model.add(MaxPooling3D(pool_size=(2, 2, 2), border_mode='same'))

        model.add(
            Conv3D(8,
                   kernel_size=(3, 3, 3),
                   input_shape=(train_data.shape[1:]),
                   border_mode='same'))
        model.add(MaxPooling3D(pool_size=(2, 2, 2), border_mode='same'))

        model.add(
            Conv3D(8,
                   kernel_size=(3, 3, 3),
                   input_shape=(train_data.shape[1:]),
                   border_mode='same'))
        model.add(MaxPooling3D(pool_size=(2, 2, 2), border_mode='same'))

        return model
Exemple #4
0
    def cnn(self):
        model = Sequential()
        samples, frames, x, y, channels = self.input_shape

        model.add(
            Conv3D(32, (2, 3, 3),
                   activation='relu',
                   input_shape=(frames, x, y, channels),
                   data_format='channels_last'))
        model.add(MaxPooling3D(pool_size=(1, 2, 2), strides=(2, 2, 2)))

        model.add(Conv3D(64, (2, 2, 2), activation='relu'))
        model.add(MaxPooling3D(pool_size=(1, 2, 2), strides=(2, 3, 3)))

        model.add(Conv3D(128, (3, 3, 3), activation='relu'))
        model.add(Conv3D(128, (3, 3, 3), activation='relu'))
        model.add(MaxPooling3D(pool_size=(1, 2, 2), strides=(2, 3, 3)))
        model.add(Dropout(0.25))

        model.add(Conv3D(256, (2, 2, 2), activation='relu'))
        model.add(Conv3D(256, (2, 2, 2), activation='relu'))
        model.add(MaxPooling3D(pool_size=(1, 2, 2), strides=(2, 3, 3)))

        model.add(Flatten())
        model.add(Dense(1024))
        model.add(Dropout(0.25))
        model.add(Dense(1024))
        model.add(Dropout(0.25))
        model.add(Dense(self.num_classes, activation='softmax'))

        return model
Exemple #5
0
def network(input_shape=(49, 49, 49, 1), class_num=2):
    """Example CNN
    
    Keyword Arguments:
        input_shape {tuple} -- shape of input images. Should be (28,28,1) for MNIST and (32,32,3) for CIFAR (default: {(28,28,1)})
        class_num {int} -- number of classes. Shoule be 10 for both MNIST and CIFAR10 (default: {10})
    
    Returns:
        model -- keras.models.Model() object
    """

    im_input = Input(shape=input_shape)

    t = Convolution3D(32, (24, 24, 24), padding='same')(im_input)  # (24,24,24)
    t = MaxPooling3D(pool_size=(2, 2, 2))(t)
    t = Convolution3D(64, (12, 12, 12), padding='same')(t)
    t = MaxPooling3D(pool_size=(2, 2, 2))(t)
    t = Convolution3D(128, (6, 6, 6), padding='same')(t)
    t = Flatten()(t)
    t = Dense(256)(t)
    t = Activation('relu')(t)
    t = Dense(class_num)(t)

    output = Activation('softmax')(t)
    model = Model(input=im_input, output=output)
    return model
Exemple #6
0
def make_model():
    model = Sequential()

    #LAYER 1 (convolution 5x5x5)
    model.add(
        Conv3D(batch_input_shape=[None, 128, 128, 128, 1],
               filters=30,
               kernel_size=5,
               strides=3,
               padding='valid',
               kernel_regularizer=regularizers.l2(0.01)))

    model.add(Activation('relu'))
    model.add(MaxPooling3D(pool_size=(2, 2, 2)))

    model.add(Dropout(rate=0.1))

    model.add(Conv3D(filters=32, kernel_size=5, strides=3, padding='valid'))

    model.add(Activation('relu'))
    model.add(MaxPooling3D(pool_size=(2, 2, 2)))

    model.add(Dropout(rate=0.11))

    model.add(Flatten())
    model.add(Dense(300, activation='relu'))
    model.add(Dropout(rate=0.17))

    model.add(Dense(100, activation='relu'))

    model.add(Dense(1, kernel_initializer='uniform', activation='sigmoid'))

    return model
Exemple #7
0
 def create_model(self, verbose=False):
     model = Sequential()
     model.add(
         Conv3D(8, (2, 3, 10),
                input_shape=(1, 4, 5, 100),
                padding="same",
                activation='relu'))
     model.add(Conv3D(8, (2, 3, 10), padding="same", activation='relu'))
     model.add(MaxPooling3D(pool_size=(1, 1, 5)))
     model.add(Conv3D(8, (2, 3, 10), padding="same", activation='relu'))
     model.add(MaxPooling3D(pool_size=(1, 1, 2)))
     model.add(Dropout(0.3))
     model.add(Flatten())
     model.add(Dense(32, activation='relu'))
     model.add(Dense(16, activation='relu'))
     model.add(Dense(4, activation='softmax'))
     # Compile model
     optimizer = Adam(lr=0.001,
                      decay=0.001)  # lr <- lr * (1.0/(1.0+decay*iter))
     model.compile(loss='categorical_crossentropy',
                   optimizer=optimizer,
                   metrics=['accuracy'])
     if verbose:
         model.summary()
     return model
Exemple #8
0
def get_model(input_shape=(49, 49, 49, 1), class_num=2):
    """Example CNN

    Keyword Arguments:
        input_shape {tuple} -- shape of input images. Should be (28,28,1) for MNIST and (32,32,3) for CIFAR (default: {(28,28,1)})
        class_num {int} -- number of classes. Shoule be 10 for both MNIST and CIFAR10 (default: {10})

    Returns:
        model -- keras.models.Model() object
    """

    im_input = Input(shape=input_shape)

    t = Convolution3D(32, (24, 24, 24), padding='same')(im_input)  # (24,24,24)
    t = MaxPooling3D(pool_size=(2, 2, 2))(t)
    t = Convolution3D(64, (12, 12, 12), padding='same')(t)
    t = MaxPooling3D(pool_size=(2, 2, 2))(t)
    t = Convolution3D(128, (6, 6, 6), padding='same')(t)
    t = Flatten()(t)
    t = Dense(256)(t)
    t = Activation('relu')(t)
    t = Dense(class_num)(t)

    output = Activation('softmax')(t)
    model = Model(input=im_input, output=output)
    sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
    model.compile(sgd, 'categorical_crossentropy', metrics=['accuracy'])

    return model
    def get_model(self):
        model = Sequential()
        # 1st layer group
        model.add(Conv3D(64, 3, 3, 3, activation='relu',
                         border_mode='same', name='conv1',
                         subsample=(1, 1, 1),
                         input_shape=self.input_shape))
        model.add(MaxPooling3D(pool_size=(1, 2, 2), strides=(1, 2, 2),
                               border_mode='valid', name='pool1'))
        # 2nd layer group
        model.add(Conv3D(128, 3, 3, 3, activation='relu',
                         border_mode='same', name='conv2',
                         subsample=(1, 1, 1)))
        model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2),
                               border_mode='valid', name='pool2'))
        # 3rd layer group
        #model.add(Conv3D(256, 3, 3, 3, activation='relu',
        #                 border_mode='same', name='conv3a',
        #                 subsample=(1, 1, 1)))
        model.add(Conv3D(256, 3, 3, 3, activation='relu',
                         border_mode='same', name='conv3b',
                         subsample=(1, 1, 1)))
        model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2),
                               border_mode='valid', name='pool3'))
        model.add(Flatten())

        # FC layers group
        model.add(Dense(512, activation='relu', name='fc7'))
        model.add(Dropout(0.5))
        model.add(Dense(self.output_shape, activation='linear'))

        return model
Exemple #10
0
    def build(input_shape, num_classes=2):
        """Create a 3D Convolutional Autoencoder model.

        Parameters:
        - input_shape: Tuple of input shape in the format
            (conv_dim1, conv_dim2, conv_dim3, channels)
        - initial_filter: Initial filter size. This will be doubled
            for each hidden layer as it goes deeper.
        - num_encoding_layers: Number of encoding convolutional +
            pooling layers. The number of decoding
            layers will be the same.

        Returns:
        - A 3D CAD model that takes a 5D tensor (volumetric images
        in batch) as input and returns a 5D vector (prediction) as output.
        """

        if len(input_shape) != 4:
            raise ValueError("Input shape should be a tuple "
                             "(conv_dim1, conv_dim2, conv_dim3, channels)")

        input_img = Input(shape=input_shape, name="cad_input")

        # Conv1 (Output 120 x 120 x 64 x 128)
        x = Conv3D(128, (7, 7, 7), activation='relu',
                   padding='same')(input_img)
        x = BatchNormalization()(x)
        x = MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2))(x)

        # Conv2 (Output 30 x 30 x 16 x 256)
        x = Conv3D(256, (5, 5, 5), activation='relu', padding='same')(x)
        x = BatchNormalization()(x)
        x = MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2))(x)

        # Conv3 (Output 7 x 7 x 8 x 256)
        x = Conv3D(256, (3, 3, 3), activation='relu', padding='same')(x)

        # Conv4 (Output 4 x 4 x 4 x 512)
        x = Conv3D(512, (3, 3, 3),
                   activation='relu',
                   strides=(2, 2, 2),
                   padding='same')(x)

        # Conv5 (Output 2 x 2 x 2 x 1024)
        x = Conv3D(1024, (3, 3, 3),
                   activation='relu',
                   strides=(2, 2, 2),
                   padding='same')(x)

        # Pooling and flatten
        x = MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2))(x)
        x = Flatten()(x)

        # Fully connected layers
        x = Dense(1024, activation='relu', use_bias=True)(x)
        x = Dense(1024, activation='relu', use_bias=True)(x)
        x = Dense(num_classes, activation='sigmoid', use_bias=True)(x)

        model = Model(inputs=input_img, outputs=x)
        return model
    def conv_3d(self):

        model = Sequential()
        model.add(
            Conv3D(32, (3, 3, 3),
                   activation='relu',
                   input_shape=self.input_shape))
        model.add(MaxPooling3D(pool_size=(1, 2, 2), strides=(1, 2, 2)))
        model.add(Conv3D(64, (3, 3, 3), activation='relu'))
        model.add(MaxPooling3D(pool_size=(1, 2, 2), strides=(1, 2, 2)))
        model.add(Conv3D(128, (3, 3, 3), activation='relu'))
        model.add(Conv3D(128, (3, 3, 3), activation='relu'))
        model.add(MaxPooling3D(pool_size=(1, 2, 2), strides=(1, 2, 2)))
        model.add(Conv3D(256, (2, 2, 2), activation='relu'))
        model.add(Conv3D(256, (2, 2, 2), activation='relu'))
        model.add(MaxPooling3D(pool_size=(1, 2, 2), strides=(1, 2, 2)))

        model.add(Flatten())
        model.add(Dense(1024))
        model.add(Dropout(0.5))
        model.add(Dense(1024))
        model.add(Dropout(0.5))
        model.add(Dense(self.nb_classes, activation='softmax'))

        return model
Exemple #12
0
def train_model():
    input_img = Input(shape=(128, 128, 128, 1))
    x = Convolution3D(16, (5, 5, 5), activation='relu', padding='same')(input_img)
    x = MaxPooling3D((2, 2, 2), padding='same')(x)
    x = Convolution3D(16, (5, 5, 5), activation='relu', padding='same')(x)
    x = MaxPooling3D((2, 2, 2), padding='same')(x)
    x = Convolution3D(16, (5, 5, 5), activation='relu', padding='same')(x)
    encoded = MaxPooling3D((2, 2, 2), padding='same', name='encoder')(x)

    print("shape of encoded: ")
    print(K.int_shape(encoded))

    x = Convolution3D(16, (5, 5, 5), activation='relu', padding='same')(encoded)
    x = UpSampling3D((2, 2, 2))(x)
    x = Convolution3D(16, (5, 5, 5), activation='relu', padding='same')(x)
    x = UpSampling3D((2, 2, 2))(x)
    x = Convolution3D(16, (5, 5, 5), activation='relu', padding='same')(x)
    x = UpSampling3D((2, 2, 2))(x)
    decoded = Convolution3D(1, (5, 5, 5), activation='sigmoid', padding='same')(x)
    print("shape of decoded: ")
    print(K.int_shape(decoded))

    autoencoder = Model(input_img, decoded)
    autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')

    autoencoder.fit(train_data, train_data,
              epochs=10,
              batch_size=14,
              validation_data=(val_data, val_data),
              callbacks=[TensorBoard(log_dir='/tmp/autoencoder')])

    autoencoder.save('autoencoder.h5')
Exemple #13
0
def createModel(nb_filters=[8, 16, 32, 64, 128, 256],
                nb_pool=[2, 3],
                nb_conv=[3, 5],
                nb_channels=1):
    img_depth = len(listOfData[0])
    img_cols = len(listOfData[0][0])
    img_rows = len(listOfData[0][0][0])
    numberOfLabels = len(set(labels))

    # CNN Model v3
    model = Sequential()
    model.add(
        Conv3D(nb_filters[1], (nb_conv[0], nb_conv[1], nb_conv[1]),
               data_format='channels_last',
               input_shape=(img_depth, img_rows, img_cols, nb_channels),
               activation='relu'))
    model.add(MaxPooling3D(pool_size=(nb_pool[0], nb_pool[1], nb_pool[1])))
    model.add(
        Conv3D(nb_filters[2], (nb_conv[0], nb_conv[1], nb_conv[1]),
               activation='relu'))
    model.add(MaxPooling3D(pool_size=(nb_pool[0], nb_pool[1], nb_pool[1])))
    model.add(
        Conv3D(nb_filters[3], (nb_conv[0], nb_conv[1], nb_conv[1]),
               activation='relu'))
    model.add(MaxPooling3D(pool_size=(nb_pool[0], nb_pool[1], nb_pool[1])))
    model.add(Flatten())
    model.add(Dense(128))
    model.add(Dropout(0.5))
    model.add(Dense(numberOfLabels))
    model.add(Activation('softmax'))
    model.compile(loss='categorical_crossentropy',
                  optimizer='adadelta',
                  metrics=['accuracy'])
    model.summary()
    return model
Exemple #14
0
 def cnn_3D(self, input_shape, modual=''):
     #建立Sequential模型    
     model = Sequential() 
     model.add(Convolution3D(
             filters = 8,
             kernel_size = (3, 3, 3),
             input_shape = input_shape, #40x40x5x1
             padding = (0,0,1),
             activation='relu',
             kernel_initializer='he_normal',
             name = modual+'conv1'
         ))# now 38x38x5x8
     model.add(MaxPooling3D(pool_size=(2,2,1)))# now 19x19x5x8
     model.add(Convolution3D(
             filters = 16,
             kernel_size = (4, 4, 3),
             activation='relu',
             kernel_initializer='he_normal',
             name = modual+'conv2'
         ))# now 16x16x3x16
     model.add(MaxPooling3D(pool_size=(2,2,1)))# now 8x8x1x16
     model.add(Convolution3D(
             filters = 32,
             kernel_size = (3, 3, 3),
             activation='relu',
             kernel_initializer='he_normal',
             name = modual+'conv2'
         ))# now 6x6x1x32  
     model.add(AveragePooling3D(pool_size=(6,6,1)))# now 1x1x1x32            
     model.add(Flatten())
     # model.add(Dropout(0.5))
     model.add(Dense(32, activation='relu', name = modual+'fc1'))
   
     return model    
Exemple #15
0
    def c3d(self):
 
        # Tunable parameters
        strides = (1, 1, 1)
        model = Sequential()
        model.add(Conv3D(32, kernel_size=(3, 3, 3), strides=strides,input_shape=(
           self.input_shape), border_mode='same', activation='relu'))
        #model.add(Activation('relu'))

        model.add(Conv3D(32, kernel_size=(3, 3, 3), strides=strides,padding='same', activation='softmax'))
        #model.add(Activation('softmax'))

        model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2), padding='same'))
        model.add(Dropout(0.25))

        model.add(Conv3D(64, kernel_size=(3, 3, 3),strides=strides, padding='same', activation='relu'))
        #model.add(Activation('relu'))
        model.add(Conv3D(64, kernel_size=(3, 3, 3),strides=strides, padding='same', activation='softmax'))
        #model.add(Activation('softmax'))
        model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2), padding='same'))
        model.add(Dropout(0.25))

        model.add(Flatten())
        model.add(Dense(512, activation='sigmoid'))
        model.add(Dropout(0.5))
        model.add(Dense(self.n_labels, activation='softmax'))


        return model
Exemple #16
0
    def get_model(self):

        model = Sequential()

        model.add(
            Conv3D(64,
                   kernel_size=(3, 3, 3),
                   input_shape=self.input_shape,
                   activation='relu'))
        model.add(MaxPooling3D(pool_size=2, strides=(1, 2, 2)))

        model.add(
            Conv3D(64,
                   kernel_size=(3, 2, 2),
                   input_shape=self.input_shape,
                   activation='relu'))

        model.add(Conv3D(128, kernel_size=(3, 2, 2), activation='relu'))
        model.add(MaxPooling3D(pool_size=2, strides=(1, 2, 2)))

        model.add(Conv3D(128, kernel_size=(3, 2, 2), activation='relu'))

        model.add(MaxPooling3D(pool_size=2, strides=2))
        model.add(Dropout(0.15))
        model.add(Conv3D(256, kernel_size=(3, 2, 2), activation='relu'))
        model.add(BatchNormalization())

        model.add(Flatten())
        model.add(Dense(512, activation='relu'))
        model.add(Dropout(0.15))
        model.add(Dense(512, activation='relu'))
        model.add(Dropout(0.15))
        model.add(Dense(self.output_shape, activation='linear'))

        return model
Exemple #17
0
    def construct_model(self):
        # th input (channels, height, width)
        # tf input (height, width, channels)
        keras.backend.set_image_dim_ordering('tf')
        model = Sequential()

        #Encode:
        model.add(Convolution3D(16,(2,3,3), activation='relu', input_shape=(config.frames_per_input, 501, 501, 3),border_mode='same'))        
        model.add(MaxPooling3D(pool_size=(2,2,2)))
        model.add(Convolution3D(16,(2,3,3), activation='relu', border_mode='same'))
        model.add(Convolution3D(16,(2,3,3), activation='relu', border_mode='same'))
        model.add(MaxPooling3D(pool_size=(2,2,2)))
        model.add(Convolution3D(8,(1,3,3), activation='relu', border_mode='same'))
        #model.add(Convolution3D(8,(1,3,3), activation='relu', border_mode='same'))
        #model.add(MaxPooling3D(pool_size=(1,2,2)))        
        #model.add(Convolution3D(8,(1,3,3), activation='relu', border_mode='same'))
        #model.add(Convolution3D(8,(1,3,3), activation='relu', border_mode='same'))
        #Decode:
        model.add(Convolution3D(16,(2,3,3), activation='relu', border_mode='same'))
        model.add(UpSampling3D((1,2,2)))
        model.add(Convolution3D(16,(2,3,3), activation='relu', border_mode='same'))
        model.add(UpSampling3D((1,2,2)))
        model.add(Convolution3D(3,(2,3,3), activation='relu', border_mode='same'))
        # model.add(Convolution3D(16,(2,3,3), activation='relu', border_mode='same'))
        # model.add(UpSampling3D((1,1,1)))
        # model.add(Convolution3D(3,(2,3,3), activation='relu', border_mode='same'))
        # model.add(UpSampling3D((1,1,1)))
        # model.add(Flatten())

        model.compile(loss='mean_squared_error', optimizer='adam')
        model.compile(loss=y_std, optimizer='adam')
        model.compile(loss='binary_crossentropy', optimizer='adam') # doesn't reset weights
        
        model.summary()        
        self.model = model
Exemple #18
0
def make_model(l2_penalty):
    model = Sequential()

    #LAYER 1 (convolution 5x5x5)
    model.add(
        Conv3D(batch_input_shape=[None, 128, 128, 128, 1],
               filters=16,
               kernel_size=5,
               strides=3,
               padding='valid',
               kernel_regularizer=l2(l2_penalty),
               activation='relu'))

    model.add(MaxPooling3D(pool_size=(2, 2, 2)))

    model.add(
        Conv3D(filters=32,
               kernel_size=5,
               strides=3,
               padding='valid',
               activation='relu'))

    model.add(MaxPooling3D(pool_size=(2, 2, 2)))

    model.add(Flatten())

    model.add(Dense(100, activation='relu'))
    model.add(Dropout(rate=0.15))

    model.add(Dense(100, activation='relu'))
    model.add(Dense(1, kernel_initializer='uniform', activation='sigmoid'))

    print(model.output_shape)

    return model
def c3d_model(summary=False):
    """ Return the Keras model of the network
    """
    model = Sequential()
    # 1st layer group
    model.add(Convolution3D(64, 3, 3, 3, activation='relu', 
                            border_mode='same', name='conv1',
                            subsample=(1, 1, 1), 
                            input_shape=(16,120,120,3)))
   # model.add(BatchNormalization())
    model.add(MaxPooling3D(pool_size=(1, 2, 2), strides=(1, 2, 2), 
                           border_mode='same', name='pool1'))
    # 2nd layer group
    model.add(Convolution3D(128, 3, 3, 3, activation='relu', 
                            border_mode='same', name='conv2',
                            subsample=(1, 1, 1)))
    model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2), 
                           border_mode='same', name='pool2'))
    # 3rd layer group
    model.add(Convolution3D(256, 3, 3, 3, activation='relu', 
                            border_mode='same', name='conv3a',
                            subsample=(1, 1, 1)))
    model.add(Convolution3D(256, 3, 3, 3, activation='relu', 
                            border_mode='same', name='conv3b',
                            subsample=(1, 1, 1)))
    model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2), 
                           border_mode='same', name='pool3'))
    # 4th layer group
    model.add(Convolution3D(512, 3, 3, 3, activation='relu', 
                            border_mode='same', name='conv4a',
                            subsample=(1, 1, 1)))
    model.add(Convolution3D(512, 3, 3, 3, activation='relu', 
                            border_mode='same', name='conv4b',
                            subsample=(1, 1, 1)))
    model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2), 
                           border_mode='same', name='pool4'))
    # 5th layer group
    model.add(Convolution3D(512, 3, 3, 3, activation='relu', 
                            border_mode='same', name='conv5a',
                            subsample=(1, 1, 1)))
    model.add(Convolution3D(512, 3, 3, 3, activation='relu', 
                            border_mode='same', name='conv5b',
                            subsample=(1, 1, 1)))
    model.add(ZeroPadding3D(padding=(0, 1, 1)))
    model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2), 
                           border_mode='valid', name='pool5'))
    model.add(BatchNormalization())
    model.add(Flatten())
    # FC layers group
    model.add(Dense(4096,activation='relu', name='fc6'))
    model.add(Dropout(.5))
    model.add(BatchNormalization())
    model.add(Dense(4096, activation='relu', name='fc7'))
    model.add(Dropout(.5))
   
    model.add(Dense(14, activation='softmax', name='fc9'))
    if summary:
        print(model.summary())
    return model
    def Conv3dBLSTM(self) :
        model = Sequential()
        # 1st layer group
        model = Sequential()
        # 1st layer group
        # (samples, conv_dim1, conv_dim2, conv_dim3, channels)
        model.add(Conv3D(64, 3, 3, 3, activation='relu', 
                                border_mode='same', name='conv1',
                                subsample=(1, 1, 1), 
                                input_shape=self.shapeOfInputConv3d)) # 40 80 80 3
        model.add(MaxPooling3D(pool_size=(1, 2, 2), strides=(1, 2, 2), 
                               border_mode='valid', name='pool1'))
        # 2nd layer group
        model.add(Conv3D(128, 3, 3, 3, activation='relu', 
                                border_mode='same', name='conv2',
                                subsample=(1, 1, 1)))
        model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2), 
                               border_mode='valid', name='pool2'))
        # 3rd layer group
        model.add(Conv3D(256, 3, 3, 3, activation='relu', 
                                border_mode='same', name='conv3a',
                                subsample=(1, 1, 1)))
        model.add(Conv3D(256, 3, 3, 3, activation='relu', 
                                border_mode='same', name='conv3b',
                                subsample=(1, 1, 1)))
        model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2), 
                               border_mode='valid', name='pool3'))
        # 4th layer group
        model.add(Conv3D(512, 3, 3, 3, activation='relu', 
                                border_mode='same', name='conv4a',
                                subsample=(1, 1, 1)))
        model.add(Conv3D(512, 3, 3, 3, activation='relu', 
                                border_mode='same', name='conv4b',
                                subsample=(1, 1, 1)))
        model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2), 
                               border_mode='valid', name='pool4'))
        # 5th layer group
        model.add(Conv3D(512, 3, 3, 3, activation='relu', 
                                border_mode='same', name='conv5a',
                                subsample=(1, 1, 1)))
        model.add(Conv3D(512, 3, 3, 3, activation='relu', 
                                border_mode='same', name='conv5b',
                                subsample=(1, 1, 1)))
        model.add(ZeroPadding3D(padding=(0, 1, 1)))
        model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2), 
                               border_mode='valid', name='pool5'))
        model.add(Reshape(target_shape=(2, 512* 3* 3)))
        # (batch_size, timesteps, input_dim)

        model.add(Bidirectional(LSTM(512* 3* 3, input_shape=self.shapeOfInputLSTM,
                                  return_sequences=False,
                                  activation="softmax",
                                  dropout=0.5)))
        model.add(Dense(512, activation='relu'))
        model.add(Dropout(0.5))
        model.add(Dense(self.classesNumber, activation='softmax'))

        return model
Exemple #21
0
    def build(input_shape, num_outputs):
        print('original input shape:', input_shape)
        _handle_dim_ordering()
        if len(input_shape) != 4:
            raise Exception(
                "Input shape should be a tuple (nb_channels, kernel_dim1, kernel_dim2, kernel_dim3)"
            )

        print('original input shape:', input_shape)
        # orignal input shape: 1,7,7,200

        if K.image_dim_ordering() == 'tf':
            input_shape = (input_shape[1], input_shape[2], input_shape[3],
                           input_shape[0])
        print('change input shape:', input_shape)

        # 用keras中函数式模型API,不用序贯模型API
        # 张量流输入
        input = Input(shape=input_shape)

        conv1 = Conv3D(filters=32,
                       kernel_size=(3, 3, 20),
                       strides=(1, 1, 5),
                       kernel_regularizer=regularizers.l2(0.01))(input)
        act1 = Activation('relu')(conv1)
        pool1 = MaxPooling3D(pool_size=(2, 2, 2),
                             strides=(1, 1, 1),
                             padding='same')(act1)

        conv2 = Conv3D(filters=64,
                       kernel_size=(2, 2, 3),
                       strides=(1, 1, 2),
                       kernel_regularizer=regularizers.l2(0.01))(pool1)
        act2 = Activation('relu')(conv2)
        drop1 = Dropout(0.5)(act2)
        pool2 = MaxPooling3D(pool_size=(2, 2, 2),
                             strides=(1, 1, 1),
                             padding='same')(drop1)

        conv3 = Conv3D(filters=128,
                       kernel_size=(3, 3, 3),
                       strides=(1, 1, 2),
                       kernel_regularizer=regularizers.l2(0.01))(pool2)
        act3 = Activation('relu')(conv3)
        drop2 = Dropout(0.5)(act3)

        flatten1 = Flatten()(drop2)
        fc1 = Dense(200, kernel_regularizer=regularizers.l2(0.01))(flatten1)
        act3 = Activation('relu')(fc1)

        # 输入分类器
        # Classifier block
        dense = Dense(units=num_outputs,
                      activation="softmax",
                      kernel_initializer="he_normal")(act3)

        model = Model(inputs=input, outputs=dense)
        return model
Exemple #22
0
def C3DP_4_DE_3_V1(n_labels, input_shape):
    #image size (26,39) and seq length 32
    # Tunable parameters
    model_name = 'C3DP_4_DE_3_V1'
    kernel_size = (3, 3, 3)
    strides = (1, 1, 1)
    extra_conv_blocks = 1

    model = Sequential()

    # 3D Conv Block 1 + Max Pooling
    model.add(
        Conv3D(32, (7, 7, 5),
               strides=strides,
               activation='relu',
               padding='same',
               input_shape=input_shape))
    model.add(MaxPooling3D(pool_size=(1, 2, 2), strides=(1, 2, 2)))

    # 3D Conv Block 2 + Max Pooling
    model.add(Conv3D(64, (5, 5, 3),
                     strides=strides,
                     activation='relu',
                     padding='same'),
              input_shape=(32, 13, 19, 3))
    model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2)))

    # 3D Conv Block 3 + Max Pooling
    model.add(
        Conv3D(128, (5, 5, 3),
               strides=strides,
               activation='relu',
               padding='same'))
    model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2)))

    # 3D Conv Block 4 + Max Pooling + Dropout
    model.add(
        Conv3D(128, (3, 5, 3),
               strides=strides,
               activation='relu',
               padding='same'))
    model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2)))
    model.add(Dropout(0.25))

    model.add(Flatten())

    # Dense Block 1
    model.add(Dense(256, activation='relu'))

    # Dense Block 2 + Dropout
    model.add(Dense(256, activation='relu'))
    model.add(Dropout(0.2))

    # Dense Block 3
    model.add(Dense(n_labels, activation='softmax'))

    return (model, model_name)
Exemple #23
0
def C3D_2_C3DP_2_DE_2(n_labels, input_shape):
    #image size (26,39) and seq length 32
    # Tunable parameters
    model_name = 'C3D_2_C3DP_2_DE_2'
    strides = (1, 1, 1)
    model = Sequential()

    # 3D Conv Block 1
    model.add(
        Conv3D(32,
               kernel_size=(3, 3, 3),
               strides=strides,
               input_shape=input_shape,
               border_mode='same',
               activation='relu'))

    # 3D Conv Block 2 + Max Pooling + Dropout
    model.add(
        Conv3D(32,
               kernel_size=(3, 3, 3),
               strides=strides,
               padding='same',
               activation='softmax'))
    model.add(
        MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2), padding='same'))
    model.add(Dropout(0.25))

    # 3D Conv Block 3
    model.add(
        Conv3D(64,
               kernel_size=(3, 3, 3),
               strides=strides,
               padding='same',
               activation='relu'))

    # 3D Conv Block 4 + Max Pooling + Dropout
    model.add(
        Conv3D(64,
               kernel_size=(3, 3, 3),
               strides=strides,
               padding='same',
               activation='softmax'))
    model.add(
        MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2), padding='same'))
    model.add(Dropout(0.25))

    model.add(Flatten())

    #Dense Block 1 + Dropout
    model.add(Dense(512, activation='sigmoid'))
    model.add(Dropout(0.5))

    #Dense Block 2
    model.add(Dense(n_labels, activation='softmax'))

    return (model, model_name)
Exemple #24
0
def C3D(weights='sports1M'):
    """Instantiates a C3D Kerasl model

    Keyword arguments:
    weights -- weights to load into model. (default is sports1M)

    Returns:
    A Keras model.

    """

    if weights not in {'sports1M', None}:
        raise ValueError('weights should be either be sports1M or None')

    if K.image_data_format() == 'channels_last':
        shape = (16,112,112,3)
    else:
        shape = (3,16,112,112)

    model = Sequential()
    model.add(Conv3D(64, 3, activation='relu', padding='same', name='conv1', input_shape=shape))
    model.add(MaxPooling3D(pool_size=(1,2,2), strides=(1,2,2), padding='same', name='pool1'))

    model.add(Conv3D(128, 3, activation='relu', padding='same', name='conv2'))
    model.add(MaxPooling3D(pool_size=(2,2,2), strides=(2,2,2), padding='valid', name='pool2'))

    model.add(Conv3D(256, 3, activation='relu', padding='same', name='conv3a'))
    model.add(Conv3D(256, 3, activation='relu', padding='same', name='conv3b'))
    model.add(MaxPooling3D(pool_size=(2,2,2), strides=(2,2,2), padding='valid', name='pool3'))

    model.add(Conv3D(512, 3, activation='relu', padding='same', name='conv4a'))
    model.add(Conv3D(512, 3, activation='relu', padding='same', name='conv4b'))
    model.add(MaxPooling3D(pool_size=(2,2,2), strides=(2,2,2), padding='valid', name='pool4'))

    model.add(Conv3D(512, 3, activation='relu', padding='same', name='conv5a'))
    model.add(Conv3D(512, 3, activation='relu', padding='same', name='conv5b'))
    model.add(ZeroPadding3D(padding=(0,1,1)))
    model.add(MaxPooling3D(pool_size=(2,2,2), strides=(2,2,2), padding='valid', name='pool5'))

    model.add(Flatten())

    model.add(Dense(4096, activation='relu', name='fc6'))
    model.add(Dropout(0.5))
    model.add(Dense(4096, activation='relu', name='fc7'))
    model.add(Dropout(0.5))
    model.add(Dense(487, activation='softmax', name='fc8'))

    if weights == 'sports1M':
        weights_path = get_file('sports1M_weights_tf.h5',
                                WEIGHTS_PATH,
                                cache_subdir='models',
                                md5_hash='b7a93b2f9156ccbebe3ca24b41fc5402')

        model.load_weights(weights_path)

    return model
def c3d_model():
    classes = 2
    
    """ Return the Keras model of the network
    """
    model = Sequential()
    input_shape=(16, 100, 100, 3) # l, h, w, c
   
    model.add(Convolution3D(64, 3, 3, 3, activation='relu',
                            border_mode='same', name='conv1',
                            input_shape=input_shape))
    model.add(MaxPooling3D(pool_size=(1, 2, 2), strides=(1, 2, 2),
                           border_mode='valid', name='pool1'))
    # 2nd layer group
    model.add(Convolution3D(128, 3, 3, 3, activation='relu',
                            border_mode='same', name='conv2'))
    model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2),
                           border_mode='valid', name='pool2'))
    # 3rd layer group
    model.add(Convolution3D(256, 3, 3, 3, activation='relu',
                            border_mode='same', name='conv3a'))
    model.add(Convolution3D(256, 3, 3, 3, activation='relu',
                            border_mode='same', name='conv3b'))
    model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2),
                           border_mode='valid', name='pool3'))
    # 4th layer group
    model.add(Convolution3D(256, 3, 3, 3, activation='relu',
                            border_mode='same', name='conv4a'))
    model.add(Convolution3D(256, 3, 3, 3, activation='relu',
                            border_mode='same', name='conv4b'))
    model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2),
                           border_mode='valid', name='pool4'))
    # 5th layer group
    model.add(Convolution3D(512, 3, 3, 3, activation='relu',
                            border_mode='same', name='conv5a'))
    model.add(Convolution3D(512, 3, 3, 3, activation='relu',
                            border_mode='same', name='conv5b'))
    
    model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2),
                           border_mode='valid', name='pool5'))
    model.add(Flatten())
    # FC layers group
    #model.add(Dense(2048, activation='relu', name='fc6'))
    #model.add(Dropout(.5))
    #model.add(Dense(2048, activation='relu', name='fc7'))
    #model.add(Dropout(.5))
    #model.add(Dense(2, activation='sigmoid', name='fc8'))

    
    #WS FC Layer with custom parameters
    model.add(Dense(512,input_dim=4608,W_regularizer=l2(0.001),activation='relu', name='fc6'))
    model.add(Dropout(.6))
    model.add(Dense(32,activation='relu',W_regularizer=l2(0.001), name='fc7'))
    model.add(Dropout(.6))
    model.add(Dense(2, activation='sigmoid',W_regularizer=l2(0.001), name='fc8'))
    return model
Exemple #26
0
    def small_c3d(self):
        """See: 'https://arxiv.org/pdf/1412.0767.pdf' """
        # Tunable parameters
        kernel_size = (3, 3, 3)
        strides = (1, 1, 1)
        extra_conv_blocks = 1

        model = Sequential()

        # Conv Block 1
        model.add(
            Conv3D(32,
                   kernel_size,
                   strides=strides,
                   activation='relu',
                   padding='same',
                   input_shape=self.input_shape))
        model.add(MaxPooling3D(pool_size=(1, 2, 2), strides=(1, 2, 2)))

        # Conv Block 2
        model.add(
            Conv3D(64,
                   kernel_size,
                   strides=strides,
                   activation='relu',
                   padding='same'))
        model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2)))

        # Conv Block 3
        model.add(
            Conv3D(128,
                   kernel_size,
                   strides=strides,
                   activation='relu',
                   padding='same'))
        model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2)))

        # Conv Block 4
        model.add(
            Conv3D(128,
                   kernel_size,
                   strides=strides,
                   activation='relu',
                   padding='same'))
        model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2)))

        # Dense Block
        model.add(Flatten())
        model.add(Dense(256, activation='relu'))
        model.add(Dropout(0.25))
        model.add(Dense(256, activation='relu'))
        model.add(Dropout(0.25))
        model.add(Dense(self.n_labels, activation='softmax'))

        return model
    def Conv3DModelCreate(self):
        # According to https://gist.github.com/albertomontesg/d8b21a179c1e6cca0480ebdf292c34d2

        model = Sequential()
        # 1st layer group
        model.add(Conv3D(64, 3, 3, 3, activation='relu', 
                                border_mode='same', name='conv1',
                                subsample=(1, 1, 1), 
                                input_shape=self.shapeOfInput)) # 40 80 80 3
        model.add(MaxPooling3D(pool_size=(1, 2, 2), strides=(1, 2, 2), 
                               border_mode='valid', name='pool1'))
        # 2nd layer group
        model.add(Conv3D(128, 3, 3, 3, activation='relu', 
                                border_mode='same', name='conv2',
                                subsample=(1, 1, 1)))
        model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2), 
                               border_mode='valid', name='pool2'))
        # 3rd layer group
        model.add(Conv3D(256, 3, 3, 3, activation='relu', 
                                border_mode='same', name='conv3a',
                                subsample=(1, 1, 1)))
        model.add(Conv3D(256, 3, 3, 3, activation='relu', 
                                border_mode='same', name='conv3b',
                                subsample=(1, 1, 1)))
        model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2), 
                               border_mode='valid', name='pool3'))
        # 4th layer group
        model.add(Conv3D(512, 3, 3, 3, activation='relu', 
                                border_mode='same', name='conv4a',
                                subsample=(1, 1, 1)))
        model.add(Conv3D(512, 3, 3, 3, activation='relu', 
                                border_mode='same', name='conv4b',
                                subsample=(1, 1, 1)))
        model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2), 
                               border_mode='valid', name='pool4'))
        # 5th layer group
        model.add(Conv3D(512, 3, 3, 3, activation='relu', 
                                border_mode='same', name='conv5a',
                                subsample=(1, 1, 1)))
        model.add(Conv3D(512, 3, 3, 3, activation='relu', 
                                border_mode='same', name='conv5b',
                                subsample=(1, 1, 1)))
        model.add(ZeroPadding3D(padding=(0, 1, 1)))
        model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2), 
                               border_mode='valid', name='pool5'))
        model.add(Flatten())
        # FC layers group
        model.add(Dense(4096, activation='relu', name='fc6'))
        model.add(Dropout(.5))
        model.add(Dense(4096, activation='relu', name='fc7'))
        model.add(Dropout(.5))
        model.add(Dense(self.classesNumber, activation='softmax', name='fc8'))

        return model
Exemple #28
0
def build_3d_model(nb_classes):
    #kernal_size = (depth,row,col)
    kernal_size = (4,3,3)
    pool_size = (1,2,2)
    timesteps =10
    #input_shape = (timesteps,nb_sensors,rows,cols)
    input_shape = (timesteps,4,9,5)
    
    model = Sequential()
    #1st layer group
    model.add(Conv3D(64,kernal_size, name = 'conv1',
                activation = 'relu', input_shape = input_shape,
                strides = (1,1,1), data_format = 'channels_first',
                padding = 'same'))
    model.add(MaxPooling3D(padding = 'valid',pool_size=pool_size,
              strides = (1,2,2),data_format = 'channels_first',name='pool1'))
    
    model.add(Dropout(0.25))
    #2nd layer group
    model.add(Conv3D(128,kernal_size,strides = (1,1,1),
        data_format = 'channels_first',input_shape=input_shape,
        activation='relu', padding = 'same', name = 'conv2'))
    model.add(MaxPooling3D(pool_size=pool_size,strides = (1,2,2),
              padding = 'valid',data_format = 'channels_first',name='pool2'))
    
    model.add(Dropout(0.25))
    #3rd layer group
    model.add(Conv3D(256,kernal_size,strides = (1,1,1),
        data_format = 'channels_first',input_shape=input_shape,
        activation='relu', padding = 'same', name = 'conv3'))
    
    #model.add(MaxPooling3D(pool_size=pool_size,strides = (1,2,2),
    #          padding = 'same',name='pool3'))
    
    model.add(Dropout(0.25))
    #FC layers
    model.add(Flatten())
    
    model.add(Dense(256,activation='relu',name='fc1'))
    model.add(Dropout(0.5))
    
    model.add(Dense(nb_classes,activation='relu',name='fc2'))
    model.add(Dropout(0.5))
    
    print(model.summary())
        
    start = time.time()

    model.compile(loss='categorical_crossentropy',
                    optimizer='adadelta',
                    metrics=['accuracy'])
    
    print("> Compile time :",time.time()-start)
    return model
    def c3d(self):
        """ Return the Keras model of the network
        """
        model = Sequential()
        # 1st layer group
        model.add(
            Conv3D(64, (3, 3, 3),
                   activation='relu',
                   padding='same',
                   name='3d1',
                   strides=(1, 1, 1),
                   input_shape=self.input_shape))
        model.add(
            MaxPooling3D(pool_size=(1, 2, 2),
                         strides=(1, 2, 2),
                         padding='valid',
                         name='pool1'))
        # 2nd layer group
        model.add(
            Conv3D(128, (3, 3, 3),
                   activation='relu',
                   padding='same',
                   name='3d2',
                   strides=(1, 1, 1)))
        model.add(
            MaxPooling3D(pool_size=(2, 2, 2),
                         strides=(2, 2, 2),
                         padding='valid',
                         name='pool2'))
        # 3rd layer group
        model.add(
            Conv3D(256, (3, 3, 3),
                   activation='relu',
                   padding='same',
                   name='3d3',
                   strides=(2, 2, 2)))

        model.add(
            MaxPooling3D(pool_size=(4, 4, 4),
                         strides=(2, 2, 2),
                         padding='valid',
                         name='pool3'))
        model.add(Flatten())

        # FC layers group
        model.add(Dense((2048), activation='relu', name='fc1'))
        model.add(Dropout(0.2))
        model.add(Dense((1024), activation='relu', name='fc2'))
        model.add(Dropout(0.2))
        model.add(Dense((512), activation='relu', name='fc3'))
        model.add(Dropout(0.2))
        model.add(Dense(self.classes, activation='softmax'))

        return model
Exemple #30
0
    def get_model(self):

        invariants = {'kernel_initializer': 'he_normal'}
        #model = Sequential()
        seq = Input(shape=self.input_shape)
        grey = TimeDistributed(
            Lambda(lambda x: tf.image.rgb_to_grayscale(x)))(seq)
        red = Lambda(lambda x: x[:, :, :, :, 0])(seq)
        red = Lambda(lambda x: x[:, :, :, :, None])(red)

        x1 = Conv3D(64, kernel_size=(15, 5, 5), padding='valid',
                    **invariants)(grey)
        x1 = Activation('relu')(x1)
        x1 = MaxPooling3D(pool_size=(1, 2, 2),
                          strides=(1, 2, 2),
                          padding='valid')(x1)
        x1 = BatchNormalization()(x1)
        x1 = Conv3D(128, kernel_size=5, padding='valid', **invariants)(x1)
        x1 = Activation('relu')(x1)
        x1 = MaxPooling3D(pool_size=(1, 2, 2),
                          strides=(1, 2, 2),
                          padding='valid')(x1)
        x1 = BatchNormalization()(x1)

        x2 = Conv3D(64, kernel_size=(15, 5, 5), padding='valid',
                    **invariants)(red)
        x2 = Activation('relu')(x2)
        x2 = MaxPooling3D(pool_size=(1, 2, 2),
                          strides=(1, 2, 2),
                          padding='valid')(x2)
        x2 = BatchNormalization()(x2)
        x2 = Conv3D(128, kernel_size=5, padding='valid', **invariants)(x2)
        x2 = Activation('relu')(x2)
        x2 = MaxPooling3D(pool_size=(1, 2, 2),
                          strides=(1, 2, 2),
                          padding='valid')(x2)
        x2 = BatchNormalization()(x2)

        x = concatenate([x1, x2])
        x = Conv3D(256, kernel_size=3, padding='valid', **invariants)(x)
        x = Activation('relu')(x)
        x = MaxPooling3D(pool_size=2, strides=(1, 2, 2), padding='valid')(x)
        x = BatchNormalization()(x)
        x = Flatten()(x)

        x = Dense(512, activation='relu', **invariants)(x)
        x = Dropout(0.15)(x)
        x = Dense(512, activation='relu', **invariants)(x)
        x = Dropout(0.15)(x)

        pred = Dense(self.output_shape, activation='linear')(x)
        model = Model(inputs=seq, outputs=pred)

        return model