TensroFlow学习——第二章(一)

损失函数

经典损失函数

分类问题和回归问题是监督学习的两大种类。

1. 分类问题——将不同的样本分到事先定义好的类别中。

  • 交叉熵(cross entropy):刻画两个概率分布之间的距离,是分类问题中使用较为广泛的一种损失函数。
    (1)Softmax回归,可以将神经网络的输出转化为一个概率分布
    在这里插入图片描述tensorflow中提供了交叉熵和Softmax两个功能的函数tf.nn.sparse_softmax_cross_entropy_with_logits

2. 回归问题——对具体数值的预测,例如房价预测、销量预测等,这些问题预测的不是一个实现定义好的分类,而是一个实数。

  • 回归问题最常用的损失函数是均方根误差(Mean Squared Error)
    在这里插入图片描述TensorFlow中实现均方根误差损失函数:
    在这里插入图片描述

3.自定义损失函数
TensorFlow可以优化任意的自定义损失函数。

在这里插入图片描述

神经网络优化算法

反向传播算法(backpropagation)——训练神经网络的核心算法,根据定义好的损失函数优化神经网络中参数的取值,从而使训练集的损失函数达到一个较小值。
梯度下降算法(gradient decent)——主要用于优化单个参数的取值。
在这里插入图片描述梯度下降算法并不能保证被优化的函数达到全局最优解,如下图所示。
在这里插入图片描述
除此之外,梯度下降算法的另外一个问题是计算时间太长,因为要在全部训练数据上最小化损失,为了加速训练过程,可以使用随机梯度下降的算法(stochastic gradient descent)。

神经网络的进一步优化

1. 学习率的设置
在训练神经网路的过程中, 需要设置学习率控制参数更新的速度。
学习率决定了参数每次更新的幅度,如果幅度过大,那么可能导致参数在极优值两次来回移动。当学习率过小时,虽然能保证收敛性,但是会打打降低优化速度。
Tensorflow提供了一种更加灵活的学习率设置方法——指数衰减法tf.train.exponential_decay。通过该方法,可以使用较大学习率来快速得到一个比较优的解。然后随着迭代的继续逐步减小学习率,使模型在训练的后期更加稳定。
2. 过拟合问题
在应用中,希望通过训练出来的模型对未知数据给出判断。模型在训练数据上的表现并不一定代表他在位未知数据上的表现。
所谓过拟合,指的是当一个模型过为复杂之后,他可以很好的“记忆”每一个训练数据中随机噪音的部分而忘记要去“学习”训练数据中通用的趋势。
为了避免过拟合,一个非常常用的方法是正则化(regularization)。正则化的思想是在损失函数中加入刻画模型复杂程度的指标。
3. 滑动平均模型
滑动平均模型——可以使模型在测试数据上更健壮(robust)。在采用随机梯度下降算法训练神经网络时,滑动平均模型可以在一定程度上提高最终模型在测试数据上的表现。
Tensorflow中提供了tf.train.ExponentialMovingAverage来实现滑动平均模型。在初始化ExponentialMovingAverage时,需要提供一个衰减率(decay)。这个衰减率将用于控制模型更新的速度。ExponentialMovingAverage对每一个变量会维护一个影子变量(shadow variable),这个影子变量的初始值就是相应变量的初始值,而每次运行变量更新时,影子变量的值会更新为:

shadow_varibale=decay*shadow_varibale+(-1decay)*variable

其中,shadow_varibale为影子变量,variable为待更新的变量,decay为衰减率。decay决定了模型更新的速度,decay越大模型越趋于稳定,decay一般会设成非常接近1的数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用 TensorFlow 定义一个 CBAM 模型的示例代码: ```python import tensorflow as tf def channel_attention(inputs, ratio=8): # 获取输入张量的形状 shape = tf.keras.backend.int_shape(inputs) # 计算通道数 channels = shape[-1] # 平均池化 avg_pool = tf.keras.layers.GlobalAveragePooling2D()(inputs) # 全连接层1 fc1 = tf.keras.layers.Dense(channels // ratio, activation='relu')(avg_pool) # 全连接层2 fc2 = tf.keras.layers.Dense(channels, activation='sigmoid')(fc1) # 重塑张量形状 fc2 = tf.keras.layers.Reshape((1, 1, channels))(fc2) # 相乘 output = tf.keras.layers.multiply([inputs, fc2]) return output def spatial_attention(inputs, kernel_size=7): # 空间最大池化 max_pool = tf.keras.layers.MaxPool2D(pool_size=(kernel_size, kernel_size), strides=(1, 1), padding='same')(inputs) # 空间平均池化 avg_pool = tf.keras.layers.AveragePooling2D(pool_size=(kernel_size, kernel_size), strides=(1, 1), padding='same')(inputs) # 拼接池化结果 concat = tf.keras.layers.Concatenate(axis=-1)([max_pool, avg_pool]) # 全连接层 output = tf.keras.layers.Conv2D(filters=1, kernel_size=(1, 1), activation='sigmoid', padding='same')(concat) return output def cbam_block(inputs, ratio=8, kernel_size=7): # 通道注意力机制 channel = channel_attention(inputs, ratio) # 空间注意力机制 spatial = spatial_attention(inputs, kernel_size) # 相乘 output = tf.keras.layers.multiply([channel, spatial]) return output def cbam_model(input_shape=(224, 224, 3), num_classes=1000): # 输入层 inputs = tf.keras.layers.Input(shape=input_shape) # 卷积层1 x = tf.keras.layers.Conv2D(filters=64, kernel_size=(7, 7), strides=(2, 2), padding='same', activation='relu')(inputs) # 池化层1 x = tf.keras.layers.MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='same')(x) # CBAM模块1 x = cbam_block(x, ratio=16, kernel_size=7) # 卷积层2 x = tf.keras.layers.Conv2D(filters=64, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu')(x) # CBAM模块2 x = cbam_block(x, ratio=16, kernel_size=7) # 池化层2 x = tf.keras.layers.MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='same')(x) # 卷积层3 x = tf.keras.layers.Conv2D(filters=128, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu')(x) # CBAM模块3 x = cbam_block(x, ratio=16, kernel_size=7) # 卷积层4 x = tf.keras.layers.Conv2D(filters=128, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu')(x) # CBAM模块4 x = cbam_block(x, ratio=16, kernel_size=7) # 池化层3 x = tf.keras.layers.MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='same')(x) # 卷积层5 x = tf.keras.layers.Conv2D(filters=256, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu')(x) # CBAM模块5 x = cbam_block(x, ratio=16, kernel_size=7) # 卷积层6 x = tf.keras.layers.Conv2D(filters=256, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu')(x) # CBAM模块6 x = cbam_block(x, ratio=16, kernel_size=7) # 池化层4 x = tf.keras.layers.MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='same')(x) # 卷积层7 x = tf.keras.layers.Conv2D(filters=512, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu')(x) # CBAM模块7 x = cbam_block(x, ratio=16, kernel_size=7) # 卷积层8 x = tf.keras.layers.Conv2D(filters=512, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu')(x) # CBAM模块8 x = cbam_block(x, ratio=16, kernel_size=7) # 池化层5 x = tf.keras.layers.MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='same')(x) # 全局平均池化 x = tf.keras.layers.GlobalAveragePooling2D()(x) # 全连接层1 x = tf.keras.layers.Dense(2048, activation='relu')(x) # 全连接层2 x = tf.keras.layers.Dense(2048, activation='relu')(x) # 输出层 outputs = tf.keras.layers.Dense(num_classes, activation='softmax')(x) # 定义模型 model = tf.keras.models.Model(inputs=inputs, outputs=outputs) return model ``` 以上代码定义了一个简单的 CBAM 模型,包括通道注意力机制和空间注意力机制。在模型中,我们使用了 8 个 CBAM 模块,每个模块包含两个注意力机制。模型输入形状为 (224, 224, 3),输出为 num_classes 个类别的概率分布。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值