[examples] sequence and revise notebooks

- combine classification + filter visualization
- order by classification, learning LeNet, brewing logreg, and
  fine-tuning to flickr style
- improve flow of content in classification + filter visualization
- include solver needed for learning LeNet
- edit notebook descriptions for site catalogue
This commit is contained in:
Evan Shelhamer 2015-03-17 19:01:02 -07:00
Родитель b8cc2974fc
Коммит a6cb8ec62c
19 изменённых файлов: 22386 добавлений и 26099 удалений

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -0,0 +1,947 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Fine-tuning a Pretrained Network for Style Recognition\n",
"\n",
"In this example, we'll explore a common approach that is particularly useful in real-world applications: take a pre-trained Caffe network and fine-tune the parameters on your custom data.\n",
"\n",
"The upside of such approach is that, since pre-trained networks are learned on a large set of images, the intermediate layers capture the \"semantics\" of the general visual appearance. Think of it as a very powerful feature that you can treat as a black box. On top of that, only a few layers will be needed to obtain a very good performance of the data."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, we will need to prepare the data. This involves the following parts:\n",
"(1) Get the ImageNet ilsvrc pretrained model with the provided shell scripts.\n",
"(2) Download a subset of the overall Flickr style dataset for this demo.\n",
"(3) Compile the downloaded Flickr dataset into a database that Caffe can then consume."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import os\n",
"os.chdir('..')\n",
"import sys\n",
"sys.path.insert(0, './python')\n",
"\n",
"import caffe\n",
"import numpy as np\n",
"from pylab import *\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# This downloads the ilsvrc auxiliary data (mean file, etc),\n",
"# and a subset of 2000 images for the style recognition task.\n",
"!data/ilsvrc12/get_ilsvrc_aux.sh\n",
"!scripts/download_model_binary.py models/bvlc_reference_caffenet\n",
"!python examples/finetune_flickr_style/assemble_data.py \\\n",
" --workers=-1 --images=2000 --seed=1701 --label=5"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's show what is the difference between the fine-tuning network and the original caffe model."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1c1\r\n",
"< name: \"CaffeNet\"\r\n",
"---\r\n",
"> name: \"FlickrStyleCaffeNet\"\r\n",
"4c4\r\n",
"< type: \"Data\"\r\n",
"---\r\n",
"> type: \"ImageData\"\r\n",
"15,26c15,19\r\n",
"< # mean pixel / channel-wise mean instead of mean image\r\n",
"< # transform_param {\r\n",
"< # crop_size: 227\r\n",
"< # mean_value: 104\r\n",
"< # mean_value: 117\r\n",
"< # mean_value: 123\r\n",
"< # mirror: true\r\n",
"< # }\r\n",
"< data_param {\r\n",
"< source: \"examples/imagenet/ilsvrc12_train_lmdb\"\r\n",
"< batch_size: 256\r\n",
"< backend: LMDB\r\n",
"---\r\n",
"> image_data_param {\r\n",
"> source: \"data/flickr_style/train.txt\"\r\n",
"> batch_size: 50\r\n",
"> new_height: 256\r\n",
"> new_width: 256\r\n",
"31c24\r\n",
"< type: \"Data\"\r\n",
"---\r\n",
"> type: \"ImageData\"\r\n",
"42,51c35,36\r\n",
"< # mean pixel / channel-wise mean instead of mean image\r\n",
"< # transform_param {\r\n",
"< # crop_size: 227\r\n",
"< # mean_value: 104\r\n",
"< # mean_value: 117\r\n",
"< # mean_value: 123\r\n",
"< # mirror: true\r\n",
"< # }\r\n",
"< data_param {\r\n",
"< source: \"examples/imagenet/ilsvrc12_val_lmdb\"\r\n",
"---\r\n",
"> image_data_param {\r\n",
"> source: \"data/flickr_style/test.txt\"\r\n",
"53c38,39\r\n",
"< backend: LMDB\r\n",
"---\r\n",
"> new_height: 256\r\n",
"> new_width: 256\r\n",
"323a310\r\n",
"> # Note that lr_mult can be set to 0 to disable any fine-tuning of this, and any other, layer\r\n",
"360c347\r\n",
"< name: \"fc8\"\r\n",
"---\r\n",
"> name: \"fc8_flickr\"\r\n",
"363c350,351\r\n",
"< top: \"fc8\"\r\n",
"---\r\n",
"> top: \"fc8_flickr\"\r\n",
"> # lr_mult is set to higher than for other layers, because this layer is starting from random while the others are already trained\r\n",
"365c353\r\n",
"< lr_mult: 1\r\n",
"---\r\n",
"> lr_mult: 10\r\n",
"369c357\r\n",
"< lr_mult: 2\r\n",
"---\r\n",
"> lr_mult: 20\r\n",
"373c361\r\n",
"< num_output: 1000\r\n",
"---\r\n",
"> num_output: 20\r\n",
"384a373,379\r\n",
"> name: \"loss\"\r\n",
"> type: \"SoftmaxWithLoss\"\r\n",
"> bottom: \"fc8_flickr\"\r\n",
"> bottom: \"label\"\r\n",
"> top: \"loss\"\r\n",
"> }\r\n",
"> layer {\r\n",
"387c382\r\n",
"< bottom: \"fc8\"\r\n",
"---\r\n",
"> bottom: \"fc8_flickr\"\r\n",
"393,399d387\r\n",
"< }\r\n",
"< layer {\r\n",
"< name: \"loss\"\r\n",
"< type: \"SoftmaxWithLoss\"\r\n",
"< bottom: \"fc8\"\r\n",
"< bottom: \"label\"\r\n",
"< top: \"loss\"\r\n"
]
}
],
"source": [
"!diff models/bvlc_reference_caffenet/train_val.prototxt models/finetune_flickr_style/train_val.prototxt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For your record, if you want to train the network in pure C++ tools, here is the command:\n",
"\n",
"<code>\n",
"build/tools/caffe train \\\n",
" -solver models/finetune_flickr_style/solver.prototxt \\\n",
" -weights models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel \\\n",
" -gpu 0\n",
"</code>\n",
"\n",
"However, we will train using Python in this example."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"iter 0, finetune_loss=3.360094, scratch_loss=3.136188\n",
"iter 10, finetune_loss=2.672608, scratch_loss=9.736364\n",
"iter 20, finetune_loss=2.071996, scratch_loss=2.250404\n",
"iter 30, finetune_loss=1.758295, scratch_loss=2.049553\n",
"iter 40, finetune_loss=1.533391, scratch_loss=1.941318\n",
"iter 50, finetune_loss=1.561658, scratch_loss=1.839706\n",
"iter 60, finetune_loss=1.461696, scratch_loss=1.880035\n",
"iter 70, finetune_loss=1.267941, scratch_loss=1.719161\n",
"iter 80, finetune_loss=1.192778, scratch_loss=1.627453\n",
"iter 90, finetune_loss=1.541176, scratch_loss=1.822061\n",
"iter 100, finetune_loss=1.029039, scratch_loss=1.654087\n",
"iter 110, finetune_loss=1.138547, scratch_loss=1.735837\n",
"iter 120, finetune_loss=0.917412, scratch_loss=1.851918\n",
"iter 130, finetune_loss=0.971519, scratch_loss=1.801927\n",
"iter 140, finetune_loss=0.868252, scratch_loss=1.745545\n",
"iter 150, finetune_loss=0.790020, scratch_loss=1.844925\n",
"iter 160, finetune_loss=1.092668, scratch_loss=1.695591\n",
"iter 170, finetune_loss=1.055344, scratch_loss=1.661715\n",
"iter 180, finetune_loss=0.969769, scratch_loss=1.823639\n",
"iter 190, finetune_loss=0.780566, scratch_loss=1.820862\n",
"done\n"
]
}
],
"source": [
"niter = 200\n",
"# losses will also be stored in the log\n",
"train_loss = np.zeros(niter)\n",
"scratch_train_loss = np.zeros(niter)\n",
"\n",
"caffe.set_device(0)\n",
"caffe.set_mode_gpu()\n",
"# We create a solver that fine-tunes from a previously trained network.\n",
"solver = caffe.SGDSolver('models/finetune_flickr_style/solver.prototxt')\n",
"solver.net.copy_from('models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel')\n",
"# For reference, we also create a solver that does no finetuning.\n",
"scratch_solver = caffe.SGDSolver('models/finetune_flickr_style/solver.prototxt')\n",
"\n",
"# We run the solver for niter times, and record the training loss.\n",
"for it in range(niter):\n",
" solver.step(1) # SGD by Caffe\n",
" scratch_solver.step(1)\n",
" # store the train loss\n",
" train_loss[it] = solver.net.blobs['loss'].data\n",
" scratch_train_loss[it] = scratch_solver.net.blobs['loss'].data\n",
" if it % 10 == 0:\n",
" print 'iter %d, finetune_loss=%f, scratch_loss=%f' % (it, train_loss[it], scratch_train_loss[it])\n",
"print 'done'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's look at the training loss produced by the two training procedures respectively."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7fbb36f0ad50>,\n",
" <matplotlib.lines.Line2D at 0x7fbb36f0afd0>]"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": [
"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\n",
"UlvRigAAAABJRU5ErkJggg==\n"
],
"text/plain": [
"<matplotlib.figure.Figure at 0x7fbb37f20990>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(np.vstack([train_loss, scratch_train_loss]).T)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Notice how the fine-tuning procedure produces a more smooth loss function change, and ends up at a better loss. A closer look at small values, clipping to avoid showing too large loss during training:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7fbb347a8310>,\n",
" <matplotlib.lines.Line2D at 0x7fbb347a8590>]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": [
"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\n"
],
"text/plain": [
"<matplotlib.figure.Figure at 0x7fbb37f207d0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(np.vstack([train_loss, scratch_train_loss]).clip(0, 4).T)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's take a look at the testing accuracy after running 200 iterations. Note that we are running a classification task of 5 classes, thus a chance accuracy is 20%. As we will reasonably expect, the finetuning result will be much better than the one from training from scratch. Let's see."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Accuracy for fine-tuning: 0.570000001788\n",
"Accuracy for training from scratch: 0.224000000954\n"
]
}
],
"source": [
"test_iters = 10\n",
"accuracy = 0\n",
"scratch_accuracy = 0\n",
"for it in arange(test_iters):\n",
" solver.test_nets[0].forward()\n",
" accuracy += solver.test_nets[0].blobs['accuracy'].data\n",
" scratch_solver.test_nets[0].forward()\n",
" scratch_accuracy += scratch_solver.test_nets[0].blobs['accuracy'].data\n",
"accuracy /= test_iters\n",
"scratch_accuracy /= test_iters\n",
"print 'Accuracy for fine-tuning:', accuracy\n",
"print 'Accuracy for training from scratch:', scratch_accuracy"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Huzzah! So we did finetuning and it is awesome. Let's take a look at what kind of results we are able to get with a longer, more complete run of the style recognition dataset. Note: the below URL might be occassionally down because it is run on a research machine.\n",
"\n",
"http://demo.vislab.berkeleyvision.org/"
]
}
],
"metadata": {
"description": "Fine-tune the ImageNet-trained CaffeNet on new data.",
"example_name": "Fine-tuning for Style Recognition",
"include_in_docs": true,
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.9"
},
"priority": 4
},
"nbformat": 4,
"nbformat_minor": 0
}

Просмотреть файл

@ -1,951 +0,0 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Finetune a Pretrained Network with Flickr Style Data\n",
"\n",
"In this example, we'll explore a common approach that is particularly useful in real-world applications: take a pre-trained Caffe network, and finetune the last few layers using your custom data.\n",
"\n",
"The upside of such approach is that, since pre-trained networks are trained on a large set of images, the intermediate layers capture the \"semantics\" of the general visual appearance. Think of it as a very powerful feature that you can treat as a black box. On top of that, only a few layers will be needed to obtain a very good performance of the data."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, we will need to prepare the data. This involves the following parts:\n",
"(1) Get the ImageNet ilsvrc pretrained model with the provided shell scripts.\n",
"(2) Download a subset of the overall Flickr style dataset for this demo.\n",
"(3) Compile the downloaded Flickr dataset into a database that Caffe can then consume."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"/home/jiayq/Research/caffe\n"
]
}
],
"source": [
"import os\n",
"os.chdir('..')\n",
"import sys\n",
"sys.path.insert(0, './python')\n",
"print os.getcwd()\n",
"\n",
"import caffe\n",
"import numpy as np\n",
"from pylab import *\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Downloading...\n",
"--2015-03-17 10:51:07-- http://dl.caffe.berkeleyvision.org/caffe_ilsvrc12.tar.gz\n",
"Resolving dl.caffe.berkeleyvision.org (dl.caffe.berkeleyvision.org)... 169.229.222.251\n",
"Connecting to dl.caffe.berkeleyvision.org (dl.caffe.berkeleyvision.org)|169.229.222.251|:80... connected.\n",
"HTTP request sent, awaiting response... 200 OK\n",
"Length: 17858008 (17M) [application/octet-stream]\n",
"Saving to: caffe_ilsvrc12.tar.gz\n",
"\n",
"100%[======================================>] 17,858,008 287KB/s in 55s \n",
"\n",
"2015-03-17 10:52:02 (318 KB/s) - caffe_ilsvrc12.tar.gz saved [17858008/17858008]\n",
"\n",
"Unzipping...\n",
"Done.\n",
"Model already exists.\n",
"Downloading 2000 images with 3 workers...\n",
"Writing train/val for 1903 successfully downloaded images.\n"
]
}
],
"source": [
"# This downloads the ilsvrc auxiliary data (mean file, etc),\n",
"# and a subset of 2000 images for the style recognition task.\n",
"\n",
"# You won't need to run this - we should have already created it for you.\n",
"!data/ilsvrc12/get_ilsvrc_aux.sh\n",
"!scripts/download_model_binary.py models/bvlc_reference_caffenet\n",
"!python examples/finetune_flickr_style/assemble_data.py \\\n",
" --workers=-1 --images=2000 --seed=1701 --label=5"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's show what is the difference between the finetune network and the original caffe model."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1c1\r\n",
"< name: \"CaffeNet\"\r\n",
"---\r\n",
"> name: \"FlickrStyleCaffeNet\"\r\n",
"4c4\r\n",
"< type: \"Data\"\r\n",
"---\r\n",
"> type: \"ImageData\"\r\n",
"15,26c15,19\r\n",
"< # mean pixel / channel-wise mean instead of mean image\r\n",
"< # transform_param {\r\n",
"< # crop_size: 227\r\n",
"< # mean_value: 104\r\n",
"< # mean_value: 117\r\n",
"< # mean_value: 123\r\n",
"< # mirror: true\r\n",
"< # }\r\n",
"< data_param {\r\n",
"< source: \"examples/imagenet/ilsvrc12_train_lmdb\"\r\n",
"< batch_size: 256\r\n",
"< backend: LMDB\r\n",
"---\r\n",
"> image_data_param {\r\n",
"> source: \"data/flickr_style/train.txt\"\r\n",
"> batch_size: 50\r\n",
"> new_height: 256\r\n",
"> new_width: 256\r\n",
"31c24\r\n",
"< type: \"Data\"\r\n",
"---\r\n",
"> type: \"ImageData\"\r\n",
"42,51c35,36\r\n",
"< # mean pixel / channel-wise mean instead of mean image\r\n",
"< # transform_param {\r\n",
"< # crop_size: 227\r\n",
"< # mean_value: 104\r\n",
"< # mean_value: 117\r\n",
"< # mean_value: 123\r\n",
"< # mirror: true\r\n",
"< # }\r\n",
"< data_param {\r\n",
"< source: \"examples/imagenet/ilsvrc12_val_lmdb\"\r\n",
"---\r\n",
"> image_data_param {\r\n",
"> source: \"data/flickr_style/test.txt\"\r\n",
"53c38,39\r\n",
"< backend: LMDB\r\n",
"---\r\n",
"> new_height: 256\r\n",
"> new_width: 256\r\n",
"323a310\r\n",
"> # Note that lr_mult can be set to 0 to disable any fine-tuning of this, and any other, layer\r\n",
"360c347\r\n",
"< name: \"fc8\"\r\n",
"---\r\n",
"> name: \"fc8_flickr\"\r\n",
"363c350,351\r\n",
"< top: \"fc8\"\r\n",
"---\r\n",
"> top: \"fc8_flickr\"\r\n",
"> # lr_mult is set to higher than for other layers, because this layer is starting from random while the others are already trained\r\n",
"365c353\r\n",
"< lr_mult: 1\r\n",
"---\r\n",
"> lr_mult: 10\r\n",
"369c357\r\n",
"< lr_mult: 2\r\n",
"---\r\n",
"> lr_mult: 20\r\n",
"373c361\r\n",
"< num_output: 1000\r\n",
"---\r\n",
"> num_output: 20\r\n",
"384a373,379\r\n",
"> name: \"loss\"\r\n",
"> type: \"SoftmaxWithLoss\"\r\n",
"> bottom: \"fc8_flickr\"\r\n",
"> bottom: \"label\"\r\n",
"> top: \"loss\"\r\n",
"> }\r\n",
"> layer {\r\n",
"387c382\r\n",
"< bottom: \"fc8\"\r\n",
"---\r\n",
"> bottom: \"fc8_flickr\"\r\n",
"393,399d387\r\n",
"< }\r\n",
"< layer {\r\n",
"< name: \"loss\"\r\n",
"< type: \"SoftmaxWithLoss\"\r\n",
"< bottom: \"fc8\"\r\n",
"< bottom: \"label\"\r\n",
"< top: \"loss\"\r\n"
]
}
],
"source": [
"!diff models/bvlc_reference_caffenet/train_val.prototxt models/finetune_flickr_style/train_val.prototxt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For your record, if you want to train the network in pure C++ tools, here is the command:\n",
"\n",
"<code>\n",
"build/tools/caffe train \\\n",
" -solver models/finetune_flickr_style/solver.prototxt \\\n",
" -weights models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel \\\n",
" -gpu 0\n",
"</code>\n",
"\n",
"However, we will train using Python in this example."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"iter 0, loss=3.786610, scratch_loss=3.163587\n",
"iter 10, loss=2.556661, scratch_loss=8.774073\n",
"iter 20, loss=2.035326, scratch_loss=2.266603\n",
"iter 30, loss=1.943101, scratch_loss=1.703273\n",
"iter 40, loss=1.982698, scratch_loss=1.831079\n",
"iter 50, loss=1.559268, scratch_loss=2.041238\n",
"iter 60, loss=1.464433, scratch_loss=1.836157\n",
"iter 70, loss=1.481868, scratch_loss=1.705826\n",
"iter 80, loss=1.394870, scratch_loss=1.695532\n",
"iter 90, loss=1.055422, scratch_loss=1.867379\n",
"iter 100, loss=1.407976, scratch_loss=1.881758\n",
"iter 110, loss=1.569579, scratch_loss=1.701803\n",
"iter 120, loss=0.951682, scratch_loss=1.764299\n",
"iter 130, loss=0.905122, scratch_loss=1.879305\n",
"iter 140, loss=1.020678, scratch_loss=1.746009\n",
"iter 150, loss=0.784985, scratch_loss=1.739624\n",
"iter 160, loss=0.911735, scratch_loss=1.673230\n",
"iter 170, loss=0.965255, scratch_loss=1.725484\n",
"iter 180, loss=1.028102, scratch_loss=1.676103\n",
"iter 190, loss=0.905020, scratch_loss=1.885763\n",
"done\n"
]
}
],
"source": [
"niter = 200\n",
"# losses will also be stored in the log\n",
"train_loss = np.zeros(niter)\n",
"scratch_train_loss = np.zeros(niter)\n",
"\n",
"caffe.set_device(0)\n",
"caffe.set_mode_gpu()\n",
"# We create a solver that finetunes from a previously trained network.\n",
"solver = caffe.SGDSolver('models/finetune_flickr_style/solver.prototxt')\n",
"solver.net.copy_from('models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel')\n",
"# For reference, we also create a solver that does no finetuning.\n",
"scratch_solver = caffe.SGDSolver('models/finetune_flickr_style/solver.prototxt')\n",
"\n",
"# We run the solver for niter times, and record the training loss.\n",
"for it in range(niter):\n",
" solver.step(1) # SGD by Caffe\n",
" scratch_solver.step(1)\n",
" # store the train loss\n",
" train_loss[it] = solver.net.blobs['loss'].data\n",
" scratch_train_loss[it] = scratch_solver.net.blobs['loss'].data\n",
" if it % 10 == 0:\n",
" print 'iter %d, loss=%f, scratch_loss=%f' % (it, train_loss[it], scratch_train_loss[it])\n",
"print 'done'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's look at the training loss produced by the two training procedures respectively."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f39dad72390>,\n",
" <matplotlib.lines.Line2D at 0x7f39dad72610>]"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": [
"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\n",
"ra0pAAAAAElFTkSuQmCC\n"
],
"text/plain": [
"<matplotlib.figure.Figure at 0x7f3a2803d590>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(np.vstack([train_loss, scratch_train_loss]).T)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Notice how the fine-tuning procedure produces a more smooth loss function change, and ends up at a better loss. A closer look at small values, clipping to avoid showing too large loss during training:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f39d50acc90>,\n",
" <matplotlib.lines.Line2D at 0x7f39d50acf10>]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": [
"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\n"
],
"text/plain": [
"<matplotlib.figure.Figure at 0x7f39dad22150>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(np.vstack([train_loss, scratch_train_loss]).clip(0, 4).T)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's take a look at the testing accuracy after running 200 iterations. Note that we are running a classification task of 5 classes, thus a chance accuracy is 20%. As we will reasonably expect, the finetuning result will be much better than the one from training from scratch. Let's see."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Accuracy for fine-tuning: 0.570000001788\n",
"Accuracy for training from scratch: 0.224000000954\n"
]
}
],
"source": [
"test_iters = 10\n",
"accuracy = 0\n",
"scratch_accuracy = 0\n",
"for it in arange(test_iters):\n",
" solver.test_nets[0].forward()\n",
" accuracy += solver.test_nets[0].blobs['accuracy'].data\n",
" scratch_solver.test_nets[0].forward()\n",
" scratch_accuracy += scratch_solver.test_nets[0].blobs['accuracy'].data\n",
"accuracy /= test_iters\n",
"scratch_accuracy /= test_iters\n",
"print 'Accuracy for fine-tuning:', accuracy\n",
"print 'Accuracy for training from scratch:', scratch_accuracy"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Huzzah! So we did finetuning and it is awesome. Let's take a look at what kind of results we are able to get with a longer, more complete run of the style recognition dataset. Note: the below URL might be occassionally down because it is run on a research machine.\n",
"\n",
"http://demo.vislab.berkeleyvision.org/"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 0
}

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -8385,7 +8385,7 @@
"pygments_lexer": "ipython2",
"version": "2.7.9"
},
"priority": 3
"priority": 6
},
"nbformat": 4,
"nbformat_minor": 0

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -0,0 +1,54 @@
layer {
name: "data"
type: "HDF5Data"
top: "data"
top: "label"
hdf5_data_param {
source: "examples/hdf5_classification/data/test.txt"
batch_size: 10
}
}
layer {
name: "ip1"
type: "InnerProduct"
bottom: "data"
top: "ip1"
inner_product_param {
num_output: 40
weight_filler {
type: "xavier"
}
}
}
layer {
name: "relu1"
type: "ReLU"
bottom: "ip1"
top: "ip1"
}
layer {
name: "ip2"
type: "InnerProduct"
bottom: "ip1"
top: "ip2"
inner_product_param {
num_output: 2
weight_filler {
type: "xavier"
}
}
}
layer {
name: "accuracy"
type: "Accuracy"
bottom: "ip2"
bottom: "label"
top: "accuracy"
}
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "ip2"
bottom: "label"
top: "loss"
}

Просмотреть файл

@ -0,0 +1,54 @@
layer {
name: "data"
type: "HDF5Data"
top: "data"
top: "label"
hdf5_data_param {
source: "examples/hdf5_classification/data/train.txt"
batch_size: 10
}
}
layer {
name: "ip1"
type: "InnerProduct"
bottom: "data"
top: "ip1"
inner_product_param {
num_output: 40
weight_filler {
type: "xavier"
}
}
}
layer {
name: "relu1"
type: "ReLU"
bottom: "ip1"
top: "ip1"
}
layer {
name: "ip2"
type: "InnerProduct"
bottom: "ip1"
top: "ip2"
inner_product_param {
num_output: 2
weight_filler {
type: "xavier"
}
}
}
layer {
name: "accuracy"
type: "Accuracy"
bottom: "ip2"
bottom: "label"
top: "accuracy"
}
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "ip2"
bottom: "label"
top: "loss"
}

Просмотреть файл

@ -0,0 +1,15 @@
train_net: "examples/hdf5_classification/nonlinear_auto_train.prototxt"
test_net: "examples/hdf5_classification/nonlinear_auto_test.prototxt"
test_iter: 250
test_interval: 1000
base_lr: 0.01
lr_policy: "step"
gamma: 0.1
stepsize: 5000
display: 1000
max_iter: 10000
momentum: 0.9
weight_decay: 0.0005
snapshot: 10000
snapshot_prefix: "examples/hdf5_classification/data/train"
solver_mode: CPU

Просмотреть файл

@ -8,7 +8,7 @@ layer {
phase: TRAIN
}
hdf5_data_param {
source: "hdf5_classification/data/train.txt"
source: "examples/hdf5_classification/data/train.txt"
batch_size: 10
}
}
@ -21,7 +21,7 @@ layer {
phase: TEST
}
hdf5_data_param {
source: "hdf5_classification/data/test.txt"
source: "examples/hdf5_classification/data/test.txt"
batch_size: 10
}
}
@ -41,8 +41,7 @@ layer {
inner_product_param {
num_output: 40
weight_filler {
type: "gaussian"
std: 0.01
type: "xavier"
}
bias_filler {
type: "constant"
@ -72,8 +71,7 @@ layer {
inner_product_param {
num_output: 2
weight_filler {
type: "gaussian"
std: 0.01
type: "xavier"
}
bias_filler {
type: "constant"

Просмотреть файл

@ -1,4 +1,5 @@
net: "hdf5_classification/train_val.prototxt"
train_net: "examples/hdf5_classification/logreg_auto_train.prototxt"
test_net: "examples/hdf5_classification/logreg_auto_test.prototxt"
test_iter: 250
test_interval: 1000
base_lr: 0.01
@ -10,5 +11,5 @@ max_iter: 10000
momentum: 0.9
weight_decay: 0.0005
snapshot: 10000
snapshot_prefix: "hdf5_classification/data/train"
snapshot_prefix: "examples/hdf5_classification/data/train"
solver_mode: CPU

Просмотреть файл

@ -1,14 +0,0 @@
net: "hdf5_classification/train_val2.prototxt"
test_iter: 250
test_interval: 1000
base_lr: 0.01
lr_policy: "step"
gamma: 0.1
stepsize: 5000
display: 1000
max_iter: 10000
momentum: 0.9
weight_decay: 0.0005
snapshot: 10000
snapshot_prefix: "hdf5_classification/data/train"
solver_mode: CPU

Просмотреть файл

@ -8,7 +8,7 @@ layer {
phase: TRAIN
}
hdf5_data_param {
source: "hdf5_classification/data/train.txt"
source: "examples/hdf5_classification/data/train.txt"
batch_size: 10
}
}
@ -21,7 +21,7 @@ layer {
phase: TEST
}
hdf5_data_param {
source: "hdf5_classification/data/test.txt"
source: "examples/hdf5_classification/data/test.txt"
batch_size: 10
}
}
@ -41,8 +41,7 @@ layer {
inner_product_param {
num_output: 2
weight_filler {
type: "gaussian"
std: 0.01
type: "xavier"
}
bias_filler {
type: "constant"

Просмотреть файл

@ -0,0 +1,24 @@
# The train/test net protocol buffer definition
train_net: "examples/mnist/lenet_auto_train.prototxt"
test_net: "examples/mnist/lenet_auto_test.prototxt"
# test_iter specifies how many forward passes the test should carry out.
# In the case of MNIST, we have test batch size 100 and 100 test iterations,
# covering the full 10,000 testing images.
test_iter: 100
# Carry out testing every 500 training iterations.
test_interval: 500
# The base learning rate, momentum and the weight decay of the network.
base_lr: 0.01
momentum: 0.9
weight_decay: 0.0005
# The learning rate policy
lr_policy: "inv"
gamma: 0.0001
power: 0.75
# Display every 100 iterations
display: 100
# The maximum number of iterations
max_iter: 10000
# snapshot intermediate results
snapshot: 5000
snapshot_prefix: "examples/mnist/lenet"

Просмотреть файл

@ -6884,7 +6884,7 @@
}
],
"metadata": {
"description": "How to do net surgery and manually change model parameters, making a fully-convolutional classifier for dense feature extraction.",
"description": "How to do net surgery and manually change model parameters for custom use.",
"example_name": "Editing model parameters",
"include_in_docs": true,
"kernelspec": {

Просмотреть файл

@ -1902,7 +1902,7 @@
"pygments_lexer": "ipython2",
"version": "2.7.9"
},
"priority": 6
"priority": 7
},
"nbformat": 4,
"nbformat_minor": 0