1.20220519
SVM
全称support vector machine,支持向量机,是一个面向数据的分类算法,目标是为确定一个分类超平面,从而将不同的数据分隔开。
支持向量机学习方法包括构建由简至繁的模型:线性可分支持向量机、线性支持向量机及非线性支持向量机。当训练数据线性不可分时,通过使用核技巧及软间隔最大化,学习非线性支持向量机。
核函数的本质:使用低维特征空间上的计算来避免在高维空间中向量内积的恐怖计算量;也就是说此时SVM模型可以应用在高维特征空间中数据可线性分割的优点,同时又避免了引入这个高维特征空间恐怖的内积计算量。
具体示例:
设两个向量x1 = (μ1 + μ2)T 和x2 = (η1 + η2)T ,两个向量的点积是五维空间的映射,因此映射过后的内积为:

而同时我们可以发现有以下公式:

两者非常相似,所以只要乘上一个相关的系数,就可以让这两个式子的值相等,也就是将高维空间的内积转换为两维空间的内积的运算。
常见核函数:
(1)线性核 k(x,z)=xz
(2)多项式核 k(x,z)=(axz+r)^d 其中 a, r, d属于超参
(3)高斯核函数 只有一个超参数,高斯核函数在实际中运用比较多,不仅仅是因为超参数较少,还因为它等价于低维映射到无穷维后展开的点积。
(4) sigmoid核函数 不太好用,不建议使用
除此之外,SVM支持核函数自定义,但要保证核函数必须为正定核函数
- 20220520 tensorflow计算图
tensorflow是一个通过计算图的形式来表述计算的编程系统,计算图也叫流程图,可以把计算图看做是一种有向图,tensorflow中的每一个计算都是计算图上的一个节点,而节点之间的边描述了计算之间的依赖关系。
tensorflow特殊之处在于,它首先需要通过编程构建一个计算图,然后将数据作为输入,通过这个计算图规定的计算操作进行计算,最后得到计算结果,是一种符号式编程,有着比较多的嵌入和优化,性能也随之提升;同时计算图非常适合用来思考数学表达式,比如公式:
image.png
通过计算图,可以清晰的看到运算表达式中,各个运算操作以及变量间的依赖和调用关系,接着我们来求偏导数,如下:
image.png
通过链式法则,我们逐节点的计算偏导数,在网络backward时,需要用链式求导法则求出网络最后输出的梯度,然后在对网络进行优化。
计算图从本质上来说,是tensorflow在内存中构建的程序逻辑图,计算图可以被分割成多个块,并且可以并行地运行在多个不同的cpu或gpu上,可以支持大规模的神经网络。
Tensorflow中的计算图有三种,分别是静态计算图,动态计算图和autograph。目前采用较广泛的是动态计算图,即使用一个算子后,该算子会被动态加入到隐含的默认计算图中立即执行得到结果,方便调试程序,但会牺牲一些效率(tensorflow2是动态计算图,tensorflow1是静态计算图)。
#静态计算图
import tensorflow as tf
# TensorFlow1.0
#定义计算图
g = tf.Graph()
with g.as_default():
#placeholder为占位符,执行会话时候指定填充对象
x = tf.placeholder(name='x', shape=[], dtype=tf.string)
y = tf.placeholder(name='y', shape=[], dtype=tf.string)
z = tf.string_join([x,y],name = 'join',separator=' ')
#执行计算图
with tf.Session(graph = g) as sess:
print(sess.run(fetches = z,feed_dict = {x:"hello",y:"world"}))
# TensorFlow2.0
g = tf.compat.v1.Graph()
with g.as_default():
x = tf.compat.v1.placeholder(name='x', shape=[], dtype=tf.string)
y = tf.compat.v1.placeholder(name='y', shape=[], dtype=tf.string)
z = tf.strings.join([x,y],name = "join",separator = " ")
with tf.compat.v1.Session(graph = g) as sess:
# fetches的结果非常像一个函数的返回值,而feed_dict中的占位符相当于函数的参数序列。
print(sess.run(fetches = z,feed_dict = {x:"hello",y:"world"}))
# 第一部分
# 动态计算图在每个算子处都进行构建,构建后立即执行
x = tf.constant("hello")
y = tf.constant("world")
z = tf.strings.join([x,y],separator=" ")
tf.print(z) # hello world
# 第二部分
# 可以将动态计算图代码的输入和输出关系封装成函数
def strjoin(x,y):
z = tf.strings.join([x,y],separator = " ")
tf.print(z) # hello world
return z
result = strjoin(tf.constant("hello"),tf.constant("world"))
print(result) # tf.Tensor(b'hello world', shape=(), dtype=string)
网友评论