Tensorflow
tf.train.match_filenames_once()
验证文件是否正确读取
tf.train.string_input_producer()
读取列表样本
tf.train.string_input_producer只是读入文件还没有解析,需要tf.WholeFileReader()来解析文件
tf.one_hot
one_hot(indices, depth, on_value=None, off_value=None, axis=None, dtype=None, name=None)
Returns a one-hot tensor.
indices表示输入的多个数值,通常是矩阵形式;
depth表示输出的尺寸。
由于one-hot类型数据长度为depth位,其中只用一位数字表示原输入数据,这里的on_value就是这个数字,默认值为1,
one-hot数据的其他位用off_value表示,默认值为0。
tf.one_hot()函数规定输入的元素indices从0开始,最大的元素值不能超过(depth - 1),因此能够表示depth个单位的输入。若输入的元素值超出范围,输出的编码均为 [0, 0 … 0, 0]。
indices = 0 对应的输出是[1, 0 … 0, 0], indices = 1 对应的输出是[0, 1 … 0, 0], 依次类推,最大可能值的输出是[0, 0 … 0, 1]。
import tensorflow as tf indices = [0,2,3,5] depth1 = 6 # indices没有元素超过(depth-1) depth2 = 4 # indices有元素超过(depth-1) a = tf.one_hot(indices,depth1) b = tf.one_hot(indices,depth2) with tf.Session() as sess: print('a = \n',sess.run(a)) print('b = \n',sess.run(b)) |
输出:
#输入是一维的,则输出是一个二维的 a = [[1. 0. 0. 0. 0. 0.] [0. 0. 1. 0. 0. 0.] [0. 0. 0. 1. 0. 0.] [0. 0. 0. 0. 0. 1.]] # shape=(4,6) b = [[1. 0. 0. 0.] [0. 0. 1. 0.] [0. 0. 0. 1.] [0. 0. 0. 0.]] # shape=(4,4) |
model.summary()
输出模型各层的参数状况
tf.io.read_file()
读取并输出输入文件名的全部内容。
Pytorch
torch.manual_seed(seed)
设置 (CPU) 生成随机数的种子,并返回一个torch.Generator对象。
设置种子的用意是一旦固定种子,后面依次生成的随机数其实都是固定的。
import torch random_seed = 123 torch.manual_seed(random_seed) print(torch.rand(1)) # 随机生成[0, 1)的数 print(torch.rand(1)) """ Out: tensor([0.2961]) tensor([0.5166]) """ |
同样的道理,也可以手动设置GPU的随机数生成种子:
torch.cuda.manual_seed(seed) – 设置当前GPU的随机数生成种子
torch.cuda.manual_seed_all(seed) – 设置所有GPU的随机数生成种子
运行代码GPU内存超出解决方法:
- 减少batchsize
- 不计算梯度,在评估时使用。
with torch.no_grad()
- 释放内存
在报错那一行前面加上下面两行代码,释放无关的内存。
if hasattr(torch.cuda, 'empty_cache'): torch.cuda.empty_cache() |
Numpy
.tolist()
将数组或者矩阵转换成列表。
x=np.array([[1,2,3],[4,5,6]])
x1=list(x)
x2=x.tolist()
那么输入x1的结果是:
[array([1, 2, 3]), array([4, 5, 6])]
而输入x2的结果是:
[[1, 2, 3], [4, 5, 6]]
从数据类型的角度来讨论这两者元素的区别:
type(x1[0])的结果是numpy.ndarray
type(x2[0])的结果是list
再来看元素的元素数据类型:
type(x1[0][0])的结果是numpy.int64
type(x2[0][0])的结果是int
所以可以看出来,list()的结果是:list of np.array of np.int;
而tolist()的结果是:list of list of int
np.random.permutation()
即随机排列序列,或返回随机范围。我的理解就是返回一个乱序的序列。
对一维数组直接乱序
对多维数组则是只对第一维进行乱序
对常数n则是生成0~n的一维乱序数组
pandas
matplotlib
Python
os.path.join()
连接两个或更多的路径名组件
- 如果各组件名首字母不包含’/’,则函数会自动加上
- 如果有一个组件是一个绝对路径,则在它之前的所有组件均会被舍弃
- 如果最后一个组件为空,则生成的路径以一个’/’分隔符结尾
path.resolve([from...],to)
把一个路径或路径片段的序列解析为一个绝对路径。相当于执行cd操作。
os.getcwd()
返回当前工作目录
os.listdir()
返回指定的文件夹包含的文件或文件夹的名字的列表。
它不包括 . 和 .. 即使它在文件夹中。
assert
assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。
断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行后出现崩溃的情况
|
os.environ
- os.environ[“CUDA_DEVICE_ORDER”] = “PCI_BUS_ID” # 按照PCI_BUS_ID顺序从0开始排列GPU设备
- os.environ[“CUDA_VISIBLE_DEVICES”] = “0” #设置当前使用的GPU设备仅为0号设备 设备名称为'/gpu:0'
- os.environ[“CUDA_VISIBLE_DEVICES”] = “1” #设置当前使用的GPU设备仅为1号设备 设备名称为'/gpu:0'
- os.environ[“CUDA_VISIBLE_DEVICES”] = “0,1” #设置当前使用的GPU设备为0,1号两个设备,名称依次为'/gpu:0'、'/gpu:1'
- os.environ[“CUDA_VISIBLE_DEVICES”] = “1,0” #设置当前使用的GPU设备为1,0号两个设备,名称依次为'/gpu:0'、'/gpu:1'。表示优先使用1号设备,然后使用0号设备
for in if用法
python 循环高级用法 [expression for x in X [if condition] for y in Y [if condition] ... for n in N [if condition] ]按照从左至右的顺序,分别是外层循环到内层循环。
>>> L = [1, 2, 3, 4, 5, 6] >>> L = [x for x in L if x % 2 != 0] >>> L [1, 3, 5] |
enumerate()
>>>seq = ['one', 'two', 'three'] >>> for i, element in enumerate(seq): ... print i, element ... 0 one 1 two 2 three |
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
random.shuffle()
将序列的所有元素随机排序.
startsWith()
startsWith() 方法用于检测字符串是否以指定的前缀开始。
如果字符串以指定的prefix开始则返回True,否则返回False。prefix也可以为由多个供查找的前缀构成的元组。如果有可选项 start,将从所指定位置开始检查。如果有可选项end,将在所指定位置停止比较。
Python3 标准库概览
操作系统接口
os模块提供了不少与操作系统相关联的函数。
>>> import os
>>> os.getcwd() # 返回当前的工作目录
'C:\\Python34'
>>> os.chdir('/server/accesslogs') # 修改当前的工作目录
>>> os.system('mkdir today') # 执行系统命令 mkdir
0
建议使用 "import os" 风格而非 "from os import *"。这样可以保证随操作系统不同而有所变化的 os.open() 不会覆盖内置函数 open()。
在使用 os 这样的大型模块时内置的 dir() 和 help() 函数非常有用:
>>> import os
>>> dir(os)
<returns a list of all module functions>
>>> help(os)
<returns an extensive manual page created from the module's docstrings>
针对日常的文件和目录管理任务,:mod:shutil 模块提供了一个易于使用的高级接口:
>>> import shutil
>>> shutil.copyfile('data.db', 'archive.db')
>>> shutil.move('/build/executables', 'installdir')
文件通配符
glob模块提供了一个函数用于从目录通配符搜索中生成文件列表:
>>> import glob
>>> glob.glob('*.py')
['primes.py', 'random.py', 'quote.py']
命令行参数
通用工具脚本经常调用命令行参数。这些命令行参数以链表形式存储于 sys 模块的 argv 变量。例如在命令行中执行 "python demo.py one two three" 后可以得到以下输出结果:
>>> import sys
>>> print(sys.argv)
['demo.py', 'one', 'two', 'three']
错误输出重定向和程序终止
sys 还有 stdin,stdout 和 stderr 属性,即使在 stdout 被重定向时,后者也可以用于显示警告和错误信息。
>>> sys.stderr.write('Warning, log file not found starting a new one\n')
Warning, log file not found starting a new one
大多脚本的定向终止都使用 "sys.exit()"。
字符串正则匹配
re模块为高级字符串处理提供了正则表达式工具。对于复杂的匹配和处理,正则表达式提供了简洁、优化的解决方案:
>>> import re
>>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
['foot', 'fell', 'fastest']
>>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
'cat in the hat'
如果只需要简单的功能,应该首先考虑字符串方法,因为它们非常简单,易于阅读和调试:
>>> 'tea for too'.replace('too', 'two')
'tea for two'
数学
math模块为浮点运算提供了对底层C函数库的访问:
>>> import math
>>> math.cos(math.pi / 4)
0.70710678118654757
>>> math.log(1024, 2)
10.0
random提供了生成随机数的工具。
>>> import random
>>> random.choice(['apple', 'pear', 'banana'])
'apple'
>>> random.sample(range(100), 10) # sampling without replacement
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>> random.random() # random float
0.17970987693706186
>>> random.randrange(6) # random integer chosen from range(6)
4
访问 互联网
有几个模块用于访问互联网以及处理网络通信协议。其中最简单的两个是用于处理从 urls 接收的数据的 urllib.request 以及用于发送电子邮件的 smtplib:
>>> from urllib.request import urlopen
>>> for line in urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl'):
... line = line.decode('utf-8') # Decoding the binary data to text.
... if 'EST' in line or 'EDT' in line: # look for Eastern Time
... print(line)
<BR>Nov. 25, 09:43:32 PM EST
>>> import smtplib
>>> server = smtplib.SMTP('localhost')
>>> server.sendmail('soothsayer@example.org', 'jcaesar@example.org',
... """To: jcaesar@example.org
... From: soothsayer@example.org
...
... Beware the Ides of March.
... """)
>>> server.quit()
注意第二个例子需要本地有一个在运行的邮件服务器。
日期和时间
datetime模块为日期和时间处理同时提供了简单和复杂的方法。
支持日期和时间算法的同时,实现的重点放在更有效的处理和格式化输出。
该模块还支持时区处理:
>>> # dates are easily constructed and formatted
>>> from datetime import date
>>> now = date.today()
>>> now
datetime.date(2003, 12, 2)
>>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
'12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'
>>> # dates support calendar arithmetic
>>> birthday = date(1964, 7, 31)
>>> age = now - birthday
>>> age.days
14368
数据压缩
以下模块直接支持通用的数据打包和压缩格式:zlib,gzip,bz2,zipfile,以及 tarfile。
>>> import zlib
>>> s = b'witch which has which witches wrist watch'
>>> len(s)
41
>>> t = zlib.compress(s)
>>> len(t)
37
>>> zlib.decompress(t)
b'witch which has which witches wrist watch'
>>> zlib.crc32(s)
226805979
性能度量
有些用户对了解解决同一问题的不同方法之间的性能差异很感兴趣。Python 提供了一个度量工具,为这些问题提供了直接答案。
例如,使用元组封装和拆封来交换元素看起来要比使用传统的方法要诱人的多,timeit 证明了现代的方法更快一些。
>>> from timeit import Timer
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.57535828626024577
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.54962537085770791
相对于 timeit 的细粒度,:mod:profile 和 pstats 模块提供了针对更大代码块的时间度量工具。
测试模块
开发高质量软件的方法之一是为每一个函数开发测试代码,并且在开发过程中经常进行测试
doctest模块提供了一个工具,扫描模块并根据程序中内嵌的文档字符串执行测试。
测试构造如同简单的将它的输出结果剪切并粘贴到文档字符串中。
通过用户提供的例子,它强化了文档,允许 doctest 模块确认代码的结果是否与文档一致:
def average(values):
"""Computes the arithmetic mean of a list of numbers.
>>> print(average([20, 30, 70]))
40.0
"""
return sum(values) / len(values)
import doctest
doctest.testmod() # 自动验证嵌入测试
unittest模块不像 doctest模块那么容易使用,不过它可以在一个独立的文件里提供一个更全面的测试集:
import unittest
class TestStatisticalFunctions(unittest.TestCase):
def test_average(self):
self.assertEqual(average([20, 30, 70]), 40.0)
self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
self.assertRaises(ZeroDivisionError, average, [])
self.assertRaises(TypeError, average, 20, 30, 70)
unittest.main() # Calling from the command line invokes all tests
glob
glob.glob()
用于匹配文件路径,返回所有匹配的文件路径列表。
print (glob.glob(r"D:\*.png")
匹配符包括“*”、“?”和"[]",其中“*”表示匹配任意字符串,“?”匹配任意单个字符,[0-9]与[a-z]表示匹配0-9的单个数字与a-z的单个字符。
json
json.dumps()
json.dumps将一个Python数据结构转换为JSON
import json data = { 'name' : 'myname', 'age' : 100, } json_str = json.dumps(data) |
json库的一些用法
方法 | 作用 |
json.dumps() | 将python对象编码成Json字符串 |
json.loads() | 将Json字符串解码成python对象 |
json.dump() | 将python中的对象转化成json储存到文件中 |
json.load() | 将文件中的json的格式转化成python对象提取出来 |
json.dump()和json.dumps()的区别:
- json.dumps() 是把python对象转换成json对象的一个过程,生成的是字符串。
- json.dump() 是把python对象转换成json对象生成一个fp的文件流,和文件相关。
json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)
- obj:转化成json的对象。
- sort_keys =True:是告诉编码器按照字典排序(a到z)输出。如果是字典类型的python对象,就把关键字按照字典排序。
- indent:参数根据数据格式缩进显示,读起来更加清晰。
- separators:是分隔符的意思,参数意思分别为不同dict项之间的分隔符和dict项内key和value之间的分隔符,把:和,后面的空格都除去了。
tdqm
easydict
easydict的作用:可以使得以属性的方式去访问字典的值!
>>> from easydict import EasyDict as edict >>> d = edict({'foo':3, 'bar':{'x':1, 'y':2}}) >>> d.foo 3 >>> d.bar.x 1
>>> d = edict(foo=3) >>> d.foo 3 |
EasyDict允许访问dict值作为属性(递归工作)
from easydict import EasyDict as edict easy = edict(d = {'foo':3, 'bar':{'x':1, 'y':2}}) # 将普通的字典传入到edict() print(easy['foo']) # 这是传统的方法 print(easy.foo) # 这是我们使用easydict输出二者结果是一样的,但是可以更为方便的使用字典了 print(easy.bar.x) # 我们也是可以很方便的使用字典中字典的元素了
|
在深度学习中往往利用 easydict 建立一个全局的变量
from easydict import EasyDict as edict config = edict() config.TRAIN = edict() # 创建一个字典,key是Train,值是{} config.Test = edict() # config.TRAIN = {} # 这个和上面的那句话是等价的,相当于创建一个字典的key config.TRAIN.batch_size = 25 # 然后在里面写值,表示Train里面的value也是一个字典 config.TRAIN.early_stopping_num = 10 config.TRAIN.lr = 0.0001 print(config)
|
Pillow
Scikit-learn(sklearn)
Scikit-image(skimage)