def _build(self): input_img = Input(self.config.net_input_shape, name='input') input_mask = Input(self.config.net_mask_shape, name='dist_mask') unet_kwargs = { k[5:]: v for (k, v) in vars(self.config).items() if k.startswith('unet_') } unet = unet_block(**unet_kwargs)(input_img) if self.config.net_conv_after_unet > 0: unet = Conv2D(self.config.net_conv_after_unet, self.config.unet_kernel_size, name='features', padding='same', activation='relu')(unet) output_prob = Conv2D(1, (1, 1), name='prob', padding='same', activation='sigmoid')(unet) output_dist = Conv2D(self.config.n_rays, (1, 1), name='dist', padding='same', activation='linear')(unet) return Model([input_img, input_mask], [output_prob, output_dist])
def _build_unet(self): assert self.config.backbone == 'unet' input_img = Input(self.config.net_input_shape, name='input') if backend_channels_last(): grid_shape = tuple(n//g if n is not None else None for g,n in zip(self.config.grid, self.config.net_mask_shape[:-1])) + (1,) else: grid_shape = (1,) + tuple(n//g if n is not None else None for g,n in zip(self.config.grid, self.config.net_mask_shape[1:])) input_mask = Input(grid_shape, name='dist_mask') unet_kwargs = {k[len('unet_'):]:v for (k,v) in vars(self.config).items() if k.startswith('unet_')} # maxpool input image to grid size pooled = np.array([1,1,1]) pooled_img = input_img while tuple(pooled) != tuple(self.config.grid): pool = 1 + (np.asarray(self.config.grid) > pooled) pooled *= pool for _ in range(self.config.unet_n_conv_per_depth): pooled_img = Conv3D(self.config.unet_n_filter_base, self.config.unet_kernel_size, padding="same", activation=self.config.unet_activation)(pooled_img) pooled_img = MaxPooling3D(pool)(pooled_img) unet = unet_block(**unet_kwargs)(pooled_img) if self.config.net_conv_after_unet > 0: unet = Conv3D(self.config.net_conv_after_unet, self.config.unet_kernel_size, name='features', padding='same', activation=self.config.unet_activation)(unet) output_prob = Conv3D(1, (1,1,1), name='prob', padding='same', activation='sigmoid')(unet) output_dist = Conv3D(self.config.n_rays, (1,1,1), name='dist', padding='same', activation='linear')(unet) return Model([input_img,input_mask], [output_prob,output_dist])
def _build(self): self.config.backbone == 'unet' or _raise(NotImplementedError()) unet_kwargs = {k[len('unet_'):]:v for (k,v) in vars(self.config).items() if k.startswith('unet_')} input_img = Input(self.config.net_input_shape, name='input') # maxpool input image to grid size pooled = np.array([1,1]) pooled_img = input_img while tuple(pooled) != tuple(self.config.grid): pool = 1 + (np.asarray(self.config.grid) > pooled) pooled *= pool for _ in range(self.config.unet_n_conv_per_depth): pooled_img = Conv2D(self.config.unet_n_filter_base, self.config.unet_kernel_size, padding='same', activation=self.config.unet_activation)(pooled_img) pooled_img = MaxPooling2D(pool)(pooled_img) unet = unet_block(**unet_kwargs)(pooled_img) if self.config.net_conv_after_unet > 0: unet = Conv2D(self.config.net_conv_after_unet, self.config.unet_kernel_size, name='features', padding='same', activation=self.config.unet_activation)(unet) output_prob = Conv2D(1, (1,1), name='prob', padding='same', activation='sigmoid')(unet) output_dist = Conv2D(self.config.n_rays, (1,1), name='dist', padding='same', activation='linear')(unet) return Model([input_img], [output_prob,output_dist])
def _build(self): #self.config.backbone == 'unet'|'unet2' or _raise(NotImplementedError()) self.config.backbone in ('unet','unet2') or _raise(NotImplementedError()) input_img = Input(self.config.net_input_shape, name='input') if backend_channels_last(): grid_shape = tuple(n//g if n is not None else None for g,n in zip(self.config.grid, self.config.net_mask_shape[:-1])) + (1,) else: grid_shape = (1,) + tuple(n//g if n is not None else None for g,n in zip(self.config.grid, self.config.net_mask_shape[1:])) input_mask = Input(grid_shape, name='dist_mask') unet_kwargs = {k[len('unet_'):]:v for (k,v) in vars(self.config).items() if k.startswith('unet_')} # maxpool input image to grid size pooled = np.array([1,1]) pooled_img = input_img while tuple(pooled) != tuple(self.config.grid): pool = 1 + (np.asarray(self.config.grid) > pooled) pooled *= pool for _ in range(self.config.unet_n_conv_per_depth): pooled_img = Conv2D(self.config.unet_n_filter_base, self.config.unet_kernel_size, padding='same', activation=self.config.unet_activation)(pooled_img) pooled_img = MaxPooling2D(pool)(pooled_img) if(self.config.backbone == 'unet2'): unet = unet_block2(**unet_kwargs)(pooled_img) if self.config.net_conv_after_unet > 0: unet = Conv2D(self.config.net_conv_after_unet, self.config.unet_kernel_size, name='features', padding='same', activation=self.config.unet_activation)(unet) ## extra dropout layer after the feature layer unet = Dropout(rate = self.config.feature_dropout)(unet) output_prob = Conv2D(1, (1,1), name='prob', padding='same', activation='sigmoid',kernel_initializer='glorot_uniform' )(unet) if self.config.y_range is None: output_dist = Conv2D(self.config.n_rays, (1,1), name='dist', padding='same', activation='linear')(unet) else: output_dist = Conv2D(self.config.n_rays, (1,1), name='linear', padding='same', activation='linear')(unet) output_dist = RangedSig(y_min=self.config.y_range[0], y_max=self.config.y_range[1], name='dist')(output_dist) # if self.config.y_range is not None: # y_min = self.config.y_range[0] # y_max = self.config.y_range[1] # output_dist = Conv2D(self.config.n_rays, (1,1), name='dist', padding='same', # == activation=Activation(lambda x: output_to_y_range(x, y_min, y_max)))(unet) # else: # output_dist = Conv2D(self.config.n_rays, (1,1), name='dist', padding='same', activation='linear')(unet) else: unet = unet_block(**unet_kwargs)(pooled_img) if self.config.net_conv_after_unet > 0: unet = Conv2D(self.config.net_conv_after_unet, self.config.unet_kernel_size, name='features', padding='same', activation=self.config.unet_activation)(unet) output_prob = Conv2D(1, (1,1), name='prob', padding='same', activation='sigmoid')(unet) if self.config.y_range is not None: y_min = self.config.y_range[0] y_max = self.config.y_range[1] output_dist = Conv2D(self.config.n_rays, (1,1), name='dist', padding='same', activation=Activation(lambda x: output_to_y_range(x, y_min, y_max)))(unet) else: output_dist = Conv2D(self.config.n_rays, (1,1), name='dist', padding='same', activation='linear')(unet) # output_dist = Conv2D(self.config.n_rays, (1,1), name='dist', padding='same', activation='linear')(unet) return Model([input_img,input_mask], [output_prob,output_dist])
def _build(self): #~~ #with tf.device('gpu:0'): #~~Indentation self.config.backbone == 'unet' or _raise(NotImplementedError()) input_img = Input(self.config.net_input_shape, name='input') if backend_channels_last(): grid_shape = tuple(n // g if n is not None else None for g, n in zip(self.config.grid, self.config. net_mask_shape[:-1])) + (1, ) else: grid_shape = (1, ) + tuple( n // g if n is not None else None for g, n in zip( self.config.grid, self.config.net_mask_shape[1:])) input_mask = Input(grid_shape, name='dist_mask') unet_kwargs = { k[len('unet_'):]: v for (k, v) in vars(self.config).items() if k.startswith('unet_') } # maxpool input image to grid size pooled = np.array([1, 1]) pooled_img = input_img while tuple(pooled) != tuple(self.config.grid): pool = 1 + (np.asarray(self.config.grid) > pooled) pooled *= pool for _ in range(self.config.unet_n_conv_per_depth): pooled_img = Conv2D( self.config.unet_n_filter_base, self.config.unet_kernel_size, padding='same', activation=self.config.unet_activation)(pooled_img) pooled_img = MaxPooling2D(pool)(pooled_img) unet = unet_block(**unet_kwargs)(pooled_img) if self.config.net_conv_after_unet > 0: unet = Conv2D(self.config.net_conv_after_unet, self.config.unet_kernel_size, name='features', padding='same', activation=self.config.unet_activation)(unet) output_prob = Conv2D(1, (1, 1), name='prob', padding='same', activation='sigmoid')(unet) output_dist = Conv2D(self.config.n_rays, (1, 1), name='dist', padding='same', activation='linear')(unet) #~~ #with tf. device("gpu:0"): compModel = Model([input_img, input_mask], [output_prob, output_dist]) compModel.compile(optimizer=keras.optimizers.Adagrad( lr=self.config.lr)) return compModel
def build_single_unet_per_channel(input_shape, last_activation, n_depth=2, n_filter_base=16, kernel_size=(3, 3, 3), n_conv_per_depth=2, activation="relu", batch_norm=False, dropout=0.0, pool_size=(2, 2, 2), residual=False, prob_out=False, eps_scale=1e-3): """ TODO """ if last_activation is None: raise ValueError( "last activation has to be given (e.g. 'sigmoid', 'relu')!") all((s % 2 == 1 for s in kernel_size)) or _raise( ValueError('kernel size should be odd in all dimensions.')) channel_axis = -1 if backend_channels_last() else 1 n_dim = len(kernel_size) conv = Conv2D if n_dim == 2 else Conv3D num_channels = input_shape[channel_axis] input = Input(input_shape, name="input") out_channels = [] num_channel_out = 1 for i in range(num_channels): c = Lambda(lambda x: x[:, ..., i:i + 1])(input) unet = unet_block(n_depth, n_filter_base, kernel_size, activation=activation, dropout=dropout, batch_norm=batch_norm, n_conv_per_depth=n_conv_per_depth, pool=pool_size, prefix='channel_{}'.format(i))(c) final = conv(num_channel_out, (1, ) * n_dim, activation='linear')(unet) if residual: if not (num_channel_out == 1 if backend_channels_last() else num_channel_out == 1): raise ValueError( "number of input and output channels must be the same for a residual net." ) final = Add()([final, input]) final = Activation(activation=last_activation)(final) if prob_out: scale = conv(num_channel_out, (1, ) * n_dim, activation='softplus')(unet) scale = Lambda(lambda x: x + np.float32(eps_scale))(scale) final = Concatenate(axis=channel_axis)([final, scale]) out_channels.append(final) if len(out_channels) > 1: output = Concatenate(axis=channel_axis)(out_channels) return Model(inputs=input, outputs=output) else: return Model(inputs=input, outputs=out_channels[0])