1.对模型进行初始化采用的一般代码
def _initialize_weights(self):
for m in self.modules(): # 遍历模型每一层
if isinstance(m, nn.Conv2d): # 判定m层是否属于nn.Conv2d类型
nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
if m.bias is not None:
nn.init.constant_(m.bias, 0)
elif isinstance(m, nn.Linear): # 判定m层是否属于nn.Linear类型
nn.init.normal_(m.weight, 0, 0.01) # normal distribution正态分布
# nn.init.normal从正态分布中取值将weight填满,mean平均值,std方差
nn.init.constant_(m.bias, 0)
# 用val值将m.bias填满
2.os.getcwd() 获取当前的工作目录
若当前文件是train.py位于在D:\projects\AlexNet\train.py
os.getcwd()返回D:\projects\AlexNet
3.assert语句
用一种更方便的方式将debug语句插入到程序中,等价于
if __debug__:
if not expression:
raise AssertionError
assert os.path.exists(image_path), "{} path does not exist.".format(image_path)
此句的意思就是如果image_path这条路径不存在则输出不存在
4.torchvision.datasets.ImageFolder()
常设置的两个参数:
root=文件所在位置
transform=数据要进行的操作
该函数要求:
1)每个类别需要单独成立一个文件夹
2)每个类别里面的图片需要按顺序排列(无论使用英语还是数字)
该函数生成对象有三个属性
classes:即目录下文件夹(类别)的个数
classes_to_idx:即目录下文件夹(类别)的对应的id,从0开始
imgs:整个大文件目录下的所有图片及对应类别
例如:
train_dataset = datasets.ImageFolder(root=os.path.join(image_path, "train"), transform=data_transform["train"])
实质上train_dataset里面的内容是由所有图片进行排列的,每一行都由(img,类别号)组成
输出第一张图片的类别号
注:此次训练Alexnet的训练数据集是没有标签的,但是每个类别的图片位于对应类别的的文件夹下,使用ImageFolder的用处一是将各类别文件夹下的图片汇聚,二是为各图片打上类别标签,还可以利用ImageFolder对象的class_to_idx属性回去类别和其对应编号
5.python与json的转换
(1)将python对象转化为json文件
json_str = json.dumps(cla_dict, indent=4)
写一个json文件
with open('class_indices.json', 'w') as json_file: json_file.write(json_str)
(2)读取一个json文件,并将json对象转化为python对象
with open("class_indices.json","r") as f: class_id = json.load(f)
6.程序运行进度条
train_bar = tqdm(train_loader, file=sys.stdout)
7.在模型训练完后,用图片去让模型进行分类,要注意模型使用的图片大小,输入的图像一般要是4维的。
8.模型最后输出一般是一个二维数组,(图片个数,类别个数)
在使用torch.softmax时要注意维度,dim=1代表对每行进行softmax
torch.argmax同理