from __future__ import absolute_import import oneflow as flow def conv2d_layer( name, input, filters, kernel_size=3, strides=1, padding="SAME", data_format="NCHW", dilation_rate=1, activation="Relu", use_bias=True, weight_initializer=flow.random_uniform_initializer(), bias_initializer=flow.constant_initializer(), ): if isinstance(kernel_size, int): kernel_size_1 = kernel_size kernel_size_2 = kernel_size if isinstance(kernel_size, list): kernel_size_1 = kernel_size[0] kernel_size_2 = kernel_size[1] weight_shape = (filters, input.shape[1], kernel_size_1, kernel_size_2) weight = flow.get_variable( name + "-weight", shape=weight_shape, dtype=input.dtype, initializer=weight_initializer, ) output = flow.nn.conv2d( input, weight, strides, padding, data_format, dilation_rate, name=name ) if use_bias: bias = flow.get_variable( name + "-bias", shape=(filters,), dtype=input.dtype, initializer=bias_initializer, ) output = flow.nn.bias_add(output, bias, data_format) if activation is not None: if activation == "Relu": output = flow.keras.activations.relu(output) else: raise NotImplementedError return output def conv2d_layer_with_bn( name, input, filters, kernel_size=3, strides=1, padding="SAME", data_format="NCHW", dilation_rate=1, activation="Relu", use_bias=True, weight_initializer=flow.random_uniform_initializer(), bias_initializer=flow.constant_initializer(), use_bn=True, ): output = conv2d_layer(name=name, input=input, filters=filters, kernel_size=kernel_size, strides=strides, padding=padding, data_format=data_format, dilation_rate=dilation_rate, activation=activation, use_bias=use_bias, weight_initializer=weight_initializer, bias_initializer=bias_initializer) if use_bn: output = flow.layers.batch_normalization(inputs=output, axis=1, momentum=0.997, epsilon=1.001e-5, center=True, scale=True, trainable=True, name=name + "_bn") return output