机器学习(PET图像重建、tensorflow、GPU/distributed)

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。

 

https://www.numpy.org/devdocs/user/quickstart.html

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值