├── .gitignore ├── LICENSE ├── README.md ├── data ├── dummy-dataset │ ├── cat │ │ ├── cat1.jpeg │ │ ├── cat2.jpeg │ │ ├── cat3.jpeg │ │ └── cat4.jpeg │ └── dog │ │ ├── dog1.jpeg │ │ ├── dog2.jpeg │ │ ├── dog3.jpeg │ │ └── dog4.jpeg └── imagenet_class_index.json ├── inflate_densenet.py ├── inflate_resnet.py └── src ├── i3dense.py ├── i3res.py └── inflate.py /.gitignore: -------------------------------------------------------------------------------- 1 | *.swp 2 | *.swn 3 | *.swo 4 | *.swm 5 | 6 | *.lprof 7 | 8 | .cache 9 | __pycache__ 10 | src/__pycache__ 11 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Yana 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Inflated I3D models with ImageNet weight transfer in PyTorch 2 | ============================================================ 3 | 4 | This repo contains several scripts that allow to inflate 2D networks according to the technique described in 5 | the paper [*Quo Vadis, Action Recognition? A New Model and the Kinetics Dataset*](https://arxiv.org/abs/1705.07750) by Joao Carreira and Andrew Zisserman to PyTorch. 6 | 7 | It provides the inflated versions for : 8 | - ResNet 50, ResNet101, ResNet152 9 | - DenseNet 121, DenseNet161, DenseNet169, DenseNet201 10 | 11 | The original (and official!) tensorflow code inflates the inception-v1 network and can be found [here](https://github.com/deepmind/kinetics-i3d/). 12 | 13 | So far this code allows for the inflation of DenseNet and ResNet where the basis block is a Bottleneck block (Resnet >50), and the transfer of 2D ImageNet weights. 14 | 15 | The 3D network is obtained by going through the layers of the 2D network and inflating them one by one. 16 | The utilities for the inflation (which both inflate the layers and transfer the weights) are located in `src/inflate.py`. 17 | 18 | Note that for the ResNet inflation, I use a centered initialization scheme as presented in [*Detect-and-Track: Efficient Pose Estimation in Videos*](https://arxiv.org/abs/1712.09184), where instead of replicating the kernel and scaling the weights by the time dimension (as described in the original I3D paper), I initialize the time-centered slice of the kernel to the 2D weights and the rest to 0. 19 | This allows to obtain (up to numerical differences) the same outputs for the 2D network with the image input and the matching 3D network with 3D inputs (obtained by replicating the 2D image input in the time dimension). 20 | 21 | ## Use it 22 | 23 | To inflate the network and run it on a dummy-dataset with comparison between the final predictions between the original and inflated networks run: 24 | 25 | - For ResNet 101 for instance, run `python inflate_resnet.py --resnet_nb 101` (available for ResNet [50|101|152]) 26 | 27 | - For DenseNet 121 `python inflate_densenet.py --densenet_nb 121` (available for DenseNet [121|161|169|201]) 28 | 29 | 30 | # Profiling 31 | 32 | Forward pass on GeForce GTX TITAN Black (6Giga) GPU with batch-size 2: 33 | 34 | | Network | time (s)| 35 | |-------------|---------| 36 | | ResNet 50 | 0.6 s | 37 | | ResNet 101 | 0.8 s | 38 | | ResNet 152 | 1.1 s | 39 | | DenseNet 121| 2.6 s | 40 | 41 | Forward pass on GeForce GTX TITAN Black (6Giga) GPU with batch-size 1: 42 | 43 | | Network | time (s)| 44 | |-------------|---------| 45 | | ResNet 50 | 0.1s | 46 | | ResNet 101 | 0.3s | 47 | | ResNet 152 | 0.5s | 48 | | DenseNet 121| 1.3 s | 49 | | DenseNet 161| 1.8 s | 50 | | DenseNet 169| 1.5 s | 51 | | DenseNet 201| 1.7 s | 52 | 53 | ## Note 54 | 55 | Another repo with networks pretrained on kinetics is available here [3D-Resnets-Pytorch](https://github.com/kenshohara/3D-ResNets-PyTorch/). 56 | However, it does not transfer the ImageNet weights, which in my experience with inception-v1 did improve the final results. 57 | -------------------------------------------------------------------------------- /data/dummy-dataset/cat/cat1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassony2/inflated_convnets_pytorch/e2e2bf11239f9042e43d594d9f85d54b4f7e4aae/data/dummy-dataset/cat/cat1.jpeg -------------------------------------------------------------------------------- /data/dummy-dataset/cat/cat2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassony2/inflated_convnets_pytorch/e2e2bf11239f9042e43d594d9f85d54b4f7e4aae/data/dummy-dataset/cat/cat2.jpeg -------------------------------------------------------------------------------- /data/dummy-dataset/cat/cat3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassony2/inflated_convnets_pytorch/e2e2bf11239f9042e43d594d9f85d54b4f7e4aae/data/dummy-dataset/cat/cat3.jpeg -------------------------------------------------------------------------------- /data/dummy-dataset/cat/cat4.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassony2/inflated_convnets_pytorch/e2e2bf11239f9042e43d594d9f85d54b4f7e4aae/data/dummy-dataset/cat/cat4.jpeg -------------------------------------------------------------------------------- /data/dummy-dataset/dog/dog1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassony2/inflated_convnets_pytorch/e2e2bf11239f9042e43d594d9f85d54b4f7e4aae/data/dummy-dataset/dog/dog1.jpeg -------------------------------------------------------------------------------- /data/dummy-dataset/dog/dog2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassony2/inflated_convnets_pytorch/e2e2bf11239f9042e43d594d9f85d54b4f7e4aae/data/dummy-dataset/dog/dog2.jpeg -------------------------------------------------------------------------------- /data/dummy-dataset/dog/dog3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassony2/inflated_convnets_pytorch/e2e2bf11239f9042e43d594d9f85d54b4f7e4aae/data/dummy-dataset/dog/dog3.jpeg -------------------------------------------------------------------------------- /data/dummy-dataset/dog/dog4.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassony2/inflated_convnets_pytorch/e2e2bf11239f9042e43d594d9f85d54b4f7e4aae/data/dummy-dataset/dog/dog4.jpeg -------------------------------------------------------------------------------- /data/imagenet_class_index.json: -------------------------------------------------------------------------------- 1 | {"0": ["n01440764", "tench"], "1": ["n01443537", "goldfish"], "2": ["n01484850", "great_white_shark"], "3": ["n01491361", "tiger_shark"], "4": ["n01494475", "hammerhead"], "5": ["n01496331", "electric_ray"], "6": ["n01498041", "stingray"], "7": ["n01514668", "cock"], "8": ["n01514859", "hen"], "9": ["n01518878", "ostrich"], "10": ["n01530575", "brambling"], "11": ["n01531178", "goldfinch"], "12": ["n01532829", "house_finch"], "13": ["n01534433", "junco"], "14": ["n01537544", "indigo_bunting"], "15": ["n01558993", "robin"], "16": ["n01560419", "bulbul"], "17": ["n01580077", "jay"], "18": ["n01582220", "magpie"], "19": ["n01592084", "chickadee"], "20": ["n01601694", "water_ouzel"], "21": ["n01608432", "kite"], "22": ["n01614925", "bald_eagle"], "23": ["n01616318", "vulture"], "24": ["n01622779", "great_grey_owl"], "25": ["n01629819", "European_fire_salamander"], "26": ["n01630670", "common_newt"], "27": ["n01631663", "eft"], "28": ["n01632458", "spotted_salamander"], "29": ["n01632777", "axolotl"], "30": ["n01641577", "bullfrog"], "31": ["n01644373", "tree_frog"], "32": ["n01644900", "tailed_frog"], "33": ["n01664065", "loggerhead"], "34": ["n01665541", "leatherback_turtle"], "35": ["n01667114", "mud_turtle"], "36": ["n01667778", "terrapin"], "37": ["n01669191", "box_turtle"], "38": ["n01675722", "banded_gecko"], "39": ["n01677366", "common_iguana"], "40": ["n01682714", "American_chameleon"], "41": ["n01685808", "whiptail"], "42": ["n01687978", "agama"], "43": ["n01688243", "frilled_lizard"], "44": ["n01689811", "alligator_lizard"], "45": ["n01692333", "Gila_monster"], "46": ["n01693334", "green_lizard"], "47": ["n01694178", "African_chameleon"], "48": ["n01695060", "Komodo_dragon"], "49": ["n01697457", "African_crocodile"], "50": ["n01698640", "American_alligator"], "51": ["n01704323", "triceratops"], "52": ["n01728572", "thunder_snake"], "53": ["n01728920", "ringneck_snake"], "54": ["n01729322", "hognose_snake"], "55": ["n01729977", "green_snake"], "56": ["n01734418", "king_snake"], "57": ["n01735189", "garter_snake"], "58": ["n01737021", "water_snake"], "59": ["n01739381", "vine_snake"], "60": ["n01740131", "night_snake"], "61": ["n01742172", "boa_constrictor"], "62": ["n01744401", "rock_python"], "63": ["n01748264", "Indian_cobra"], "64": ["n01749939", "green_mamba"], "65": ["n01751748", "sea_snake"], "66": ["n01753488", "horned_viper"], "67": ["n01755581", "diamondback"], "68": ["n01756291", "sidewinder"], "69": ["n01768244", "trilobite"], "70": ["n01770081", "harvestman"], "71": ["n01770393", "scorpion"], "72": ["n01773157", "black_and_gold_garden_spider"], "73": ["n01773549", "barn_spider"], "74": ["n01773797", "garden_spider"], "75": ["n01774384", "black_widow"], "76": ["n01774750", "tarantula"], "77": ["n01775062", "wolf_spider"], "78": ["n01776313", "tick"], "79": ["n01784675", "centipede"], "80": ["n01795545", "black_grouse"], "81": ["n01796340", "ptarmigan"], "82": ["n01797886", "ruffed_grouse"], "83": ["n01798484", "prairie_chicken"], "84": ["n01806143", "peacock"], "85": ["n01806567", "quail"], "86": ["n01807496", "partridge"], "87": ["n01817953", "African_grey"], "88": ["n01818515", "macaw"], "89": ["n01819313", "sulphur-crested_cockatoo"], "90": ["n01820546", "lorikeet"], "91": ["n01824575", "coucal"], "92": ["n01828970", "bee_eater"], "93": ["n01829413", "hornbill"], "94": ["n01833805", "hummingbird"], "95": ["n01843065", "jacamar"], "96": ["n01843383", "toucan"], "97": ["n01847000", "drake"], "98": ["n01855032", "red-breasted_merganser"], "99": ["n01855672", "goose"], "100": ["n01860187", "black_swan"], "101": ["n01871265", "tusker"], "102": ["n01872401", "echidna"], "103": ["n01873310", "platypus"], "104": ["n01877812", "wallaby"], "105": ["n01882714", "koala"], "106": ["n01883070", "wombat"], "107": ["n01910747", "jellyfish"], "108": ["n01914609", "sea_anemone"], "109": ["n01917289", "brain_coral"], "110": ["n01924916", "flatworm"], "111": ["n01930112", "nematode"], "112": ["n01943899", "conch"], "113": ["n01944390", "snail"], "114": ["n01945685", "slug"], "115": ["n01950731", "sea_slug"], "116": ["n01955084", "chiton"], "117": ["n01968897", "chambered_nautilus"], "118": ["n01978287", "Dungeness_crab"], "119": ["n01978455", "rock_crab"], "120": ["n01980166", "fiddler_crab"], "121": ["n01981276", "king_crab"], "122": ["n01983481", "American_lobster"], "123": ["n01984695", "spiny_lobster"], "124": ["n01985128", "crayfish"], "125": ["n01986214", "hermit_crab"], "126": ["n01990800", "isopod"], "127": ["n02002556", "white_stork"], "128": ["n02002724", "black_stork"], "129": ["n02006656", "spoonbill"], "130": ["n02007558", "flamingo"], "131": ["n02009229", "little_blue_heron"], "132": ["n02009912", "American_egret"], "133": ["n02011460", "bittern"], "134": ["n02012849", "crane"], "135": ["n02013706", "limpkin"], "136": ["n02017213", "European_gallinule"], "137": ["n02018207", "American_coot"], "138": ["n02018795", "bustard"], "139": ["n02025239", "ruddy_turnstone"], "140": ["n02027492", "red-backed_sandpiper"], "141": ["n02028035", "redshank"], "142": ["n02033041", "dowitcher"], "143": ["n02037110", "oystercatcher"], "144": ["n02051845", "pelican"], "145": ["n02056570", "king_penguin"], "146": ["n02058221", "albatross"], "147": ["n02066245", "grey_whale"], "148": ["n02071294", "killer_whale"], "149": ["n02074367", "dugong"], "150": ["n02077923", "sea_lion"], "151": ["n02085620", "Chihuahua"], "152": ["n02085782", "Japanese_spaniel"], "153": ["n02085936", "Maltese_dog"], "154": ["n02086079", "Pekinese"], "155": ["n02086240", "Shih-Tzu"], "156": ["n02086646", "Blenheim_spaniel"], "157": ["n02086910", "papillon"], "158": ["n02087046", "toy_terrier"], "159": ["n02087394", "Rhodesian_ridgeback"], "160": ["n02088094", "Afghan_hound"], "161": ["n02088238", "basset"], "162": ["n02088364", "beagle"], "163": ["n02088466", "bloodhound"], "164": ["n02088632", "bluetick"], "165": ["n02089078", "black-and-tan_coonhound"], "166": ["n02089867", "Walker_hound"], "167": ["n02089973", "English_foxhound"], "168": ["n02090379", "redbone"], "169": ["n02090622", "borzoi"], "170": ["n02090721", "Irish_wolfhound"], "171": ["n02091032", "Italian_greyhound"], "172": ["n02091134", "whippet"], "173": ["n02091244", "Ibizan_hound"], "174": ["n02091467", "Norwegian_elkhound"], "175": ["n02091635", "otterhound"], "176": ["n02091831", "Saluki"], "177": ["n02092002", "Scottish_deerhound"], "178": ["n02092339", "Weimaraner"], "179": ["n02093256", "Staffordshire_bullterrier"], "180": ["n02093428", "American_Staffordshire_terrier"], "181": ["n02093647", "Bedlington_terrier"], "182": ["n02093754", "Border_terrier"], "183": ["n02093859", "Kerry_blue_terrier"], "184": ["n02093991", "Irish_terrier"], "185": ["n02094114", "Norfolk_terrier"], "186": ["n02094258", "Norwich_terrier"], "187": ["n02094433", "Yorkshire_terrier"], "188": ["n02095314", "wire-haired_fox_terrier"], "189": ["n02095570", "Lakeland_terrier"], "190": ["n02095889", "Sealyham_terrier"], "191": ["n02096051", "Airedale"], "192": ["n02096177", "cairn"], "193": ["n02096294", "Australian_terrier"], "194": ["n02096437", "Dandie_Dinmont"], "195": ["n02096585", "Boston_bull"], "196": ["n02097047", "miniature_schnauzer"], "197": ["n02097130", "giant_schnauzer"], "198": ["n02097209", "standard_schnauzer"], "199": ["n02097298", "Scotch_terrier"], "200": ["n02097474", "Tibetan_terrier"], "201": ["n02097658", "silky_terrier"], "202": ["n02098105", "soft-coated_wheaten_terrier"], "203": ["n02098286", "West_Highland_white_terrier"], "204": ["n02098413", "Lhasa"], "205": ["n02099267", "flat-coated_retriever"], "206": ["n02099429", "curly-coated_retriever"], "207": ["n02099601", "golden_retriever"], "208": ["n02099712", "Labrador_retriever"], "209": ["n02099849", "Chesapeake_Bay_retriever"], "210": ["n02100236", "German_short-haired_pointer"], "211": ["n02100583", "vizsla"], "212": ["n02100735", "English_setter"], "213": ["n02100877", "Irish_setter"], "214": ["n02101006", "Gordon_setter"], "215": ["n02101388", "Brittany_spaniel"], "216": ["n02101556", "clumber"], "217": ["n02102040", "English_springer"], "218": ["n02102177", "Welsh_springer_spaniel"], "219": ["n02102318", "cocker_spaniel"], "220": ["n02102480", "Sussex_spaniel"], "221": ["n02102973", "Irish_water_spaniel"], "222": ["n02104029", "kuvasz"], "223": ["n02104365", "schipperke"], "224": ["n02105056", "groenendael"], "225": ["n02105162", "malinois"], "226": ["n02105251", "briard"], "227": ["n02105412", "kelpie"], "228": ["n02105505", "komondor"], "229": ["n02105641", "Old_English_sheepdog"], "230": ["n02105855", "Shetland_sheepdog"], "231": ["n02106030", "collie"], "232": ["n02106166", "Border_collie"], "233": ["n02106382", "Bouvier_des_Flandres"], "234": ["n02106550", "Rottweiler"], "235": ["n02106662", "German_shepherd"], "236": ["n02107142", "Doberman"], "237": ["n02107312", "miniature_pinscher"], "238": ["n02107574", "Greater_Swiss_Mountain_dog"], "239": ["n02107683", "Bernese_mountain_dog"], "240": ["n02107908", "Appenzeller"], "241": ["n02108000", "EntleBucher"], "242": ["n02108089", "boxer"], "243": ["n02108422", "bull_mastiff"], "244": ["n02108551", "Tibetan_mastiff"], "245": ["n02108915", "French_bulldog"], "246": ["n02109047", "Great_Dane"], "247": ["n02109525", "Saint_Bernard"], "248": ["n02109961", "Eskimo_dog"], "249": ["n02110063", "malamute"], "250": ["n02110185", "Siberian_husky"], "251": ["n02110341", "dalmatian"], "252": ["n02110627", "affenpinscher"], "253": ["n02110806", "basenji"], "254": ["n02110958", "pug"], "255": ["n02111129", "Leonberg"], "256": ["n02111277", "Newfoundland"], "257": ["n02111500", "Great_Pyrenees"], "258": ["n02111889", "Samoyed"], "259": ["n02112018", "Pomeranian"], "260": ["n02112137", "chow"], "261": ["n02112350", "keeshond"], "262": ["n02112706", "Brabancon_griffon"], "263": ["n02113023", "Pembroke"], "264": ["n02113186", "Cardigan"], "265": ["n02113624", "toy_poodle"], "266": ["n02113712", "miniature_poodle"], "267": ["n02113799", "standard_poodle"], "268": ["n02113978", "Mexican_hairless"], "269": ["n02114367", "timber_wolf"], "270": ["n02114548", "white_wolf"], "271": ["n02114712", "red_wolf"], "272": ["n02114855", "coyote"], "273": ["n02115641", "dingo"], "274": ["n02115913", "dhole"], "275": ["n02116738", "African_hunting_dog"], "276": ["n02117135", "hyena"], "277": ["n02119022", "red_fox"], "278": ["n02119789", "kit_fox"], "279": ["n02120079", "Arctic_fox"], "280": ["n02120505", "grey_fox"], "281": ["n02123045", "tabby"], "282": ["n02123159", "tiger_cat"], "283": ["n02123394", "Persian_cat"], "284": ["n02123597", "Siamese_cat"], "285": ["n02124075", "Egyptian_cat"], "286": ["n02125311", "cougar"], "287": ["n02127052", "lynx"], "288": ["n02128385", "leopard"], "289": ["n02128757", "snow_leopard"], "290": ["n02128925", "jaguar"], "291": ["n02129165", "lion"], "292": ["n02129604", "tiger"], "293": ["n02130308", "cheetah"], "294": ["n02132136", "brown_bear"], "295": ["n02133161", "American_black_bear"], "296": ["n02134084", "ice_bear"], "297": ["n02134418", "sloth_bear"], "298": ["n02137549", "mongoose"], "299": ["n02138441", "meerkat"], "300": ["n02165105", "tiger_beetle"], "301": ["n02165456", "ladybug"], "302": ["n02167151", "ground_beetle"], "303": ["n02168699", "long-horned_beetle"], "304": ["n02169497", "leaf_beetle"], "305": ["n02172182", "dung_beetle"], "306": ["n02174001", "rhinoceros_beetle"], "307": ["n02177972", "weevil"], "308": ["n02190166", "fly"], "309": ["n02206856", "bee"], "310": ["n02219486", "ant"], "311": ["n02226429", "grasshopper"], "312": ["n02229544", "cricket"], "313": ["n02231487", "walking_stick"], "314": ["n02233338", "cockroach"], "315": ["n02236044", "mantis"], "316": ["n02256656", "cicada"], "317": ["n02259212", "leafhopper"], "318": ["n02264363", "lacewing"], "319": ["n02268443", "dragonfly"], "320": ["n02268853", "damselfly"], "321": ["n02276258", "admiral"], "322": ["n02277742", "ringlet"], "323": ["n02279972", "monarch"], "324": ["n02280649", "cabbage_butterfly"], "325": ["n02281406", "sulphur_butterfly"], "326": ["n02281787", "lycaenid"], "327": ["n02317335", "starfish"], "328": ["n02319095", "sea_urchin"], "329": ["n02321529", "sea_cucumber"], "330": ["n02325366", "wood_rabbit"], "331": ["n02326432", "hare"], "332": ["n02328150", "Angora"], "333": ["n02342885", "hamster"], "334": ["n02346627", "porcupine"], "335": ["n02356798", "fox_squirrel"], "336": ["n02361337", "marmot"], "337": ["n02363005", "beaver"], "338": ["n02364673", "guinea_pig"], "339": ["n02389026", "sorrel"], "340": ["n02391049", "zebra"], "341": ["n02395406", "hog"], "342": ["n02396427", "wild_boar"], "343": ["n02397096", "warthog"], "344": ["n02398521", "hippopotamus"], "345": ["n02403003", "ox"], "346": ["n02408429", "water_buffalo"], "347": ["n02410509", "bison"], "348": ["n02412080", "ram"], "349": ["n02415577", "bighorn"], "350": ["n02417914", "ibex"], "351": ["n02422106", "hartebeest"], "352": ["n02422699", "impala"], "353": ["n02423022", "gazelle"], "354": ["n02437312", "Arabian_camel"], "355": ["n02437616", "llama"], "356": ["n02441942", "weasel"], "357": ["n02442845", "mink"], "358": ["n02443114", "polecat"], "359": ["n02443484", "black-footed_ferret"], "360": ["n02444819", "otter"], "361": ["n02445715", "skunk"], "362": ["n02447366", "badger"], "363": ["n02454379", "armadillo"], "364": ["n02457408", "three-toed_sloth"], "365": ["n02480495", "orangutan"], "366": ["n02480855", "gorilla"], "367": ["n02481823", "chimpanzee"], "368": ["n02483362", "gibbon"], "369": ["n02483708", "siamang"], "370": ["n02484975", "guenon"], "371": ["n02486261", "patas"], "372": ["n02486410", "baboon"], "373": ["n02487347", "macaque"], "374": ["n02488291", "langur"], "375": ["n02488702", "colobus"], "376": ["n02489166", "proboscis_monkey"], "377": ["n02490219", "marmoset"], "378": ["n02492035", "capuchin"], "379": ["n02492660", "howler_monkey"], "380": ["n02493509", "titi"], "381": ["n02493793", "spider_monkey"], "382": ["n02494079", "squirrel_monkey"], "383": ["n02497673", "Madagascar_cat"], "384": ["n02500267", "indri"], "385": ["n02504013", "Indian_elephant"], "386": ["n02504458", "African_elephant"], "387": ["n02509815", "lesser_panda"], "388": ["n02510455", "giant_panda"], "389": ["n02514041", "barracouta"], "390": ["n02526121", "eel"], "391": ["n02536864", "coho"], "392": ["n02606052", "rock_beauty"], "393": ["n02607072", "anemone_fish"], "394": ["n02640242", "sturgeon"], "395": ["n02641379", "gar"], "396": ["n02643566", "lionfish"], "397": ["n02655020", "puffer"], "398": ["n02666196", "abacus"], "399": ["n02667093", "abaya"], "400": ["n02669723", "academic_gown"], "401": ["n02672831", "accordion"], "402": ["n02676566", "acoustic_guitar"], "403": ["n02687172", "aircraft_carrier"], "404": ["n02690373", "airliner"], "405": ["n02692877", "airship"], "406": ["n02699494", "altar"], "407": ["n02701002", "ambulance"], "408": ["n02704792", "amphibian"], "409": ["n02708093", "analog_clock"], "410": ["n02727426", "apiary"], "411": ["n02730930", "apron"], "412": ["n02747177", "ashcan"], "413": ["n02749479", "assault_rifle"], "414": ["n02769748", "backpack"], "415": ["n02776631", "bakery"], "416": ["n02777292", "balance_beam"], "417": ["n02782093", "balloon"], "418": ["n02783161", "ballpoint"], "419": ["n02786058", "Band_Aid"], "420": ["n02787622", "banjo"], "421": ["n02788148", "bannister"], "422": ["n02790996", "barbell"], "423": ["n02791124", "barber_chair"], "424": ["n02791270", "barbershop"], "425": ["n02793495", "barn"], "426": ["n02794156", "barometer"], "427": ["n02795169", "barrel"], "428": ["n02797295", "barrow"], "429": ["n02799071", "baseball"], "430": ["n02802426", "basketball"], "431": ["n02804414", "bassinet"], "432": ["n02804610", "bassoon"], "433": ["n02807133", "bathing_cap"], "434": ["n02808304", "bath_towel"], "435": ["n02808440", "bathtub"], "436": ["n02814533", "beach_wagon"], "437": ["n02814860", "beacon"], "438": ["n02815834", "beaker"], "439": ["n02817516", "bearskin"], "440": ["n02823428", "beer_bottle"], "441": ["n02823750", "beer_glass"], "442": ["n02825657", "bell_cote"], "443": ["n02834397", "bib"], "444": ["n02835271", "bicycle-built-for-two"], "445": ["n02837789", "bikini"], "446": ["n02840245", "binder"], "447": ["n02841315", "binoculars"], "448": ["n02843684", "birdhouse"], "449": ["n02859443", "boathouse"], "450": ["n02860847", "bobsled"], "451": ["n02865351", "bolo_tie"], "452": ["n02869837", "bonnet"], "453": ["n02870880", "bookcase"], "454": ["n02871525", "bookshop"], "455": ["n02877765", "bottlecap"], "456": ["n02879718", "bow"], "457": ["n02883205", "bow_tie"], "458": ["n02892201", "brass"], "459": ["n02892767", "brassiere"], "460": ["n02894605", "breakwater"], "461": ["n02895154", "breastplate"], "462": ["n02906734", "broom"], "463": ["n02909870", "bucket"], "464": ["n02910353", "buckle"], "465": ["n02916936", "bulletproof_vest"], "466": ["n02917067", "bullet_train"], "467": ["n02927161", "butcher_shop"], "468": ["n02930766", "cab"], "469": ["n02939185", "caldron"], "470": ["n02948072", "candle"], "471": ["n02950826", "cannon"], "472": ["n02951358", "canoe"], "473": ["n02951585", "can_opener"], "474": ["n02963159", "cardigan"], "475": ["n02965783", "car_mirror"], "476": ["n02966193", "carousel"], "477": ["n02966687", "carpenter's_kit"], "478": ["n02971356", "carton"], "479": ["n02974003", "car_wheel"], "480": ["n02977058", "cash_machine"], "481": ["n02978881", "cassette"], "482": ["n02979186", "cassette_player"], "483": ["n02980441", "castle"], "484": ["n02981792", "catamaran"], "485": ["n02988304", "CD_player"], "486": ["n02992211", "cello"], "487": ["n02992529", "cellular_telephone"], "488": ["n02999410", "chain"], "489": ["n03000134", "chainlink_fence"], "490": ["n03000247", "chain_mail"], "491": ["n03000684", "chain_saw"], "492": ["n03014705", "chest"], "493": ["n03016953", "chiffonier"], "494": ["n03017168", "chime"], "495": ["n03018349", "china_cabinet"], "496": ["n03026506", "Christmas_stocking"], "497": ["n03028079", "church"], "498": ["n03032252", "cinema"], "499": ["n03041632", "cleaver"], "500": ["n03042490", "cliff_dwelling"], "501": ["n03045698", "cloak"], "502": ["n03047690", "clog"], "503": ["n03062245", "cocktail_shaker"], "504": ["n03063599", "coffee_mug"], "505": ["n03063689", "coffeepot"], "506": ["n03065424", "coil"], "507": ["n03075370", "combination_lock"], "508": ["n03085013", "computer_keyboard"], "509": ["n03089624", "confectionery"], "510": ["n03095699", "container_ship"], "511": ["n03100240", "convertible"], "512": ["n03109150", "corkscrew"], "513": ["n03110669", "cornet"], "514": ["n03124043", "cowboy_boot"], "515": ["n03124170", "cowboy_hat"], "516": ["n03125729", "cradle"], "517": ["n03126707", "crane"], "518": ["n03127747", "crash_helmet"], "519": ["n03127925", "crate"], "520": ["n03131574", "crib"], "521": ["n03133878", "Crock_Pot"], "522": ["n03134739", "croquet_ball"], "523": ["n03141823", "crutch"], "524": ["n03146219", "cuirass"], "525": ["n03160309", "dam"], "526": ["n03179701", "desk"], "527": ["n03180011", "desktop_computer"], "528": ["n03187595", "dial_telephone"], "529": ["n03188531", "diaper"], "530": ["n03196217", "digital_clock"], "531": ["n03197337", "digital_watch"], "532": ["n03201208", "dining_table"], "533": ["n03207743", "dishrag"], "534": ["n03207941", "dishwasher"], "535": ["n03208938", "disk_brake"], "536": ["n03216828", "dock"], "537": ["n03218198", "dogsled"], "538": ["n03220513", "dome"], "539": ["n03223299", "doormat"], "540": ["n03240683", "drilling_platform"], "541": ["n03249569", "drum"], "542": ["n03250847", "drumstick"], "543": ["n03255030", "dumbbell"], "544": ["n03259280", "Dutch_oven"], "545": ["n03271574", "electric_fan"], "546": ["n03272010", "electric_guitar"], "547": ["n03272562", "electric_locomotive"], "548": ["n03290653", "entertainment_center"], "549": ["n03291819", "envelope"], "550": ["n03297495", "espresso_maker"], "551": ["n03314780", "face_powder"], "552": ["n03325584", "feather_boa"], "553": ["n03337140", "file"], "554": ["n03344393", "fireboat"], "555": ["n03345487", "fire_engine"], "556": ["n03347037", "fire_screen"], "557": ["n03355925", "flagpole"], "558": ["n03372029", "flute"], "559": ["n03376595", "folding_chair"], "560": ["n03379051", "football_helmet"], "561": ["n03384352", "forklift"], "562": ["n03388043", "fountain"], "563": ["n03388183", "fountain_pen"], "564": ["n03388549", "four-poster"], "565": ["n03393912", "freight_car"], "566": ["n03394916", "French_horn"], "567": ["n03400231", "frying_pan"], "568": ["n03404251", "fur_coat"], "569": ["n03417042", "garbage_truck"], "570": ["n03424325", "gasmask"], "571": ["n03425413", "gas_pump"], "572": ["n03443371", "goblet"], "573": ["n03444034", "go-kart"], "574": ["n03445777", "golf_ball"], "575": ["n03445924", "golfcart"], "576": ["n03447447", "gondola"], "577": ["n03447721", "gong"], "578": ["n03450230", "gown"], "579": ["n03452741", "grand_piano"], "580": ["n03457902", "greenhouse"], "581": ["n03459775", "grille"], "582": ["n03461385", "grocery_store"], "583": ["n03467068", "guillotine"], "584": ["n03476684", "hair_slide"], "585": ["n03476991", "hair_spray"], "586": ["n03478589", "half_track"], "587": ["n03481172", "hammer"], "588": ["n03482405", "hamper"], "589": ["n03483316", "hand_blower"], "590": ["n03485407", "hand-held_computer"], "591": ["n03485794", "handkerchief"], "592": ["n03492542", "hard_disc"], "593": ["n03494278", "harmonica"], "594": ["n03495258", "harp"], "595": ["n03496892", "harvester"], "596": ["n03498962", "hatchet"], "597": ["n03527444", "holster"], "598": ["n03529860", "home_theater"], "599": ["n03530642", "honeycomb"], "600": ["n03532672", "hook"], "601": ["n03534580", "hoopskirt"], "602": ["n03535780", "horizontal_bar"], "603": ["n03538406", "horse_cart"], "604": ["n03544143", "hourglass"], "605": ["n03584254", "iPod"], "606": ["n03584829", "iron"], "607": ["n03590841", "jack-o'-lantern"], "608": ["n03594734", "jean"], "609": ["n03594945", "jeep"], "610": ["n03595614", "jersey"], "611": ["n03598930", "jigsaw_puzzle"], "612": ["n03599486", "jinrikisha"], "613": ["n03602883", "joystick"], "614": ["n03617480", "kimono"], "615": ["n03623198", "knee_pad"], "616": ["n03627232", "knot"], "617": ["n03630383", "lab_coat"], "618": ["n03633091", "ladle"], "619": ["n03637318", "lampshade"], "620": ["n03642806", "laptop"], "621": ["n03649909", "lawn_mower"], "622": ["n03657121", "lens_cap"], "623": ["n03658185", "letter_opener"], "624": ["n03661043", "library"], "625": ["n03662601", "lifeboat"], "626": ["n03666591", "lighter"], "627": ["n03670208", "limousine"], "628": ["n03673027", "liner"], "629": ["n03676483", "lipstick"], "630": ["n03680355", "Loafer"], "631": ["n03690938", "lotion"], "632": ["n03691459", "loudspeaker"], "633": ["n03692522", "loupe"], "634": ["n03697007", "lumbermill"], "635": ["n03706229", "magnetic_compass"], "636": ["n03709823", "mailbag"], "637": ["n03710193", "mailbox"], "638": ["n03710637", "maillot"], "639": ["n03710721", "maillot"], "640": ["n03717622", "manhole_cover"], "641": ["n03720891", "maraca"], "642": ["n03721384", "marimba"], "643": ["n03724870", "mask"], "644": ["n03729826", "matchstick"], "645": ["n03733131", "maypole"], "646": ["n03733281", "maze"], "647": ["n03733805", "measuring_cup"], "648": ["n03742115", "medicine_chest"], "649": ["n03743016", "megalith"], "650": ["n03759954", "microphone"], "651": ["n03761084", "microwave"], "652": ["n03763968", "military_uniform"], "653": ["n03764736", "milk_can"], "654": ["n03769881", "minibus"], "655": ["n03770439", "miniskirt"], "656": ["n03770679", "minivan"], "657": ["n03773504", "missile"], "658": ["n03775071", "mitten"], "659": ["n03775546", "mixing_bowl"], "660": ["n03776460", "mobile_home"], "661": ["n03777568", "Model_T"], "662": ["n03777754", "modem"], "663": ["n03781244", "monastery"], "664": ["n03782006", "monitor"], "665": ["n03785016", "moped"], "666": ["n03786901", "mortar"], "667": ["n03787032", "mortarboard"], "668": ["n03788195", "mosque"], "669": ["n03788365", "mosquito_net"], "670": ["n03791053", "motor_scooter"], "671": ["n03792782", "mountain_bike"], "672": ["n03792972", "mountain_tent"], "673": ["n03793489", "mouse"], "674": ["n03794056", "mousetrap"], "675": ["n03796401", "moving_van"], "676": ["n03803284", "muzzle"], "677": ["n03804744", "nail"], "678": ["n03814639", "neck_brace"], "679": ["n03814906", "necklace"], "680": ["n03825788", "nipple"], "681": ["n03832673", "notebook"], "682": ["n03837869", "obelisk"], "683": ["n03838899", "oboe"], "684": ["n03840681", "ocarina"], "685": ["n03841143", "odometer"], "686": ["n03843555", "oil_filter"], "687": ["n03854065", "organ"], "688": ["n03857828", "oscilloscope"], "689": ["n03866082", "overskirt"], "690": ["n03868242", "oxcart"], "691": ["n03868863", "oxygen_mask"], "692": ["n03871628", "packet"], "693": ["n03873416", "paddle"], "694": ["n03874293", "paddlewheel"], "695": ["n03874599", "padlock"], "696": ["n03876231", "paintbrush"], "697": ["n03877472", "pajama"], "698": ["n03877845", "palace"], "699": ["n03884397", "panpipe"], "700": ["n03887697", "paper_towel"], "701": ["n03888257", "parachute"], "702": ["n03888605", "parallel_bars"], "703": ["n03891251", "park_bench"], "704": ["n03891332", "parking_meter"], "705": ["n03895866", "passenger_car"], "706": ["n03899768", "patio"], "707": ["n03902125", "pay-phone"], "708": ["n03903868", "pedestal"], "709": ["n03908618", "pencil_box"], "710": ["n03908714", "pencil_sharpener"], "711": ["n03916031", "perfume"], "712": ["n03920288", "Petri_dish"], "713": ["n03924679", "photocopier"], "714": ["n03929660", "pick"], "715": ["n03929855", "pickelhaube"], "716": ["n03930313", "picket_fence"], "717": ["n03930630", "pickup"], "718": ["n03933933", "pier"], "719": ["n03935335", "piggy_bank"], "720": ["n03937543", "pill_bottle"], "721": ["n03938244", "pillow"], "722": ["n03942813", "ping-pong_ball"], "723": ["n03944341", "pinwheel"], "724": ["n03947888", "pirate"], "725": ["n03950228", "pitcher"], "726": ["n03954731", "plane"], "727": ["n03956157", "planetarium"], "728": ["n03958227", "plastic_bag"], "729": ["n03961711", "plate_rack"], "730": ["n03967562", "plow"], "731": ["n03970156", "plunger"], "732": ["n03976467", "Polaroid_camera"], "733": ["n03976657", "pole"], "734": ["n03977966", "police_van"], "735": ["n03980874", "poncho"], "736": ["n03982430", "pool_table"], "737": ["n03983396", "pop_bottle"], "738": ["n03991062", "pot"], "739": ["n03992509", "potter's_wheel"], "740": ["n03995372", "power_drill"], "741": ["n03998194", "prayer_rug"], "742": ["n04004767", "printer"], "743": ["n04005630", "prison"], "744": ["n04008634", "projectile"], "745": ["n04009552", "projector"], "746": ["n04019541", "puck"], "747": ["n04023962", "punching_bag"], "748": ["n04026417", "purse"], "749": ["n04033901", "quill"], "750": ["n04033995", "quilt"], "751": ["n04037443", "racer"], "752": ["n04039381", "racket"], "753": ["n04040759", "radiator"], "754": ["n04041544", "radio"], "755": ["n04044716", "radio_telescope"], "756": ["n04049303", "rain_barrel"], "757": ["n04065272", "recreational_vehicle"], "758": ["n04067472", "reel"], "759": ["n04069434", "reflex_camera"], "760": ["n04070727", "refrigerator"], "761": ["n04074963", "remote_control"], "762": ["n04081281", "restaurant"], "763": ["n04086273", "revolver"], "764": ["n04090263", "rifle"], "765": ["n04099969", "rocking_chair"], "766": ["n04111531", "rotisserie"], "767": ["n04116512", "rubber_eraser"], "768": ["n04118538", "rugby_ball"], "769": ["n04118776", "rule"], "770": ["n04120489", "running_shoe"], "771": ["n04125021", "safe"], "772": ["n04127249", "safety_pin"], "773": ["n04131690", "saltshaker"], "774": ["n04133789", "sandal"], "775": ["n04136333", "sarong"], "776": ["n04141076", "sax"], "777": ["n04141327", "scabbard"], "778": ["n04141975", "scale"], "779": ["n04146614", "school_bus"], "780": ["n04147183", "schooner"], "781": ["n04149813", "scoreboard"], "782": ["n04152593", "screen"], "783": ["n04153751", "screw"], "784": ["n04154565", "screwdriver"], "785": ["n04162706", "seat_belt"], "786": ["n04179913", "sewing_machine"], "787": ["n04192698", "shield"], "788": ["n04200800", "shoe_shop"], "789": ["n04201297", "shoji"], "790": ["n04204238", "shopping_basket"], "791": ["n04204347", "shopping_cart"], "792": ["n04208210", "shovel"], "793": ["n04209133", "shower_cap"], "794": ["n04209239", "shower_curtain"], "795": ["n04228054", "ski"], "796": ["n04229816", "ski_mask"], "797": ["n04235860", "sleeping_bag"], "798": ["n04238763", "slide_rule"], "799": ["n04239074", "sliding_door"], "800": ["n04243546", "slot"], "801": ["n04251144", "snorkel"], "802": ["n04252077", "snowmobile"], "803": ["n04252225", "snowplow"], "804": ["n04254120", "soap_dispenser"], "805": ["n04254680", "soccer_ball"], "806": ["n04254777", "sock"], "807": ["n04258138", "solar_dish"], "808": ["n04259630", "sombrero"], "809": ["n04263257", "soup_bowl"], "810": ["n04264628", "space_bar"], "811": ["n04265275", "space_heater"], "812": ["n04266014", "space_shuttle"], "813": ["n04270147", "spatula"], "814": ["n04273569", "speedboat"], "815": ["n04275548", "spider_web"], "816": ["n04277352", "spindle"], "817": ["n04285008", "sports_car"], "818": ["n04286575", "spotlight"], "819": ["n04296562", "stage"], "820": ["n04310018", "steam_locomotive"], "821": ["n04311004", "steel_arch_bridge"], "822": ["n04311174", "steel_drum"], "823": ["n04317175", "stethoscope"], "824": ["n04325704", "stole"], "825": ["n04326547", "stone_wall"], "826": ["n04328186", "stopwatch"], "827": ["n04330267", "stove"], "828": ["n04332243", "strainer"], "829": ["n04335435", "streetcar"], "830": ["n04336792", "stretcher"], "831": ["n04344873", "studio_couch"], "832": ["n04346328", "stupa"], "833": ["n04347754", "submarine"], "834": ["n04350905", "suit"], "835": ["n04355338", "sundial"], "836": ["n04355933", "sunglass"], "837": ["n04356056", "sunglasses"], "838": ["n04357314", "sunscreen"], "839": ["n04366367", "suspension_bridge"], "840": ["n04367480", "swab"], "841": ["n04370456", "sweatshirt"], "842": ["n04371430", "swimming_trunks"], "843": ["n04371774", "swing"], "844": ["n04372370", "switch"], "845": ["n04376876", "syringe"], "846": ["n04380533", "table_lamp"], "847": ["n04389033", "tank"], "848": ["n04392985", "tape_player"], "849": ["n04398044", "teapot"], "850": ["n04399382", "teddy"], "851": ["n04404412", "television"], "852": ["n04409515", "tennis_ball"], "853": ["n04417672", "thatch"], "854": ["n04418357", "theater_curtain"], "855": ["n04423845", "thimble"], "856": ["n04428191", "thresher"], "857": ["n04429376", "throne"], "858": ["n04435653", "tile_roof"], "859": ["n04442312", "toaster"], "860": ["n04443257", "tobacco_shop"], "861": ["n04447861", "toilet_seat"], "862": ["n04456115", "torch"], "863": ["n04458633", "totem_pole"], "864": ["n04461696", "tow_truck"], "865": ["n04462240", "toyshop"], "866": ["n04465501", "tractor"], "867": ["n04467665", "trailer_truck"], "868": ["n04476259", "tray"], "869": ["n04479046", "trench_coat"], "870": ["n04482393", "tricycle"], "871": ["n04483307", "trimaran"], "872": ["n04485082", "tripod"], "873": ["n04486054", "triumphal_arch"], "874": ["n04487081", "trolleybus"], "875": ["n04487394", "trombone"], "876": ["n04493381", "tub"], "877": ["n04501370", "turnstile"], "878": ["n04505470", "typewriter_keyboard"], "879": ["n04507155", "umbrella"], "880": ["n04509417", "unicycle"], "881": ["n04515003", "upright"], "882": ["n04517823", "vacuum"], "883": ["n04522168", "vase"], "884": ["n04523525", "vault"], "885": ["n04525038", "velvet"], "886": ["n04525305", "vending_machine"], "887": ["n04532106", "vestment"], "888": ["n04532670", "viaduct"], "889": ["n04536866", "violin"], "890": ["n04540053", "volleyball"], "891": ["n04542943", "waffle_iron"], "892": ["n04548280", "wall_clock"], "893": ["n04548362", "wallet"], "894": ["n04550184", "wardrobe"], "895": ["n04552348", "warplane"], "896": ["n04553703", "washbasin"], "897": ["n04554684", "washer"], "898": ["n04557648", "water_bottle"], "899": ["n04560804", "water_jug"], "900": ["n04562935", "water_tower"], "901": ["n04579145", "whiskey_jug"], "902": ["n04579432", "whistle"], "903": ["n04584207", "wig"], "904": ["n04589890", "window_screen"], "905": ["n04590129", "window_shade"], "906": ["n04591157", "Windsor_tie"], "907": ["n04591713", "wine_bottle"], "908": ["n04592741", "wing"], "909": ["n04596742", "wok"], "910": ["n04597913", "wooden_spoon"], "911": ["n04599235", "wool"], "912": ["n04604644", "worm_fence"], "913": ["n04606251", "wreck"], "914": ["n04612504", "yawl"], "915": ["n04613696", "yurt"], "916": ["n06359193", "web_site"], "917": ["n06596364", "comic_book"], "918": ["n06785654", "crossword_puzzle"], "919": ["n06794110", "street_sign"], "920": ["n06874185", "traffic_light"], "921": ["n07248320", "book_jacket"], "922": ["n07565083", "menu"], "923": ["n07579787", "plate"], "924": ["n07583066", "guacamole"], "925": ["n07584110", "consomme"], "926": ["n07590611", "hot_pot"], "927": ["n07613480", "trifle"], "928": ["n07614500", "ice_cream"], "929": ["n07615774", "ice_lolly"], "930": ["n07684084", "French_loaf"], "931": ["n07693725", "bagel"], "932": ["n07695742", "pretzel"], "933": ["n07697313", "cheeseburger"], "934": ["n07697537", "hotdog"], "935": ["n07711569", "mashed_potato"], "936": ["n07714571", "head_cabbage"], "937": ["n07714990", "broccoli"], "938": ["n07715103", "cauliflower"], "939": ["n07716358", "zucchini"], "940": ["n07716906", "spaghetti_squash"], "941": ["n07717410", "acorn_squash"], "942": ["n07717556", "butternut_squash"], "943": ["n07718472", "cucumber"], "944": ["n07718747", "artichoke"], "945": ["n07720875", "bell_pepper"], "946": ["n07730033", "cardoon"], "947": ["n07734744", "mushroom"], "948": ["n07742313", "Granny_Smith"], "949": ["n07745940", "strawberry"], "950": ["n07747607", "orange"], "951": ["n07749582", "lemon"], "952": ["n07753113", "fig"], "953": ["n07753275", "pineapple"], "954": ["n07753592", "banana"], "955": ["n07754684", "jackfruit"], "956": ["n07760859", "custard_apple"], "957": ["n07768694", "pomegranate"], "958": ["n07802026", "hay"], "959": ["n07831146", "carbonara"], "960": ["n07836838", "chocolate_sauce"], "961": ["n07860988", "dough"], "962": ["n07871810", "meat_loaf"], "963": ["n07873807", "pizza"], "964": ["n07875152", "potpie"], "965": ["n07880968", "burrito"], "966": ["n07892512", "red_wine"], "967": ["n07920052", "espresso"], "968": ["n07930864", "cup"], "969": ["n07932039", "eggnog"], "970": ["n09193705", "alp"], "971": ["n09229709", "bubble"], "972": ["n09246464", "cliff"], "973": ["n09256479", "coral_reef"], "974": ["n09288635", "geyser"], "975": ["n09332890", "lakeside"], "976": ["n09399592", "promontory"], "977": ["n09421951", "sandbar"], "978": ["n09428293", "seashore"], "979": ["n09468604", "valley"], "980": ["n09472597", "volcano"], "981": ["n09835506", "ballplayer"], "982": ["n10148035", "groom"], "983": ["n10565667", "scuba_diver"], "984": ["n11879895", "rapeseed"], "985": ["n11939491", "daisy"], "986": ["n12057211", "yellow_lady's_slipper"], "987": ["n12144580", "corn"], "988": ["n12267677", "acorn"], "989": ["n12620546", "hip"], "990": ["n12768682", "buckeye"], "991": ["n12985857", "coral_fungus"], "992": ["n12998815", "agaric"], "993": ["n13037406", "gyromitra"], "994": ["n13040303", "stinkhorn"], "995": ["n13044778", "earthstar"], "996": ["n13052670", "hen-of-the-woods"], "997": ["n13054560", "bolete"], "998": ["n13133613", "ear"], "999": ["n15075141", "toilet_tissue"]} -------------------------------------------------------------------------------- /inflate_densenet.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import copy 3 | import json 4 | 5 | from matplotlib import pyplot as plt 6 | import torch 7 | import torchvision 8 | import torchvision.transforms as transforms 9 | import torchvision.datasets as datasets 10 | 11 | from src.i3dense import I3DenseNet 12 | 13 | 14 | # To profile uncomment @profile and run `kernprof -lv inflate_densenet.py` 15 | # @profile 16 | def run_inflater(args): 17 | normalize = transforms.Normalize( 18 | mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) 19 | dataset = datasets.ImageFolder('data/dummy-dataset', 20 | transforms.Compose([ 21 | transforms.CenterCrop(224), 22 | transforms.RandomHorizontalFlip(), 23 | transforms.ToTensor(), 24 | normalize, 25 | ])) 26 | 27 | class_idx = json.load(open('data/imagenet_class_index.json')) 28 | imagenet_classes = [class_idx[str(k)][1] for k in range(len(class_idx))] 29 | 30 | if args.densenet_nb == 121: 31 | densenet = torchvision.models.densenet121(pretrained=True) 32 | elif args.densenet_nb == 161: 33 | densenet = torchvision.models.densenet161(pretrained=True) 34 | elif args.densenet_nb == 169: 35 | densenet = torchvision.models.densenet169(pretrained=True) 36 | elif args.densenet_nb == 201: 37 | densenet = torchvision.models.densenet201(pretrained=True) 38 | else: 39 | raise ValueError('densenet_nb should be in [50|101|152] but got {}' 40 | ).format(args.densenet_nb) 41 | 42 | loader = torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=False) 43 | i3densenet = I3DenseNet( 44 | copy.deepcopy(densenet), args.frame_nb, inflate_block_convs=True) 45 | i3densenet.train() 46 | i3densenet.cuda() 47 | 48 | for i, (input_2d, target) in enumerate(loader): 49 | target = target.cuda() 50 | target_var = torch.autograd.Variable(target) 51 | input_2d_var = torch.autograd.Variable(input_2d) 52 | out2d = densenet(input_2d_var) 53 | 54 | input_3d = input_2d.unsqueeze(2).repeat(1, 1, args.frame_nb, 1, 1) 55 | input_3d_var = torch.autograd.Variable(input_3d.cuda()) 56 | 57 | out3d = i3densenet(input_3d_var) 58 | out_diff = out2d.data - out3d.cpu().data 59 | 60 | # Computing errors between final predictions of inflated and uninflated 61 | # dense networks 62 | print( 63 | 'Batch {i} maximum error between 2d and inflated predictions: {err}'. 64 | format(i=i, err=out_diff.max())) 65 | assert (out_diff.max() < 0.0001) 66 | 67 | if args.display_samples: 68 | max_vals, max_indexes = out3d.max(1) 69 | for sample_idx in range(out3d.shape[0]): 70 | sample_out = out3d.data[sample_idx] 71 | 72 | top_val, top_idx = torch.sort(sample_out, 0, descending=True) 73 | 74 | print('Top {} classes and associated scores: '.format( 75 | args.top_k)) 76 | for i in range(args.top_k): 77 | print('[{}]: {}'.format(imagenet_classes[top_idx[i]], 78 | top_val[i])) 79 | 80 | sample_img = input_2d[sample_idx].numpy().transpose(1, 2, 0) 81 | sample_img = (sample_img - sample_img.min()) * (1 / ( 82 | sample_img.max() - sample_img.min())) 83 | plt.imshow(sample_img) 84 | plt.show() 85 | 86 | 87 | if __name__ == "__main__": 88 | parser = argparse.ArgumentParser( 89 | 'Inflates the 121 version of densenet and runs\ 90 | it on dummy dataset to compare outputs from original and inflated networks\ 91 | (should be the same)') 92 | parser.add_argument( 93 | '--densenet_nb', 94 | type=int, 95 | default=121, 96 | help='What version of ResNet to use, in [121|161|169|201]') 97 | parser.add_argument( 98 | '--display_samples', 99 | action='store_true', 100 | help='Whether to display samples and associated\ 101 | scores for 3d inflated densenet') 102 | parser.add_argument( 103 | '--top_k', 104 | type=int, 105 | default='5', 106 | help='When display_samples, number of top classes to display') 107 | parser.add_argument( 108 | '--frame_nb', 109 | type=int, 110 | default='8', 111 | help='Number of video_frames to use (should be a multiple of 8)') 112 | args = parser.parse_args() 113 | run_inflater(args) 114 | -------------------------------------------------------------------------------- /inflate_resnet.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import copy 3 | import json 4 | 5 | from matplotlib import pyplot as plt 6 | import torch 7 | import torchvision 8 | import torchvision.transforms as transforms 9 | import torchvision.datasets as datasets 10 | 11 | from src.i3res import I3ResNet 12 | 13 | 14 | # To profile uncomment @profile and run `kernprof -lv inflate_resnet.py` 15 | # @profile 16 | def run_inflater(args): 17 | normalize = transforms.Normalize( 18 | mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) 19 | dataset = datasets.ImageFolder('data/dummy-dataset', 20 | transforms.Compose([ 21 | transforms.CenterCrop(224), 22 | transforms.RandomHorizontalFlip(), 23 | transforms.ToTensor(), 24 | normalize, 25 | ])) 26 | 27 | class_idx = json.load(open('data/imagenet_class_index.json')) 28 | imagenet_classes = [class_idx[str(k)][1] for k in range(len(class_idx))] 29 | 30 | if args.resnet_nb == 50: 31 | resnet = torchvision.models.resnet50(pretrained=True) 32 | elif args.resnet_nb == 101: 33 | resnet = torchvision.models.resnet101(pretrained=True) 34 | elif args.resnet_nb == 152: 35 | resnet = torchvision.models.resnet152(pretrained=True) 36 | else: 37 | raise ValueError('resnet_nb should be in [50|101|152] but got {}' 38 | ).format(args.resnet_nb) 39 | 40 | loader = torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=False) 41 | i3resnet = I3ResNet(copy.deepcopy(resnet), args.frame_nb) 42 | i3resnet.train() 43 | device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") 44 | i3resnet = i3resnet.to(device) 45 | resnet = resnet.to(device) 46 | 47 | for i, (input_2d, target) in enumerate(loader): 48 | target = target.to(device) 49 | target_var = torch.autograd.Variable(target) 50 | input_2d_var = torch.autograd.Variable(input_2d.to(device)) 51 | 52 | out2d = resnet(input_2d_var) 53 | out2d = out2d.cpu().data 54 | 55 | input_3d = input_2d.unsqueeze(2).repeat(1, 1, args.frame_nb, 1, 1) 56 | input_3d_var = torch.autograd.Variable(input_3d.to(device)) 57 | 58 | out3d = i3resnet(input_3d_var) 59 | out3d = out3d.cpu().data 60 | 61 | out_diff = out2d - out3d 62 | print('mean abs error {}'.format(out_diff.abs().mean())) 63 | print('mean abs val {}'.format(out2d.abs().mean())) 64 | 65 | # Computing errors between final predictions of inflated and uninflated 66 | # dense networks 67 | print( 68 | 'Batch {i} maximum error between 2d and inflated predictions: {err}'. 69 | format(i=i, err=out_diff.max())) 70 | assert (out_diff.max() < 0.0001) 71 | 72 | if args.display_samples: 73 | max_vals, max_indexes = out3d.max(1) 74 | for sample_idx in range(out3d.shape[0]): 75 | sample_out = out3d[sample_idx] 76 | 77 | top_val, top_idx = torch.sort(sample_out, 0, descending=True) 78 | 79 | print('Top {} classes and associated scores: '.format( 80 | args.top_k)) 81 | for i in range(args.top_k): 82 | print('[{}]: {}'.format(imagenet_classes[top_idx[i]], 83 | top_val[i])) 84 | 85 | sample_img = input_2d[sample_idx].numpy().transpose(1, 2, 0) 86 | sample_img = (sample_img - sample_img.min()) * (1 / ( 87 | sample_img.max() - sample_img.min())) 88 | plt.imshow(sample_img) 89 | plt.show() 90 | 91 | 92 | if __name__ == "__main__": 93 | parser = argparse.ArgumentParser('Inflates ResNet and runs\ 94 | it on dummy dataset to compare outputs from original and inflated networks\ 95 | (should be the same)') 96 | parser.add_argument( 97 | '--resnet_nb', 98 | type=int, 99 | default=50, 100 | help='What version of ResNet to use, in [50|101|152]') 101 | parser.add_argument( 102 | '--display_samples', 103 | action='store_true', 104 | help='Whether to display samples and associated\ 105 | scores for 3d inflated resnet') 106 | parser.add_argument( 107 | '--top_k', 108 | type=int, 109 | default='5', 110 | help='When display_samples, number of top classes to display') 111 | parser.add_argument( 112 | '--frame_nb', 113 | type=int, 114 | default='16', 115 | help='Number of video_frames to use (should be a multiple of 8)') 116 | args = parser.parse_args() 117 | run_inflater(args) 118 | -------------------------------------------------------------------------------- /src/i3dense.py: -------------------------------------------------------------------------------- 1 | import math 2 | 3 | import torch 4 | import torch.nn.functional as F 5 | from torch.nn import ReplicationPad3d 6 | import torchvision 7 | 8 | from src import inflate 9 | 10 | 11 | class I3DenseNet(torch.nn.Module): 12 | def __init__(self, densenet2d, frame_nb, inflate_block_convs=False): 13 | super(I3DenseNet, self).__init__() 14 | self.frame_nb = frame_nb 15 | self.features, transition_nb = inflate_features( 16 | densenet2d.features, inflate_block_convs=inflate_block_convs) 17 | self.final_time_dim = frame_nb // int(math.pow( 18 | 2, 19 | transition_nb)) # time_dim is divided by two for each transition 20 | self.final_layer_nb = densenet2d.classifier.in_features 21 | self.classifier = inflate.inflate_linear(densenet2d.classifier, 22 | self.final_time_dim) 23 | 24 | def forward(self, inp): 25 | features = self.features(inp) 26 | out = torch.nn.functional.relu(features) 27 | out = torch.nn.functional.avg_pool3d(out, kernel_size=(1, 7, 7)) 28 | out = out.permute(0, 2, 1, 3, 4).contiguous().view( 29 | -1, self.final_time_dim * self.final_layer_nb) 30 | out = self.classifier(out) 31 | return out 32 | 33 | 34 | class _DenseLayer3d(torch.nn.Sequential): 35 | def __init__(self, denselayer2d, inflate_convs=False): 36 | super(_DenseLayer3d, self).__init__() 37 | 38 | self.inflate_convs = inflate_convs 39 | for name, child in denselayer2d.named_children(): 40 | if isinstance(child, torch.nn.BatchNorm2d): 41 | self.add_module(name, inflate.inflate_batch_norm(child)) 42 | elif isinstance(child, torch.nn.ReLU): 43 | self.add_module(name, child) 44 | elif isinstance(child, torch.nn.Conv2d): 45 | kernel_size = child.kernel_size[0] 46 | if inflate_convs and kernel_size > 1: 47 | # Pad input in the time dimension 48 | assert kernel_size % 2 == 1, 'kernel size should be\ 49 | odd be got {}'.format(kernel_size) 50 | pad_size = int(kernel_size / 2) 51 | pad_time = ReplicationPad3d((0, 0, 0, 0, pad_size, 52 | pad_size)) 53 | self.add_module('padding.1', pad_time) 54 | # Add time dimension of same dim as the space one 55 | self.add_module(name, 56 | inflate.inflate_conv(child, kernel_size)) 57 | else: 58 | self.add_module(name, inflate.inflate_conv(child, 1)) 59 | else: 60 | raise ValueError( 61 | '{} is not among handled layer types'.format(type(child))) 62 | self.drop_rate = denselayer2d.drop_rate 63 | 64 | def forward(self, x): 65 | new_features = super(_DenseLayer3d, self).forward(x) 66 | if self.drop_rate > 0: 67 | new_features = F.dropout( 68 | new_features, p=self.drop_rate, training=self.training) 69 | return torch.cat([x, new_features], 1) 70 | 71 | 72 | class _Transition3d(torch.nn.Sequential): 73 | def __init__(self, transition2d, inflate_conv=False): 74 | """ 75 | Inflates transition layer from transition2d 76 | """ 77 | super(_Transition3d, self).__init__() 78 | for name, layer in transition2d.named_children(): 79 | if isinstance(layer, torch.nn.BatchNorm2d): 80 | self.add_module(name, inflate.inflate_batch_norm(layer)) 81 | elif isinstance(layer, torch.nn.ReLU): 82 | self.add_module(name, layer) 83 | elif isinstance(layer, torch.nn.Conv2d): 84 | if inflate_conv: 85 | pad_time = ReplicationPad3d((0, 0, 0, 0, 1, 1)) 86 | self.add_module('padding.1', pad_time) 87 | self.add_module(name, inflate.inflate_conv(layer, 3)) 88 | else: 89 | self.add_module(name, inflate.inflate_conv(layer, 1)) 90 | elif isinstance(layer, torch.nn.AvgPool2d): 91 | self.add_module(name, inflate.inflate_pool(layer, 2)) 92 | else: 93 | raise ValueError( 94 | '{} is not among handled layer types'.format(type(layer))) 95 | 96 | 97 | def inflate_features(features, inflate_block_convs=False): 98 | """ 99 | Inflates the feature extractor part of DenseNet by adding the corresponding 100 | inflated modules and transfering the inflated weights 101 | """ 102 | features3d = torch.nn.Sequential() 103 | transition_nb = 0 # Count number of transition layers 104 | for name, child in features.named_children(): 105 | if isinstance(child, torch.nn.BatchNorm2d): 106 | features3d.add_module(name, inflate.inflate_batch_norm(child)) 107 | elif isinstance(child, torch.nn.ReLU): 108 | features3d.add_module(name, child) 109 | elif isinstance(child, torch.nn.Conv2d): 110 | features3d.add_module(name, inflate.inflate_conv(child, 1)) 111 | elif isinstance(child, torch.nn.MaxPool2d) or isinstance( 112 | child, torch.nn.AvgPool2d): 113 | features3d.add_module(name, inflate.inflate_pool(child)) 114 | elif isinstance(child, torchvision.models.densenet._DenseBlock): 115 | # Add dense block 116 | block = torch.nn.Sequential() 117 | for nested_name, nested_child in child.named_children(): 118 | assert isinstance(nested_child, 119 | torchvision.models.densenet._DenseLayer) 120 | block.add_module(nested_name, 121 | _DenseLayer3d( 122 | nested_child, 123 | inflate_convs=inflate_block_convs)) 124 | features3d.add_module(name, block) 125 | elif isinstance(child, torchvision.models.densenet._Transition): 126 | features3d.add_module(name, _Transition3d(child)) 127 | transition_nb = transition_nb + 1 128 | else: 129 | raise ValueError( 130 | '{} is not among handled layer types'.format(type(child))) 131 | return features3d, transition_nb 132 | -------------------------------------------------------------------------------- /src/i3res.py: -------------------------------------------------------------------------------- 1 | import math 2 | 3 | import torch 4 | from torch.nn import ReplicationPad3d 5 | 6 | from src import inflate 7 | 8 | 9 | class I3ResNet(torch.nn.Module): 10 | def __init__(self, resnet2d, frame_nb=16, class_nb=1000, conv_class=False): 11 | """ 12 | Args: 13 | conv_class: Whether to use convolutional layer as classifier to 14 | adapt to various number of frames 15 | """ 16 | super(I3ResNet, self).__init__() 17 | self.conv_class = conv_class 18 | 19 | self.conv1 = inflate.inflate_conv( 20 | resnet2d.conv1, time_dim=3, time_padding=1, center=True) 21 | self.bn1 = inflate.inflate_batch_norm(resnet2d.bn1) 22 | self.relu = torch.nn.ReLU(inplace=True) 23 | self.maxpool = inflate.inflate_pool( 24 | resnet2d.maxpool, time_dim=3, time_padding=1, time_stride=2) 25 | 26 | self.layer1 = inflate_reslayer(resnet2d.layer1) 27 | self.layer2 = inflate_reslayer(resnet2d.layer2) 28 | self.layer3 = inflate_reslayer(resnet2d.layer3) 29 | self.layer4 = inflate_reslayer(resnet2d.layer4) 30 | 31 | if conv_class: 32 | self.avgpool = inflate.inflate_pool(resnet2d.avgpool, time_dim=1) 33 | self.classifier = torch.nn.Conv3d( 34 | in_channels=2048, 35 | out_channels=class_nb, 36 | kernel_size=(1, 1, 1), 37 | bias=True) 38 | else: 39 | final_time_dim = int(math.ceil(frame_nb / 16)) 40 | self.avgpool = inflate.inflate_pool( 41 | resnet2d.avgpool, time_dim=final_time_dim) 42 | self.fc = inflate.inflate_linear(resnet2d.fc, 1) 43 | 44 | def forward(self, x): 45 | x = self.conv1(x) 46 | x = self.bn1(x) 47 | x = self.relu(x) 48 | x = self.maxpool(x) 49 | 50 | x = self.layer1(x) 51 | x = self.layer2(x) 52 | x = self.layer3(x) 53 | x = self.layer4(x) 54 | 55 | if self.conv_class: 56 | x = self.avgpool(x) 57 | x = self.classifier(x) 58 | x = x.squeeze(3) 59 | x = x.squeeze(3) 60 | x = x.mean(2) 61 | else: 62 | x = self.avgpool(x) 63 | x_reshape = x.view(x.size(0), -1) 64 | x = self.fc(x_reshape) 65 | return x 66 | 67 | 68 | def inflate_reslayer(reslayer2d): 69 | reslayers3d = [] 70 | for layer2d in reslayer2d: 71 | layer3d = Bottleneck3d(layer2d) 72 | reslayers3d.append(layer3d) 73 | return torch.nn.Sequential(*reslayers3d) 74 | 75 | 76 | class Bottleneck3d(torch.nn.Module): 77 | def __init__(self, bottleneck2d): 78 | super(Bottleneck3d, self).__init__() 79 | 80 | spatial_stride = bottleneck2d.conv2.stride[0] 81 | 82 | self.conv1 = inflate.inflate_conv( 83 | bottleneck2d.conv1, time_dim=1, center=True) 84 | self.bn1 = inflate.inflate_batch_norm(bottleneck2d.bn1) 85 | 86 | self.conv2 = inflate.inflate_conv( 87 | bottleneck2d.conv2, 88 | time_dim=3, 89 | time_padding=1, 90 | time_stride=spatial_stride, 91 | center=True) 92 | self.bn2 = inflate.inflate_batch_norm(bottleneck2d.bn2) 93 | 94 | self.conv3 = inflate.inflate_conv( 95 | bottleneck2d.conv3, time_dim=1, center=True) 96 | self.bn3 = inflate.inflate_batch_norm(bottleneck2d.bn3) 97 | 98 | self.relu = torch.nn.ReLU(inplace=True) 99 | 100 | if bottleneck2d.downsample is not None: 101 | self.downsample = inflate_downsample( 102 | bottleneck2d.downsample, time_stride=spatial_stride) 103 | else: 104 | self.downsample = None 105 | 106 | self.stride = bottleneck2d.stride 107 | 108 | def forward(self, x): 109 | residual = x 110 | out = self.conv1(x) 111 | out = self.bn1(out) 112 | out = self.relu(out) 113 | 114 | out = self.conv2(out) 115 | out = self.bn2(out) 116 | out = self.relu(out) 117 | 118 | out = self.conv3(out) 119 | out = self.bn3(out) 120 | 121 | if self.downsample is not None: 122 | residual = self.downsample(x) 123 | 124 | out += residual 125 | out = self.relu(out) 126 | return out 127 | 128 | 129 | def inflate_downsample(downsample2d, time_stride=1): 130 | downsample3d = torch.nn.Sequential( 131 | inflate.inflate_conv( 132 | downsample2d[0], time_dim=1, time_stride=time_stride, center=True), 133 | inflate.inflate_batch_norm(downsample2d[1])) 134 | return downsample3d 135 | -------------------------------------------------------------------------------- /src/inflate.py: -------------------------------------------------------------------------------- 1 | import torch 2 | from torch.nn import Parameter 3 | 4 | 5 | def inflate_conv(conv2d, 6 | time_dim=3, 7 | time_padding=0, 8 | time_stride=1, 9 | time_dilation=1, 10 | center=False): 11 | # To preserve activations, padding should be by continuity and not zero 12 | # or no padding in time dimension 13 | kernel_dim = (time_dim, conv2d.kernel_size[0], conv2d.kernel_size[1]) 14 | padding = (time_padding, conv2d.padding[0], conv2d.padding[1]) 15 | stride = (time_stride, conv2d.stride[0], conv2d.stride[0]) 16 | dilation = (time_dilation, conv2d.dilation[0], conv2d.dilation[1]) 17 | conv3d = torch.nn.Conv3d( 18 | conv2d.in_channels, 19 | conv2d.out_channels, 20 | kernel_dim, 21 | padding=padding, 22 | dilation=dilation, 23 | stride=stride) 24 | # Repeat filter time_dim times along time dimension 25 | weight_2d = conv2d.weight.data 26 | if center: 27 | weight_3d = torch.zeros(*weight_2d.shape) 28 | weight_3d = weight_3d.unsqueeze(2).repeat(1, 1, time_dim, 1, 1) 29 | middle_idx = time_dim // 2 30 | weight_3d[:, :, middle_idx, :, :] = weight_2d 31 | else: 32 | weight_3d = weight_2d.unsqueeze(2).repeat(1, 1, time_dim, 1, 1) 33 | weight_3d = weight_3d / time_dim 34 | 35 | # Assign new params 36 | conv3d.weight = Parameter(weight_3d) 37 | conv3d.bias = conv2d.bias 38 | return conv3d 39 | 40 | 41 | def inflate_linear(linear2d, time_dim): 42 | """ 43 | Args: 44 | time_dim: final time dimension of the features 45 | """ 46 | linear3d = torch.nn.Linear(linear2d.in_features * time_dim, 47 | linear2d.out_features) 48 | weight3d = linear2d.weight.data.repeat(1, time_dim) 49 | weight3d = weight3d / time_dim 50 | 51 | linear3d.weight = Parameter(weight3d) 52 | linear3d.bias = linear2d.bias 53 | return linear3d 54 | 55 | 56 | def inflate_batch_norm(batch2d): 57 | # In pytorch 0.2.0 the 2d and 3d versions of batch norm 58 | # work identically except for the check that verifies the 59 | # input dimensions 60 | 61 | batch3d = torch.nn.BatchNorm3d(batch2d.num_features) 62 | # retrieve 3d _check_input_dim function 63 | batch2d._check_input_dim = batch3d._check_input_dim 64 | return batch2d 65 | 66 | 67 | def inflate_pool(pool2d, 68 | time_dim=1, 69 | time_padding=0, 70 | time_stride=None, 71 | time_dilation=1): 72 | if isinstance(pool2d, torch.nn.AdaptiveAvgPool2d): 73 | pool3d = torch.nn.AdaptiveAvgPool3d((1, 1, 1)) 74 | else: 75 | kernel_dim = (time_dim, pool2d.kernel_size, pool2d.kernel_size) 76 | padding = (time_padding, pool2d.padding, pool2d.padding) 77 | if time_stride is None: 78 | time_stride = time_dim 79 | stride = (time_stride, pool2d.stride, pool2d.stride) 80 | if isinstance(pool2d, torch.nn.MaxPool2d): 81 | dilation = (time_dilation, pool2d.dilation, pool2d.dilation) 82 | pool3d = torch.nn.MaxPool3d( 83 | kernel_dim, 84 | padding=padding, 85 | dilation=dilation, 86 | stride=stride, 87 | ceil_mode=pool2d.ceil_mode) 88 | elif isinstance(pool2d, torch.nn.AvgPool2d): 89 | pool3d = torch.nn.AvgPool3d(kernel_dim, stride=stride) 90 | else: 91 | raise ValueError('{} is not among known pooling classes'.format(type(pool2d))) 92 | 93 | return pool3d 94 | --------------------------------------------------------------------------------