def _dense(self, net, num_units, name=None, sparsity_technique='baseline'): return sparse_fully_connected( x=net, units=num_units, sparsity_technique=sparsity_technique, kernel_regularizer=self._regularizer, name=name)
def model(inputs, is_training): """Creation of the model graph.""" with tf.variable_scope(name, 'resnet_model'): inputs = conv2d_fixed_padding( inputs=inputs, filters=int(64 * width), kernel_size=7, strides=2, pruning_method=pruning_method if prune_first_layer else 'baseline', init_method=init_method if prune_first_layer else 'baseline', data_format=data_format, end_sparsity=end_sparsity, weight_decay=weight_decay, name='initial_conv') inputs = tf.identity(inputs, 'initial_conv') inputs = batch_norm_relu(inputs, is_training, data_format=data_format) inputs = tf.layers.max_pooling2d(inputs=inputs, pool_size=3, strides=2, padding='SAME', data_format=data_format, name='initial_max_pool') inputs = tf.identity(inputs, 'initial_max_pool') inputs = block_group(inputs=inputs, filters=int(64 * width), block_fn=block_fn, blocks=num_blocks[0], strides=1, is_training=is_training, name='block_group1', pruning_method=pruning_method, init_method=init_method, data_format=data_format, end_sparsity=end_sparsity, weight_decay=weight_decay) inputs = block_group(inputs=inputs, filters=int(128 * width), block_fn=block_fn, blocks=num_blocks[1], strides=2, is_training=is_training, name='block_group2', pruning_method=pruning_method, init_method=init_method, data_format=data_format, end_sparsity=end_sparsity, weight_decay=weight_decay) inputs = block_group(inputs=inputs, filters=int(256 * width), block_fn=block_fn, blocks=num_blocks[2], strides=2, is_training=is_training, name='block_group3', pruning_method=pruning_method, init_method=init_method, data_format=data_format, end_sparsity=end_sparsity, weight_decay=weight_decay) inputs = block_group(inputs=inputs, filters=int(512 * width), block_fn=block_fn, blocks=num_blocks[3], strides=2, is_training=is_training, name='block_group4', pruning_method=pruning_method, init_method=init_method, data_format=data_format, end_sparsity=end_sparsity, weight_decay=weight_decay) pool_size = (inputs.shape[1], inputs.shape[2]) inputs = tf.layers.average_pooling2d(inputs=inputs, pool_size=pool_size, strides=1, padding='VALID', data_format=data_format, name='final_avg_pool') inputs = tf.identity(inputs, 'final_avg_pool') multiplier = 4 if block_fn is bottleneck_block_ else 1 fc_units = multiplier * int(512 * width) inputs = tf.reshape(inputs, [-1, fc_units]) kernel_initializer = tf.random_normal_initializer(stddev=.01) # If init_method==sparse and not pruning, skip. if init_method != 'sparse' or prune_last_layer: kernel_initializer = _pick_initializer(kernel_initializer, init_method, pruning_method, end_sparsity) kernel_regularizer = contrib_layers.l2_regularizer(weight_decay) inputs = sparse_fully_connected( x=inputs, units=num_classes, sparsity_technique=pruning_method if prune_last_layer else 'baseline', kernel_initializer=kernel_initializer, kernel_regularizer=kernel_regularizer, name='final_dense') inputs = tf.identity(inputs, 'final_dense') return inputs
def model(inputs, is_training): """Creation of the model graph.""" with tf.variable_scope(name, 'resnet_model'): inputs = resnet_model.fixed_padding(inputs, kernel_size=3, data_format=data_format) padding = 'VALID' kernel_initializer = tf.variance_scaling_initializer() kernel_regularizer = contrib_layers.l2_regularizer(weight_decay) inputs = tf.layers.conv2d(inputs=inputs, filters=_make_divisible(32 * width), kernel_size=3, strides=2, padding=padding, use_bias=False, kernel_initializer=kernel_initializer, kernel_regularizer=kernel_regularizer, data_format=data_format, name='initial_conv') inputs = tf.identity(inputs, 'initial_conv') inputs = resnet_model.batch_norm_relu(inputs, is_training, data_format=data_format) mb_block = functools.partial(mbv1_block_, is_training=is_training, width=width, pruning_method=pruning_method, data_format=data_format, weight_decay=weight_decay) inputs = mb_block(inputs, filters=64, stride=1, block_id=0) inputs = mb_block(inputs, filters=128, stride=2, block_id=1) inputs = mb_block(inputs, filters=128, stride=1, block_id=2) inputs = mb_block(inputs, filters=256, stride=2, block_id=3) inputs = mb_block(inputs, filters=256, stride=1, block_id=4) inputs = mb_block(inputs, filters=512, stride=2, block_id=5) inputs = mb_block(inputs, filters=512, stride=1, block_id=6) inputs = mb_block(inputs, filters=512, stride=1, block_id=7) inputs = mb_block(inputs, filters=512, stride=1, block_id=8) inputs = mb_block(inputs, filters=512, stride=1, block_id=9) inputs = mb_block(inputs, filters=512, stride=1, block_id=10) inputs = mb_block(inputs, filters=1024, stride=2, block_id=11) inputs = mb_block(inputs, filters=1024, stride=1, block_id=12) last_block_filters = _make_divisible(int(1024 * width), 8) if data_format == 'channels_last': pool_size = (inputs.shape[1], inputs.shape[2]) elif data_format == 'channels_first': pool_size = (inputs.shape[2], inputs.shape[3]) inputs = tf.layers.average_pooling2d(inputs=inputs, pool_size=pool_size, strides=1, padding='VALID', data_format=data_format, name='final_avg_pool') inputs = tf.identity(inputs, 'final_avg_pool') inputs = tf.reshape(inputs, [-1, last_block_filters]) kernel_initializer = tf.variance_scaling_initializer() kernel_regularizer = contrib_layers.l2_regularizer(weight_decay) if prune_last_layer: inputs = sparse_fully_connected( x=inputs, units=num_classes, sparsity_technique=pruning_method if prune_last_layer else 'baseline', kernel_initializer=kernel_initializer, kernel_regularizer=kernel_regularizer, name='final_dense') else: inputs = tf.layers.dense(inputs=inputs, units=num_classes, activation=None, use_bias=True, kernel_initializer=kernel_initializer, kernel_regularizer=kernel_regularizer, name='final_dense') inputs = tf.identity(inputs, 'final_dense') return inputs