def discriminator(inp, reuse=False): with tf.variable_scope('Encoder', reuse=reuse): # 64 inp = gaussnoise(inp, std=0.05) conv1 = conv2d(inp, 128, kernel=3, strides=2, name=dname + 'conv1') conv1 = lrelu(conv1, 0.2) # 32 conv2 = tf.nn.dropout(conv1, keep_prob) conv2 = conv2d(conv2, 256, kernel=3, strides=2, name=dname + 'conv2') conv2 = batchnorm(conv2, is_training=is_train, name=dname + 'bn2') conv2 = lrelu(conv2, 0.2) # 16 conv3 = tf.nn.dropout(conv2, keep_prob) conv3 = conv2d(conv3, 512, kernel=3, strides=2, name=dname + 'conv3') conv3 = batchnorm(conv3, is_training=is_train, name=dname + 'bn3') conv3 = lrelu(conv3, 0.2) # 8 conv3b = conv2d(conv3, 512, kernel=3, strides=1, name=dname + 'conv3b') conv3b = batchnorm(conv3b, is_training=is_train, name=dname + 'bn3b') conv3b = lrelu(conv3b, 0.2) conv4 = tf.nn.dropout(conv3b, keep_prob) conv4 = conv2d(conv4, 1024, kernel=3, strides=2, name=dname + 'conv4') conv4 = batchnorm(conv4, is_training=is_train, name=dname + 'bn4') conv4 = lrelu(conv4, 0.2) # 4 flat = flatten(conv4) # Classifier clspred = linear(flat, n_classes, name=dname + 'cpred') # Decoder g1 = conv2d(conv4, nout=512, kernel=3, name=dname + 'deconv1') g1 = batchnorm(g1, is_training=tf.constant(True), name=dname + 'bn1g') g1 = lrelu(g1, 0.2) g2 = nnupsampling(g1, [8, 8]) g2 = conv2d(g2, nout=256, kernel=3, name=dname + 'deconv2') g2 = batchnorm(g2, is_training=tf.constant(True), name=dname + 'bn2g') g2 = lrelu(g2, 0.2) g3 = nnupsampling(g2, [16, 16]) g3 = conv2d(g3, nout=128, kernel=3, name=dname + 'deconv3') g3 = batchnorm(g3, is_training=tf.constant(True), name=dname + 'bn3g') g3 = lrelu(g3, 0.2) g4 = nnupsampling(g3, [32, 32]) g4 = conv2d(g4, nout=64, kernel=3, name=dname + 'deconv4') g4 = batchnorm(g4, is_training=tf.constant(True), name=dname + 'bn4g') g4 = lrelu(g4, 0.2) g5 = nnupsampling(g4, [64, 64]) g5 = conv2d(g5, nout=32, kernel=3, name=dname + 'deconv5') g5 = batchnorm(g5, is_training=tf.constant(True), name=dname + 'bn5g') g5 = lrelu(g5, 0.2) g5b = conv2d(g5, nout=3, kernel=3, name=dname + 'deconv5b') g5b = tf.nn.tanh(g5b) return clspred, g5b
def ModelSimple(X, is_training): h_1 = lrelu(batch_norm(conv2d(X, 32, name='conv1'), is_training, scope='bn1'), name='lrelu1') h_2 = lrelu(batch_norm(conv2d(h_1, 64, name='conv2'), is_training, scope='bn2'), name='lrelu2') h_3 = lrelu(batch_norm(conv2d(h_2, 64, name='conv3'), is_training, scope='bn3'), name='lrelu3') h_3_flat = tf.reshape(h_3, [-1, 64 * 4 * 4]) return linear(h_3_flat, 10)
def D_base(name, x): with tf.variable_scope(name): conv1 = conv('conv1', x, 4 * 4, 64, 2, 0, True) l1 = lrelu('lrelu1', conv1) conv2 = conv('conv2', l1, 4 * 4, 128, 2, 0, True) ins2 = ins_norm('ins2', conv2) l2 = lrelu('lrelu2', ins2) conv3 = conv('conv3', l2, 4 * 4, 256, 2, 0, True) ins3 = ins_norm('ins3', conv3) l3 = lrelu('lrelu3', ins3) conv4 = conv('conv4', l3, 4 * 4, 512, 1, 0, True) ins4 = ins_norm('ins4', conv4) l4 = lrelu('lrelu4', ins4) conv5 = conv('conv5', l4, 4 * 4, 1, 1, 0, True) return [l1, l2, l3, l4, conv5]
def generator(inp_z, inp_y, reuse=False): with tf.variable_scope('Generator', reuse=reuse): inp = tf.concat([inp_z, inp_y], 1) sz = 4 g1 = linear(inp, 512 * sz * sz, name=gname + 'deconv1') g1 = batchnorm(g1, is_training=tf.constant(True), name=gname + 'bn1g') g1 = lrelu(g1, 0.2) g1_reshaped = tf.reshape(g1, [-1, 512, sz, sz]) print 'genreshape: ' + str(g1_reshaped.get_shape().as_list()) g2 = nnupsampling(g1_reshaped, [8, 8]) g2 = conv2d(g2, nout=512, kernel=3, name=gname + 'deconv2') g2 = batchnorm(g2, is_training=tf.constant(True), name=gname + 'bn2g') g2 = lrelu(g2, 0.2) g3 = nnupsampling(g2, [16, 16]) g3 = conv2d(g3, nout=256, kernel=3, name=gname + 'deconv3') g3 = batchnorm(g3, is_training=tf.constant(True), name=gname + 'bn3g') g3 = lrelu(g3, 0.2) g4 = nnupsampling(g3, [32, 32]) g4 = conv2d(g4, nout=128, kernel=3, name=gname + 'deconv4') g4 = batchnorm(g4, is_training=tf.constant(True), name=gname + 'bn4g') g4 = lrelu(g4, 0.2) g4b = conv2d(g4, nout=128, kernel=3, name=gname + 'deconv4b') g4b = batchnorm(g4b, is_training=tf.constant(True), name=gname + 'bn4bg') g4b = lrelu(g4b, 0.2) g5 = nnupsampling(g4b, [64, 64]) g5 = conv2d(g5, nout=64, kernel=3, name=gname + 'deconv5') g5 = batchnorm(g5, is_training=tf.constant(True), name=gname + 'bn5g') g5 = lrelu(g5, 0.2) g5b = conv2d(g5, nout=64, kernel=3, name=gname + 'deconv5b') g5b = batchnorm(g5b, is_training=tf.constant(True), name=gname + 'bn5bg') g5b = lrelu(g5b, 0.2) g6 = nnupsampling(g5b, [128, 128]) g6 = conv2d(g6, nout=32, kernel=3, name=gname + 'deconv6') g6 = batchnorm(g6, is_training=tf.constant(True), name=gname + 'bn6g') g6 = lrelu(g6, 0.2) g6b = conv2d(g6, nout=3, kernel=3, name=gname + 'deconv6b') g6b = tf.nn.tanh(g6b) g6b_64 = pool(g6b, fsize=3, strides=2, op='avg') return g6b_64, g6b
def net_preloaded(vgg_layers, input_image, relu_kind=None, pooling_type='avg', padding='SAME'): """ This function read the vgg layers and create the net architecture We need the input image to know the dimension of the input layer of the net """ net = {} shapes = {} _, height, width, numberChannels = input_image.shape # In order to have the right shape of the input current = tf.Variable( np.zeros((1, height, width, numberChannels), dtype=np.float32)) shapes['input'] = current.get_shape().as_list() net['input'] = current print('input', current.get_shape()) for i, name in enumerate(VGG19_LAYERS): kind = name[:4] shapes[name] = current.get_shape().as_list() if (kind == 'conv'): #if(VGG19_mat=='texturesyn_normalizedvgg.mat'): # Only way to get the weight of the kernel of convolution # Inspired by http://programtalk.com/vs2/python/2964/facenet/tmp/vggverydeep19.py/ kernels = vgg_layers[i][0][0][2][0][0] bias = vgg_layers[i][0][0][2][0][1] # matconvnet: weights are [width, height, in_channels, out_channels] # tensorflow: weights are [height, width, in_channels, out_channels] kernels = tf.constant(np.transpose(kernels, (1, 0, 2, 3))) bias = tf.constant(bias.reshape(-1)) current = st.conv_layer(current, kernels, bias, name, padding) # Update the variable named current to have the right size elif (kind == 'relu'): if (relu_kind == 'l'): # leakly relu current = lrelu(current, leak=leak) else: current = tf.nn.relu(current, name=name) elif (kind == 'pool'): current = st.pool_layer(current, name, pooling_type, padding) net[name] = current print(name, current.get_shape()) assert len(net) == len(VGG19_LAYERS) + 1 # Test if the length is right return (net, shapes)
def generator(inp_z, inp_y): with tf.variable_scope('Generator'): inp = tf.concat([inp_z, inp_y], 1) g1 = linear(inp, 512 * 4 * 4, name=gname + 'deconv1') g1 = batchnorm(g1, is_training=tf.constant(True), name=gname + 'bn1g') g1 = lrelu(g1, 0.2) g1_reshaped = tf.reshape(g1, [-1, 512, 4, 4]) print 'genreshape: ' + str(g1_reshaped.get_shape().as_list()) g2 = nnupsampling(g1_reshaped, [8, 8]) g2 = conv2d(g2, nout=256, kernel=3, name=gname + 'deconv2') g2 = batchnorm(g2, is_training=tf.constant(True), name=gname + 'bn2g') g2 = lrelu(g2, 0.2) g3 = nnupsampling(g2, [16, 16]) g3 = conv2d(g3, nout=128, kernel=3, name=gname + 'deconv3') g3 = batchnorm(g3, is_training=tf.constant(True), name=gname + 'bn3g') g3 = lrelu(g3, 0.2) g3b = conv2d(g3, nout=128, kernel=3, name=gname + 'deconv3b') g3b = batchnorm(g3b, is_training=tf.constant(True), name=gname + 'bn3bg') g3b = lrelu(g3b, 0.2) g4 = nnupsampling(g3b, [32, 32]) g4 = conv2d(g4, nout=64, kernel=3, name=gname + 'deconv4') g4 = batchnorm(g4, is_training=tf.constant(True), name=gname + 'bn4g') g4 = lrelu(g4, 0.2) g4b = conv2d(g4, nout=64, kernel=3, name=gname + 'deconv4b') g4b = batchnorm(g4b, is_training=tf.constant(True), name=gname + 'bn4bg') g4b = lrelu(g4b, 0.2) g5 = nnupsampling(g4b, [64, 64]) g5 = conv2d(g5, nout=32, kernel=3, name=gname + 'deconv5') g5 = batchnorm(g5, is_training=tf.constant(True), name=gname + 'bn5g') g5 = lrelu(g5, 0.2) g5b = conv2d(g5, nout=3, kernel=3, name=gname + 'deconv5b') g5b = tf.nn.tanh(g5b) g5b_32 = pool(g5b, fsize=3, strides=2, op='avg', pad='SAME') return g5b_32, g5b
def discriminator(inp, reuse=False): with tf.variable_scope('Encoder', reuse=reuse): # 32 inp = gaussnoise(inp, std=0.05) conv1 = conv2d(inp, 96, kernel=3, strides=1, name=dname + 'conv1') conv1 = lrelu(conv1, 0.2) conv1b = conv2d(conv1, 96, kernel=3, strides=2, name=dname + 'conv1b') conv1b = batchnorm(conv1b, is_training=is_train, name=dname + 'bn1b') conv1b = lrelu(conv1b, 0.2) conv1b = tf.nn.dropout(conv1b, keep_prob) # 16 conv2 = conv2d(conv1b, 192, kernel=3, strides=1, name=dname + 'conv2') conv2 = batchnorm(conv2, is_training=is_train, name=dname + 'bn2') conv2 = lrelu(conv2, 0.2) conv2b = conv2d(conv2, 192, kernel=3, strides=2, name=dname + 'conv2b') conv2b = batchnorm(conv2b, is_training=is_train, name=dname + 'bn2b') conv2b = lrelu(conv2b, 0.2) conv2b = tf.nn.dropout(conv2b, keep_prob) # 8 conv3 = conv2d(conv2b, 256, kernel=3, strides=1, name=dname + 'conv3') conv3 = batchnorm(conv3, is_training=is_train, name=dname + 'bn3') conv3 = lrelu(conv3, 0.2) conv3b = conv2d(conv3, 256, kernel=1, strides=1, name=dname + 'conv3b') conv3b = batchnorm(conv3b, is_training=is_train, name=dname + 'bn3b') conv3b = lrelu(conv3b, 0.2) conv4 = conv2d(conv3b, 512, kernel=1, strides=1, name=dname + 'conv4') conv4 = batchnorm(conv4, is_training=is_train, name=dname + 'bn4') conv4 = lrelu(conv4, 0.2) flat = flatten(conv4) # Classifier clspred = linear(flat, n_classes, name=dname + 'cpred') # Decoder g2 = conv2d(conv4, nout=256, kernel=3, name=dname + 'deconv2') g2 = batchnorm(g2, is_training=tf.constant(True), name=dname + 'bn2g') g2 = lrelu(g2, 0.2) g3 = nnupsampling(g2, [16, 16]) g3 = conv2d(g3, nout=128, kernel=3, name=dname + 'deconv3') g3 = batchnorm(g3, is_training=tf.constant(True), name=dname + 'bn3g') g3 = lrelu(g3, 0.2) g3b = conv2d(g3, nout=128, kernel=3, name=dname + 'deconv3b') g3b = batchnorm(g3b, is_training=tf.constant(True), name=dname + 'bn3bg') g3b = lrelu(g3b, 0.2) g4 = nnupsampling(g3b, [32, 32]) g4 = conv2d(g4, nout=64, kernel=3, name=dname + 'deconv4') g4 = batchnorm(g4, is_training=tf.constant(True), name=dname + 'bn4g') g4 = lrelu(g4, 0.2) g4b = conv2d(g4, nout=3, kernel=3, name=dname + 'deconv4b') g4b = tf.nn.tanh(g4b) return clspred, g4b
def autoencoder(input_shape=[None, 784], n_filters=[1, 10, 10, 10], filter_sizes=[3, 3, 3, 3], corruption=False): """Build a deep denoising autoencoder w/ tied weights. Parameters ---------- input_shape : list, optional Description n_filters : list, optional Description filter_sizes : list, optional Description Returns ------- x : Tensor Input placeholder to the network z : Tensor Inner-most latent representation y : Tensor Output reconstruction of the input cost : Tensor Overall cost to use for training Raises ------ ValueError Description """ # %% # input to the network x = tf.placeholder( tf.float32, input_shape, name='x') # %% # Optionally apply denoising autoencoder if corruption: x_noise = corrupt(x) else: x_noise = x # %% # ensure 2-d is converted to square tensor. if len(x.get_shape()) == 2: x_dim = np.sqrt(x_noise.get_shape().as_list()[1]) if x_dim != int(x_dim): raise ValueError('Unsupported input dimensions') x_dim = int(x_dim) x_tensor = tf.reshape( x_noise, [-1, x_dim, x_dim, n_filters[0]]) elif len(x_noise.get_shape()) == 4: x_tensor = x_noise else: raise ValueError('Unsupported input dimensions') current_input = x_tensor # %% # Build the encoder encoder = [] shapes = [] for layer_i, n_output in enumerate(n_filters[1:]): n_input = current_input.get_shape().as_list()[3] shapes.append(current_input.get_shape().as_list()) W = tf.Variable( tf.random_uniform([ filter_sizes[layer_i], filter_sizes[layer_i], n_input, n_output], -1.0 / math.sqrt(n_input), 1.0 / math.sqrt(n_input))) b = tf.Variable(tf.zeros([n_output])) encoder.append(W) output = lrelu( tf.add(tf.nn.conv2d( current_input, W, strides=[1, 2, 2, 1], padding='SAME'), b)) current_input = output # %% # store the latent representation z = current_input encoder.reverse() shapes.reverse() # %% # Build the decoder using the same weights for layer_i, shape in enumerate(shapes): W = encoder[layer_i] b = tf.Variable(tf.zeros([W.get_shape().as_list()[2]])) output = lrelu(tf.add( tf.nn.deconv2d( current_input, W, tf.pack([tf.shape(x)[0], shape[1], shape[2], shape[3]]), strides=[1, 2, 2, 1], padding='SAME'), b)) current_input = output # %% # now have the reconstruction through the network y = current_input # cost function measures pixel-wise difference cost = tf.reduce_sum(tf.square(y - x_tensor)) # %% return {'x': x, 'z': z, 'y': y, 'cost': cost}
from connections import conv2d, linear from datasets import MNIST # %% Setup input to the network and true output label. These are # simply placeholders which we'll fill in later. mnist = MNIST() x = tf.placeholder(tf.float32, [None, 784]) y = tf.placeholder(tf.float32, [None, 10]) x_tensor = tf.reshape(x, [-1, 28, 28, 1]) # %% Define the network: bn1 = batch_norm(-1, name='bn1') bn2 = batch_norm(-1, name='bn2') bn3 = batch_norm(-1, name='bn3') h_1 = lrelu(bn1(conv2d(x_tensor, 32, name='conv1')), name='lrelu1') h_2 = lrelu(bn2(conv2d(h_1, 64, name='conv2')), name='lrelu2') h_3 = lrelu(bn3(conv2d(h_2, 64, name='conv3')), name='lrelu3') h_3_flat = tf.reshape(h_3, [-1, 64 * 4 * 4]) h_4 = linear(h_3_flat, 10) y_pred = tf.nn.softmax(h_4) # %% Define loss/eval/training functions cross_entropy = -tf.reduce_sum(y * tf.log(y_pred)) train_step = tf.train.AdamOptimizer().minimize(cross_entropy) correct_prediction = tf.equal(tf.argmax(y_pred, 1), tf.argmax(y, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, 'float')) # %% We now create a new session to actually perform the initialization the # variables:
def autoencoder(input_shape=[None, 784], n_filters=[1, 10, 10, 10], filter_sizes=[3, 3, 3, 3], corruption=False): """Build a deep denoising autoencoder w/ tied weights. Parameters ---------- input_shape : list, optional Description n_filters : list, optional Description filter_sizes : list, optional Description Returns ------- x : Tensor Input placeholder to the network z : Tensor Inner-most latent representation y : Tensor Output reconstruction of the input cost : Tensor Overall cost to use for training Raises ------ ValueError Description """ # %% # input to the network x = tf.placeholder(tf.float32, input_shape, name='x') # %% # Optionally apply denoising autoencoder if corruption: x_noise = corrupt(x) else: x_noise = x # %% # ensure 2-d is converted to square tensor. if len(x.get_shape()) == 2: x_dim = np.sqrt(x_noise.get_shape().as_list()[1]) if x_dim != int(x_dim): raise ValueError('Unsupported input dimensions') x_dim = int(x_dim) x_tensor = tf.reshape(x_noise, [-1, x_dim, x_dim, n_filters[0]]) elif len(x_noise.get_shape()) == 4: x_tensor = x_noise else: raise ValueError('Unsupported input dimensions') current_input = x_tensor # %% # Build the encoder encoder = [] shapes = [] for layer_i, n_output in enumerate(n_filters[1:]): n_input = current_input.get_shape().as_list()[3] shapes.append(current_input.get_shape().as_list()) W = tf.Variable( tf.random_uniform([ filter_sizes[layer_i], filter_sizes[layer_i], n_input, n_output ], -1.0 / math.sqrt(n_input), 1.0 / math.sqrt(n_input))) b = tf.Variable(tf.zeros([n_output])) encoder.append(W) output = lrelu( tf.add( tf.nn.conv2d(current_input, W, strides=[1, 2, 2, 1], padding='SAME'), b)) current_input = output # %% # store the latent representation z = current_input encoder.reverse() shapes.reverse() # %% # Build the decoder using the same weights for layer_i, shape in enumerate(shapes): W = encoder[layer_i] b = tf.Variable(tf.zeros([W.get_shape().as_list()[2]])) output = lrelu( tf.add( tf.nn.deconv2d( current_input, W, tf.pack([tf.shape(x)[0], shape[1], shape[2], shape[3]]), strides=[1, 2, 2, 1], padding='SAME'), b)) current_input = output # %% # now have the reconstruction through the network y = current_input # cost function measures pixel-wise difference cost = tf.reduce_sum(tf.square(y - x_tensor)) # %% return {'x': x, 'z': z, 'y': y, 'cost': cost}