网站首页 > 技术文章 正文
每个对机器学习感兴趣的机器学习工程师/软件开发人员/学生都在卷积神经网络(也称为CNN)上工作。我们有一个一般理论,即如何训练网络对图像进行分类。但是,刚接触机器学习/神经网络的人们并不了解CNN如何精确地学习参数。
我们知道,在每个转换层中,网络都试图了解基本模式。例如:在第一层中,网络尝试学习图案和边缘。在第二层中,它尝试了解形状/颜色和其他内容。最后一层称为要素层/完全连接层尝试对图像进行分类。
在学习参数之前,我们需要了解卷积网络中的一些基本概念,这对修改/重用源代码非常有帮助。
CNN网络中存在各种层。
输入层:所有输入层所做的都是读取图像。因此,这里没有学习参数。
卷积层:考虑一个以“ l ”个特征图为输入并以“ k ”个特征图为输出的卷积层。过滤器尺寸为“ n * m ” 。
在此,输入具有l = 32个特征图作为输入,k = 64个特征图作为输出,并且过滤器大小为n = 3和m = 3。重要的是要理解,我们不只是拥有3 * 3过滤器,而是实际上拥有3 * 3 * 32过滤器,因为我们的输入具有32个尺寸。作为第一转换层的输出,我们学习了64个不同的3 * 3 * 32滤波器,总权重为“ n * m * k * l ”。然后,每个特征图都有一个称为“偏差”的术语。因此,参数总数为“ (n * m * l + 1)* k ”.
池化层:池化层中没有可以学习的参数。该层仅用于减小图像尺寸。
完全连接层:在此层中,所有输入单元对每个输出单元都具有可分离的权重。对于“ n ”个输入和“ m ”个输出,权数为“ n * m ”。另外,该层对于每个输出节点都有偏差,因此“ (n + 1)* m ”个参数。
输出层:此层是完全连接的层,因此当“ n ”是输入数而“ m ”是输出数时,参数(n + 1)m。
CNN层的最后一个困难是第一个完全连接的层。我们不知道完全连接层的尺寸,因为它是卷积层。要计算它,我们必须从输入图像的大小开始,并计算每个卷积层的大小。
在简单的情况下,输出CNN层的大小被计算为“ input_size-(filter_size-1) ”。例如,如果输入image_size为(50,50)且filter为(3,3),则(50-(3-1))= 48。但是卷积网络的输入图像的大小不应小于输入的大小,因此可以进行填充。
因此可以进行填充。
要计算填充,请输入input_size + 2 * padding_size-(filter_size-1)。对于上述情况,(50+(2 * 1)-(3-1)= 52–2 = 50)给出相同的输入大小。
如果我们想明确地想在卷积过程中对图像进行下采样,则可以定义一个跨度。
最后,要计算网络学习的参数数量(n * m * k + 1)* f.
让我们在给定的代码中看到这一点。
import keras
from keras.models import Model
from keras.layers import Input, concatenate, Conv2D, MaxPooling2D, Conv2DTranspose, Dropout
from keras.optimizers import Adam
from keras.callbacks import ModelCheckpoint
from keras.utils import plot_model
from keras import backend as K
K.set_image_data_format('channels_last')
img_row = 96
img_col = 96
smooth = 1
def create_conv_layer(f,stride,activationfn,padding,prevlayer,dropout):
conv = Conv2D(f,stride,activation=activationfn,padding=padding)(prevlayer)
conv = Dropout(dropout)(conv)
conv = Conv2D(f,stride,activation=activationfn,padding=padding)(conv)
return conv
def maxpooling_fn(prevlayer):
return MaxPooling2D(pool_size=(2,2))(prevlayer)
def concatenate_fn(f,kernal,stride,padding,src,dest):
return concatenate([Conv2DTranspose(f,kernal,strides=stride,padding=padding)(src),dest],axis=3)
def dice_coef(y_true,y_pred):
y_true_f = K.flatten(y_true)
y_pred_f = K.flatten(y_pred)
intersection = K.sum(y_true_f * y_pred_f)
return (2. * intersection + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)
def dice_coef_loss(y_true,y_pred):
return -dice_coef(y_true,y_pred)
def getnetwork():
inputs = Input((img_row,img_col,1))
conv1 = create_conv_layer(32,(3,3),'relu','same',inputs,0.2)
pool1 = maxpooling_fn(conv1)
conv2 = create_conv_layer(64,(3,3),'relu','same',pool1,0.2)
pool2 = maxpooling_fn(conv2)
conv3 = create_conv_layer(128,(3,3),'relu','same',pool2,0.3)
pool3 = maxpooling_fn(conv3)
conv4 = create_conv_layer(256,(3,3),'relu','same',pool3,0.3)
pool4 = maxpooling_fn(conv4)
conv5 = create_conv_layer(512,(3,3),'relu','same',pool4,0.3)
pool5 = maxpooling_fn(conv5)
up6 = concatenate_fn(256,(2,2),(2,2),'same',conv5,conv4)
conv6 = create_conv_layer(256,(3,3),'relu','same',up6,0.3)
up7 = concatenate_fn(128,(2,2),(2,2),'same',conv6,conv3)
conv7 = create_conv_layer(128,(3,3),'relu','same',up7,0.3)
up8 = concatenate_fn(64,(2,2),(2,2),'same',conv7,conv2)
conv8 = create_conv_layer(64,(3,3),'relu','same',up8,0.3)
up9 = concatenate_fn(32,(2,2),(2,2),'same',conv8,conv1)
conv9 = create_conv_layer(32,(3,3),'relu','same',up9,0.3)
conv10 = Conv2D(1,(1,1),activation='sigmoid')(conv9)
model = Model(inputs=[inputs],outputs=[conv10])
model.compile(optimizer=Adam(lr=0.00001),loss=dice_coef_loss,metrics=[dice_coef])
return model
model = getnetwork()
print(model.summary())
plot_model(model, to_file='model.png')
input_1(输入层)的形状为(None,96,96,1),参数为0。在整个程序中,stride = 1,kernel_size = 2 * 2,padding = same。
卷积_1:(((kernel_size)* stride + 1)* filters)= 3 * 3 * 1 + 1 * 32 = 320个参数。在第一层中,卷积层具有32个滤镜。
Dropout_1:Dropout层不执行任何操作。它只是删除低于所述权重的节点。
Convolutional_2:由于convolutional_1已经学习了32个过滤器。所以数量该层中的可训练参数为3 * 3 * 32 + 1 * 32 = 9248,依此类推。
Max_pooling_2d:此层用于减小输入图像的大小。kernal_size =(2,2)在这里使用。因此输入图像96减少到一半48。模型从这一层学不到任何东西。
Convolutional_3: 3 * 3 * 32 + 1 * 64 = 18496,依此类推。
最后,所有的参数总结在一起。
总训练参数= 7,759,521可训练参数= 7,759,251非训练参数= 0。
Have a great day..!
猜你喜欢
- 2024-10-28 使用卷积神经网络构建图像分类模型检测肺炎
- 2024-10-28 机器不学习:卷积神经网络CNN与Keras实战
- 2024-10-28 我是如何用5个概念理解的卷积神经网络?(Hadoop大数据)
- 2024-10-28 深度学习笔记:图像识别和卷积网络
- 2024-10-28 Tensorflow Conv2D和MaxPool2D原理
- 2024-10-28 PyTorch中傅立叶卷积:计算大核卷积的数学原理和代码实现
- 2024-10-28 一文看完卷积神经网络及实现机制 卷积神经网络的原理与实现
- 2024-10-28 卷积神经网络原理及其C++/Opencv实现(6)—前向传播代码实现
- 2024-10-28 「周末AI课堂」卷积之上的新操作|机器学习你会遇到的“坑”
- 2024-10-28 谈谈CNN中的位置和尺度问题 cnn例题
你 发表评论:
欢迎- 最近发表
-
- 在 Spring Boot 项目中使用 activiti
- 开箱即用-activiti流程引擎(active 流程引擎)
- 在springBoot项目中整合使用activiti
- activiti中的网关是干什么的?(activiti包含网关)
- SpringBoot集成工作流Activiti(完整源码和配套文档)
- Activiti工作流介绍及使用(activiti工作流会签)
- SpringBoot集成工作流Activiti(实际项目演示)
- activiti工作流引擎(activiti工作流引擎怎么用)
- 工作流Activiti初体验及在数据库中生成的表
- Activiti工作流浅析(activiti6.0工作流引擎深度解析)
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)