优化器演算法
在反向传播的过程中,优化器的用途在於最小化损失函数的loss值,期望找到全局的最佳解。
有可能会遇到昨天我们所说的鞍点,这时搭配好的学习率,是有机会避开鞍点的。
没有一个优化器是最好也最厉害的,所以选择优化器的方式,小弟认为是多尝试,等到经验够多,可能就可以知道哪些的资料集种类适合那些优化器。
不同优化器的收敛轨迹动态图
图片来源:https://lonepatient.top/2018/09/25/Cyclical_Learning_Rate
模型选定:用轻量型的预训练模型densenet201做训练,训练时间也较快。
资料集:因中文手写字图片过多,决定节省时间,选定之前介绍过的验证码辨识的图片共12000张训练集,测试集3000张,验证集1000张。
import os
from PIL import Image
import torch
from torch.utils.data import Dataset
import pandas as pd
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
def img_loader(img_path):
img = Image.open(img_path)
return img.convert("RGB")
# data_path = r"C:/Users/Frank/PycharmProjects/practice/captcha_recognition/picture/"
# ans_path = r'C:\Users\Frank\PycharmProjects\practice\captcha_recognition\answer\answer2.csv'
def make_dataset(data_path,ans_path,alphabet):
img_names = os.listdir(data_path)
img_names.sort(key=lambda x: int(x.split(".")[0]))
df_ans = pd.read_csv(ans_path)
ans_list = list(df_ans["code"].values)
samples = []
for ans, img_name in zip(ans_list, img_names):
if len(str(ans)) == 5 :#num_char:
img_path = os.path.join(data_path, img_name)
target = []
for char in str(ans):
vec = [0] * 36 # num_class
vec[alphabet.find(char)] = 1
target += vec
samples.append((img_path, target))
else:
print(img_name)
return samples
class CaptchaData(Dataset):
def __init__(self, data_path,ans_path,
transform=None, target_transform=None, alphabet=alphabet):
super(Dataset, self).__init__()
self.data_path = data_path
self.ans_path = ans_path
# self.num_class = num_class
# self.num_char = num_char
self.transform = transform
self.target_transform = target_transform
self.alphabet = alphabet
self.samples = make_dataset(self.data_path,self.ans_path,self.alphabet
)
def __len__(self):
return len(self.samples)
def __getitem__(self, index):
img_path, target = self.samples[index]
img = img_loader(img_path)
if self.transform is not None:
img = self.transform(img)
if self.target_transform is not None:
target = self.target_transform(target)
return img, torch.Tensor(target)
<<: Day 21 - Vue Router基本概念(1)
这次的参赛是为了写让自己更多学习 react 更多更好的写法,会从 Javascript 和 Rea...
Azure cognitive service: Translator- 让 Azure 帮你翻译 ...
10 - or equals Ruby 的 ||=(or equals)运算符号使用频率是个使用频率...
在上一篇文章提到对话系统的管理,今天我们要来说明主画面设定及场景资料转换。 需要注意的是,介面的素材...
1.前言 各位有理解loop中很长的咒语吗?不懂得可以多看几次,不要气馁,文章不会跑走,所以继续加油...