1. TensorFlow
TensorFlow不仅可以用来做神经网络算法研究,也可以用来做普通的机器学习算法,甚至是只要你能够把计算表示成数据流图,都可以用TensorFlow。
一个简单的小例子:(前三张:输入,最后一张:输出)loss会返回,使得输入无限准确。经过200次的训练,使得w和b的值无限接近一开始预设的0.1和0.3。
![]()
![]()
人工智能实战项目合集:https://github.com/Honlan/DeepInterests
在使用TensorFlow之前,有必要了解如下几个概念:
1. 计算是用图的形式表示的。
2. Sessions是执行的入口,类似于SparkContext。
3. 数据是用tensor表示的。
4. Variables用来表示可变状态,比如模型参数。
5. 使用feeds和fetches从运算节点输入和输出数据。
TensorFlow计算框架要求所有的计算都表示成图,节点在图中被称为运算op(operation简称)。一个运算可以获得零个或者多个Tensors,经过计算,可以产生零个或者多个Tensors。一个Tensor是一个多维数组,举个例子,可以把一批图像数据表示成一个4维浮点数组[batch, height, width, channels]
计算图是通过Session提交,一个Session决定图中的运算该到那个设备上去计算,比如是选CPU还是CPU。运算op产生的结果在python中是一个numpy.ndarray数组对象,在C和C++中是tensorflow::Tensor实例。
shape [2,3] 表示为数组的意思是第一维有两个元素,第二维有三个元素,如: [[1,2,3],[4,5,6]]
TensorFlow用张量这种数据结构来表示所有的数据。你可以把一个张量想象成一个n维的数组或列表。一个张量有一个静态类型和动态类型的维数。张量可以在图中的节点之间流通。在TensorFlow系统中,张量的维数来被描述为阶。
import tensorflow as tf
a = tf.constant([[1.,2.,3.],[4.,5.,6.],[7.,8.,9.]],shape = [3,3])
b = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(b)
print(sess.run(a))
[[ 1. 2. 3.]
[ 4. 5. 6.]
[ 7. 8. 9.]]
2. 拓展知识
PET:
正电子发射型计算机断层显像(Positron Emission Computed Tomography),是核医学领域比较先进的临床检查影像技术。PET全称为正电子发射计算机断层显像(positron emission tomography PET),是反映病变的基因、分子、代谢及功能状态的显像设备。它是利用正电子核素标记葡萄糖等人体代谢物作为显像剂,通过病灶对显像剂的摄取来反映其代谢变化,从而为临床提供疾病的生物代谢信息。
其大致方法是,将某种物质,一般是生物生命代谢中必须的物质,如:葡萄糖、蛋白质、核酸、脂肪酸,标记上短寿命的放射性核素(如18F,11C等),注入人体后,通过对于该物质在代谢中的聚集,来反映生命代谢活动的情况,从而达到诊断的目的。
图像重建:
通过物体外部测量的数据,经数字处理获得三维物体的形状信息的技术。图像重建技术开始是在放射医疗设备中应用,显示人体各部分的图像,即计算机断层摄影技术,简称CT技术。
人类通过双眼来探索与发现世界。人类接收外部信息的方式中,有不到三成来自于听觉、触觉、嗅觉等感受器官,而超过七成、最丰富、最复杂的信息则通过视觉[1]进行感知的。计算机视觉便是一种探索给计算机装备眼睛(摄像头)与大脑(算法)的技术,以使计算机能够自主独立的控制行为、解决问题,同时感知、理解、分析外部环境。
CT(Computed Tomography)是大家所熟悉的X线断层显像技术。可以清楚的获得病变的解剖结构信息,但是仅靠结构特点诊断疾病有局限性,有些病变的性质比如肿瘤的良恶性、手术后肿瘤有无复发CT均难以做出准确的判断。不能准确地反映疾病的生理代谢状态。
PET-CT是将PET和CT整合在一台仪器上,组成一个完整的显像系统,被称作PET-CT系统(integrated PET-CT system), 病人在检查时经过快速的全身扫描,可以同时获得CT解剖图像和PET功能代谢图像,两种图像优势互补,使医生在了解生物代谢信息的同时获得精准的解剖定位,从而对疾病做出全面、准确的判断。(PET/CT在肿瘤疾病中的应用:http://dict.bioon.com/detail.asp?id=e2d8683347)
卷积:
比如做馒头
楼下早点铺子生意太好了,供不应求,就买了一台机器,不断的生产馒头。
假设馒头的生产速度是 f(t) ,那么一天后生产出来的馒头总量为: ∫240f(t)dt
馒头生产出来之后,就会慢慢腐败,假设腐败函数为 g(t) ,比如,10个馒头,24小时会腐败: 10∗g(t)
想想就知道,第一个小时生产出来的馒头,一天后会经历24小时的腐败,第二个小时生产出来的馒头,一天后会经历23小时的腐败。 如此,我们可以知道,一天后,馒头总共腐败了: ∫240f(t)g(24−t)dt
通俗易懂地说,就是:输出 = 输入 * 系统
线性回归:
回归方法是为了对连续性的数据做出预测,其中最简单的方法当然就是线性回归。顾名思义,线性回归就是用线性方程来对已知的线性方程进行拟合,用拟合出的线性方程对未知数据做出预测。线性回归的优点就是计算公式简单,计算结果容易理解;缺点就是对非线性的数据拟合程度不够好。
矩阵:
矩阵定义如下:由m×n 个数aij (i= 1,2,…,m;j= 1,2,…,n)排成的m 行n 列的数表
注意:我们通常会说矩阵的维度,这里的维度也不是指的空间,而是指矩阵的行数。
Numpy:
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
属性 | 描述 |
---|---|
shape | 元组,值为数组中每一维(轴)的元素个数(长度) |
size | 数组中元素的总数 |
ndim | 维(轴)数 |
[[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]][[13 14 15 16]
[17 18 19 20]
[21 22 23 24]]] 维度为(2,3,4)
的矩阵,size=2*3*4
矩阵 转置 transpose 高维数组:
如果是问转置这件事情有什么意义的话,这里可以说一个应用场景。
例如有一组数据,以及对应这一组数据中每一个值的一组标签数据,两组数据是分开的(在代码编写过程中这种现象很常见)。
现在需求是把数据和其对应的标签组合起来。那么可以先把两组数据堆叠,然后进行转置。
矩阵其实是用来描述或者说是记录 物体所有的点在一个线性空间里的坐标 的,当然也可以用于描述 对别的对象进行 旋转 / 缩放 / 平移 的程度
在做图像处理或输出时,如果要对一个物体(2维 / 3维 / n维,取决于这个物体所在的线性空间),进行 旋转 / 平移 / 缩放 等操作,就要对描述这个物体(有无数个点组成,每个点都有它在矩阵里对应的行向量)的所有矩阵进行运算啦
所以矩阵那些奇形怪状的 加法,数乘,相乘,转置,方阵对应的行列式 的运算定律不是无理取闹的
- 在二维空间里矩阵的 转置 ,就相当于 得到关于某个点对称的二维图像,有点像A4纸上写着矩阵的数表,摁着它的右上角,揭着它的左下角沿对角线往上掀啦
- 在三维空间里矩阵的 转置 ,同样是相当于 得到关于某个点对称的三维立体,想象一下一个正方体关于某个点对称的情形,这是一种特殊的旋转,左乘一个矩阵也可以殊途同归达到转置的效果
1. 同型矩阵的 加法 :对应着 缩放,不过可能是不等比例的,叫做 变形 更合理~
2. 数乘 :不用说啦,就是 等比例缩放~
3. 至于俩矩阵 相乘:哈哈哈,在表示物体原位置的矩阵的基础上,左乘一个矩阵就可以 旋转 啦
在读图片时,会用到这么的一段代码:
(和transposr有关)
1
2
3
4
image_vector_len = np.prod(image_size)#总元素大小,3*55*47
img = Image.open(path)
arr_img = np.asarray(img, dtype='float64')
arr_img = arr_img.transpose(2,0,1).reshape((image_vector_len, ))# 47行,55列,每个点有3个元素rgb。再把这些元素一字排开
对于一维的shape,转置是不起作用的。
对图像执行np.transpose(img, (1, 0, 2))操作,可以将图像逆时针翻转90度,在配合cv2.flip(img, 0 or 1),可以做到翻转270度或90度:
import cv2 as cv
import numpy as np
img = cv.imread('my.jpg')
cv.imshow('img',img)
#逆时针旋转90度
img = np.transpose(img, (1, 0, 2))
#顺时针旋转90度
# img = cv.flip(img, 1)
#顺时针旋转270度
# img = cv.flip(img, 1)
cv.namedWindow('img',cv.WINDOW_AUTOSIZE)
cv.imshow('img2',img)
cv.waitKey(0)
cv.destroyAllWindows()
原数组two的数组两个轴为(x,y),对应的下标为(0,1),np.transpose()传入的参数为(1,0),即将原数组的x,y轴互换。综上,对二维数组的transpose操作就是对原数组的转置操作。如下:
>>> two=np.arange(16).reshape(4,4)
>>> two
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
>>> two.transpose()
array([[ 0, 4, 8, 12],
[ 1, 5, 9, 13],
[ 2, 6, 10, 14],
[ 3, 7, 11, 15]])
>>> two.transpose(1,0)
array([[ 0, 4, 8, 12],
[ 1, 5, 9, 13],
[ 2, 6, 10, 14],
[ 3, 7, 11, 15]])
transpose进行的操作其实是将各个维度重置,原来(2,3,4)对应的是(0,1,2)。使用transpose(1,0,2)后,各个维度大小变为(3,2,4),其实就是将第一维和第二维互换。
T 属性:数组的简单轴对换
3. GPU
由于GPU具有高并行结构(highly parallel structure),所以GPU在处理图形数据和复杂算法方面拥有比CPU更高的效率。CPU执行计算任务时,一个时刻只处理一个数据,不存在真正意义上的并行,而GPU具有多个处理器核,在一个时刻可以并行处理多个数据。
GPU采用流式并行计算模式,可对每个数据进行独立的并行计算,所谓“对数据进行独立计算”,即,流内任意元素的计算不依赖于其它同类型数据,例如,计算一个顶点的世界位置坐标,不依赖于其他顶点的位置。而所谓“并行计算”是指“多个数据可以同时被使用,多个数据并行运算的时间和1个数据单独执行的时间是一样的”。
GPU计算能力这么强,被广泛使用!比如挖矿(比特币)、图形图像处理、数值模拟、机器学习算法训练等等,那我们怎么发挥GPU超强的计算能力呢?---编程!GPU全称:graphics processing unit,图形处理器,顾名思义就是处理图形的。
GPU的处理速度之快得益于它可以高效地处理矩阵乘法和卷积,GPU如此快速的真正原因是内存带宽和不必要的并行。
图2对CPU与GPU中的逻辑架构进行了对比。其中Control是控制器、ALU算术逻辑单元、Cache是cpu内部缓存、DRAM就是内存。可以看到GPU设计者将更多的晶体管用作执行单元,而不是像CPU那样用作复杂的控制单元和缓存。从实际来看,CPU芯片空间的5%是ALU,而GPU空间的40%是ALU。这也是导致GPU计算能力超强的原因。
图2 cpu和gpu硬件逻辑结构对比
使用神经网络训练,一个最大的问题就是训练速度的问题,特别是对于深度学习而言,过多的参数会消耗很多的时间,在神经网络训练过程中,运算最多的是关于矩阵的运算,这个时候就正好用到了GPU,GPU本来是用来处理图形的,但是因为其处理矩阵计算的高效性就运用到了深度学习之中。
4. python 模块
python中的tqdm模块用法:它的作用就是在终端上出现一个进度条,使得代码进度可视化。
h5py:操作 HDF5 文件的 Python 工具 h5py。
HDF(Hierarchical Data Format)指一种为存储和处理大容量科学数据设计的文件格式及相应库文件。当前流行的版本是 HDF5。HDF5 拥有一系列的优异特性,使其特别适合进行大量科学数据的存储和操作,如它支持非常多的数据类型,灵活,通用,跨平台,可扩展,高效的 I/O 性能,支持几乎无限量(高达 EB)的单文件存储等。
一个 HDF5 文件是存储两类对象的容器,这两类对象分别为:
- dataset:类似数组的数据集合;
- group;类似目录的容器,其中可以包含一个或多个 dataset 及其它的 group。
一个 HDF5 文件从一个命名为 "/" 的 group 开始,所有的 dataset 和其它 group 都包含在此 group 下,当操作 HDF5 文件时,如果没有显式指定 group 的 dataset 都是默认指 "/" 下的 dataset,另外类似相对文件路径的 group 名字都是相对于 "/" 的。
HDF5 文件的 dataset 和 group 都可以拥有描述性的元数据,称作 attribute。
用 h5py 操作 HDF5 文件,我们可以像使用目录一样使用 group,像使用 numpy 数组一样使用 dataset,像使用字典一样使用属性,非常方便和易用。
5. Jupyter
在终端输入ipython notebook即可运行jupyter
kernel:简而言之就是jupyter支持的编程语言环境。
notebook启动ipynb时,默认kernel是什么:新建ipynb文件时,选择的是哪个kernel,每次进入时就启动相应的kernel
notebook是编辑器,代码python或其他运行需要语言编译环境的支持,kernel中就包含了这个语言环境,不同的kernel可对应不同的环境。
自动关联kernel与虚拟环境:创建虚拟环境的同时,安装上ipykernel即可
虚拟环境安装的python语言编译环境,通过配置Jupyter下的kernel.json文件,就可以将虚拟环境映射为kernel。