1基础语法与数据结构的熟悉
1.1 基础语法
1.关于变量命名
2.关于缩进
3.关于符号":"
在 python 语法中,符号":"被用于类,函数定义,循环体, if, else 语句等,容易被忽略造成语法错误。
4.关于中英文字符
python 语法因为特殊字符造成的问题特别多,以后肯定会遇到。一般我们写注释会写一些中文帮助理解,所以记得每一个脚本的第一行写上。
#coding:utf8
5.import
import 既可以引入标准库,也可以引入其他脚本,多级目录的引用此后一定要熟悉。
import sys ##引入标准库
from test.py import sum #从 test.py 脚本中引入 sum 函数
1.2 数组与元组(list 和 tuple),字典
2.元组tuple
元组与数组类似,不同之处在于元组的元素不能修改; 元组使用小括号, 数组使用方
括号。元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。
3.字典dict
1.3 函数
位置参数、默认参数、可变参数、关键字参数和命名关键字参数,随着越来越熟练,系统越来越复杂,就会用的越来越多
结果:
1.4 类
当代码工程比较复杂时,类的设计是不可避免的,比如要在实际的工程环境中进行部署,和其他的项目进行通信等。
类的设计以 class 关键词为代表,后面接类名,继承的子类。
一般定义一个类一定会包含 init 函数,用于完成初始化。然后就是对外的功能函数,下面是一个最精简的例子
#coding:utf8
class YousanAI(object):
def __init__(self, projectname, tuition):
self.projectname = projectname
self.tuition= tuition
self.studiers = [] ##定义一个数组
def addstudiers(self,name):
self.studiers.append(name)
def removestudiers(self,name):
self.studiers.remove(name)
yousanAI = YousanAI("季划",1500)
yousanAI.addstudiers("王司")
print type(yousanAI)
练习:把文件下的的图片的命名和标签都保存在txt
关键在于使用:os.walk()
os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下。
os.walk() 方法是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情。
#conding:utf8
import os
import sys
def study(a,b,c=0,*args,**kw):
print('a=',a,'b=',b,'c=',c,'args=',args,'kw=',kw)
study(1,2,3,'learningAI',age=24,gender=boy)
def listfiles(rootDir,txtfile,label=0):
ftxfile = open(txtfile,'w')
list_dirs = os.walk(rootDir)
print("list_dirs:", list_dirs)
#print(list_dirs[1])
#print(list_dirs[2])
#print(list_dirs[3])
count = 0
dircount = 0
index= 0
for root, dirs, files in list_dirs:
print("index:",index)
index+=1
print(root,dirs,files)
print("--00--")
for d in dirs:
print(os.path.join(root,d))
dircount = dircount + 1
print("+++11++")
for f in files:
print(os.path.join(root,f))
print("+++22++")
ftxfile.write(os.path.join(root,f)+' '+str(label)+'\n')
count = count + 1
print(",,,,,")
print(rootDir+"has "+str(dircount)+" dirstory")
print(rootDir+"has "+str(count)+" files")
#if __name__ == '__mian__':
listfiles(sys.argv[1],sys.argv[2],sys.argv[3])
结果:
执行:python python.py 0作业2和作业3/ python.txt 0
练习:把上述的文件下的图片分成train.txt 和 test.txt
import os
import sys
import shutil
import cv2
import random
class GeneDataset():
def __init__(self,rootdir):
self.rootdir = rootdir
self.subdirs = []
self.subdirimages = []
self.numclasses = 0
self.lines = []
def looksudir(self):
list_dirs = os.walk(self.rootdir)
for root ,dirs, files in list_dirs:
for d in dirs:
self.subdirs.append(os.path.join(root,d))
print("subdir=",os.path.join(root,d))
self.numclasses = self.numclasses + 1
def reformat(self):
label = 0
for subdir in self.subdirs:
list_dirs = os.walk(subdir)
for root,dirs,files in list_dirs:
for f in files:
srcname = os.path.join(root,f)
print("srcname",srcname)
srcformat = srcname.split('.')[-1]
if srcformat is not ".jpg":
#img = cv2.imread(srcname)
#newname = srcname.replace(srcformat,'jpg')
#print("newname=",newname)
#cv2.imwrite(newname,img)
newname = str(srcname.split('.')[0])+'.jpg'
os.rename(srcname,newname)
self.lines.append(newname+' '+str(label)+'\n')
#os.remove(srcname)
label = label + 1
def split_train_val(self,trainfile,testfile):
if len(self.lines):
random.shuffle(self.lines)
ftrainfile = open(trainfile,'w')
ftestfile = open(testfile,'w')
trainlength = int(0.7*len(self.lines))
for i in range(0,trainlength):
ftrainfile.write(self.lines[i])
for i in range(trainlength,len(self.lines)):
ftestfile.write(self.lines[i])
#实例化
myclassdataset = GeneDataset(sys.argv[1])
#查看sudir
myclassdataset.looksudir()
#统一格式成.jpg,把不是jpg的图片后缀变成jpg
myclassdataset.reformat()
#划分
myclassdataset.split_train_val('train.txt','test.txt')
结果:
2 矩阵数据库 NumPy
2.1 基础知识
NumPy(Numerical Python)是 Python 最重要的矩阵库,支持高维数组与矩阵运算,提供了大量的数学函数库。对于深度学习来说,高维数组我们用的很多,因此要想学好深度学习,必须对 NumPy 了如指掌。
1.ndarray 对象与创建
ndarray 是 numpy 库的基础数据格式, 要想对数组进行运算操作,我们必须先创建个数组。
#创建指定数组
import numpy as np#导入 numpy 这个包
a0 = np.array([1,2,3,4])#采用数组方式
a1 = np.array((1,2,3,4))#采用元组方式
a3 = np.array([[1,2,3],[2,3,4],[4,5,6]])#创建多维数组
#自动生成数组
a = np.arange(0,1,0.1)
a = np.linspace(0,10,10)
np.zeros() :生成元素全是 0 的数组
np.ones():生成元素全是 1 的数组
np.zeros_like(a):生成形状和 a 一样且元素全是 0 的数组
np.ones_like(a):生成形状和 a 一样且元素全是 1 的数组
np.zeros((100,100),np.uint8):生成一个 100*100 的 uint8 类型的图像
获取数组 a 的 shape:
a.shape
获取数组 a 的元素类型:
a.dtype
获取数组 a 的维度:
a.ndim
2.存取数组
竖轴表示第 0 轴(行),横轴表示第 1 轴(列),读取元素时我们通过逗号把 0 轴和 1 轴隔开
3.数组变换
对数组的形状变换是非常高频的操作。
a = np.arange(0,10,1)
b = a.reshape(2,5)
通过 reshape()函数把一个 1 维数组,变成了一个 2 行 5 列的一个数组,reshape()里面的参数就是你想要转换成的数组的形状。
b和c是一样的结果。
维度交换
通过上面实例我们看出通过 swapaxes()将一个数组的第 0 轴和第 1 轴进行了交换,由2 行 5 列变成了 5 列 2 行, 三维数组例子类似。
这个实例将三维数组的第 0 轴和第 1 轴进行了交换,三维数组的维度变换在 caffe,tensorflow, pytorch 等各类开源框架中使用都是非常的频繁的。
一个图像读取进来是(height,weight,channel)这样的格式存储,而深度学习框架中 ,通常都是(batch,channel,height,width)的存储格式,经常需要转换。
可以看出我们通过 reshape(-1)、 flatten()和 ravel()函数将多维变成了 1 维数组
有的时候,我们需要将多余的维度去掉,比如一个数据格式是(100,100,1),第三维通道为 1,那么可以将其变换为(100,100),用到 squeeze 脚本。如果反之,则是 expand_dims,而且可以拓展到不同的维度,这两个操作在深度学习框架中,非常频繁使用。
a = np.zeros((100,100,1)) ##尺度为(100,100,1
b = np.squeeze(a) ##尺度为(100,100)
c = np.expand_dims(b,0) ##尺度为(1,100,100)
d = np.expand_dims(b,1) ##尺度为(100,1,100)
e = np.expand_dims(b,2) ##尺度为(100,100,1)
数组的堆叠,数组的堆叠通常有水平叠加和垂直叠加,分别用到
hstack() 【水平堆叠】和 vstack()【垂直堆叠】函数,请看下面的实例:
a = np.array([1,2,3,4]) #尺度为(4,),一维向量
b = np.array([5,6,7,8]) #尺度为(4,) ,一维向量
c = np.hstack((a,b)) #尺度为(8,) ,一维向量
d = np.vstack((a,b)) #尺度为(2,4),二维矩阵