深度学习tips(6)CNN

https://www.cnblogs.com/wj-1314/articles/9621901.html

fine-tuning就是使用已用于其他目标、预训练好模型的权重或者部分权重,作为初始值开始训练。

 • 复用相同层的权重,新定义层取随机权重初始值

 • 调大新定义层的的学习率,调小复用层学习率

卷积网络在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间的精确的数学表达式,只要用已知的模式对卷积网络加以训练,网络就具有输入输出对之间的映射能力。

CNN一个非常重要的特点就是头重脚轻(越往输入权值越小,越往输出权值越多),呈现出一个倒三角的形态,这就很好地避免了BP神经网络中反向传播的时候梯度损失得太快。

1.卷积

简单来说,卷积(或内积)就是一种先把对应位置相乘然后再把结果相加的运算。

卷积运算一个重要的特点就是,通过卷积运算,可以使原信号特征增强,并且降低噪音。

卷积核/滤波器/权重的大小叫做接受域/感知野/数据窗口。

2.常见结构

2.1卷积层

C-层或Convolutions层/CONV层/特征提取层:主要作用就是进行特征提取。

2.2池化层

S-层(subsampling层)/子抽样局部平均层/下采样局部平均层/POOL层:进行子抽样然后再进行局部平均。它没有参数,起到降维的作用。将输入切分成不重叠的一些 n×n 区域。每一个区域就包含个值。从这个值计算出一个值。主要作用是减小特征图,起到降维的作用。常用的方法是选取局部区域的最大值或者平均值。

对于第一个卷积层来说,一个特征对应一个通道(或叫feature map或特征映射或者叫滤波器),例如三原色(RGB)的图像就需要三个特征映射层。但是经过第一个池化层之后,下一个卷积层的特征映射 (feature map)个数并不一定与开始的相同了,一般情况下会比初始的特征映射个数多,因为根据视觉系统原理----底层的结构构成上层更抽象的结构,所以当前层的特征映射是上一层的特征映射的组合,也就是一个特征映射会对应上一层的一个或多个特征映射。

2.3接受域和步长

接受域是卷积核的大小,每次移动的幅度叫做步长。

3代码示例

from PIL import Image
import  numpy as np 
from keras.models import Sequential
from keras.layers import Convolution2D, ZeroPadding2D, MaxPooling2D
from keras.optimizers import SGD
 
'''
   第一步:读取图片数据
   说明:这个过程需要安装pillow模块:pip install pillow
'''
##1张1通道的256*256的灰度图片
##data[0,0,0,0]:表示第一张图片的第一个通道的坐标为(0,0)的像素值
img_width, img_height = 256, 256
data = np.empty((1,1,img_width,img_height),dtype="float32")
##打开图片
img = Image.open("D:\\keras\\lena.jpg")
##把图片转换成数组形式
arr = np.asarray(img,dtype="float32")
data[0,:,:,:] = arr 
'''
    第二步:设置权重
    说明:注意最外围是5个方括号
'''
weights = [[[[[-1]],[[0]],[[1]]],[[[-2]],[[0]],[[2]]],[[[-1]],[[0]],[[1]]]]]
weights =np.array(weights)
 
'''
   第三步:组织卷积神经网络
   说明:
   1.因为实验采用的是默认的tensorflow后端,而输入图像是channels_first模式,所以注意data_format参数的设置
   2.为了实验的效果,所以strides、pool_size等参数设置成了1
'''
 
##第一次卷积
model = Sequential()
model.add(ZeroPadding2D(padding=(2, 2), data_format='channels_first', batch_input_shape=(1, 1,img_width, img_height)))
model.add(Convolution2D(filters=1,kernel_size=(3,3),strides=(1,1), activation='relu', name='conv1_1', data_format='channels_first'))
model.set_weights(weights)
 
##第二次卷积
model.add(ZeroPadding2D((1, 1)))
model.add(Convolution2D(filters=1,kernel_size=(3,3),strides=(1,1), activation='relu', name='conv1_2',data_format='channels_first'))
model.set_weights(weights)
 
##池化操作
model.add(ZeroPadding2D((0, 0)))
model.add(MaxPooling2D(pool_size=1, strides=None,data_format='channels_first'))
 
'''
  第四步: 设置优化参数并编译网络
'''
 
# 优化函数,设定学习率(lr)等参数
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) 
# 使用mse作为loss函数
model.compile(loss='mse', optimizer=sgd, class_mode='categorical') 
 
'''
    第五步:预测结果
'''
result = model.predict(data,batch_size=1,verbose=0)
 
'''
    第六步:保存结果到图片
'''
img_new=Image.fromarray(result[0][0]).convert('L')
img_new.save("D:\\keras\\tt123.jpg")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值