Anaconda 环境部分
conda 在新建环境创建并使用 jupyter notebook
- 进入所创建的环境 --
conda activate 环境名
- 安装 jupyter notebook --
conda install nb_conda
- 激活 jupyter notebook --
jupyter notebook
(注意:会以命令前的文件目录作为打开目录)
- 进入所创建的环境 --
Python 版本的 opencv 安装
- 进入所创建的环境 --
conda activate 环境名
- 安装 opencv --
conda install opencv-python
- 使用 --
import cv2
- 进入所创建的环境 --
pytorch 两大命令
dir()
-- 打开、看见 pytorch 的工具包;能让我们知道工具箱以及工具箱中的分隔区有什么东西help()
-- 说明书;让我们知道每个工具如何使用,返回工具的使用方法。我们可以通过 'Ctrl + 点击函数名/类名' 代替,也可以使用函数名/类名 + ??
代替。
注意:在使用dir()
和help()
查看带有括号的命令的时候不用加括号,例如:help(torch.cuda.is_available)
Windows 绝对路径问题
- 绝对路径中的反斜杠符
\
号会造成转义,可以通过在路径前加 r 解决,例如:path = r'C:\xxxx'
Pytorch Dataset
- Dataset 具体用法见官网文档
- 一个小技巧:可以直接使用加法将两个实例化的类相加起来从而完成数据集的拼接,例如
train_dataset = ants_dataset + bees_dataset
tensorboard 使用
没有安装的话需要用 Conda 或则 pip 命令安装一下 -- conda/pip install tensorboard
建立 tensorboard
- 引入 tensorboard --
from torch.utils.tensorboard import SummaryWriter
- 指定 tensorboard 日志写入路径,例如:
writer = SummaryWriter('runs/experiment_1')
- 引入 tensorboard --
将数据写入 tensorboard
数据集中的图片
- 获得图片数据(注意此时得到的图片数据不能直接写入 Tensorboard ,因为其类型为 PIL 或 numpy 形式,不为 tensor 形式)
- 将图片转换为 Tensor 类型,可参考
img_grid = torchvision.utils.make_grid(images)
- 将图片数据写入 tensorboard ,例如:
writer.add_image('Tensor_img', img_grid, step)
训练过程中数值(训练集和测试集的 loss )
writer.add_scalar(tag, scalar_value, global_step)
,这里的tag指定可视化时这个变量的名字,scalar_value是你要存的值,global_step可以理解为x轴坐标。
网络结构
- 实例化网络结构和创建输入
- 将网络结构和输入写入 tensorboard --
writer.add_graph(net, input)
- 关闭 tensorboard 日志写入 --
writer.close()
- 终端启动
tensorboard --logdir=日志路径 --port 端口号
,其中--port 端口号
可以省略代表使用默认端口,例如:tensorboard --logdir=./runs/test --port 8123
- tensorboard 随程序启动
from torch.utils.tensorboard import SummaryWriter
from tensorboard import program
path_to_logs = r'runs\train\PaperCylinderForward\exp\real'
writer = SummaryWriter(log_dir=path_to_logs) #日志存储的路径
# 新增代码
tb = program.TensorBoard()
tb.configure(argv=[None, '--logdir', path_to_logs])
url = tb.launch()
print(f"Tensorflow listening on {url}")
查看如何向函数和类的传入参数
- 首先查看源码或则说明 -- 可以使用 'Ctrl + 点击函数名/类名',也可以使用
函数名/类名 + ??
,还可以使用help()
- 多看
Args
和Examples
在实际开发中,可以首先将鼠标光标定位到 类/函数的括号里,Ctrl + P
,这时候 Pycharm 会给出提示
The :class:`~torch.utils.data.DataLoader` supports both map-style and
iterable-style datasets with single- or multi-process loading, customizing
loading order and optional automatic batching (collation) and memory pinning.
See :py:mod:`torch.utils.data` documentation page for more details.
Args:
dataset (Dataset): dataset from which to load the data.
batch_size (int, optional): how many samples per batch to load
(default: ``1``).
shuffle (bool, optional): set to ``True`` to have the data reshuffled
at every epoch (default: ``False``).
sampler (Sampler or Iterable, optional): defines the strategy to draw
samples from the dataset. Can be any ``Iterable`` with ``__len__``
implemented. If specified, :attr:`shuffle` must not be specified.
batch_sampler (Sampler or Iterable, optional): like :attr:`sampler`, but
returns a batch of indices at a time. Mutually exclusive with
:attr:`batch_size`, :attr:`shuffle`, :attr:`sampler`,
and :attr:`drop_last`.
num_workers (int, optional): how many subprocesses to use for data
loading. ``0`` means that the data will be loaded in the main process.
(default: ``0``)
Transforms 的使用
基本使用
- 创建具体的工具,例如:
tool = transforms.ToTensor()
- 使用所创建的工具对输入进行输出,例如:
result = tool(input)
- 创建具体的工具,例如:
对于 Transforms ,多关注其输入和输出类型,多看看官方文档,关注方法需要什么参数,不知到其值是什么类型的时候可以 Print 或则 断点调试
class Person:
def __call__(self, name):
print('__call__' + 'Hello' + name)
def hello(self, name):
print('Hello' + name)
person = Person()
person('zhangsan')
person.hello('lisi')
result:
__call__Hellozhangsan
Hellolisi
call 函数,不用调用就会执行为什么需要将变量转换为 tensor 类型?
转换为 tensor 类型后,变量会具有 pytorch 框架的一些属性,例如变量的类型是 GPU 还是 CPU 、是否具有梯度、梯度函数的类型、以及是否冻结变量的值等等。
torchvision
主要处理图像和视频相关,里面包含数据集等等。
Python 笔记(易忘)
- 字符串格式化
# 方法1
device = 'cuda' if torch.cuda.is_available() else 'cpu'
print(f'Using {device} device')
# 方法2
train_data_size = len(train_data)
print('训练数据集的长度为:{}'.format(train_data_size))
- 数组的reshape
例如output = torch.reshape(input张量, (-1, 3, 30, 30))
,其中 -1 代表自适应 - python 同时遍历两个数组
a = [1,2,3,4]
b = [5,6,7,8]
t = dict(zip(a,b))
for x,y in t.items():
print("x:",x,"y:",y)
'''
x: 1 y: 5
x: 2 y: 6
x: 3 y: 7
x: 4 y: 8
Process finished with exit code 0
'''
- python找到指定子字符串后面的数字
import re
reg=re.compile(r"(?<=子字符串)\d+")
match=reg.search("字符串")
print match.group(0)
项目文件的命名(参考) -- 来源于小土堆
现有网络模型的使用及修改
模型的使用
- 进入官方文档寻找相应的数据集以及模型,查看其文档使用说明,例如:
vgg16_pre_train = torchvision.models.vgg16(pretrained=False)
模型的修改
层的追加
- 在模型整体后面追加层,例如:
vgg16_pre_train.add_module('add_linear', nn.Linear(1000, 10))
- 在序列里面追加层,例如:
vgg16_pre_train.classifier.add_module('add_linear', nn.Linear(1000, 10))
层的修改
- 修改序列里的层,例如:
vgg16_pre_train.classifier[6] = nn.Linear(4096, 10)
模型的保存与读取
- 模型的保存
import torch
import torchvision
vgg16 = torchvision.models.vgg16(pretrained=False)
# 保存方式1,模型结构加模型参数
torch.save(vgg16, 'vgg16_method1.pth')
# 保存方式2,模型参数(官方推荐)
torch.save(vgg16.state_dict(), 'vgg16_method2.pth')
- 模型的读取
import torch
import torchvision
# 保存方式1 加载模型
model1 = torch.load('vgg16_method1.pth')
print(model1)
# 保存方式2 加载模型 -- 需要创建模型,然后再加载参数
model2 = torchvision.models.vgg16(pretrained=False)
model2.load_state_dict(torch.load('vgg16_method2.pth'))
print(model2)
注意方法一可能会报错,只需要将定义模型的类引入即可,例如: from model_save import *
GPU 训练加速
- 需要加速的变量 -- 网络模型、训练和测试数据(输入,标注)、损失函数
variable.to(device)
# 单显卡
device = torch.device('cuda')
device = torch.device('cuda:0')
# 多显卡
device = torch.device('cuda:0')
device = torch.device('cuda:1')
device = torch.device('cuda:2')
# 代码实例
model = get_model()
loss_f = t.nn.CrossEntropyLoss()
model = model.cuda()
loss_f = loss_f.cuda()
x,y = x.cuda(),y.cuda() # 注意数据需要重新赋值
- 损失函数加速
loss_fn = nn.CrossEntropyLoss()
loss_fn = loss_fn.to(device)
技巧
检查网络结构小技巧
- 首先实例化网络 --
net = Net()
- 创建一个张量输入 --
input = torch.ones((64, 3, 32, 32))
- 获得所创建张量的输出,并打印输出张量,如果没有报错,则代表输入类型的张量正确。
output = net(input)
print(output)
编写 model 结构技巧 -- torch.nn.Sequential
- 将层写进一个
Sequential
里 - 在forward函数里调用
Sequential
Google 计算器
- 直接在 google 搜索框内搜索式子就可以得到式子答案
打印模型所需时间
import time
start_time = time.time()
end_time = time.time()
print(end_time - start_time)
python代码编码标签
# -*- coding: utf-8 -*-
CSV 文件操作
方法一 --- 利用 CSV 包
- CSV读取文件
# CSV 文件的读操作
import csv
with open('test.csv', 'r', encoding='utf-8') as f:
data = csv.reader(f)
# print(list(data))
for row in list(data):
print(row)
- CSV写入文件(会擦除原有文件)
# CSV文件的写操作
import csv
with open('test.csv', 'w', encoding='utf-8', newline='') as f:
data = csv.writer(f)
#先写入columns_name
data.writerow(['ID', '姓名', '年龄', '薪资'])
#写入多行用writerows
data.writerows([['1001', '高琦', '28', '10000'], ['1002', '张三', '30', '2000'], ['1003', '李四', '32', '5000'], ['1004', '王二', '33', '3000']])
data.writerow(['1005', '牛牛', '38', '20000'])
- CSV写入文件(在原有文件上追加)
# CSV文件的写操作
import csv
with open('test.csv', 'a+', encoding='utf-8', newline='') as f:
data = csv.writer(f)
#先写入columns_name
data.writerow(['ID', '姓名', '年龄', '薪资'])
#写入多行用writerows
data.writerows([['1001', '高琦', '28', '10000'], ['1002', '张三', '30', '2000'], ['1003', '李四', '32', '5000'], ['1004', '王二', '33', '3000']])
data.writerow(['1005', '牛牛', '38', '20000'])
方法二 --- 利用 Pandas 包
- 读 CSV 文件
# pandas 读取 csv 文件
import pandas as pd
data = pd.read_csv('test.csv')
print(data)
- 写 CSV 文件
# Pandas 写入 CSV 文件
import pandas as pd
#任意的多组列表
a = [1, 2, 3]
b = [2, 3, 4]
c = [['ID', '姓名', '年龄', '薪资'],
['1001', '高琦', '28', '10000'],
['1002', '张三', '30', '2000'],
['1003', '李四', '32', '5000'],
['1004', '王二', '33', '3000']]
#字典中的key值即为csv中列名
dataframe = pd.DataFrame({'a_name':a, 'b_name':b})
dataframe2 = pd.DataFrame(c)
#将DataFrame存储为csv,index表示是否显示行名,default=True
dataframe.to_csv("test.csv", index=False, sep=',')
dataframe2.to_csv("test.csv", index=False, sep=',')
- pandas DataFrame 取行列操作
import pandas as pd
data = [['Google', 10 , 999], ['Runoob', 12, 9099], ['Wiki', 13, 8898]]
df = pd.DataFrame(data,columns=['Site', 'Age', 'Number'],dtype=float)
print(df)
print(df.loc[0]) # 取行
print(df['Site']) # 取列
- 其他功能
OS 模块
- os.system() --- 直接调用系统的命令
import os
# os.system 调用系统级的命令
os.system('notepad.exe')
os.system('ping www.liccoo.com')
os.system('cmd')
- os.startfile() --- 直接调用可执行文件
# os.startfile() 直接调用可执行文件
import os
os.startfile(f'C:\Program Files\Google\Chrome\Application\chrome.exe')
- os 文件相关方面的命令
- os 文件目录相关方面的命令
- 获取文件以及文件夹相关的信息
- 关于工作目录的操作
- 创建以及删除单级、多级目录
- os.path()模块
- waik()递归遍历所有文件和目录
代码展示1
代码展示2 - shutil模块 --- 文件和目录的拷贝