marlenezw's picture
more changes to the third party lib.
dd38ad1
raw
history blame
No virus
5.09 kB
import tensorflow as tf
import numpy as np
def conv_relu_pool(input, conv_ker, conv_filters, conv_stride=1, conv_padding='SAME',
conv_ker_init=tf.random_normal_initializer(0.01), conv_bias_init=tf.zeros_initializer(),
pool_size=2, pool_stride=2, pool_padding='same', var_scope='layer', reuse=None):
with tf.variable_scope(var_scope):
conv = tf.layers.conv2d(input, filters=conv_filters, kernel_size=[conv_ker, conv_ker],
strides=conv_stride, padding=conv_padding, bias_initializer=conv_bias_init,
kernel_initializer=conv_ker_init, name='conv', reuse=reuse)
relu = tf.nn.relu(conv, name='relu')
out = tf.layers.max_pooling2d(relu, pool_size=(pool_size, pool_size),
strides=(pool_stride, pool_stride), padding=pool_padding, name='pool')
return out
def conv_relu(input, conv_ker, conv_filters, conv_stride=1, conv_dilation=1, conv_padding='SAME',
conv_ker_init=tf.random_normal_initializer(0.01), conv_bias_init=tf.zeros_initializer(),
var_scope='layer', reuse=None):
with tf.variable_scope(var_scope):
conv = tf.layers.conv2d(input, filters=conv_filters, kernel_size=[conv_ker, conv_ker],
strides=conv_stride, dilation_rate=conv_dilation, padding=conv_padding,
bias_initializer=conv_bias_init, kernel_initializer=conv_ker_init, name='conv',
reuse=reuse)
out = tf.nn.relu(conv, name='relu')
return out
def conv(input, conv_ker, conv_filters, conv_stride=1, conv_dilation=1, conv_padding='SAME',
conv_ker_init=tf.random_normal_initializer(0.01), conv_bias_init=tf.zeros_initializer(),
var_scope='layer', reuse=None):
with tf.variable_scope(var_scope):
out = tf.layers.conv2d(input, filters=conv_filters, kernel_size=[conv_ker, conv_ker],
strides=conv_stride, dilation_rate=conv_dilation, padding=conv_padding,
bias_initializer=conv_bias_init, kernel_initializer=conv_ker_init, name='conv',
reuse=reuse)
return out
def deconv(input, conv_ker, conv_filters, conv_stride=1, conv_padding='SAME',
conv_ker_init=tf.random_normal_initializer(0.01), conv_bias_init=tf.zeros_initializer(),
var_scope='layer', reuse=None):
with tf.variable_scope(var_scope):
out = tf.layers.conv2d_transpose(input, filters=conv_filters, kernel_size=[conv_ker, conv_ker],
strides=conv_stride, padding=conv_padding, bias_initializer=conv_bias_init,
kernel_initializer=conv_ker_init, name='deconv', reuse=reuse)
return out
def deconv2d_bilinear_upsampling_initializer(shape):
"""Returns the initializer that can be passed to DeConv2dLayer for initializ ingthe
weights in correspondence to channel-wise bilinear up-sampling.
Used in segmentation approaches such as [FCN](https://arxiv.org/abs/1605.06211)
Parameters
----------
shape : tuple of int
The shape of the filters, [height, width, output_channels, in_channels].
It must match the shape passed to DeConv2dLayer.
Returns
-------
``tf.constant_initializer``
A constant initializer with weights set to correspond to per channel bilinear upsampling
when passed as W_int in DeConv2dLayer
--------
from: tensorlayer
https://github.com/tensorlayer/tensorlayer/blob/c7a1a4924219244c71048709ca729aca0c34c453/tensorlayer/layers/convolution.py
"""
if shape[0] != shape[1]:
raise Exception('deconv2d_bilinear_upsampling_initializer only supports symmetrical filter sizes')
if shape[3] < shape[2]:
raise Exception('deconv2d_bilinear_upsampling_initializer behaviour is not defined for num_in_channels < num_out_channels ')
filter_size = shape[0]
num_out_channels = shape[2]
num_in_channels = shape[3]
# Create bilinear filter kernel as numpy array
bilinear_kernel = np.zeros([filter_size, filter_size], dtype=np.float32)
scale_factor = (filter_size + 1) // 2
if filter_size % 2 == 1:
center = scale_factor - 1
else:
center = scale_factor - 0.5
for x in range(filter_size):
for y in range(filter_size):
bilinear_kernel[x, y] = (1 - abs(x - center) / scale_factor) * \
(1 - abs(y - center) / scale_factor)
weights = np.zeros((filter_size, filter_size, num_out_channels, num_in_channels))
for i in range(num_out_channels):
weights[:, :, i, i] = bilinear_kernel
# assign numpy array to constant_initalizer and pass to get_variable
bilinear_weights_init = tf.constant_initializer(value=weights, dtype=tf.float32)
return bilinear_weights_init