| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- import numpy as np
- import tensorflow as tf
- import matplotlib.pyplot as plt
- import tmp.vggface16
- def main():
-
- sess = tf.Session()
-
- t_input = tf.placeholder(np.float32, name='input') # define the input tensor
- image_mean = 117.0
- t_preprocessed = tf.expand_dims(t_input-image_mean, 0)
-
- # Build the inference graph
- nodes = tmp.vggface16.load('data/vgg_face.mat', t_preprocessed)
-
- img_noise = np.random.uniform(size=(224,224,3)) + 117.0
- # Picking some internal layer. Note that we use outputs before applying the ReLU nonlinearity
- # to have non-zero gradients for features with negative initial activations.
- layer = 'conv5_3'
- channel = 140 # picking some feature channel to visualize
- img = render_naive(sess, t_input, nodes[layer][:,:,:,channel], img_noise)
- showarray(img)
- def showarray(a):
- a = np.uint8(np.clip(a, 0, 1)*255)
- plt.imshow(a)
- plt.show()
-
- def visstd(a, s=0.1):
- '''Normalize the image range for visualization'''
- return (a-a.mean())/max(a.std(), 1e-4)*s + 0.5
- def render_naive(sess, t_input, t_obj, img0, iter_n=20, step=1.0):
- t_score = tf.reduce_mean(t_obj) # defining the optimization objective
- t_grad = tf.gradients(t_score, t_input)[0] # behold the power of automatic differentiation!
-
- img = img0.copy()
- for _ in range(iter_n):
- g, _ = sess.run([t_grad, t_score], {t_input:img})
- # normalizing the gradient, so the same step size should work
- g /= g.std()+1e-8 # for different layers and networks
- img += g*step
- return visstd(img)
-
- if __name__ == '__main__':
- main()
|