GlobalAveragePooling2D层和Flatten层

GlobalAveragePooling2D层和Flatten层在深度学习中用于降低维度和减少参数量,常用于卷积神经网络(CNN)的特征提取部分。

GlobalAveragePooling2D层是一种全局平均池化层,在该层中,每个特征图的特征被计算出来后,通过对每个特征图取平均值得到一个标量特征。这样,无论输入图像的尺寸大小如何变化,最终得到的特征都是固定长度的。相比较Flatten层,GlobalAveragePooling2D层会保留更少的特征信息,但减少了参数量和计算量。它适用于分类任务,并且在处理大量图像数据时表现出色。

Flatten层则将输入数据进行扁平化处理,将多维的输入张量转换为一维向量。它可以将每个像素都看作是独立的特征,将二维或多维的图像特征转换为一维特征表示。Flatten层保留了更多的特征信息,但会增加模型的参数数量。它适用于全连接层之前的特征提取阶段,并且在图像重建和生成任务中常用。

总结来说:

  • GlobalAveragePooling2D层适用于分类任务,具有参数少、计算量低的优点。但丢失了位置信息和一些特征细节。
  • Flatten层适用于特征提取和全连接层之间的过程,保留了更多的特征信息,但参数数量较多。
解释一下这段代码import pdb import tensorflow as tf from matplotlib import pyplot as plt import numpy as np import os from tensorflow.keras import Model from tensorflow.keras.layers import Conv2D,BatchNormalization,Activation,MaxPool2D,Dense,Dropout,Flatten,GlobalAveragePooling2D np.set_printoptions(threshold=np.inf) class ResnetBlock(Model): def __init__(self, filters, strides=1,residual_path=False): super(ResnetBlock, self).__init__() self.filters = filters self.strides = strides self.residual_path = residual_path self.c1 = Conv2D(filters, (3, 3), strides=strides, padding='same', use_bias=False) self.b1 = BatchNormalization() self.a1 = Activation('relu') self.c2 = Conv2D(filters, (3, 3), strides=1, padding='same', use_bias=False) self.b2 = BatchNormalization() if residual_path: self.down_c1 = Conv2D(filters, (1, 1),strides=strides, padding='same', use_bias=False) self.down_b1 = BatchNormalization() self.a2 = Activation('relu') def call(self, inputs): residual = inputs x = self.c1(inputs) x = self.b1(x) x = self.a1(x) x = self.c2(x) y = self.b2(x) if self.residual_path: residual = self.down_c1(inputs) residual = self.down_b1(residual) out = self.a2(y + residual) return out class ResNet18(Model): def __init__(self, block_list, initial_filters=64): super(ResNet18, self).__init__() self.num_blocks = len(block_list) self.block_list = block_list self.out_filters = initial_filters self.c1 = Conv2D(self.out_filters, (3, 3), strides=1, padding='same', use_bias=False, kernel_initializer='he_normal') self.b1 = BatchNormalization() self.a1 = Activation('relu') self.blocks = tf.keras.models.Sequential() for block_id in range(len(block_list)): for layer_id in range(block_list[block_id]): if block_id != 0 and layer_id == 0: block = ResnetBlock(self.out_filters, strides=2, residual_path=True) else: block = ResnetBlock(self.out_filters, residual_path=False) self.blocks.add(block) self.out_filters *= 2 self.p1 = tf.keras.layers.GlobalAveragePooling2D() self.f1 = tf.keras.layers.Dense(41, activation='tanh') def call(self, inputs): x = self.c1(inputs) x = self.b1(x) x = self.a1(x) x = self.blocks(x) x = self.p1(x) y = self.f1(x) return y
06-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值