keras学习记录之cnn(1)

Keras 常用函数

API

英文全称Application Programming Interface,翻译为“应用程序编程接口”。是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。——百度百科(简单点就是函数调用接口

sequential

顺序模型是多个网络层的线性堆叠。(所以各个网络层一起组成了sequential,所以写网络的时候一般都是先写一个sequential)
两种构建网络的方法:

from keras.models import Sequential
from keras.layers import Dense, Activation

model = Sequential([
    Dense(32, input_shape=(784,)),
    Activation('relu'),
    Dense(10),
    Activation('softmax'),
])

也可以简单地使用 .add() 方法将各层添加到模型中:(这个看着简单点

model = Sequential()
model.add(Dense(32, input_dim=784))
model.add(Activation('relu'))

Conv2D

2D 卷积层 (例如对图像的空间卷积)
例子:

model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(100, 100, 3)))
# 输入: 3 通道 100x100 像素图像 -> (100, 100, 3) 张量。
# 使用 32 个大小为 3x3 的卷积滤波器。

关于cnn的理解
上述输入为100X100X3,滤波器为32通道3X3(其实个人觉得这样说不合适,卷积核应该是(3X3X3)前两个对应的是长和宽,后一个是高(高会自动匹配输入的通道数))。这样输出就是100-3+1=98,98X98X32。
输出尺寸
在这里插入图片描述
这篇文章讲的很透彻
标准:

keras.layers.Conv2D(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None, dilation_rate=(1, 1), activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)

常用参数
filters: 整数,输出空间的维度 (即卷积中滤波器的输出数量)。
kernel_size: 一个整数,或者 2 个整数表示的元组或列表, 指明 2D 卷积窗口的宽度和长度。 可以是一个整数,为所有空间维度指定相同的值。(高度自动匹配不需要定义)
strides: 一个整数,或者 2 个整数表示的元组或列表, 指明卷积沿宽度和高度方向的步长。 可以是一个整数,为所有空间维度指定相同的值
padding: “valid” 或 “same” (大小写敏感)。padding参数的作用是决定在进行卷积或池化操作时,是否对输入的图像矩阵边缘补0,‘SAME’ 为补零‘VALID’ 则不补(多余的部分舍去),其原因是因为在这些操作过程中过滤器可能不能将某个方向上的数据刚好处理完。(疑问这样是不是就不能让padding等于某个常数以生成想要的size)

cnn.add(Conv2D(64, 3, padding='same', strides=1)) 

输入14 14 32输出为14 14 64。解释:output_shape = (image_shape-filter_shape+2*padding)/stride + 1,这里我们不知道padding补了多少,padding取same。valid情况下最后为[12 13 14],这三个位置都有信息;same情况下要补零,继续生成[13 14 15]、[14 15 16],14 15 没有信息,为0。(也就是说same补零补到没有信息为止) 。
padding的详细介绍
input_shape:输入的形状,只是第一层要。 如input_shape=(28, 28, 1)
use_bias: 布尔值,该层是否使用偏置向量。
activation: 要使用的激活函数 (详见 activations)。 如果你不指定,则不使用激活函数 (即线性激活: a(x) = x)。
data_format: 字符串, channels_last (默认) 或 channels_first 之一,表示输入中维度的顺序。 channels_last 对应输入尺寸为 (batch, height, width, channels), channels_first 对应输入尺寸为 (batch, channels, height, width)。 它默认为从 Keras 配置文件 ~/.keras/keras.json 中 找到的 image_data_format 值。 如果你从未设置它,将使用 channels_last。
更多参数详情
**

高级激活函数

**
对于 Theano/TensorFlow/CNTK 不能表达的复杂激活函数,如含有可学习参数的激活函数,可通过 高级激活函数 实现,可以在 keras.layers.advanced_activations 模块中找到。 这些高级激活函数包括 PReLU 和 LeakyReLU 。

cnn.add(Conv2D(32, 3, padding='same', strides=2,
               input_shape=(28, 28, 1)))
cnn.add(LeakyReLU(0.2))  #高级激活函数,(对于 Theano/TensorFlow/CNTK 不能表达的复杂激活函数)当神经元未激活时,它仍允许赋予一个很小的梯度
参数  alpha: float >= 0。负斜率系数。

**

Dropout函数防止过拟合

**
Dropout 有助于防止过拟合。
rate: 在 0 和 1 之间浮动。需要丢弃的输入比例

keras.layers.Dropout(rate, noise_shape=None, seed=None)
cnn = Sequential()
cnn.add(Conv2D(32, 3, padding='same', strides=2,
               input_shape=(28, 28, 1)))
cnn.add(LeakyReLU(0.2))  
cnn.add(Dropout(0.3))

**

input()函数

input()初始化输入层

Input(shape=None,batch_shape=None,name=None,dtype=K.floatx(),sparse=False,tensor=None)
     features = cnn(image)

shape:输入的形状
name:这层的名字,没有指定将自动生成

# 第一个输出 (name=generation) 是鉴别是否认为所显示的图像是伪造的,
# 而第二个输出 (name=auxiliary) 是鉴别认为图像所属的类。
fake = Dense(1, activation='sigmoid', name='generation')(features) # 1真假
aux = Dense(num_classes, activation='softmax', name='auxiliary')(features) # 10分类
return Model(image, [fake, aux])  # Model(输入层, 输出层)

如上述代码:先初始化输入层;然后将输入层放入已经写好的中间层cnn,得到feature;将feature放入输出层。这样就是一个完整的网络。
**

网络可视化

from keras.utils import plot_model
plot_model(build_discriminator,
           to_file='model.png',
           show_shapes = True,
           show_layer_names = True,
           expand_nested = True,
           )

expand_nested :将每一层网路都详细的写出来
在这里插入图片描述

Conv2DTranspose()函数

用法:

cnn.add(Conv2DTranspose(192, 5, strides=1, padding='valid',
                        activation='relu',
                        kernel_initializer='glorot_normal'))#(3, 3, 384)>>(7,7,192)相当于卷积的逆运算

就是卷积运算的逆运算了,可以利用上述的卷积公式倒推出输出的尺寸。
官方给的计算公式

new_rows = ((rows - 1) * strides[0] + kernel_size[0]
            - 2 * padding[0] + output_padding[0])
new_cols = ((cols - 1) * strides[1] + kernel_size[1]
            - 2 * padding[1] + output_padding[1])

算起来太难了,在其他程序中看到有用上采样代替的,如:

 # 上采样
 # 7, 7, 64 -> 14, 14, 64        
 model.add(UpSampling2D())   
 model.add(Conv2D(128, kernel_size=3, padding="same"))   

BatchNormalization()函数

用法:

cnn.add(Conv2DTranspose(192, 5, strides=1, padding='valid',
                        activation='relu',
                        kernel_initializer='glorot_normal'))#(3, 3, 384)>>(7,7,192)相当于卷积的逆运算
cnn.add(BatchNormalization())

作用:
(1)你可以选择比较大的初始学习率,让你的训练速度飙涨。以前还需要慢慢调整学习率,甚至在网络训练到一半的时候,还需要想着学习率进一步调小的比例选择多少比较合适,现在我们可以采用初始很大的学习率,然后学习率的衰减速度也很大,因为这个算法收敛很快。当然这个算法即使你选择了较小的学习率,也比以前的收敛速度快,因为它具有快速训练收敛的特性;

(2)你再也不用去理会过拟合中drop out、L2正则项参数的选择问题,采用BN算法后,你可以移除这两项了参数,或者可以选择更小的L2正则约束参数了,因为BN具有提高网络泛化能力的特性;

(3)再也不需要使用使用局部响应归一化层了(局部响应归一化是Alexnet网络用到的方法,搞视觉的估计比较熟悉),因为BN本身就是一个归一化网络层;

(4)可以把训练数据彻底打乱(防止每批训练的时候,某一个样本都经常被挑选到,文献说这个可以提高1%的精度,这句话我也是百思不得其解啊)。
总结:能让每个隐层节点的激活输入分布固定下来避免了“Internal Covariate Shift”的问题,提高训练的效果。
详细介绍

summary函数

用法:model.summary(),统计每层的输出大小以及参数的个数。详细解释

Embedding()函数

嵌入层,将正整数(索引值)转换为固定尺寸的稠密向量(即投影到高维空间)
标准示例:

model = Sequential()
model.add(Embedding(1000, 64, input_length=10))
# 模型将输入一个大小为 (batch, input_length) 的整数矩阵。
# 输入中最大的整数(即词索引)不应该大于 999 (词汇表大小)
# 现在 model.output_shape == (None, 10, 64),其中 None 是 batch 的维度。
# 即将10维的输入投到64维的空间

实际情况:

image_class = Input(shape=(1,), dtype='int32')

cls = Embedding(num_classes, latent_size,
                embeddings_initializer='glorot_normal')(image_class) 

这里的(image_class)就相当于标准示例的input_length=,num_classes=10对应0到9的手写数字的标签,投影到latent_size=100的高维空间。

GlobalAveragePooling2D()函数

作用:对输出的每一个通道的特征图计算一个平均值(平均池化),得到一个特征向量。[B H W C]=>[B C]

ZeroPadding2D函数

作用:给指定维度补零

 model.add(ZeroPadding2D(padding=((0,1),(0,1))))

在最后一行后面加一行零,最后一列后面加一列零。行数增1,列数增1

keras.layers.convolutional.ZeroPadding2D(padding=((1,0),(1,0)))

在第一行前面加一行零,第一列前面加一列零。行数增1,列数增1

keras.layers.convolutional.ZeroPadding2D(padding=(1, 0), dim_ordering='default')

在第一行前面和最后一行后面都加一行零。行数增2,列数不变

keras.layers.convolutional.ZeroPadding2D(padding=(0, 1), dim_ordering='default')

在第一列前面和最后一列后面都加一列零。列数增2,行数不变

multiply()函数

针对多输入网络层,将各个输入信息融合
输入为列表形式

model_input = multiply([noise, label_embedding])  

在这里插入图片描述

Model类模型的常用函数

compile()函数

用于配置训练模的必要参数,如:

optimizer = Adam(0.0002, 0.5)  #问题一:这个什么意思,可以用 BatchNormalization()代替吗 ,不可以一个是网路结构,一个是梯度下降
# 判别模型
losses = ['binary_crossentropy', 'sparse_categorical_crossentropy']
self.discriminator = self.build_discriminator()
self.discriminator.compile(loss=losses,       # 这里有两个损失函数用哪个? 用于配置训练模型
    optimizer=optimizer,
    metrics=['accuracy'])

用法:

compile(optimizer, loss=None, metrics=None, loss_weights=None, sample_weight_mode=None, weighted_metrics=None, target_tensors=None)

输入:
optimizer:字符串(优化器名)或者优化器实例。
loss:字符串(目标函数名)或目标函数,如果模型具有多个输出,则可以通过传递损失函数的字典或列表,在每个输出上使用不同的损失。 模型将最小化的损失值将是所有单个损失的总和。(输出顺序和函数顺序一一对应)
train_on_batch()函数
metrics: 在训练和测试期间的模型评估标准。 通常你会使用 metrics = [‘accuracy’]

train_on_batch()函数

作用:运行一批样品的单次梯度更新

Model.train_on_batch(x, y, sample_weight=None, class_weight=None, reset_metrics=True)

例:

g_loss = self.combined.train_on_batch([noise, sampled_labels], [valid, sampled_labels])
#self.combined.metrics_names

输入:x为输入,y为正确答案
输出:标量训练误差(同时更新参数,获得更高的准确率)

metrics_names函数

注意: train_on_batch()函数输出的量可能不止一个,这个时候要搞明白每个输出对应的量,可以用
self.combined.metrics_names 这行代码看。

fit()函数

训练网络
model.fit(x_train, y_train, batch_size=512, epochs=1,validation_split=0.2)
在这里插入图片描述
ETA:Estimated Time of Arrival。Loss:系统的损失。acc:Accuracy正确率。

模型的保存 save()函数

作用:保存已经训练好的model
用法:

#save( filepath, overwrite=True, include_optimizer=True)
autoencoder.save( 'autoencoder_1.h5', overwrite=True, include_optimizer=True )

filepath:保存的路径

overwrite:如果存在源文件,是否覆盖

include_optimizer:是否保存优化器状态

模型的载入 keras.models.load_model( )函数

my_model = keras . models . load_model( filepath )

载入后可以继续训练:

my_model . fit( X_train_2,Y_train_2 )

也可以直接评估:

preds = my_model . evaluate( X_test, Y_test )
print ( "Loss = " + str( preds[0] ) )
print ( "Test Accuracy = " + str( preds[1] ) )

有关模型的读写更加详尽的介绍

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值