0%

机器学习笔记

深度学习,手势识别

CNN卷积神经网络

参考链接

一维卷积Conv1d

二维卷积Conv2d

三维卷积Conv3d

融合层Merge 分离层lambda

lambda 将Input输入层分隔
Merge 融合层

ANN

CNN后面接LSTM

机器学习指标

召回率F1

机器学习算法分类

TCN
DenseNet

论文地址

Keras实现DenseNet结构

LSTM RNN
keras中TimeDistributed的用法

计算top-1 err和计算top-5 err

top1就是你预测的label取最后概率向量里面最大的那一个作为预测结果,你的预测结果中概率最大的那个类必须是正确类别才算预测正确。而top5就是最后概率向量最大的前五名中出现了正确概率即为预测正确

Batch Normalization

作者认为:网络训练过程中参数不断改变导致后续每一层输入的分布也发生变化,
而学习的过程又要使每一层适应输入的分布,因此我们不得不降低学习率、小心地初始化。
作者将分布发生变化称之为 internal covariate shift。
Batch Normalization

GlobalAveragePooling2D层

就是在卷积层之后,用GAP替代FC全连接层。有两个有点:一是GAP在特征图与最终的分类间转
换更加简单自然;二是不像FC层需要大量训练调优的参数,降低了空间参数会使模型更加健壮,抗过拟合效果更佳

YOLOV3
自定义激活函数

Neual Network可视化工具

keras-vis

什么使用local connected layer,fully connected layer
当数据集具有全局的局部特征分布时,也就是说局部特征之间有较强的相关性,适合用全卷积。在不同的区域有不同的特征分布时,适合用local-Conv

BP反向传播

Python使用numpy实现BP神经网络
优点:能比较鲁棒性地评估模型在未知数据上的性能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$ # MLP for Pima Indians Dataset with 10-fold cross validation
$ from keras.models import Sequential
$ from keras.layers import Dense
$ from sklearn.model_selection import StratifiedKFold
$ import numpy
$ # fix random seed for reproducibility
$ seed = 7
$ numpy.random.seed(seed)
$ # load pima indians dataset
$ dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
$ # split into input (X) and output (Y) variables
$ X = dataset[:,0:8]
$ Y = dataset[:,8]
$ # define 10-fold cross validation test harness
$ kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed)
$ cvscores = []
$ for train, test in kfold.split(X, Y):
$ # create model
$ model = Sequential()
$ model.add(Dense(12, input_dim=8, activation='relu'))
$ model.add(Dense(8, activation='relu'))
$ model.add(Dense(1, activation='sigmoid'))
$ # Compile model
$ model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
$ # Fit the model
$ model.fit(X[train], Y[train], epochs=150, batch_size=10, verbose=0)
$ # evaluate the model
$ scores = model.evaluate(X[test], Y[test], verbose=0)
$ print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
$ cvscores.append(scores[1] * 100)
$ print("%.2f%% (+/- %.2f%%)" % (numpy.mean(cvscores), numpy.std(cvscores)))

K-flod cross validation

将数据集分成k份,每一轮用其中(k-1)份做训练而剩余1份做验证,以这种方式执行k轮,得到k个模型.将k次的性能取平均,作为该算法的整体性能.k一般取值为5或者10
缺点:计算复杂度较大.因此,在数据集较大,模型复杂度较高,或者计算资源不是很充沛的情况下,可能不适用,尤其是在训练深度学习模型的时候

Keras自定义层

https://keras.io/guides/making_new_layers_and_models_via_subclassing/

自定义激活函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ import os
$ from keras import backend as K
$ from keras.layers import Activation,Conv2D
$ from keras.utils.generic_utils import get_custom_objects
$ os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3"
$
$
$ def swish(x):
$ '''
$ x:每个值
$ '''
$ return (K.sigmoid(x) * x)
$ get_custom_objects().update({'swish': Activation(swish)})
$
$ # 用法
$ net = Activation("swish")(net)
$ # 或者 都可以
$ net = (......,activation='swish')(net)
1
2
3
4
5
6
7
8
9
$ from keras import backend as K
$ from keras.utils.generic_utils import get_custom_objects
$
$ def custom_activation(x):
$ return (K.sigmoid(x) * 5) - 1
$
$ get_custom_objects().update({'custom_activation': Activation(custom_activation)})
$
$ model.add(Activation(custom_activation))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
$ from keras import backend as K
$ from keras.layers.core import Lambda
$ from keras.engine import Layer
$
$ #使用theano/tensorflow的内置函数简单地编写激活函数
$ def sigmoid_relu(x):
$ """
$ f(x) = x for x>0
$ f(x) = sigmoid(x)-0.5 for x<=0
$ """
$ return K.relu(x)-K.relu(0.5-K.sigmoid(x))
$
$ #使用Lambda
$ def lambda_activation(x):
$ """
$ f(x) = max(relu(x),sigmoid(x)-0.5)
$ """
$ return K.maximum(K.relu(x),K.sigmoid(x)-0.5)
$
$ #编写自己的layer(这个例子中参数theta,alpha1,alpha2是固定的超参数,不需要train,故没定义build)
$ class My_activation(Layer):
$ """
$ f(x) = x for x>0
$ f(x) = alpha1 * x for theta<x<=0
$ f(x) = alpha2 * x for x<=theta
$ """
$ def __init__(self,theta=-5.0,alpha1=0.2,alpha2=0.1,**kwargs):
$ self.theta = theta
$ self.alpha1 = alpha1
$ self.alpha2 = alpha2
$ super(My_activation,self).__init__(**kwargs)
$ def call(self,x,mask=None):
$ fx_0 = K.relu(x) #for x>0
$ fx_1 = self.alpha1*x*K.cast(x>self.theta,K.floatx())*K.cast(x<=0.0,K.floatx()) #for theta<x<=0
$ fx_2 = self.alpha2*x*K.cast(x<=self.theta,K.floatx())#for x<=theta
$ return fx_0+fx_1+fx_2
$ def get_output_shape_for(self, input_shape):
$ #we don't change the input shape
$ return input_shape
$
$ #alpha1,alpha2是可学习超参数
$ class Trainable_activation(Layer):
$ """
$ f(x) = x for x>0
$ f(x) = alpha1 * x for theta<x<=0
$ f(x) = alpha2 * x for x<=theta
$ """
$ def __init__(self,init='zero',theta=-5.0,**kwargs):
$ self.init = initializations.get(init)
$ self.theta = theta
$ super(Trainable_activation,self).__init__(**kwargs)
$ def build(self,input_shape):
$ self.alpha1 = self.init(input_shape[1:],name='alpha1')#init alpha1 and alpha2 using ''zero''
$ self.alpha2 = self.init(input_shape[1:],name='alpha2')
$ self.trainable_weights = [self.alpha1,self.alpha2]
$ def call(self,x,mask=None):
$ fx_0 = K.relu(x) #for x>0
$ fx_1 = self.alpha1*x*K.cast(x>self.theta,K.floatx())*K.cast(x<=0.0,K.floatx()) #for theta<x<=0
$ fx_2 = self.alpha2*x*K.cast(x<=self.theta,K.floatx())#for x<=theta
$ return fx_0+fx_1+fx_2
$ def get_output_shape_for(self, input_shape):
$ #we don't change the input shape
$ return input_shape
$

使用时

1
2
3
4
$ model.add(Activation(sigmoid_relu))
$ model.add(Lambda(lambda_activation))
$ model.add(My_activation(theta=-5.0,alpha1=0.2,alpha2=0.1))
$ model.add(Trainable_activation(init='normal',theta=-5.0))

强化学习 Enforce learning

https://www.jianshu.com/p/e037d42ab6b1

机器学习参数的难题

(1)参数太多,如果训练数据集有限,很容易产生过拟合;
(2)网络越大、参数越多,计算复杂度越大,难以应用;
(3)网络越深,容易出现梯度弥散问题(梯度越往后穿越容易消失),难以优化模型

SE-Net

对于channel维度的特征融合,卷积操作基本上默认对输入特征图的所有channel进行融合。而MobileNet网络中的组卷积(Group Convolution)和深度可分离卷积(Depthwise Separable Convolution)对channel进行分组也主要是为了使模型更加轻量级,减少计算量

参考书籍

Deep Learning for Time Series Forecasting
该作者网站

(硬件平台)[https://www.china-scratch.com/news/7587]

Hikey970

坚持原创技术分享,您的支持将鼓励我继续创作!