Python中的OrderedDict
是一种字典类型,它记住了元素插入的顺序。在Python 3.7及以后的版本中,普通的dict
类型已经保证了插入顺序,但OrderedDict
仍然有其独特的用途,比如它提供了一些额外的方法,如popitem(last=True)
,这在普通字典中是没有的。
以下是OrderedDict
的一些基本用法:
- 创建OrderedDict: 创建一个空的
OrderedDict
或从一个序列的键值对中创建。from collections import OrderedDict # 创建一个空的OrderedDict ordered_dict = OrderedDict() # 或者从一个序列的键值对中创建 ordered_dict = OrderedDict([('key1', 'value1'), ('key2', 'value2')])
添加元素: 使用
__setitem__
方法或update
方法添加元素。 -
# 使用 __setitem__ 方法添加元素 ordered_dict['key3'] = 'value3' # 使用 update 方法添加元素 ordered_dict.update({'key4': 'value4'})
访问元素: 使用键来访问元素。
-
value = ordered_dict['key1']
修改官方VGG16模型最后一层的方法:
model.classifier._modules['6'] = nn.Linear(4096,len(classNames)) #修改vgg-16模型最后一层全连接层,输出目标类别个数
classifier就是最后这个线性层所在的地方,长这样:
self.classifier = nn.Sequential(
nn.Linear(512 * 7 * 7, 4096),
nn.ReLU(True),
nn.Dropout(p=dropout),
nn.Linear(4096, 4096),
nn.ReLU(True),
nn.Dropout(p=dropout),
nn.Linear(4096, num_classes),
)
它相当于一个字典式的存储,用键值'6',可以取出对应‘值’。
而对于VGGFace模型来说。他的分类层是这样定义的:
self.fc = nn.ModuleDict(OrderedDict(
{
'fc6': nn.Linear(in_features=512 * 7 * 7, out_features=4096),
'fc6-relu': nn.ReLU(inplace=True),
'fc6-dropout': nn.Dropout(p=0.5),
'fc7': nn.Linear(in_features=4096, out_features=4096),
'fc7-relu': nn.ReLU(inplace=True),
'fc7-dropout': nn.Dropout(p=0.5),
'fc8': nn.Linear(in_features=4096, out_features=2622),
}))
orderdict是一个保证了顺序的字典,
在Python中,特别是在使用PyTorch深度学习框架时,nn.ModuleDict
是一个特殊的容器,用于存储多个nn.Module
对象。nn.Module
是PyTorch中所有神经网络模块的基类,而ModuleDict
则是一个继承自collections.abc.MutableMapping
的类,它允许你以字典的方式存储和访问这些模块。
nn.ModuleDict
的主要特点包括:
-
字典接口:它提供了与普通字典相同的接口,可以像操作字典一样操作
ModuleDict
。 -
模块存储:
ModuleDict
中的每个键值对的值必须是nn.Module
的实例。 -
键的自动注册:当你将一个
nn.Module
添加到ModuleDict
时,它会自动注册到nn.Module
的_modules
属性中,这意味着这个模块的参数会被自动收集并用于后续的训练和推理。 -
方便的访问:可以通过键名直接访问
ModuleDict
中的模块。
这里要修改VGGFace的最后一层得用
model.fc._modules['fc8'] = nn.Linear(4096, len(classNames)) # 修改vgg-16模型最后一层全连接层,输出目标类别个数
fc是最后分类层所在的‘这块的名字’,_modules必须要带上。'fc8'就是最后这一层对应的键值,能取出来最后一层