Python深耕之图像深度学习必备工具包

2022-11-21 21:48:34 浏览数 (1)

因为研究方向的变动将本号更名为《R语言交流中心与Python深耕之路》,从R语言扩展到Python编程。今天给大家介绍下一个完整的深度学习模型的构建所需要的必备python模块。

1. os 工作目录,文件,shell的操作

代码语言:javascript复制
##获得当前工作目录
os.getcwd()
##重置工作目录
os.fchdir()
##列出指定目录下的所有文件及子目录
os.listdir()
##删除指定文件test.py
os.remove(“test.py”)
##运行shell命令
os.system()
##分割路径和文件名
os.path.split(‘/data/hh,txt’)##(“/data”,”hh.txt”)
##分离文件名和扩展名
os.path.splitext()
##判断目录或文件返回TRUE或者FALSE
os.path.isfile()
os.path.isdir()
##为工作目录下文件拼接绝对路径
os.path.abspath()
##去除文件的绝对路径,返回文件名
os.path.basename()
##返回文件路径
os.path.dirname()
##获得文件的大小
os.path.getsize()
##链接目录和文件名
os.path.join(path,name)

2. pandas 读取数据表格并进行相关操作

代码语言:javascript复制
##读取数据
import pandas as pd
pd.read_csv() 读取csv文件
pd.read_excel() 读取excel文件
##构建数据框
Data= pd.DataFrame({"id":[1001,1002,1003,1004,1005,1006], "city":['Beijing ', 'SH', ' guangzhou ', 'Shenzhen', 'shanghai', 'BEIJING '], "age":[23,44,54,32,34,32], },columns =['id','date','city' ,'age'])
##查看数据基本信息
Data.info()
##查看维度信息
Data.shape()
##查看某一列的数据类型
Data['id'].dtype
##提取数据
Data.iloc[:,1] #第二列所有行
##数据的导出
Data.to_excel('test.xlsx', sheet_name='test')
Data.to_csv('test.csv')

3. numpy数组(矩阵)的操作

代码语言:javascript复制
##载入模块
import numpy as np
##创建空数组
numpy.empty(shape, dtype = float, order = 'C')
## 创建全0/1的数组
np.ones(shape, dtype)
np.zeros(shape, dtype)
##仿照数组a创建对应的全0/1数组
np.ones_like(a, dtype)
np.zeros_like(a, dtype)
##获得数组a的行列数
a.shape ##(行,列)
##数组的转置
a.transpose()
##整个数组的最大/小值
a.max()
a.min()
##整个数组求和,均值,标准差
a.sum()
a.mean()
a.std()

4. h5py深度学习数据源文件的构建

首先我们看下hdf5文件的构造:

dataset : 是数组集合(文件)

group:是数组集合所属的分组(文件夹)

hdf5文件的内部构造基本和文件夹和文件的关系差不多,进行相互参考。当然此文件在深度学习数据的载入也是非常高效的胜过npz,pickle等。基本框架如下图:

代码语言:javascript复制
##hdf5文件的创建
import h5py
import numpy as np
A = np.random.randint(100, size=(4,4))
B = np.random.randint(100, size=(5,3,3))
# 创建hdf5文件
f1 = h5py.File("data.hdf5", "w")
##存储数据,创建dataset
dset1 = f1.create_dataset("dataset1", (4,4), dtype='i', data=A)
##组内添加dataset
g1 = f1.create_group("group1")
dset2 = g1.create_dataset("dataset2", (5,3,3), dtype='i', data=B)
## 添加元数据
dset1.attrs['scale'] = 0.01
dset1.attrs['offset'] = 15
##关闭文件
f1.close()
代码语言:javascript复制
#读取hdf5文件
f2 = h5py.File('data.hdf5', 'r')
## matrix A
dset1 = f2['dataset1'][:]
## matrix B
dset2 = f2['group1']['dataset2'][:]

5. opencv主要是对图像进行分析操作

此工具主要对前期的图像数据进行预处理的工具,尤其是在进行病理WSI图像的处理时可以起到为图像的预处理节约大量的时间。其中重要的几个函数是:

代码语言:javascript复制
##载入图像
import cv2
img = cv2.imread("test.jpg")
##图像色彩模式改变
gray=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
##二进制处理图,ret为阈值,binary为处理后图像
ret, binary = cv2.threshold(gray, 117, 255, cv2.THRESH_BINARY)#117开始阈值,255最大阈值
##寻找ROI
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

6. PIL图像读取工具

代码语言:javascript复制
##载入图像
from PIL import Image
im = Image.open ("test.jpg")
##数组转化
pil_img= Image.fromarray(im)
##PIL转numpy
np_img= np.array(pil_img)

7. pyro概率模型编程工具

这个工具相当于比较高级概率函数重构库,当然本人目前没有这个算法修改的能力,如果是高水平的你也许用的到,请自行研究。

8. torchvision深度学习库,包含主流的深度学习框架

torchvision是pytorch的一个图形库,它服务于PyTorch深度学习框架的,主要用来构建计算机视觉模型,主要有以下几个重要的函数

代码语言:javascript复制
torchvision.datasets #为方便实例化提供的样例数据集
torchvision.models #包含常用的模型框架
torchvision.transforms #进行图像增加的各种转换

具体实例:

代码语言:javascript复制
##模型加载,使用 pretrained=True 可以加载一个别人预训练好的模型。
import torchvision.models as models
resnet18 = models.resnet18()
alexnet = models.alexnet(pretrained=True)
##图像增强
from torchvision import transforms as transforms
transform = transforms.Compose([
    transforms.Resize(96), # 缩放到 96 * 96 大小
    transforms.ToTensor(),
    transforms.Normalize((0.5), (0.5)) # 归一化
])

9. torch深度学习模型框架

相信这个工具大家应该是可以说只要接触深度学习必定会接触的框架之一。详细的教程应该也是铺天盖地。在这里大体说一下训练一个模型的必备内容:

代码语言:javascript复制
##数据载入
###载入深度学习需要重构datalodar类
class LXRTDataLoader(torch.utils.data.Dataset):
    def __init__(self):
        with h5py.File("img.hdf5", 'r') as f:
              self.length = len(f['dataset'])   # to get the length, do not load
   
    def __len__(self):
        return self.length
    def open_hdf5(self):
        self.img_hdf5 = h5py.File('img.hdf5', 'r')
        self.dataset = self.img_hdf5['dataset'] # if you want dataset.
    def __getitem__(self, item: int):
        if not hasattr(self, 'img_hdf5'):
            self.open_hdf5()
        img0 = self.img_hdf5['dataset'][0] # Do loading here
        img1 = self.dataset[1]
        return img0, img1
    def close(self):
        self.img_hdf5.close()
代码语言:javascript复制
##模型
###来源于torchvision
model = models.resnet18()
###基于torch的nn.models进行构建
import torch.nn as nn
class model(nn.Module):
    def __init__(self):
        super(Net,self).__init__()#实现父类的初始化
        self.conv1=nn.Conv2d(3,6,5)#定义卷积层组件
        self.pool1=nn.MaxPool2d(2,2)#定义池化层组件
        self.conv2=nn.Conv2dn(6,16,5)
        self.pool2=nn.MaxPool2d(2,2)
        self.fc1=nn.Linear(16*5*5,120)#定义线性连接
        self.fc2=nn.Linear(120,84)
        self.fc3=nn.Linear(84,10)
    def forward(self,x):#x模型的输入
        x=self.pool1(F.relu(self.conv1(x)))
        x=self.pool2(F.relu(self.conv2(x)))
        x=x.view(-1,16*5*5)#表示将x进行reshape,为后面做为全连接层的输入
        x=F.relu(self.fc1(x))
        x=F.relu(self.fc2(x))
        x=self.fc3(x)
    return x
代码语言:javascript复制
##损失函数,优化函数
criterion = torch.nn.MSELoss(reduction='sum')
optimizer = torch.optim.SGD(model.parameters(), lr=1e-4)
代码语言:javascript复制
##训练模型
train_ls, test_ls = [], []
for t in range(epoch):
    for step, (x, y) in enumerate(train_loader):
        # Forward pass: Compute predicted y by passing x to the model
        y_pred = model(x)
        # Compute and print loss
        loss = criterion(y_pred, y) # 计算损失函数
        # Zero gradients, perform a backward pass, and update the weights.
        optimizer.zero_grad() # 梯度置零,因为反向传播过程中梯度会累加上一次循环的梯度
        loss.backward() # loss反向传播
        optimizer.step() # 反向传播后参数更新
代码语言:javascript复制
##保存模型
torch.save(model.state_dict(), 'model.pt')##参数字典
torch.save(model, 'model.pkl')##完整模型
#加载模型
model.load_state_dict(torch.load(' model.pt'))##参数字典
model.load = torch.load('model.pkl')##完整模型

10. matplotlib可视化工具,进行结果绘制的工具

此工具包作为可视化的工具,在这里不展开细讲了,提供一个可以可视化pytorch模型训练过程的实例:

代码语言:javascript复制
import matplotlib.pyplot as plt
def plot_train(x, y, x_label, y_label, x2 =None, y2 =None, legend=None, figsize=(5, 3)):
##创建figure
    plt.xlabel(x_label)
    plt.ylabel(y_label)
    plt.semilogy(x, y)
    if x2 and y2:
        plt.semilogy(x2, y2, linestyle=':')
   
    if legend:
        plt.legend(legend)

当然,以上都是基础的完成流程,其中还涉及一些细节需要进行优化,改造,调参。这些在后续的时间中会一一进行更新,希望和大家一起努力进入人工智能领域。

0 人点赞