<p>In the link to Ipython notebook Dmitry provided, it says that it does <strong>gradient</strong> <strong>ascent</strong> with <strong>maximizing</strong> L2 normalization. I believe this is what Google means to be enhance the feature from a algorithmic perspective. </p>

<p>If you think about it, it's really the case, minimizing L2 would prevent over-fitting, i.e. make the curve looks smoother. If you do the opposite, you are making the feature more obvious.</p>

<p>Here is a great link to understand <a href="http://www.onmyphd.com/?p=gradient.descent" rel="noreferrer">gradient ascent</a>, though it talks about gradient descent mainly.</p>

<p>I don't know much about implementation details in caffe, since I use theano mostly. Hope it helps!</p>

<p><strong>Update</strong></p>

<p>So I read about the detailed articles [1],[2],[3],[4] today and find out that <a href="http://arxiv.org/pdf/1312.6034v2.pdf" rel="noreferrer">[3]</a> actually talks about the algorithm in details</p>

<blockquote>
  <p>A locally-optimal <em>I</em> can be found by the back-propagation
  method. The procedure is related to the ConvNet training procedure, where the back-propagation is
  used to optimise the layer weights. The difference is that in our case the optimisation is performed
  with respect to the input image, while the weights are fixed to those found during the training stage.
  We initialised the optimisation with the zero image (in our case, the ConvNet was trained on the
  zero-centred image data), and then added the training set mean image to the result.</p>
</blockquote>

<p>Therefore, after training the network on classification, you train it again w.r.t to the input image, using gradient ascent in order to get higher score for the class.</p>
Google Deep Dream art: how to pick a layer in a neural network and enhance it
<p>I am interested in a recent blog post by Google that describes the use of <code>nn</code> to make art. </p>

<p>I am particularly interested in one technique: </p>

<blockquote>
  <p>'In this case we simply feed the network an arbitrary image or photo and let the network analyze the picture. We then pick a layer and ask the network to enhance whatever it detected. Each layer of the network deals with features at a different level of abstraction, so the complexity of features we generate depends on which layer we choose to enhance. For example, lower layers tend to produce strokes or simple ornament-like patterns, because those layers are sensitive to basic features such as edges and their orientations.' </p>
</blockquote>

<p>The post is <a href="http://googleresearch.blogspot.co.uk/2015/06/inceptionism-going-deeper-into-neural.html?m=1" rel="nofollow">http://googleresearch.blogspot.co.uk/2015/06/inceptionism-going-deeper-into-neural.html?m=1</a>. </p>

<p><strong>My question</strong>: the post describes this as a 'simple' case--is there an open-source implementation of a nn that could be used for this purpose in a relatively plug-and-play process? 
For just the technique described, does the network need to be trained? </p>

<p>No doubt for other techniques mentioned in the paper one needs a network already trained on a large number of images, but for the one I've described is there already some kind of open-source network layer visualization package?</p>