TensorFlow2.0从入门到进阶——第二章问题总结:loss值选取、优化方法、激活函数、数据集划分、归一化、批归一化、callbacks

 

看的视频——https://www.bilibili.com/video/av79196096?p=23

loss值选取:

mse(均方误差):回归中使用

model.compile(loss = "mean_squared_error", optimizer = "adam")

categorical_crossentropy loss(交叉熵损失函数):分类问题中使用

model.compile(loss = "sparse_categorical_crossentropy",
             optimizer = "adam",
             metrics = ["accuracy"])
#sparse_categorical_crossentropy ->使得y从index先变为onehot
#categorical_crossentropy y最开始即为one-hot 
#交叉熵

https://www.jianshu.com/p/ae3932eda8f2

优化方法———sgd与adm:

https://www.cnblogs.com/guoyaohua/p/8542554.html

sgd——随机梯度下降,比其它算法用的时间长,而且可能会被困在鞍点

adm——增加了动量(指数加权平均),在梯度不变的方向速度变快,梯度变化的方向速度变慢。

激活函数——selu:

自带批归一化功能的激活函数

for _ in range(20):
    #激活函数放到批归一化之前
    model.add(keras.layers.Dense(100,activation="relu"))
    model.add(keras.layers.BatchNormalization())
    """
    #激活函数放到批归一化之后
    model.add(keras.layers.Dense(100))
    model.add(keras.layers.BatchNormalization())
    model.add(keras.layers.Activation('relu'))
    """
model.add(keras.layers.Dense(10,activation="softmax"))

与下面等价:

for _ in range(20):
    #激活函数放到批归一化之前
    #自带归一化功能的激活函数——selu
    model.add(keras.layers.Dense(100,activation="selu"))
model.add(keras.layers.Dense(10,activation="softmax"))

https://www.jianshu.com/p/3a43a6a860ef

https://www.jianshu.com/p/d216645251ce

数据集划分:

# random_state 等价于 random_seed 保证实验结果的一致性
x_train_all, x_test, y_train_all, y_test = train_test_split(housing.data, housing.target, random_state = 7, test_size = 0.1)
x_train, x_valid, y_train, y_valid = train_test_split(x_train_all, y_train_all, random_state = 11)
print(x_train.shape, y_train.shape)
print(x_valid.shape, y_valid.shape)
print(x_test.shape, y_test.shape)

归一化:

分类问题归一化:

#归一化变为均值为0方差为1
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
#fit_transform 要求为二维矩阵 因此先转换为[none,784]归一化后再转换回来[none,28,28]
#fit_transform 中的fit的功能 记录训练集中的均值方差  验证集和测试集做归一化也要用训练集的均值和方差
x_train_scaled = scaler.fit_transform(x_train.astype(np.float32).reshape(-1,1)).reshape(-1,28,28)
x_valid_scaled = scaler.transform(x_valid.astype(np.float32).reshape(-1,1)).reshape(-1,28,28)
x_test_scaled = scaler.transform(x_test.astype(np.float32).reshape(-1,1)).reshape(-1,28,28)

回归问题归一化:

scalar = StandardScaler()
x_train_scaled = scalar.fit_transform(x_train)
x_valid_scaled = scalar.transform(x_valid)
x_test_scaled = scalar.transform(x_test)

批归一化:

for _ in range(20):
    #激活函数放到批归一化之前
    model.add(keras.layers.Dense(100,activation="relu"))
    model.add(keras.layers.BatchNormalization())
    """
    #激活函数放到批归一化之后
    model.add(keras.layers.Dense(100))
    model.add(keras.layers.BatchNormalization())
    model.add(keras.layers.Activation('relu'))
    """

https://www.cnblogs.com/skyfsm/p/8453498.html

它不仅可以加快了模型的收敛速度,而且更重要的是在一定程度缓解了深层网络中“梯度弥散”的问题,从而使得训练深层网络模型更加容易和稳定。

BN的本质就是利用优化变一下方差大小和均值位置,使得新的分布更切合数据的真实分布,保证模型的非线性表达能力。BN的极端的情况就是这两个参数等于mini-batch的均值和方差,那么经过batch normalization之后的数据和输入完全一样,当然一般的情况是不同的。

若神经网络训练时遇到收敛速度较慢,或者“梯度爆炸”等无法训练的情况发生时都可以尝试用BN来解决。同时,常规使用情况下同样可以加入BN来加速模型训练,甚至提升模型精度。

梯度消失:

深度神经网络  反向传播 链式法则 前面的更新缓慢
https://www.jianshu.com/p/3f35e555d5ba
#接近于输出层的隐藏层由于其梯度相对正常,所以权值更新时也就相对正常,但是当越靠近输入层时,由于梯度消失现象,会导致靠近输入层的隐藏层权值更新缓慢或者更新停滞。这就导致在训练时,只等价于后面几层的浅层网络的学习。

从求导结果可以看出,Sigmoid导数的取值范围在0~0.25之间,而我们初始化的网络权值通常都小于1,因此,当层数增多时,小于0的值不断相乘,最后就导致梯度消失的情况出现。同理,梯度爆炸的问题也就很明显了,就是当权值过大时,导致 ,最后大于1的值不断相乘,就会产生梯度爆炸。

梯度消失和梯度爆炸本质上是一样的,都是因为网络层数太深而引发的梯度反向传播中的连乘效应。

解决方法: 换用Relu、LeakyRelu、Elu等激活函数
BatchNormalization BN本质上是解决传播过程中的梯度问题

callbacks:

#callback
# Tensorboard 文件夹
#modelcheckpoint文件名
#earlystopping
logdir = os.path.join('callbacks')
if not os.path.exists(logdir):
    os.mkdir(logdir)
output_model_file = os.path.join(logdir,"fashion_mnist_model.h5")
#https://blog.csdn.net/weixin_41010198/article/details/102815483
callbacks = [
        keras.callbacks.TensorBoard(logdir),
        keras.callbacks.ModelCheckpoint(output_model_file,save_best_only = True),
        keras.callbacks.EarlyStopping(patience=5,min_delta = 1e-3),
    
]
history = model.fit(x_train_scaled,y_train,epochs = 10,validation_data = (x_valid_scaled,y_valid),callbacks = callbacks)

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Tensorflow 2.9框架训练CNN模型的代码,数据集为NSL-KDD: ```python import tensorflow as tf from tensorflow.keras import layers import pandas as pd import numpy as np # 读取NSL-KDD数据集 train_df = pd.read_csv('KDDTrain+.txt', header=None) test_df = pd.read_csv('KDDTest+.txt', header=None) # 数据预处理 def preprocess(df): # 选取需要的特征列 features = [1, 2, 3, 41, 42, 43] x = df.iloc[:, features].values # 将字符串标签转换为整数 y = df.iloc[:, -1].replace({'normal':0, 'neptune':1, 'warezclient':2, 'ipsweep':3, 'portsweep':4, 'teardrop':5, 'nmap':6, 'satan':7, 'smurf':8, 'pod':9, 'back':10, 'guess_passwd':11, 'ftp_write':12, 'multihop':13, 'rootkit':14, 'buffer_overflow':15, 'imap':16, 'warezmaster':17, 'phf':18, 'land':19, 'loadmodule':20, 'spy':21, 'perl':22}).values # 对特征进行归一化处理 x = (x - x.mean()) / x.std() # 将标签转换为one-hot编码 y = tf.keras.utils.to_categorical(y, num_classes=23) return x, y x_train, y_train = preprocess(train_df) x_test, y_test = preprocess(test_df) # 构建CNN模型 model = tf.keras.Sequential([ layers.Reshape((6, 1), input_shape=(6,)), layers.Conv1D(32, 3, activation='relu'), layers.MaxPooling1D(2), layers.Conv1D(64, 3, activation='relu'), layers.MaxPooling1D(2), layers.Flatten(), layers.Dense(128, activation='relu'), layers.Dropout(0.5), layers.Dense(23, activation='softmax') ]) # 编译模型 model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) # 训练模型 model.fit(x_train, y_train, batch_size=128, epochs=10, validation_data=(x_test, y_test)) ``` 其中,`preprocess`函数用于对数据进行预处理,包括选取特征列、将标签转换为整数并进行one-hot编码、对特征进行归一化处理。`Sequential`模型中使用了两个`Conv1D`层和两个`MaxPooling1D`层,以及一个`Flatten`层、两个`Dense`层和一个`Dropout`层。最后使用`compile`方法编译模型,使用`fit`方法训练模型。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值