1、残差连接是目前常用的组件,解决了大规模深度学习模型梯度消失和瓶颈问题。
通常,在10层以上的模型中追加残差连接可能有帮助。
1
2
3
4
5
6
7
8
9
10
11
12
|
from keras import layers
x = ...
y = layers.Conv2D( 128 , 3 , activation = 'relu' , padding = 'same' )(x)
y = layers.Conv2D( 128 , 3 , activation = 'relu' , padding = 'same' )(y)
y = layers.MaxPooling2D( 2 , strides = 2 )(y)
# 形状不同,要做线性变换:
residual = layers.Conv2D( 128 , 1 , strides = 2 , padding = 'same' )(x) # 使用 1×1 卷积,将 x 线性下采样为与 y 具有相同的形状
y = layers.add([y, residual])
|
2、标准化用于使模型看到的不同样本更相似,有助于模型的优化和泛化。
1
2
3
4
5
6
7
|
# Conv
conv_model.add(layers.Conv2D( 32 , 3 , activation = 'relu' ))
conv_model.add(layers.BatchNormalization())
# Dense
dense_model.add(layers.Dense( 32 , activation = 'relu' ))
dense_model.add(layers.BatchNormalization())
|
3、深度可分离卷积层,在Keras中被称为SeparableConv2D,其功能与普通Conv2D相同。
但是SeparableConv2D比Conv2D轻,训练快,精度高。
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
|
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras import layers
height = 64
width = 64
channels = 3
num_classes = 10
model = Sequential()
model.add(layers.SeparableConv2D( 32 , 3 ,activation = 'relu' ,input_shape = (height, width, channels,)))
model.add(layers.SeparableConv2D( 64 , 3 , activation = 'relu' ))
model.add(layers.MaxPooling2D( 2 ))
model.add(layers.SeparableConv2D( 64 , 3 , activation = 'relu' ))
model.add(layers.SeparableConv2D( 128 , 3 , activation = 'relu' ))
model.add(layers.MaxPooling2D( 2 ))
model.add(layers.SeparableConv2D( 64 , 3 , activation = 'relu' ))
model.add(layers.SeparableConv2D( 128 , 3 , activation = 'relu' ))
model.add(layers.GlobalAveragePooling2D())
model.add(layers.Dense( 32 , activation = 'relu' ))
model.add(layers.Dense(num_classes, activation = 'softmax' ))
model. compile (optimizer = 'rmsprop' , loss = 'categorical_crossentropy' )
|
Counter实例扩展:
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
|
from collections import Counter
list1 = [ 'a' , 'b' , 'c' , 23 , 23 , 'a' , 'd' , 'b' , 'e' ]
counter1 = Counter(list1)
print (counter1)
print (counter1[ 'a' ])
#1.1.1统计不同单词的数目
print ( len ( set (list1)))
#1.1.2对统计结果进行分组 下面的方法表示分为4组,不填默认全部分组,以列表
#存储,里面元素是tuple对象
print (counter1.most_common( 4 ))
#1.1.3 elements()获取Counter()生成对象的所有键名,重复的几个会全部打印
# 该方法返回一个迭代器对象
keylist = counter1.elements()
print (keylist)
print ( list (keylist))
#1.1.4 update(x) 更新计数器 把x的内容加入到原来计数器中
#x可以作为字符串,列表,元组,集合,但是不能作为字典,纯数字,否则报错
list2 = [ 'a' , 'd' , 'f' , 'q' , 2 , 3 , 2 , 3 , 4 ]
print (counter1)
counter1.update(list2)
print (counter1)
#1.1.5 substract(x) 更新计数器 把x代表的次数减少1,默认减少1,(通过字典形式指定一次减少的个数)
#,不存在则减为-1,依次减,作用与update()相反
counter1.subtract( 'a' )
print (counter1)
counter1.subtract([ 'a' , 'b' , 2 ])
print (counter1)
|
到此这篇关于Python高级架构模式知识点总结的文章就介绍到这了,更多相关Python高级架构模式的整理内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://www.py.cn/jishu/jichu/32600.html