{
  "source_file": "0930",
  "source_platform": "技术平台",
  "author": "Distill",
  "title_listed": "Feature Visualization",
  "keywords": "特征可视化,CNN,可解释性",
  "domain": "图像处理",
  "content_type": "图解教程",
  "is_paid_flag": "否",
  "url": "https://distill.pub/2017/feature-visualization/",
  "publish_date": "2017-11",
  "corpus_stage": "预训练/SFT",
  "notes": "CNN特征可视化",
  "id": "5e62c39a7a75",
  "collected_at": "2026-10-02T17:50:34",
  "title": "Feature Visualization",
  "body_markdown": "Distill\nFeature Visualization\nHow neural networks build up their understanding of images\nFeature visualization allows us to see how GoogLeNet\n, trained on the ImageNet\ndataset, builds up its understanding of images over many layers.\n      Visualizations of all channels are available in the\nappendix\n.\nAuthors\nAffiliations\nChris Olah\nGoogle Brain Team\nAlexander Mordvintsev\nGoogle Research\nLudwig Schubert\nGoogle Brain Team\nPublished\nNov. 7, 2017\nDOI\n10.23915/distill.00007\nThere is a growing sense that neural networks need to be interpretable to humans.\n  The field of neural network interpretability has formed in response to these concerns.\n  As it matures, two major threads of research have begun to coalesce: feature visualization and attribution.\nFeature visualization\nanswers questions about what a network — or parts of a network — are looking for by generating examples.\nAttribution\nAs a young field, neural network interpretability does not yet have standardized terminology.\n        Attribution has gone under many different names in the literature — including “feature visualization”! — but recent work seems to prefer terms like “attribution” and “saliency maps”.\nstudies what part of an example is responsible for the network activating a particular way.\nThis article focuses on feature visualization.\n  While feature visualization is a powerful tool, actually getting it to work involves a number of details.\n  In this article, we examine the major issues and explore common approaches to solving them.\n  We find that remarkably simple methods can produce high-quality visualizations. Along the way we introduce a few tricks for exploring variation in what neurons react to, how they interact, and how to improve the optimization process.\nFeature Visualization by Optimization\nNeural networks are, generally speaking, differentiable with respect to their inputs.\n  If we want to find out what kind of input would cause a certain behavior — whether that’s an internal neuron firing or the final output behavior — we can use derivatives to iteratively tweak the input\n  towards that goal\n.\nStarting from random noise, we optimize an image to activate a particular neuron (layer mixed4a, unit 11).\nWhile conceptually simple, there are subtle challenges in getting the optimization to work. We will explore them, as well as common approaches to tackle them in the section ”\nThe Enemy of Feature Visualization\n″.\nOptimization Objectives\nWhat do we want examples of?\n  This is the core question in working with examples, regardless of whether we’re searching through a dataset to find the examples, or optimizing images to create them from scratch.\n  We have a wide variety of options in what we search for:\nDifferent\noptimization objectives\nshow what different parts of a network are looking for.\nn\nlayer index\nx,y\nspatial position\nz\nchannel index\nk\nclass index\nNeuron\nlayer\nn\n[x,y,z]\nChannel\nlayer\nn\n[:,:,z]\nLayer\n/DeepDream\nlayer\nn\n[:,:,:]\n2\nsoftmax\nClass Logits\npre_softmax[k]\nsoftmax\nClass Probability\nsoftmax[k]\nIf we want to understand individual features, we can search for examples where they have high values — either for a\nneuron\nat an individual position, or for an entire\nchannel\n.\n  We used the channel objective to create most of the images in this article.\nIf we want to understand a\nlayer\nas a whole, we can use the DeepDream objective\n, searching for images the layer finds “interesting.”\nAnd if we want to create examples of output classes from a classifier, we have two options — optimizing\nclass logits\nbefore the softmax or optimizing\nclass probabilities\nafter the softmax.\n  One can see the logits as the evidence for each class, and the probabilities as the likelihood of each class given the evidence.\n  Unfortunately, the easiest way to increase the probability softmax gives to a class is often to make the alternatives unlikely rather than to make the class of interest likely\n.\n  From our experience, optimizing pre-softmax logits produces images of better visual quality.\nWhile the standard explanation is that maximizing probability doesn’t work very well because you can just push down evidence for other classes, an alternate hypothesis is that it’s just harder to optimize through the softmax function. We understand this has sometimes been an issue in adversarial examples, and the solution is to optimize the LogSumExp of the logits instead. This is equivalent to optimizing softmax but generally more tractable. Our experience was that the LogSumExp trick doesn’t seem better than dealing with the raw probabilities.\nRegardless of why that happens, it can be fixed by very strong regularization with generative models. In this case the probabilities can be a very principled thing to optimize.\nThe objectives we’ve mentioned only scratch the surface of possible objectives — there are a lot more that one could try.\n  Of particular note are the objectives used in style transfer\n, which can teach us about the kinds of style and content a network understands,\n  and objectives used in optimization-based model inversion\n, which help us understand what information a model keeps and what it throws away.\n  We are only at the beginning of understanding which objectives are interesting, and there is a lot of room for more work in this area.\nWhy visualize by optimization?\nOptimization can give us an example input that causes the desired behavior — but why bother with that?\n  Couldn’t we just look through the dataset for examples that cause the desired behavior?\nIt turns out that optimization approach can be a powerful way to understand what a model is really looking for,\n  because it separates the things causing behavior from things that merely correlate with the causes.\n  For example, consider the following neurons visualized with dataset examples and optimization:\nOptimization also has the advantage of flexibility.\n  For example, if we want to study how neurons jointly represent information,\n  we can easily ask how a particular example would need to be different for an additional neuron to activate.\n  This flexibility can also be helpful in visualizing how features evolve as the network trains.\n  If we were limited to understanding the model on the fixed examples in our dataset, topics like these ones would be much harder to explore.\nOn the other hand, there are also significant challenges to visualizing features with optimization.\n  In the following sections we’ll examine techniques to get diverse visualizations, understand how neurons interact, and avoid high frequency artifacts.\nDiversity\nDo our examples show us the full picture?\n  When we create examples by optimization, this is something we need to be very careful of.\n  It’s entirely possible for genuine examples to still mislead us by only showing us one “facet” of what a feature represents.\nDataset examples have a big advantage here.\n  By looking through our dataset, we can find diverse examples.\n  It doesn’t just give us ones activating a neuron intensely:\n  we can look across a whole spectrum of activations to see what activates the neuron to different extents.\nIn contrast, optimization generally gives us just one extremely positive example — and if we’re creative, a very negative example as well.\n  Is there some way that optimization could also give us this diversity?\nAchieving Diversity with Optimization\nA given feature of a network may respond to a wide range of inputs.\n  On the class level, for example, a classifier that has been trained to recognize dogs should recognize both closeups of their faces as well as wider profile images — even though those have quite different visual appearances.\n  Early work by Wei\net al.\nattempts to demonstrate this “intra-class” diversity by recording activations over the entire training set, clustering them and optimizing for the cluster centroids, revealing the different facets of a class that were learned.\nA different approach by Nguyen, Yosinski, and collaborators was to search through the dataset for diverse examples and use those as starting points for the optimization process\n.\n  The idea is that this initiates optimization in different facets of the feature so that the resulting example from optimization will demonstrate that facet.\n  In more recent work, they combine visualizing classes with a generative model, which they can sample for diverse examples\n.\n  Their first approach had limited success, and while the generative model approach works very well — we’ll discuss it more in the section on regularization under\nlearned priors\n— it can be a bit tricky.\nWe find there’s a very simple way to achieve diversity: adding a “diversity term”\nFor this article we use an approach based on ideas from artistic style transfer. Following that work, we begin by computing the Gram matrix\nG\nG\nG\nof the channels, where\nG\ni\n,\nj\nG_{i,j}\nG\ni\n,\nj\n​\nis a the dot product between the (flattened) response of filter\ni\ni\ni\nand filter\nj\nj\nj\n:\nG\ni\n,\nj\n=\n∑\nx\n,\ny\nlayer\nn\n[x, y, i]\n⋅\nlayer\nn\n[x, y, j]\nG_{i,j} = \\sum_{x,y} \\text{layer}_n\\text{[x, y, i]} \\cdot \\text{layer}_n\\text{[x, y, j]}\nG\ni\n,\nj\n​\n=\nx\n,\ny\n∑\n​\nlayer\nn\n​\n[x, y, i]\n⋅\nlayer\nn\n​\n[x, y, j]\nFrom this, we compute the diversity term: the negative pairwise cosine similarity of pairs of visualizations.\nC\ndiversity\n=\n−\n∑\na\n∑\nb\n≠\na\nvec\n(\nG\na\n)\n⋅\nvec\n(\nG\nb\n)\n∣\n∣\nvec\n(\nG\na\n)\n∣\n∣\n∣\n∣\nvec\n(\nG\nb\n)\n∣\n∣\nC_{\\text{diversity}} = - \\sum_{a} \\sum_{b\\neq a} ~ \\frac{\\text{vec}(G_a) \\cdot \\text{vec}(G_b)}{||\\text{vec}(G_a)||~||\\text{vec}(G_b)||}\nC\ndiversity\n​\n=\n−\na\n∑\n​\nb\n≠\na\n∑\n​\n∣\n∣\nvec\n(\nG\na\n​\n)\n∣\n∣\n∣\n∣\nvec\n(\nG\nb\n​\n)\n∣\n∣\nvec\n(\nG\na\n​\n)\n⋅\nvec\n(\nG\nb\n​\n)\n​\nWe then maximize the diversity term jointly with the regular optimization objective.\nto one’s objective that pushes multiple examples to be different from each other.\n  The diversity term can take a variety of forms, and we don’t have much understanding of their benefits yet.\n  One possibility is to penalize the cosine similarity of different examples.\n  Another is to use ideas from style transfer\nto force the feature to be displayed in different styles.\nIn lower level neurons, a diversity term can reveal the different facets a feature represents:\nSimple Optimization\nOptimization with diversity reveals four different, curvy facets.\nLayer mixed4a, Unit 97\nDataset examples\nDiverse feature visualizations allow us to more closely pinpoint what activates a neuron, to the degree that we can make, and — by looking at dataset examples —\ncheck\npredictions about what inputs will activate the neuron.\nFor example, let’s examine this simple optimization result.\nSimple optimization\nLooking at it in isolation one might infer that this neuron activates on the top of dog heads, as the optimization shows both eyes and only downward curved edges.\n  Looking at the optimization with diversity however, we see optimization results which don’t include eyes, and also one which includes upward curved edges. We thus have to broaden our expectation of what this neuron activates on to be mostly about the fur texture. Checking this hypothesis against dataset examples shows that is broadly correct. Note the spoon with a texture and color similar enough to dog fur for the neuron to activate.\nOptimization with diversity.\nLayer mixed4a, Unit 143\nDataset examples\nThe effect of diversity can be even more striking in higher level neurons, where it can show us different types of objects that stimulate a neuron.\n  For example, one neuron responds to different kinds of balls, even though they have a variety of appearances.\nSimple Optimization\nOptimization with diversity reveals multiple types of balls.\nLayer mixed5a, Unit 9\nDataset examples\nThis simpler approach has a number of shortcomings:\n  For one, the pressure to make examples different can cause unrelated artifacts (such as eyes) to appear.\n  Additionally, the optimization may make examples be different in an unnatural way.\n  For example, in the above example one might want to see examples of soccer balls clearly separated from other types of balls like golf or tennis balls.\n  Dataset based approaches such as Wei\net al.\ncan split features apart more naturally — however they may not be as helpful in understanding how the model will behave on different data.\nDiversity also starts to brush on a more fundamental issue: while the examples above represent a mostly coherent idea, there are also neurons that represent strange mixtures of ideas.\n  Below, a neuron responds to two types of animal faces, and also to car bodies.\nSimple Optimization\nOptimization with diversity show cats, foxes, but also cars.\nLayer mixed4e, Unit 55\nDataset examples\nExamples like these suggest that neurons are not necessarily the right semantic units for understanding neural nets.\nInteraction between Neurons\nIf neurons are not the right way to understand neural nets, what is?\n  In real life, combinations of neurons work together to represent images in neural networks.\n  A helpful way to think about these combinations is geometrically: let’s define\nactivation space\nto be all possible combinations of neuron activations.\n  We can then think of individual neuron activations as the\nbasis vectors\nof this activation space. Conversely, a combination of neuron activations is then just a vector in this space.\nThis framing unifies the concepts “neurons” and “combinations of neurons” as “vectors in activation space”. It allows us to ask: Should we expect the directions of the basis vectors to be any more interpretable than the directions of other vectors in this space?\nSzegedy\net al.\nfound that random directions seem just as meaningful as the directions of the basis vectors.\n  More recently Bau, Zhou\net al.\nfound the directions of the basis vectors to be interpretable more often than random directions.\n  Our experience is broadly consistent with both results; we find that random directions often seem interpretable, but at a lower rate than basis directions.\nDataset examples and optimized examples of\nrandom directions\nin activation space. The directions shown here were hand-picked for interpretability.\nWe can also define interesting directions in activation space by doing arithmetic on neurons.\n  For example, if we add a “black and white” neuron to a “mosaic” neuron, we obtain a black and white version of the mosaic.\n  This is reminiscent of semantic arithmetic of word embeddings as seen in Word2Vec or generative models’ latent spaces.\nBy jointly optimizing two neurons we can get a sense of how they interact.\nThese examples show us how neurons jointly represent images.\n  To better understand how neurons interact, we can also interpolate between them.\nThe optimization objective is a linear interpolation between the individual channel objectives. To get the interpolations to look better, we also add a small alignment objective that encourages lower layer activations to be similar. We additionally use a combination of separate and shared image parameterizations to make it easier for the optimization algorithm to cause objects to line up, while still giving it the freedom to create any image it needs to.\nThis is similar to interpolating in the latent space of generative models.\nThis is only starting to scratch the surface of how neurons interact.\n  The truth is that we have almost no clue how to select meaningful directions, or whether there even exist particularly meaningful directions.\n  Independent of finding directions, there are also questions on how directions interact — for example, interpolation can show us how a small number of directions interact, but in reality there are hundreds of directions interacting.\nThe Enemy of Feature Visualization\nIf you want to visualize features, you might just optimize an image to make neurons fire.\n  Unfortunately, this doesn’t really work.\n  Instead, you end up with a kind of neural network optical illusion — an image full of noise and nonsensical high-frequency patterns that the network responds strongly to.\nEven if you carefully tune learning rate, you’ll get noise.\nOptimization results are enlarged to show detail and artifacts.\nThese patterns seem to be the images kind of cheating, finding ways to activate neurons that don’t occur in real life.\n  If you optimize long enough, you’ll tend to see some of what the neuron genuinely detects as well,\n  but the image is dominated by these high frequency patterns.\n  These patterns seem to be closely related to the phenomenon of adversarial examples\n.\nWe don’t fully understand why these high frequency patterns form,\n  but an important part seems to be strided convolutions and pooling operations, which create high-frequency patterns in the gradient\n.\nEach\nstrided convolution or pooling\ncreates checkerboard patterns in the gradient magnitudes when we backprop through it.\nThese high-frequency patterns show us that, while optimization based visualization’s freedom from constraints is appealing, it’s a double-edged sword.\n  Without any constraints on images, we end up with adversarial examples.\n  These are certainly interesting, but if we want to understand how these models work in real life, we need to somehow move past them…\nThe Spectrum of Regularization\nDealing with this high frequency noise has been one of the primary challenges and overarching threads of feature visualization research.\n  If you want to get useful visualizations, you need to impose a more natural structure using some kind of prior, regularizer, or constraint.\nIn fact, if you look at most notable papers on feature visualization, one of their main points will usually be an approach to regularization.\n  Researchers have tried a lot of different things!\nWe can think of all of these approaches as living on a spectrum, based on how strongly they regularize the model.\n  On one extreme, if we don’t regularize at all, we end up with adversarial examples.\n  On the opposite end, we search over examples in our dataset and run into all the limitations we discussed earlier.\n  In the middle we have three main families of regularization options.\nWeak Regularization\navoids misleading correlations, but is less connected to real use.\nUnregularized\nFrequency\nPenalization\nTransformation\nRobustness\nStrong Regularization\ngives more realistic examples at risk of misleading correlations.\nLearned\nPrior\nDataset\nExamples\nErhan,\net al.\n, 2009\nIntroduced core idea. Minimal regularization.\nSzegedy,\net al.\n, 2013\nAdversarial examples. Visualizes with dataset examples.\nMahendran & Vedaldi, 2015\nIntroduces total variation regularizer. Reconstructs input from representation.\nNguyen,\net al.\n, 2015\nExplores counterexamples. Introduces image blurring.\nMordvintsev,\net al.\n, 2015\nIntroduced jitter & multi-scale. Explored GMM priors for classes.\nØygard,\net al.\n, 2015\nIntroduces gradient blurring.\n(Also uses jitter.)\nTyka,\net al.\n, 2016\nRegularizes with bilateral filters.\n(Also uses jitter.)\nMordvintsev,\net al.\n, 2016\nNormalizes gradient frequencies.\n(Also uses jitter.)\nNguyen,\net al.\n, 2016\nParamaterizes images with GAN generator.\nNguyen,\net al.\n, 2016\nUses denoising autoencoder prior to make a generative model.\nThree Families of Regularization\nLet’s consider these three intermediate categories of regularization in more depth.\nFrequency penalization\ndirectly targets the high frequency noise these methods suffer from.\n  It may explicitly penalize variance between neighboring pixels (total variation)\n, or implicitly penalize high-frequency noise by blurring the image each optimization step\n.\nIf we think about blurring in Fourier space, it is equivalent to adding a scaled L2 penalty to the objective, penalizing each Fourier-component based on its frequency.\nUnfortunately, these approaches also discourage legitimate high-frequency features like edges along with noise.\n  This can be slightly improved by using a bilateral filter, which preserves edges, instead of blurring\n.\n(Some work uses similar techniques to reduce high frequencies in the gradient before they accumulate in the visualization\n.\n  These techniques are in some ways very similar to the above and in some ways radically different — we’ll examine them in the next section,\nPreconditioning and Parameterization\n.)\nFrequency penalization directly targets high frequency noise\nTransformation robustness\ntries to find examples that still activate the optimization target highly even if we slightly transform them.\n  Even a small amount seems to be very effective in the case of images\n,\n  especially when combined with a more general regularizer for high-frequencies\n.\n  Concretely, this means that we stochastically jitter, rotate or scale the image before applying the optimization step.\nStochastically transforming the image before applying the optimization step suppresses noise\nLearned priors.\nOur previous regularizers use very simple heuristics to keep examples reasonable.\n  A natural next step is to actually learn a model of the real data and try to enforce that.\n  With a strong model, this becomes similar to searching over the dataset.\n  This approach produces the most photorealistic visualizations, but it may be unclear what came from the model being visualized and what came from the prior.\nOne approach is to learn a generator that maps points in a latent space to examples of your data,\n  such as a GAN or VAE,\n  and optimize within that latent space\n.\n  An alternative approach is to learn a prior that gives you access to the gradient of probability;\n  this allows you to jointly optimize for the prior along with your objective\n.\n  When one optimizes for the prior and the probability of a class, one recovers a generative model of the data conditioned on that particular class.\n  Finally, Wei\net al.\napproximate a generative model prior, at least for the color distribution, by penalizing distance between patches of the output and the nearest patches retrieved from a database of image patches collected from the training data.\nPreconditioning and Parameterization\nIn the previous section, we saw a few methods\nthat reduced high frequencies\nin the gradient\nrather than the visualization itself.\n  It’s not clear this is really a regularizer:\n  it resists high frequencies, but still allows them to form when the gradient consistently pushes for it.\n  If it isn’t a regularizer, what does transforming the gradient like this do?\nTransforming the gradient like this is actually quite a powerful tool — it’s called “preconditioning” in optimization.\n  You can think of it as doing steepest descent to optimize the same objective,\n  but in another parameterization of the space or under a different notion of distance.\nGradient blurring\nis equivalent to gradient descent in a different parameterization of image space, where high frequency dimensions are stretched to make moving in those directions slower. Gradient Laplacian Pyramid normalization\nis a kind of adaptive learning rate approach in the same space.\nThis changes which direction of descent will be steepest, and how fast the optimization moves in each direction, but it does not change what the minimums are.\n  If there are many local minima, it can stretch and shrink their basins of attraction, changing which ones the optimization process falls into.\n  As a result, using the right preconditioner can make an optimization problem radically easier.\nHow can we choose a preconditioner that will give us these benefits?\n  A good first guess is one that makes your data decorrelated and whitened.\n  In the case of images this means doing gradient descent in the Fourier basis,\nThis points to a profound fact about the Fourier transform.\n    As long as a correlation is consistent across spatial positions — such as the correlation between a pixel and its left neighbor being the same across all positions of an image — the Fourier coefficients will be independent variables.\n    To see this, note that such a spatially consistent correlation can be expressed as a convolution, and by the convolution theorem becomes pointwise multiplication after the Fourier transform.\nwith frequencies scaled so that they all have equal energy.\nNote that we have to be careful to get the colors to be decorrelated, too. The Fourier transforms decorrelates spatially, but a correlation will still exist between colors.\n      To address this, we explicitly measure the correlation between colors in the training set and use a Cholesky decomposition to decorrelate them. Compare the directions of steepest decent before and after decorrelating colors:\nCorrelated Colors\nDecorrelated Colors\nLet’s see how using different measures of distance changes the direction of steepest descent.\n  The regular L\n2\ngradient can be quite different from the directions of steepest descent in the L\n∞\nmetric or in the decorrelated space:\nThree directions of steepest descent under different notions of distance\nAll of these directions are valid descent directions for the same objective,\n  but we can see they’re radically different.\n  Notice that optimizing in the decorrelated space reduces high frequencies,\n  while using L\n∞\nincreases them.\nUsing the decorrelated descent direction results in quite different visualizations.\n  It’s hard to do really fair comparisons because of hyperparameters, but the\n  resulting visualizations seem a lot better — and develop faster, too.\nCombining the preconditioning and transformation robustness improves quality even further\n(Unless otherwise noted, the images in this article were optimizing in the decorrelated space and a suite of transformation robustness techniques.\nImages were optimized for 2560 steps in a color-decorrelated fourier-transformed space, using Adam at a learning rate of 0.05.\n    We used each of following transformations in the given order at each step of the optimization:\n• Padding the input by 16 pixels to avoid edge artifacts\n• Jittering by up to 16 pixels\n• Scaling by a factor randomly selected from this list: 1, 0.975, 1.025, 0.95, 1.05\n• Rotating by an angle randomly selected from this list; in degrees: -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5\n• Jittering a second time by up to 8 pixels\n• Cropping the padding\n)\nIs the preconditioner merely accelerating descent, bringing us to the same place\n  normal gradient descent would have brought us if we were patient enough?\n  Or is it also regularizing, changing which local minima we get attracted to?\n  It’s hard to tell for sure.\n  On the one hand, gradient descent seems to continue improving as you exponentially increase the number of optimization steps — it hasn’t converged, it’s just moving very slowly.\n  On the other hand, if you turn off all other regularizers, the preconditioner seems to reduce high-frequency patterns.\nConclusion\nNeural feature visualization has made great progress over the last few years.\n  As a community, we’ve developed principled ways to create compelling visualizations.\n  We’ve mapped out a number of important challenges and found ways of addressing them.\nIn the quest to make neural networks interpretable, feature visualization\n  stands out as one of the most promising and developed research directions.\n  By itself, feature visualization will never give a completely satisfactory\n  understanding. We see it as one of the fundamental building blocks that,\n  combined with additional tools, will empower humans to understand these systems.\nThere remains still a lot of important work to be done in improving feature visualization.\n  Some issues that stand out include understanding neuron interaction, finding which units are most meaningful for understanding neural net activations, and giving a holistic view of the facets of a feature.\nAdditional Resources\nAppendix:\nGoogLeNet Visualizations\nVisualizations of every channel in GoogLeNet\nCode:\ntensorflow/lucid\nOpen-source implementation of our techniques\nFollow-up:\nThe Building Blocks of Interpretability\nExploration of how feature visualization and other techniques can be combined.\nAcknowledgments\nWe are extremely grateful to Shan Carter and Ian Goodfellow.\n    Shan gave thoughtful feedback, especially on the design of the article.\n    Ian generously stepped in to handle the review process of this article — we would not have been able to publish it without him.\nWe’re also grateful for the comments, thoughts and support of\n    Arvind Satyanarayan, Ian Johnson,\n    Greg Corrado, Blaise Aguera y Arcas,\n    Katherine Ye, Michael Nielsen, Emma Pierson, Dario Amodei,\n    Mike Tyka,\n    Andrea Vedaldi, Ruth Fong, Jason Freidenfelds,\n    Geoffrey Hinton,\n    Timon Ruban,\n    Been Kim, Martin Wattenberg, and Fernanda Viegas.\nThis work was made possible by many open source tools, for which we are grateful.\n    In particular, all of our experiments were based on Tensorflow\n.\nAuthor Contributions\nWriting, Exposition, and Diagram Contributions.\nChris drafted most of the text of the article and made the original version of most interactive diagrams. Ludwig made the neuron addition, dataset examples, and interpolation diagrams, as well as refined the others. Ludwig also created the appendix that visualizes all of GoogLeNet.\nResearch Contributions.\nThe biggest technical contribution of this work is likely the section on preconditioning. Alex discovered in prior work that normalizing gradient frequencies had a radical effect on visualizing neurons. Chris reframed this as adaptive gradient descent in a different basis. Together, they iterated on a number of ways of parameterizing images. Similarly, Alex originally introduced the use of diversity term, and Chris reﬁned using it. Chris did the exploration of interpolating between neurons.\nInfrastructure Contributions.\nAll experiments are based on code written by Alex, some of which was\npublished previously\n. Alex, Chris and Ludwig all contributed significantly to refining this into the present library,\nLucid\n. Alex and Chris introduced particularly important abstractions.\nDiscussion and Review\nReview 1 - Anonymous\nReview 2 - Anonymous\nReview 3 - Anonymous\nReferences\nGoing deeper with convolutions\n[PDF]\nSzegedy, C., Liu, W., Jia, Y., Sermanet, P., Reed, S., Anguelov, D., Erhan, D., Vanhoucke, V. and Rabinovich, A., 2015. Proceedings of the IEEE conference on computer vision and pattern recognition, pp. 1--9.\nImagenet: A large-scale hierarchical image database\n[PDF]\nDeng, J., Dong, W., Socher, R., Li, L., Li, K. and Fei-Fei, L., 2009. Computer Vision and Pattern Recognition, 2009. CVPR 2009. IEEE Conference on, pp. 248--255.\nDOI: 10.1109/cvprw.2009.5206848\nVisualizing higher-layer features of a deep network\n[PDF]\nErhan, D., Bengio, Y., Courville, A. and Vincent, P., 2009. University of Montreal, Vol 1341, pp. 3.\nInceptionism: Going deeper into neural networks\n[HTML]\nMordvintsev, A., Olah, C. and Tyka, M., 2015. Google Research Blog.\nDeep inside convolutional networks: Visualising image classification models and saliency maps\n[PDF]\nSimonyan, K., Vedaldi, A. and Zisserman, A., 2013. arXiv preprint arXiv:1312.6034.\nA neural algorithm of artistic style\n[PDF]\nGatys, L.A., Ecker, A.S. and Bethge, M., 2015. arXiv preprint arXiv:1508.06576.\nUnderstanding deep image representations by inverting them\n[PDF]\nMahendran, A. and Vedaldi, A., 2015. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pp. 5188--5196.\nDOI: 10.1109/cvpr.2015.7299155\nUnderstanding Intra-Class Knowledge Inside {CNN}\n[PDF]\nWei, D., Zhou, B., Torralba, A. and Freeman, W.T., 2015. CoRR, Vol abs/1507.02379.\nMultifaceted feature visualization: Uncovering the different types of features learned by each neuron in deep neural networks\n[PDF]\nNguyen, A., Yosinski, J. and Clune, J., 2016. arXiv preprint arXiv:1602.03616.\nPlug & play generative networks: Conditional iterative generation of images in latent space\n[PDF]\nNguyen, A., Yosinski, J., Bengio, Y., Dosovitskiy, A. and Clune, J., 2016. arXiv preprint arXiv:1612.00005.\nIntriguing properties of neural networks\n[PDF]\nSzegedy, C., Zaremba, W., Sutskever, I., Bruna, J., Erhan, D., Goodfellow, I. and Fergus, R., 2013. arXiv preprint arXiv:1312.6199.\nNetwork Dissection: Quantifying Interpretability of Deep Visual Representations\n[PDF]\nBau, D., Zhou, B., Khosla, A., Oliva, A. and Torralba, A., 2017. Computer Vision and Pattern Recognition.\nDeconvolution and checkerboard artifacts\n[link]\nOdena, A., Dumoulin, V. and Olah, C., 2016. Distill, Vol 1(10), pp. e3.\nDOI: distill.00003\nDeep neural networks are easily fooled: High confidence predictions for unrecognizable images\n[PDF]\nNguyen, A., Yosinski, J. and Clune, J., 2015. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pp. 427--436.\nDOI: 10.1109/cvpr.2015.7298640\nVisualizing GoogLeNet Classes\n[link]\nØygard, A., 2015.\nClass visualization with bilateral filters\n[HTML]\nTyka, M., 2016.\nDeepDreaming with TensorFlow\n[link]\nMordvintsev, A., 2016.\nSynthesizing the preferred inputs for neurons in neural networks via deep generator networks\n[PDF]\nNguyen, A., Dosovitskiy, A., Yosinski, J., Brox, T. and Clune, J., 2016. Advances in Neural Information Processing Systems, pp. 3387--3395.\nTensorflow: Large-scale machine learning on heterogeneous distributed systems\n[PDF]\nAbadi, M., Agarwal, A., Barham, P., Brevdo, E., Chen, Z., Citro, C., Corrado, G.S., Davis, A., Dean, J., Devin, M., Ghemawat, S., Goodfellow, I.J., Harp, A., Irving, G., Isard, M., Jia, Y., J{\\'{o}}zefowicz, R., Kaiser, L., Kudlur, M., Levenberg, J., Man{\\'{e}}, D., Monga, R., Moore, S., Murray, D.G., Olah, C., Schuster, M., Shlens, J., Steiner, B., Sutskever, I., Talwar, K., Tucker, P.A., Vanhoucke, V., Vasudevan, V., Vi{\\'{e}}gas, F.B., Vinyals, O., Warden, P., Wattenberg, M., Wicke, M., Yu, Y. and Zheng, X., 2016. arXiv preprint arXiv:1603.04467.\nUpdates and Corrections\nIf you see mistakes or want to suggest changes, please\ncreate an issue on GitHub\n.\nReuse\nDiagrams and text are licensed under Creative Commons Attribution\nCC-BY 4.0\nwith the\nsource available on GitHub\n, unless noted otherwise. The figures that have been reused from other sources don’t fall under this license and can be recognized by a note in their caption: “Figure from …”.\nCitation\nFor attribution in academic contexts, please cite this work as\nOlah, et al., \"Feature Visualization\", Distill, 2017.\nBibTeX citation\n@article{olah2017feature,\n  author = {Olah, Chris and Mordvintsev, Alexander and Schubert, Ludwig},\n  title = {Feature Visualization},\n  journal = {Distill},\n  year = {2017},\n  note = {https://distill.pub/2017/feature-visualization},\n  doi = {10.23915/distill.00007}\n}\nDistill\nis dedicated to clear explanations of machine learning\nAbout\nSubmit\nPrize\nArchive\nRSS\nGitHub\nTwitter\nISSN 2476-0757",
  "metadata": {
    "title": "Feature Visualization",
    "description": null,
    "keywords": null,
    "author": null,
    "og:type": "article",
    "og:title": "Feature Visualization",
    "og:description": "How neural networks build up their understanding of images",
    "og:url": "https://distill.pub/2017/feature-visualization",
    "og:image": "https://distill.pub/2017/feature-visualization/thumbnail.jpg",
    "og:locale": "en_US",
    "og:site_name": "Distill",
    "twitter:card": "summary_large_image",
    "twitter:title": "Feature Visualization",
    "twitter:description": "How neural networks build up their understanding of images",
    "twitter:url": "https://distill.pub/2017/feature-visualization",
    "twitter:image": "https://distill.pub/2017/feature-visualization/thumbnail.jpg",
    "twitter:image:width": "560",
    "twitter:image:height": "295",
    "article:published": "2017-11-07",
    "article:created": "2017-11-07",
    "article:modified": "2019-08-28T00:26:22.000Z",
    "article:author": "Ludwig Schubert"
  },
  "paywall": {
    "listed_paid": false,
    "detected": false,
    "marker": "",
    "public_only": false,
    "policy": "付费/会员内容只保留页面公开可见部分，不绕过付费墙"
  },
  "crawl": {
    "success": true,
    "status_code": 200,
    "error": ""
  },
  "code_blocks": [
    {
      "file": "attachments/5e62c39a7a75/code/body-000.txt",
      "chars": 53,
      "language": "text"
    },
    {
      "file": "attachments/5e62c39a7a75/code/body-001.txt",
      "chars": 268,
      "language": "text"
    }
  ],
  "images": [
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/objectives/neuron.png",
      "bytes": 46552,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-8566481fb0af4c86ef8a.png",
      "src": "https://distill.pub/2017/feature-visualization/images/objectives/neuron.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/objectives/channel.png",
      "bytes": 57226,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-f815e5d44fcfd82cc503.png",
      "src": "https://distill.pub/2017/feature-visualization/images/objectives/channel.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/attribution-1.png",
      "bytes": 337389,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-bcdfafb68609e3ec08fd.png",
      "src": "https://distill.pub/2017/feature-visualization/images/attribution-1.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/attribution-2.jpg",
      "bytes": 4791,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-4f5cbb22a5ed98a1dbd4.jpg",
      "src": "https://distill.pub/2017/feature-visualization/images/attribution-2.jpg",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/objectives/layer.png",
      "bytes": 55485,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-f0915acaf96b33b7bb5b.png",
      "src": "https://distill.pub/2017/feature-visualization/images/objectives/layer.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/objectives/logits.png",
      "bytes": 66592,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-1336e23ebc5dee833cc8.png",
      "src": "https://distill.pub/2017/feature-visualization/images/objectives/logits.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/objectives/logits_post.png",
      "bytes": 60357,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-9267a8160410a679b535.png",
      "src": "https://distill.pub/2017/feature-visualization/images/objectives/logits_post.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/diversity/mixed4a_97_optimized.png",
      "bytes": 66515,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-ce2cb49e6397b0dfc1c8.png",
      "src": "https://distill.pub/2017/feature-visualization/images/diversity/mixed4a_97_optimized.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/diversity/mixed4a_97_diversity.png",
      "bytes": 335039,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-ceadb5331591a2759c79.png",
      "src": "https://distill.pub/2017/feature-visualization/images/diversity/mixed4a_97_diversity.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/diversity/mixed4a_97_examples.jpg",
      "bytes": 20417,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-99b2e7ef3ac34c2214ba.jpg",
      "src": "https://distill.pub/2017/feature-visualization/images/diversity/mixed4a_97_examples.jpg",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/diversity/mixed4a_143_optimized.png",
      "bytes": 64129,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-2d8c9495e2b0f9e6d8db.png",
      "src": "https://distill.pub/2017/feature-visualization/images/diversity/mixed4a_143_optimized.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/diversity/mixed4a_143_diversity.png",
      "bytes": 315938,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-53c542a91acf61cb58b7.png",
      "src": "https://distill.pub/2017/feature-visualization/images/diversity/mixed4a_143_diversity.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/diversity/mixed4a_143_examples.jpg",
      "bytes": 50172,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-ed0eeea07f875168feea.jpg",
      "src": "https://distill.pub/2017/feature-visualization/images/diversity/mixed4a_143_examples.jpg",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/diversity/mixed5a_9_optimized.png",
      "bytes": 65582,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-8793ee2884066ad0c7fb.png",
      "src": "https://distill.pub/2017/feature-visualization/images/diversity/mixed5a_9_optimized.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/diversity/mixed5a_9_diversity.png",
      "bytes": 328112,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-a1149ddfd66e61356411.png",
      "src": "https://distill.pub/2017/feature-visualization/images/diversity/mixed5a_9_diversity.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/diversity/mixed5a_9_examples.jpg",
      "bytes": 35571,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-2a338e89da5ba32376f6.jpg",
      "src": "https://distill.pub/2017/feature-visualization/images/diversity/mixed5a_9_examples.jpg",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/diversity/mixed4e_55_optimized.png",
      "bytes": 66339,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-59d5716861b6e54a6fe5.png",
      "src": "https://distill.pub/2017/feature-visualization/images/diversity/mixed4e_55_optimized.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/diversity/mixed4e_55_diversity.png",
      "bytes": 331250,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-21b1bc722490f52ec867.png",
      "src": "https://distill.pub/2017/feature-visualization/images/diversity/mixed4e_55_diversity.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/diversity/mixed4e_55_examples.jpg",
      "bytes": 39858,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-7cd3a78dc795ddffda12.jpg",
      "src": "https://distill.pub/2017/feature-visualization/images/diversity/mixed4e_55_examples.jpg",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/prior_vis_icons/Erhan2009.png",
      "bytes": 11864,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-ff9f7f237941390c7644.png",
      "src": "https://distill.pub/2017/feature-visualization/images/prior_vis_icons/Erhan2009.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/prior_vis_icons/Szegedy2013.png",
      "bytes": 138956,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-1b3d1328bbfa6d41a361.png",
      "src": "https://distill.pub/2017/feature-visualization/images/prior_vis_icons/Szegedy2013.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/prior_vis_icons/Mahendran2015.png",
      "bytes": 187950,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-9397ac7b8fe1cc5a1d37.png",
      "src": "https://distill.pub/2017/feature-visualization/images/prior_vis_icons/Mahendran2015.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/prior_vis_icons/Nguyen2015.png",
      "bytes": 102670,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-336335f98c27771c1b88.png",
      "src": "https://distill.pub/2017/feature-visualization/images/prior_vis_icons/Nguyen2015.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/prior_vis_icons/Mordvintsev2015.png",
      "bytes": 118270,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-8eacf0d4cb294d09c7d6.png",
      "src": "https://distill.pub/2017/feature-visualization/images/prior_vis_icons/Mordvintsev2015.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/prior_vis_icons/Oygard2015.png",
      "bytes": 310319,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-ec5cdbdacbc065985845.png",
      "src": "https://distill.pub/2017/feature-visualization/images/prior_vis_icons/Oygard2015.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/prior_vis_icons/Tyka2016.png",
      "bytes": 556864,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-855ff8cf985d64a3be5d.png",
      "src": "https://distill.pub/2017/feature-visualization/images/prior_vis_icons/Tyka2016.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/prior_vis_icons/Mordvintsev2016.png",
      "bytes": 119841,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-bc201d90fb5dfc575a72.png",
      "src": "https://distill.pub/2017/feature-visualization/images/prior_vis_icons/Mordvintsev2016.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/prior_vis_icons/Nguyen2016a.png",
      "bytes": 177015,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-33c8a918be10289d5f40.png",
      "src": "https://distill.pub/2017/feature-visualization/images/prior_vis_icons/Nguyen2016a.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/prior_vis_icons/Nguyen2016b.png",
      "bytes": 107884,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-7e4886c44e29c8de2ba5.png",
      "src": "https://distill.pub/2017/feature-visualization/images/prior_vis_icons/Nguyen2016b.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/correlated_colors.jpeg",
      "bytes": 4066,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-ded6465c58917d2a24d6.jpeg",
      "src": "https://distill.pub/2017/feature-visualization/images/correlated_colors.jpeg",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://distill.pub/2017/feature-visualization/images/decorrelated_colors.jpeg",
      "bytes": 5684,
      "reused": false,
      "local_path": "attachments/5e62c39a7a75/images/body-23ba19851e5172607a63.jpeg",
      "src": "https://distill.pub/2017/feature-visualization/images/decorrelated_colors.jpeg",
      "alt": "",
      "downloaded": true
    }
  ],
  "audio": [],
  "videos": [],
  "links": [
    {
      "href": "https://distill.pub/",
      "label": "Distill",
      "type": "a"
    },
    {
      "href": "https://distill.pub/2017/feature-visualization/appendix/",
      "label": "appendix",
      "type": "a"
    },
    {
      "href": "https://colah.github.io/",
      "label": "Chris Olah",
      "type": "a"
    },
    {
      "href": "https://g.co/brain",
      "label": "Google Brain Team",
      "type": "a"
    },
    {
      "href": "https://znah.net/",
      "label": "Alexander Mordvintsev",
      "type": "a"
    },
    {
      "href": "https://research.google.com/",
      "label": "Google Research",
      "type": "a"
    },
    {
      "href": "https://schubert.io/",
      "label": "Ludwig Schubert",
      "type": "a"
    },
    {
      "href": "https://doi.org/10.23915/distill.00007",
      "label": "10.23915/distill.00007",
      "type": "a"
    },
    {
      "href": "https://github.com/tensorflow/lucid",
      "label": "Code: tensorflow/lucid",
      "type": "a"
    },
    {
      "href": "https://distill.pub/2018/building-blocks/",
      "label": "Follow-up: The Building Blocks of Interpretability",
      "type": "a"
    },
    {
      "href": "https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/deepdream/deepdream.ipynb",
      "label": "published previously",
      "type": "a"
    },
    {
      "href": "https://github.com/distillpub/post--feature-visualization/issues/1",
      "label": "Review 1 - Anonymous",
      "type": "a"
    },
    {
      "href": "https://github.com/distillpub/post--feature-visualization/issues/4",
      "label": "Review 2 - Anonymous",
      "type": "a"
    },
    {
      "href": "https://github.com/distillpub/post--feature-visualization/issues/6",
      "label": "Review 3 - Anonymous",
      "type": "a"
    },
    {
      "href": "https://arxiv.org/pdf/1409.4842.pdf",
      "label": "[PDF]",
      "type": "a"
    },
    {
      "href": "http://www.image-net.org/papers/imagenet_cvpr09.pdf",
      "label": "[PDF]",
      "type": "a"
    },
    {
      "href": "https://doi.org/10.1109/cvprw.2009.5206848",
      "label": "DOI: 10.1109/cvprw.2009.5206848",
      "type": "a"
    },
    {
      "href": "https://www.researchgate.net/profile/Aaron_Courville/publication/265022827_Visualizing_Higher-Layer_Features_of_a_Deep_Network/links/53ff82b00cf24c81027da530.pdf",
      "label": "[PDF]",
      "type": "a"
    },
    {
      "href": "https://research.googleblog.com/2015/06/inceptionism-going-deeper-into-neural.html",
      "label": "[HTML]",
      "type": "a"
    },
    {
      "href": "https://arxiv.org/pdf/1312.6034.pdf",
      "label": "[PDF]",
      "type": "a"
    },
    {
      "href": "https://arxiv.org/pdf/1508.06576.pdf",
      "label": "[PDF]",
      "type": "a"
    },
    {
      "href": "https://arxiv.org/pdf/1412.0035v1.pdf",
      "label": "[PDF]",
      "type": "a"
    },
    {
      "href": "https://doi.org/10.1109/cvpr.2015.7299155",
      "label": "DOI: 10.1109/cvpr.2015.7299155",
      "type": "a"
    },
    {
      "href": "http://arxiv.org/pdf/1507.02379.pdf",
      "label": "[PDF]",
      "type": "a"
    },
    {
      "href": "https://arxiv.org/pdf/1602.03616.pdf",
      "label": "[PDF]",
      "type": "a"
    },
    {
      "href": "https://arxiv.org/pdf/1612.00005.pdf",
      "label": "[PDF]",
      "type": "a"
    },
    {
      "href": "https://arxiv.org/pdf/1312.6199.pdf",
      "label": "[PDF]",
      "type": "a"
    },
    {
      "href": "https://arxiv.org/pdf/1704.05796.pdf",
      "label": "[PDF]",
      "type": "a"
    },
    {
      "href": "http://distill.pub/2016/deconv-checkerboard/",
      "label": "[link]",
      "type": "a"
    },
    {
      "href": "https://doi.org/distill.00003",
      "label": "DOI: distill.00003",
      "type": "a"
    },
    {
      "href": "https://arxiv.org/pdf/1412.1897.pdf",
      "label": "[PDF]",
      "type": "a"
    },
    {
      "href": "https://doi.org/10.1109/cvpr.2015.7298640",
      "label": "DOI: 10.1109/cvpr.2015.7298640",
      "type": "a"
    },
    {
      "href": "https://www.auduno.com/2015/07/29/visualizing-googlenet-classes/",
      "label": "[link]",
      "type": "a"
    },
    {
      "href": "https://mtyka.github.io/deepdream/2016/02/05/bilateral-class-vis.html",
      "label": "[HTML]",
      "type": "a"
    },
    {
      "href": "https://arxiv.org/pdf/1605.09304.pdf",
      "label": "[PDF]",
      "type": "a"
    },
    {
      "href": "https://arxiv.org/pdf/1603.04467.pdf",
      "label": "[PDF]",
      "type": "a"
    },
    {
      "href": "https://github.com/distillpub/post--feature-visualization/issues/new",
      "label": "create an issue on GitHub",
      "type": "a"
    },
    {
      "href": "https://creativecommons.org/licenses/by/4.0/",
      "label": "CC-BY 4.0",
      "type": "a"
    },
    {
      "href": "https://github.com/distillpub/post--feature-visualization",
      "label": "source available on GitHub",
      "type": "a"
    },
    {
      "href": "https://distill.pub/about/",
      "label": "About",
      "type": "a"
    },
    {
      "href": "https://distill.pub/journal/",
      "label": "Submit",
      "type": "a"
    },
    {
      "href": "https://distill.pub/prize/",
      "label": "Prize",
      "type": "a"
    },
    {
      "href": "https://distill.pub/archive/",
      "label": "Archive",
      "type": "a"
    },
    {
      "href": "https://distill.pub/rss.xml",
      "label": "RSS",
      "type": "a"
    },
    {
      "href": "https://github.com/distillpub",
      "label": "GitHub",
      "type": "a"
    },
    {
      "href": "https://twitter.com/distillpub",
      "label": "Twitter",
      "type": "a"
    }
  ],
  "repair_version": 2,
  "repaired_at": "2026-10-14T10:54:14Z",
  "source_url": "https://distill.pub/2017/feature-visualization/",
  "papers": [
    {
      "status": "ok",
      "url": "https://arxiv.org/pdf/1409.4842.pdf",
      "bytes": 1214160,
      "reused": true,
      "local_path": "papers/repair/2d17a8dd5e8a9936f8ef.pdf"
    },
    {
      "status": "http_404",
      "url": "http://www.image-net.org/papers/imagenet_cvpr09.pdf",
      "retried_at": "2026-10-20T18:04:55Z"
    },
    {
      "status": "http_403",
      "url": "https://www.researchgate.net/profile/Aaron_Courville/publication/265022827_Visualizing_Higher-Layer_Features_of_a_Deep_Network/links/53ff82b00cf24c81027da530.pdf",
      "retried_at": "2026-10-20T18:04:55Z"
    },
    {
      "status": "ok",
      "url": "https://arxiv.org/pdf/1312.6034.pdf",
      "bytes": 2262025,
      "reused": true,
      "local_path": "papers/repair/5c375055da17ead61604.pdf"
    },
    {
      "status": "ok",
      "url": "https://arxiv.org/pdf/1508.06576.pdf",
      "bytes": 6112337,
      "reused": true,
      "local_path": "papers/repair/49d88bcedc63350b4ef6.pdf"
    },
    {
      "status": "ok",
      "url": "https://arxiv.org/pdf/1412.0035v1.pdf",
      "bytes": 2265693,
      "reused": true,
      "local_path": "papers/repair/670cef6069437a4d3ffb.pdf"
    },
    {
      "status": "ok",
      "url": "http://arxiv.org/pdf/1507.02379.pdf",
      "bytes": 2340072,
      "reused": false,
      "local_path": "papers/repair/9caf8373e0f0d764cce7.pdf"
    },
    {
      "status": "ok",
      "url": "https://arxiv.org/pdf/1602.03616.pdf",
      "bytes": 10374723,
      "reused": true,
      "local_path": "papers/repair/d18f7c8f01e3fa11cf5c.pdf"
    },
    {
      "status": "ok",
      "url": "https://arxiv.org/pdf/1612.00005.pdf",
      "bytes": 25726389,
      "reused": true,
      "local_path": "papers/repair/b188d1a5bdcb285fbb45.pdf"
    },
    {
      "status": "ok",
      "url": "https://arxiv.org/pdf/1312.6199.pdf",
      "bytes": 6565323,
      "reused": true,
      "local_path": "papers/repair/67aa78d89bf9969f80c2.pdf"
    },
    {
      "status": "ok",
      "url": "https://arxiv.org/pdf/1704.05796.pdf",
      "bytes": 3329116,
      "reused": true,
      "local_path": "papers/repair/fa291157c0972073146e.pdf"
    },
    {
      "status": "ok",
      "url": "https://arxiv.org/pdf/1412.1897.pdf",
      "bytes": 9985569,
      "reused": true,
      "local_path": "papers/repair/a11d2cb82fb90198cc81.pdf"
    },
    {
      "status": "ok",
      "url": "https://arxiv.org/pdf/1605.09304.pdf",
      "bytes": 12825142,
      "reused": false,
      "local_path": "papers/repair/fca033ed686ffd029ed9.pdf"
    },
    {
      "status": "ok",
      "url": "https://arxiv.org/pdf/1603.04467.pdf",
      "bytes": 992339,
      "reused": false,
      "local_path": "papers/repair/c6e0063125ba06bcc255.pdf"
    }
  ],
  "actual_video_files": [],
  "body_chars": 34578,
  "expected_body_images": 31,
  "discovery_status": "ok",
  "delivery_status": "partial",
  "missing_reason": "http_403；http_404",
  "raw_html": "attachments/5e62c39a7a75/pages/source.html",
  "local_html": "attachments/5e62c39a7a75/pages/article.html",
  "body_base_path": "attachments/5e62c39a7a75/pages/",
  "body_markdown_path": "attachments/5e62c39a7a75/pages/article.md"
}