{ "cells": [ { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "%load_ext autoreload\n", "%autoreload 2" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# !pip install --upgrade torchvision\n", "# !pip install --upgrade torch" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "PyTorch Version: 1.1.0\n", "Torchvision Version: 0.2.2\n" ] } ], "source": [ "from __future__ import print_function\n", "from __future__ import division\n", "import torch\n", "import torch.nn as nn\n", "import torch.optim as optim\n", "import numpy as np\n", "import torchvision\n", "from torchvision import datasets, models, transforms\n", "import matplotlib.pyplot as plt\n", "import time\n", "import os\n", "import copy\n", "import cv2\n", "from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip\n", "import IPython.display as ipd\n", "from moviepy.editor import AudioFileClip\n", "\n", "import vggish_input\n", "import conv\n", "\n", "print(\"PyTorch Version: \",torch.__version__)\n", "print(\"Torchvision Version: \",torchvision.__version__)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Params" ] }, { "cell_type": "code", "execution_count": 104, "metadata": {}, "outputs": [], "source": [ "# Top level data directory. Here we assume the format of the directory conforms\n", "# to the ImageFolder structure\n", "# data_dir = \"/Users/aziai/Downloads/hymenoptera_data/\"\n", "data_dir = \"/Users/aziai/Downloads/casino/\"\n", "\n", "# Models to choose from [resnet, alexnet, vgg, squeezenet, densenet, inception]\n", "model_name = \"alexnet\"\n", "\n", "# Number of classes in the dataset\n", "num_classes = 2\n", "\n", "# Batch size for training (change depending on how much memory you have)\n", "batch_size = 8\n", "\n", "# Number of epochs to train for\n", "num_epochs = 15\n", "\n", "# Flag for feature extracting. When False, we finetune the whole model,\n", "# when True we only update the reshaped layer params\n", "feature_extract = True\n", "\n", "segments = {\n", " \"movies_casino_royale_2006.mp4\": {\n", " 'kissing': [\n", " (2 * 3600 + 4 * 60 + 6, 2 * 3600 + 4 * 60 + 9),\n", " (0 * 3600 + 37 * 60 + 33, 0 * 3600 + 38 * 60 + 34),\n", " (2 * 3600 + 0 * 60 + 26, 2 * 3600 + 0 * 60 + 37),\n", " ],\n", " 'not': [\n", " (0 * 3600 + 60 * 9 + 47, 0 * 3600 + 60 * 9 + 57),\n", " (1 * 3600 + 9 * 60 + 39, 1 * 3600 + 9 * 60 + 45),\n", " (1 * 3600 + 51 * 60 + 56, 1 * 3600 + 52 * 60 + 2),\n", " ]\n", " },\n", " 'movies_goldeneye_1995.mp4': {\n", " 'kissing': [\n", " (0 * 3600 + 16 * 60 + 51, 0 * 3600 + 17 * 60 + 0),\n", " (1 * 3600 + 38 * 60 + 51, 1 * 3600 + 39 * 60 + 2),\n", " (2 * 3600 + 4 * 60 + 53, 2 * 3600 + 5 * 60 + 15),\n", " ],\n", " 'not': [\n", " (0 * 3600 + 28 * 60 + 26, 0 * 3600 + 28 * 60 + 40),\n", " (0 * 3600 + 52 * 60 + 16, 0 * 3600 + 52 * 60 + 38),\n", " (1 * 3600 + 21 * 60 + 50, 1 * 3600 + 21 * 60 + 59),\n", " ]\n", " }\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Explore" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "audioclip = AudioFileClip(\"/Users/aziai/Downloads/movies_goldeneye_1995.mp4\")" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "audioclip" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "q = VideoFileClip('/Users/aziai/Downloads/movies_goldeneye_1995_kissing_3.mp4')\n", "q" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "chunk: 0%| | 2/486 [00:00<00:28, 17.21it/s, now=None]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "MoviePy - Writing audio in %s\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " " ] }, { "name": "stdout", "output_type": "stream", "text": [ "MoviePy - Done.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r" ] } ], "source": [ "q.audio.write_audiofile('u.wav')" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ipd.Audio('u.wav')" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [], "source": [ "ex = vggish_input.wavfile_to_examples('u.wav')" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(22, 96, 64)" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ex.shape" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "22.0" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "q.duration" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [], "source": [ "# can't read mp4\n", "# sf.read('/Users/aziai/Downloads/movies_casino_royale_2006_not_1.mp4')" ] }, { "cell_type": "code", "execution_count": 108, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Downloading: \"https://download.pytorch.org/models/alexnet-owt-4df8aa71.pth\" to /Users/aziai/.cache/torch/checkpoints/alexnet-owt-4df8aa71.pth\n", "100%|██████████| 244418560/244418560 [00:18<00:00, 13346961.75it/s]\n" ] } ], "source": [ "# Initialize the model for this run\n", "model_ft, input_size, _ = conv.convnet_init(model_name, num_classes, feature_extract, use_pretrained=True)\n", "\n", "# Print the model we just instantiated\n", "# print(model_ft)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Processing" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "target: /Users/aziai/Downloads/movies_casino_royale_2006_kissing_1.mp4\n", "Moviepy - Running:\n", ">>> \"+ \" \".join(cmd)\n", "Moviepy - Command successful\n", "5\n", "target: /Users/aziai/Downloads/movies_casino_royale_2006_kissing_2.mp4\n", "Moviepy - Running:\n", ">>> \"+ \" \".join(cmd)\n", "Moviepy - Command successful\n", "5\n", "target: /Users/aziai/Downloads/movies_casino_royale_2006_kissing_3.mp4\n", "Moviepy - Running:\n", ">>> \"+ \" \".join(cmd)\n", "Moviepy - Command successful\n", "5\n", "target: /Users/aziai/Downloads/movies_casino_royale_2006_not_1.mp4\n", "Moviepy - Running:\n", ">>> \"+ \" \".join(cmd)\n", "Moviepy - Command successful\n", "5\n", "target: /Users/aziai/Downloads/movies_casino_royale_2006_not_2.mp4\n", "Moviepy - Running:\n", ">>> \"+ \" \".join(cmd)\n", "Moviepy - Command successful\n", "5\n", "target: /Users/aziai/Downloads/movies_casino_royale_2006_not_3.mp4\n", "Moviepy - Running:\n", ">>> \"+ \" \".join(cmd)\n", "Moviepy - Command successful\n", "5\n", "target: /Users/aziai/Downloads/movies_goldeneye_1995_kissing_1.mp4\n", "Moviepy - Running:\n", ">>> \"+ \" \".join(cmd)\n", "Moviepy - Command successful\n", "5\n", "target: /Users/aziai/Downloads/movies_goldeneye_1995_kissing_2.mp4\n", "Moviepy - Running:\n", ">>> \"+ \" \".join(cmd)\n", "Moviepy - Command successful\n", "5\n", "target: /Users/aziai/Downloads/movies_goldeneye_1995_kissing_3.mp4\n", "Moviepy - Running:\n", ">>> \"+ \" \".join(cmd)\n", "Moviepy - Command successful\n", "5\n", "target: /Users/aziai/Downloads/movies_goldeneye_1995_not_1.mp4\n", "Moviepy - Running:\n", ">>> \"+ \" \".join(cmd)\n", "Moviepy - Command successful\n", "5\n", "target: /Users/aziai/Downloads/movies_goldeneye_1995_not_2.mp4\n", "Moviepy - Running:\n", ">>> \"+ \" \".join(cmd)\n", "Moviepy - Command successful\n", "5\n", "target: /Users/aziai/Downloads/movies_goldeneye_1995_not_3.mp4\n", "Moviepy - Running:\n", ">>> \"+ \" \".join(cmd)\n", "Moviepy - Command successful\n", "5\n" ] } ], "source": [ "# TODO: move this into the package\n", "!rm -rf ~/Downloads/casino\n", "!mkdir -p /Users/aziai/Downloads/casino/train/kissing /Users/aziai/Downloads/casino/train/not\n", "!mkdir -p /Users/aziai/Downloads/casino/val/kissing /Users/aziai/Downloads/casino/val/not\n", "\n", "slice_clips(segments, root='/Users/aziai/Downloads/', fps=1)" ] }, { "cell_type": "code", "execution_count": 109, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Initializing Datasets and Dataloaders...\n" ] } ], "source": [ "# Data augmentation and normalization for training\n", "# Just normalization for validation\n", "data_transforms = {\n", " 'train': transforms.Compose([\n", " transforms.RandomResizedCrop(input_size),\n", " transforms.RandomHorizontalFlip(),\n", " transforms.ToTensor(),\n", " transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n", " ]),\n", " 'val': transforms.Compose([\n", " transforms.Resize(input_size),\n", " transforms.CenterCrop(input_size),\n", " transforms.ToTensor(),\n", " transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n", " ]),\n", "}\n", "\n", "print(\"Initializing Datasets and Dataloaders...\")\n", "\n", "# Create training and validation datasets\n", "image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x), data_transforms[x]) for x in ['train', 'val']}\n", "# Create training and validation dataloaders\n", "dataloaders_dict = {x: torch.utils.data.DataLoader(image_datasets[x], batch_size=batch_size, shuffle=True, num_workers=4) for x in ['train', 'val']}\n", "\n", "# Detect if we have a GPU available\n", "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")" ] }, { "cell_type": "code", "execution_count": 110, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "device(type='cpu')" ] }, "execution_count": 110, "metadata": {}, "output_type": "execute_result" } ], "source": [ "device" ] }, { "cell_type": "code", "execution_count": 111, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Params to learn:\n", "hi\n", "\t classifier.6.weight\n", "hi\n", "\t classifier.6.bias\n" ] } ], "source": [ "# Send the model to GPU\n", "model_ft = model_ft.to(device)\n", "\n", "# Gather the parameters to be optimized/updated in this run. If we are\n", "# finetuning we will be updating all parameters. However, if we are\n", "# doing feature extract method, we will only update the parameters\n", "# that we have just initialized, i.e. the parameters with requires_grad\n", "# is True.\n", "params_to_update = model_ft.parameters()\n", "print(\"Params to learn:\")\n", "if feature_extract:\n", " params_to_update = []\n", " for name,param in model_ft.named_parameters():\n", " if param.requires_grad == True:\n", " params_to_update.append(param)\n", " print(\"\\t\",name)\n", "else:\n", " for name,param in model_ft.named_parameters():\n", " if param.requires_grad == True:\n", " print(\"\\t\",name)\n", "\n", "# Observe that all parameters are being optimized\n", "optimizer_ft = optim.SGD(params_to_update, lr=0.001, momentum=0.9)" ] }, { "cell_type": "code", "execution_count": 112, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'train': ,\n", " 'val': }" ] }, "execution_count": 112, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dataloaders_dict" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 0/14\n", "----------\n" ] }, { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;31m# Train and evaluate\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mmodel_ft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhist\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtrain_model\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel_ft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdataloaders_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcriterion\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moptimizer_ft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnum_epochs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnum_epochs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mis_inception\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel_name\u001b[0m\u001b[0;34m==\u001b[0m\u001b[0;34m\"inception\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m\u001b[0m in \u001b[0;36mtrain_model\u001b[0;34m(model, dataloaders, criterion, optimizer, num_epochs, is_inception)\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[0mloss\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mloss1\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m0.4\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mloss2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 70\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 71\u001b[0;31m \u001b[0moutputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 72\u001b[0m \u001b[0mloss\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcriterion\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moutputs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabels\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 73\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/anaconda3/lib/python3.7/site-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m 491\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_slow_forward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 492\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 493\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 494\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mhook\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_forward_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 495\u001b[0m \u001b[0mhook_result\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/anaconda3/lib/python3.7/site-packages/torchvision/models/alexnet.py\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, x)\u001b[0m\n\u001b[1;32m 42\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 43\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 44\u001b[0;31m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfeatures\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 45\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mavgpool\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 46\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mview\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m256\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0;36m6\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/anaconda3/lib/python3.7/site-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m 491\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_slow_forward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 492\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 493\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 494\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mhook\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_forward_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 495\u001b[0m \u001b[0mhook_result\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/anaconda3/lib/python3.7/site-packages/torch/nn/modules/container.py\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, input)\u001b[0m\n\u001b[1;32m 90\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 91\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mmodule\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_modules\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 92\u001b[0;31m \u001b[0minput\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodule\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 93\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 94\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/anaconda3/lib/python3.7/site-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m 491\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_slow_forward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 492\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 493\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 494\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mhook\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_forward_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 495\u001b[0m \u001b[0mhook_result\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/anaconda3/lib/python3.7/site-packages/torch/nn/modules/conv.py\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, input)\u001b[0m\n\u001b[1;32m 336\u001b[0m _pair(0), self.dilation, self.groups)\n\u001b[1;32m 337\u001b[0m return F.conv2d(input, self.weight, self.bias, self.stride,\n\u001b[0;32m--> 338\u001b[0;31m self.padding, self.dilation, self.groups)\n\u001b[0m\u001b[1;32m 339\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 340\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ "# Setup the loss fxn\n", "criterion = nn.CrossEntropyLoss()\n", "\n", "# Train and evaluate\n", "model_ft, hist = train_model(model_ft, dataloaders_dict, criterion, optimizer_ft, num_epochs=num_epochs, is_inception=(model_name==\"inception\"))" ] }, { "cell_type": "code", "execution_count": 213, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 0/14\n", "----------\n", "train Loss: 0.3134 Acc: 0.9094\n", "val Loss: 1.3234 Acc: 0.4613\n", "\n", "Epoch 1/14\n", "----------\n", "train Loss: 0.2211 Acc: 0.9145\n", "val Loss: 1.9410 Acc: 0.4774\n", "\n", "Epoch 2/14\n", "----------\n", "train Loss: 0.2032 Acc: 0.9145\n", "val Loss: 1.3396 Acc: 0.5489\n", "\n", "Epoch 3/14\n", "----------\n", "train Loss: 0.1794 Acc: 0.9145\n", "val Loss: 2.1199 Acc: 0.5168\n", "\n", "Epoch 4/14\n", "----------\n", "train Loss: 0.1408 Acc: 0.9145\n", "val Loss: 1.8238 Acc: 0.5139\n", "\n", "Epoch 5/14\n", "----------\n", "train Loss: 0.1545 Acc: 0.9145\n", "val Loss: 1.4714 Acc: 0.5314\n", "\n", "Epoch 6/14\n", "----------\n", "train Loss: 0.1360 Acc: 0.9152\n", "val Loss: 1.5584 Acc: 0.6438\n", "\n", "Epoch 7/14\n", "----------\n", "train Loss: 0.1201 Acc: 0.9171\n", "val Loss: 2.1923 Acc: 0.5533\n", "\n", "Epoch 8/14\n", "----------\n", "train Loss: 0.1379 Acc: 0.9190\n", "val Loss: 1.4044 Acc: 0.6949\n", "\n", "Epoch 9/14\n", "----------\n", "train Loss: 0.1216 Acc: 0.9184\n", "val Loss: 2.7929 Acc: 0.6628\n", "\n", "Epoch 10/14\n", "----------\n", "train Loss: 0.1295 Acc: 0.9203\n", "val Loss: 1.5944 Acc: 0.7007\n", "\n", "Epoch 11/14\n", "----------\n", "train Loss: 0.1167 Acc: 0.9235\n", "val Loss: 2.3126 Acc: 0.6569\n", "\n", "Epoch 12/14\n", "----------\n", "train Loss: 0.0999 Acc: 0.9261\n", "val Loss: 3.0063 Acc: 0.6788\n", "\n", "Epoch 13/14\n", "----------\n", "train Loss: 0.0934 Acc: 0.9267\n", "val Loss: 4.5230 Acc: 0.6657\n", "\n", "Epoch 14/14\n", "----------\n", "train Loss: 0.0944 Acc: 0.9287\n", "val Loss: 2.5686 Acc: 0.7270\n", "\n", "Training complete in 71m 33s\n", "Best val Acc: 0.727007\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Initialize the non-pretrained version of the model used for this run\n", "scratch_model,_ = initialize_model(model_name, num_classes, feature_extract=False, use_pretrained=False)\n", "scratch_model = scratch_model.to(device)\n", "scratch_optimizer = optim.SGD(scratch_model.parameters(), lr=0.001, momentum=0.9)\n", "scratch_criterion = nn.CrossEntropyLoss()\n", "_,scratch_hist = train_model(scratch_model, dataloaders_dict, scratch_criterion, scratch_optimizer, num_epochs=num_epochs, is_inception=(model_name==\"inception\"))\n", "\n" ] }, { "cell_type": "code", "execution_count": 215, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Plot the training curves of validation accuracy vs. number\n", "# of training epochs for the transfer learning method and\n", "# the model trained from scratch\n", "ohist = []\n", "shist = []\n", "\n", "ohist = [h.cpu().numpy() for h in hist]\n", "shist = [h.cpu().numpy() for h in scratch_hist]\n", "\n", "plt.title(\"Validation F1 score vs. Number of Training Epochs\")\n", "plt.xlabel(\"Training Epochs\")\n", "plt.ylabel(\"Validation F1 score\")\n", "plt.plot(range(1,num_epochs+1),ohist,label=\"Pretrained\")\n", "plt.plot(range(1,num_epochs+1),shist,label=\"Scratch\")\n", "plt.ylim((0,1.))\n", "plt.xticks(np.arange(1, num_epochs+1, 1.0))\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Concat" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### VGGish" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'TRUE'" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import os\n", "os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'\n", "os.environ['KMP_DUPLICATE_LIB_OK']" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import torch" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from kissing_detector import KissingDetector" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "model_name = 'resnet'\n", "num_classes = 2\n", "feature_extract = True" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "kd = KissingDetector(model_name, num_classes, feature_extract)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "KissingDetector(\n", " (conv): ResNet(\n", " (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)\n", " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace)\n", " (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n", " (layer1): Sequential(\n", " (0): BasicBlock(\n", " (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace)\n", " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (1): BasicBlock(\n", " (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace)\n", " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (layer2): Sequential(\n", " (0): BasicBlock(\n", " (conv1): Conv2d(64, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace)\n", " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (downsample): Sequential(\n", " (0): Conv2d(64, 128, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", " (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (1): BasicBlock(\n", " (conv1): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace)\n", " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (layer3): Sequential(\n", " (0): BasicBlock(\n", " (conv1): Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace)\n", " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (downsample): Sequential(\n", " (0): Conv2d(128, 256, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", " (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (1): BasicBlock(\n", " (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace)\n", " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (layer4): Sequential(\n", " (0): BasicBlock(\n", " (conv1): Conv2d(256, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace)\n", " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (downsample): Sequential(\n", " (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", " (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (1): BasicBlock(\n", " (conv1): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace)\n", " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))\n", " (fc): Identity()\n", " )\n", " (vggish): VGGish(\n", " (features): Sequential(\n", " (0): Conv2d(1, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", " (1): ReLU(inplace)\n", " (2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n", " (3): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", " (4): ReLU(inplace)\n", " (5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n", " (6): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", " (7): ReLU(inplace)\n", " (8): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", " (9): ReLU(inplace)\n", " (10): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n", " (11): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", " (12): ReLU(inplace)\n", " (13): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", " (14): ReLU(inplace)\n", " (15): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n", " )\n", " (embeddings): Sequential(\n", " (0): Linear(in_features=12288, out_features=4096, bias=True)\n", " (1): ReLU(inplace)\n", " (2): Linear(in_features=4096, out_features=4096, bias=True)\n", " (3): ReLU(inplace)\n", " (4): Linear(in_features=4096, out_features=128, bias=True)\n", " (5): ReLU(inplace)\n", " )\n", " )\n", " (combined): Linear(in_features=640, out_features=2, bias=True)\n", ")" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "kd" ] }, { "cell_type": "code", "execution_count": 114, "metadata": {}, "outputs": [], "source": [ "from data import AudioVideo" ] }, { "cell_type": "code", "execution_count": 115, "metadata": {}, "outputs": [], "source": [ "av = AudioVideo('x')" ] }, { "cell_type": "code", "execution_count": 118, "metadata": {}, "outputs": [], "source": [ "a, v, c = av[0]" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([[-0.7212, 0.5589]], grad_fn=)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "kd(torch.rand((1, 1, 96, 64)),\n", " torch.rand((1, 3, kd.conv_input_size, kd.conv_input_size)))" ] }, { "cell_type": "code", "execution_count": 120, "metadata": {}, "outputs": [], "source": [ "datasets = {x: AudioVideo(x) for x in ['train', 'val']}" ] }, { "cell_type": "code", "execution_count": 121, "metadata": {}, "outputs": [], "source": [ "dataloaders_dict = {x: torch.utils.data.DataLoader(datasets[x],\n", " batch_size=batch_size,\n", " shuffle=True, num_workers=4)\n", " for x in ['train', 'val']}" ] }, { "cell_type": "code", "execution_count": 122, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 0/14\n", "----------\n" ] }, { "ename": "ValueError", "evalue": "too many values to unpack (expected 2)", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m model_ft, hist = train_model(kd,\n\u001b[1;32m 2\u001b[0m \u001b[0mdataloaders_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcriterion\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moptimizer_ft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnum_epochs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnum_epochs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m is_inception=(model_name == \"inception\"))\n\u001b[0m", "\u001b[0;32m\u001b[0m in \u001b[0;36mtrain_model\u001b[0;34m(model, dataloaders, criterion, optimizer, num_epochs, is_inception)\u001b[0m\n\u001b[1;32m 48\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 49\u001b[0m \u001b[0;31m# Iterate over data.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 50\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabels\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdataloaders\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mphase\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 51\u001b[0m \u001b[0minputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 52\u001b[0m \u001b[0mlabels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlabels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mValueError\u001b[0m: too many values to unpack (expected 2)" ] } ], "source": [ "model_ft, hist = train_model(kd,\n", " dataloaders_dict, criterion, optimizer_ft, num_epochs=num_epochs,\n", " is_inception=(model_name == \"inception\"))\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 119, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([[-0.7130, 0.5764]], grad_fn=)" ] }, "execution_count": 119, "metadata": {}, "output_type": "execute_result" } ], "source": [ "kd(a, v)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# !curl https://raw.githubusercontent.com/IBM/MAX-Audio-Classifier/master/assets/piano.wav --output piano.wav" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "import vggish_input" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "examples = vggish_input.wavfile_to_examples(\"piano.wav\")" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(10, 96, 64)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "examples.shape" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "import soundfile as sf\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "wav_data, sr = sf.read('piano.wav', dtype='int16')" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "samples = wav_data / 32768.0" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(449519, 2)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "samples.shape" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "data = np.mean(wav_data, axis=1)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 5. , 16.5, 29.5, ..., 0. , 0. , 0. ])" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "import vggish_params" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "16000" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vggish_params.SAMPLE_RATE" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "44100" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sr" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(449519,)" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.shape" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "import resampy" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "data = resampy.resample(data, sr, vggish_params.SAMPLE_RATE)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(163090,)" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.shape" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "import torch" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([ 5.4787, 41.1916, 101.0292, ..., 0.0000, 0.0000, 0.0000],\n", " dtype=torch.float64)" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "torch.from_numpy(data)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "examples = vggish_input.wavfile_to_examples(\"piano.wav\")\n", "examples = examples[:,None,:,:] # add dummy dimension for \"channel\"\n", "examples = torch.from_numpy(examples).float() # Convert input example to float rather" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "torch.Size([10, 128])" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "kd.vggish(examples).shape" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 111, "metadata": {}, "outputs": [], "source": [ "a, b, c = convnet_init('resnet', 2, True)" ] }, { "cell_type": "code", "execution_count": 114, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "224" ] }, "execution_count": 114, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b" ] }, { "cell_type": "code", "execution_count": 110, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[autoreload of conv failed: Traceback (most recent call last):\n", " File \"/anaconda3/lib/python3.7/site-packages/IPython/extensions/autoreload.py\", line 244, in check\n", " superreload(m, reload, self.old_objects)\n", " File \"/anaconda3/lib/python3.7/site-packages/IPython/extensions/autoreload.py\", line 376, in superreload\n", " module = reload(module)\n", " File \"/anaconda3/lib/python3.7/imp.py\", line 314, in reload\n", " return importlib.reload(module)\n", " File \"/anaconda3/lib/python3.7/importlib/__init__.py\", line 169, in reload\n", " _bootstrap._exec(spec, module)\n", " File \"\", line 630, in _exec\n", " File \"\", line 724, in exec_module\n", " File \"\", line 860, in get_code\n", " File \"\", line 791, in source_to_code\n", " File \"\", line 219, in _call_with_frames_removed\n", " File \"/Users/aziai/Dropbox/github/cs231n-project/conv.py\", line 28\n", " output_size = model_ft(torch.rand.).shape[0]\n", " ^\n", "SyntaxError: invalid syntax\n", "]\n" ] }, { "data": { "text/plain": [ "512" ] }, "execution_count": 110, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a(torch.rand((5, 3, b, b))).shape[1]" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [], "source": [ "a = dataloaders_dict['train']" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a.batch_sampler" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 0/14\n", "----------\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Traceback (most recent call last):\n", " File \"/anaconda3/lib/python3.7/multiprocessing/queues.py\", line 242, in _feed\n", " send_bytes(obj)\n", " File \"/anaconda3/lib/python3.7/multiprocessing/connection.py\", line 200, in send_bytes\n", " self._send_bytes(m[offset:offset + size])\n", " File \"/anaconda3/lib/python3.7/multiprocessing/connection.py\", line 404, in _send_bytes\n", " self._send(header + buf)\n", " File \"/anaconda3/lib/python3.7/multiprocessing/connection.py\", line 368, in _send\n", " n = write(self._handle, buf)\n", "BrokenPipeError: [Errno 32] Broken pipe\n", "Traceback (most recent call last):\n", " File \"/anaconda3/lib/python3.7/multiprocessing/queues.py\", line 242, in _feed\n", " send_bytes(obj)\n", " File \"/anaconda3/lib/python3.7/multiprocessing/connection.py\", line 200, in send_bytes\n", " self._send_bytes(m[offset:offset + size])\n", " File \"/anaconda3/lib/python3.7/multiprocessing/connection.py\", line 404, in _send_bytes\n", " self._send(header + buf)\n", " File \"/anaconda3/lib/python3.7/multiprocessing/connection.py\", line 368, in _send\n", " n = write(self._handle, buf)\n", "BrokenPipeError: [Errno 32] Broken pipe\n", "Traceback (most recent call last):\n", " File \"/anaconda3/lib/python3.7/multiprocessing/queues.py\", line 242, in _feed\n", " send_bytes(obj)\n", " File \"/anaconda3/lib/python3.7/multiprocessing/connection.py\", line 200, in send_bytes\n", " self._send_bytes(m[offset:offset + size])\n", " File \"/anaconda3/lib/python3.7/multiprocessing/connection.py\", line 404, in _send_bytes\n", " self._send(header + buf)\n", " File \"/anaconda3/lib/python3.7/multiprocessing/connection.py\", line 368, in _send\n", " n = write(self._handle, buf)\n", "BrokenPipeError: [Errno 32] Broken pipe\n", "Traceback (most recent call last):\n", " File \"/anaconda3/lib/python3.7/multiprocessing/queues.py\", line 242, in _feed\n", " send_bytes(obj)\n", " File \"/anaconda3/lib/python3.7/multiprocessing/connection.py\", line 200, in send_bytes\n", " self._send_bytes(m[offset:offset + size])\n", " File \"/anaconda3/lib/python3.7/multiprocessing/connection.py\", line 404, in _send_bytes\n", " self._send(header + buf)\n", " File \"/anaconda3/lib/python3.7/multiprocessing/connection.py\", line 368, in _send\n", " n = write(self._handle, buf)\n", "BrokenPipeError: [Errno 32] Broken pipe\n" ] }, { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0moptimizer_ft\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mnum_epochs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnum_epochs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m is_inception=(model_name==\"inception\"))\n\u001b[0m", "\u001b[0;32m\u001b[0m in \u001b[0;36mtrain_model\u001b[0;34m(model, dataloaders, criterion, optimizer, num_epochs, is_inception)\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[0mloss\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mloss1\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m0.4\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mloss2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 70\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 71\u001b[0;31m \u001b[0moutputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 72\u001b[0m \u001b[0mloss\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcriterion\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moutputs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabels\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 73\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/anaconda3/lib/python3.7/site-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m 491\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_slow_forward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 492\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 493\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 494\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mhook\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_forward_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 495\u001b[0m \u001b[0mhook_result\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/anaconda3/lib/python3.7/site-packages/torchvision/models/squeezenet.py\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, x)\u001b[0m\n\u001b[1;32m 96\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 97\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 98\u001b[0;31m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfeatures\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 99\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclassifier\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 100\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mview\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnum_classes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/anaconda3/lib/python3.7/site-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m 491\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_slow_forward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 492\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 493\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 494\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mhook\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_forward_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 495\u001b[0m \u001b[0mhook_result\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/anaconda3/lib/python3.7/site-packages/torch/nn/modules/container.py\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, input)\u001b[0m\n\u001b[1;32m 90\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 91\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mmodule\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_modules\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 92\u001b[0;31m \u001b[0minput\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodule\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 93\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 94\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/anaconda3/lib/python3.7/site-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m 491\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_slow_forward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 492\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 493\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 494\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mhook\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_forward_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 495\u001b[0m \u001b[0mhook_result\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/anaconda3/lib/python3.7/site-packages/torch/nn/modules/pooling.py\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, input)\u001b[0m\n\u001b[1;32m 144\u001b[0m return F.max_pool2d(input, self.kernel_size, self.stride,\n\u001b[1;32m 145\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpadding\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdilation\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mceil_mode\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 146\u001b[0;31m self.return_indices)\n\u001b[0m\u001b[1;32m 147\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 148\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/anaconda3/lib/python3.7/site-packages/torch/_jit_internal.py\u001b[0m in \u001b[0;36mfn\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 131\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mif_true\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 132\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 133\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mif_false\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 134\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 135\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mif_true\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__doc__\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mif_false\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__doc__\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/anaconda3/lib/python3.7/site-packages/torch/nn/functional.py\u001b[0m in \u001b[0;36m_max_pool2d\u001b[0;34m(input, kernel_size, stride, padding, dilation, ceil_mode, return_indices)\u001b[0m\n\u001b[1;32m 492\u001b[0m \u001b[0mstride\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjit\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mannotate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mint\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 493\u001b[0m return torch.max_pool2d(\n\u001b[0;32m--> 494\u001b[0;31m input, kernel_size, stride, padding, dilation, ceil_mode)\n\u001b[0m\u001b[1;32m 495\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 496\u001b[0m max_pool2d = torch._jit_internal.boolean_dispatch(\n", "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ "# Setup the loss fxn\n", "criterion = nn.CrossEntropyLoss()\n", "\n", "# Train and evaluate\n", "model_ft, hist = train_model(a,\n", " dataloaders_dict,\n", " criterion,\n", " optimizer_ft,\n", " num_epochs=num_epochs,\n", " is_inception=(model_name==\"inception\"))" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "ename": "RuntimeError", "evalue": "shape '[96, 1000]' is invalid for input of size 49152", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mRuntimeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0ma\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrand\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m96\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m7\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m7\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m/anaconda3/lib/python3.7/site-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m 491\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_slow_forward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 492\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 493\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 494\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mhook\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_forward_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 495\u001b[0m \u001b[0mhook_result\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/anaconda3/lib/python3.7/site-packages/torchvision/models/squeezenet.py\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, x)\u001b[0m\n\u001b[1;32m 98\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfeatures\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 99\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclassifier\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 100\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mview\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnum_classes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 101\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 102\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mRuntimeError\u001b[0m: shape '[96, 1000]' is invalid for input of size 49152" ] } ], "source": [ "a(torch.rand((96, 3, 7, 7)))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.2" } }, "nbformat": 4, "nbformat_minor": 2 }