人工智能实践-Tensorflow2.0 笔记2

4. 网络八股优化

4.1. 优化内容概括

  1. 自制数据集,解决本领域应用
  2. 数据增强,扩充数据集
  3. 断点续训,存取模型
  4. 参数提取,把参数存入文本
  5. acc/loss可视化,查看训练效果
  6. 应用程序,给图识物

4.2. 自制数据集

图片处理代码:

img = Image.open("test.jpg")
# img.show()  # 显示图片
print(img.mode)  # PIL有九种不同模式: 1,L,P,RGB,RGBA,CMYK,YCbCr,I,F
print(img.size)  # 图片大小:宽x高
print(img.getpixel((2, 3)))  # 获取某像素,第一个参数为宽,第二个参数为高
imgL = img.convert("L")  # 将图像转换为灰度图像,每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。
imgLData = np.array(imgL)  # 将图像数据转换为numpy数据

4.3. 数据增强

对图像的增强,就是对图像的简单形变,用来应对因拍照角度不同引起的图片变形,Tensorflow2给出了数据增强函数tensorflow.keras.preprocessing.image.ImageDataGenerator

4.4. 断点续训

断点续训可以存取模型

checkpoint_save_path = './checkpoint/mnist.ckpt'
if os.path.exists(checkpoint_save_path + '.index'):
    print('--------------load the model--------------------')
    model.load_weights(checkpoint_save_path)

cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path, save_weights_only=True,save_best_only=True)
history = model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test),validation_freq=1, callbacks=[cp_callback])

4.5. 参数提取

# model.trainable_variables  # 返回模型中可训练的参数
np.set_printoptions(threshold=超过多少省略显示)  # np.inf 表示无限大
print(model.trainable_variables)
file = open('./weights.txt', 'w')
for v in model.trainable_variables:
    file.write(str(v.name) + '\n')
    file.write(str(v.shape) + '\n')
    file.write(str(v.numpy()) + '\n')
file.close()

4.6. acc/loss 可视化

history = model.fit()时,同步记录了训练集和测试集的acc和loss
history:
训练集loss: loss
测试集loss: val_loss
训练集准确率: sparse_categorical_accuracy
测试集准确率: val_sparse_categorical_accuracy

acc = history.history['sparse_categorical_accuracy']
val_acc = history.history['val_sparse_categorical_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']

4.7. 给图识物

  1. 复现模型
    model = tf.keras.models.Sequential()
  2. 加载参数
    model.load_weights(model_save_path)
  3. 预测结果
    result = model.predict(x_predict)

5. 卷积

卷积计算过程、感受野、全零填充(Padding)、TF描述卷积计算层、批标准化(Batch Normalization, BN)、池化(Pooling)、舍弃(Dropout)、卷积神经网络、cifar数据集、卷积神经网络搭建示例、实现LeNet、AlexNet、VGGNet、InceptionNet、ResNet五个经典卷积网络

5.1. 卷积计算过程

实际项目中,输入神经网络的是高分辨率的彩色图片,使得送入全连接网络的输入特征数过多,随着隐藏层层数的增加,网络规模过大,待优化参数过多,容易导致模型过拟合,为了减少待训练参数,我们在实际应用时,会先对原始图片进行特征提取,把提取出来的特征送给全连接网络,让全连接网络输出识别结果。
卷积计算是一种有效的特征提取方法
一般会用一个正方形的卷积核,按指定步长,在输入特征图上滑动,遍历输入特征图里的每个像素点。每滑动一个步长,卷积核会与输入特征图部分像素点重合,重合区域对应元素相乘、求和,再加上偏置项,得到输出特征的一个像素点。
输入特征图的深度(channel数),决定了当前层卷积核的深度
每个卷积核在卷积计算后,会得到一张输出特征图,所以当前层使用了几个卷积核,就有几张输出特征图
卷积,就是利用立体卷积核,实现了参数的空间共享

5.2. 感受野

感受野(Receptive Field):输出特征图中的每个像素点,在原始输入图片上映射区域的大小
感受野相同,特征提取能力相同
一般选用3x3卷积核

5.3. 全零填充

若希望,卷积计算保持输入特征图尺寸不变,则需要使用全零填充
全零填充:输入特征图周围填充0
卷积输出特征图边长计算公式:
Padding = { same(全零填充) 入 长 步 长 ( 向 上 取 整 ) valid(不全零填充) 入 长 − 核 长 + 1 步 长 ( 向 上 取 整 ) \text{Padding}= \begin{cases} \text{same(全零填充)} & \frac{入长}{步长}(向上取整)\\ \text{valid(不全零填充)} & \frac{入长-核长+1}{步长}(向上取整) \end{cases} Padding={same(全零填充)valid(不全零填充)+1

5.4. TF描述卷积层

tf.keras.layers.Conv2D(
filters=卷积核个数,
kernel_size=卷积核尺寸,#正方形写核长整数,或(核高h,核宽w)
strides=卷积步长,#纵横相同写步长整数,或(纵向步长h,横向步长w),默认1
padding=“valid"or"same”,#使用全零填充-same,不使用-valid
activation=“relu” or “sigmoid” or “tanh” or “softmax” 等,#如有BN此处不写
input_shape=(高,宽,通道数) #输入特征图维度,可省略
)

model = tf.keras.models.Sequential([
Conv2D(6, 5, padding=“valid”, activation=“sigmoid”),
MaxPool2D(2, 2),
Conv2D(6, (5, 5), padding=“valid”, activation=“sigmoid”),
MaxPool2D(2, 2),
Conv2D(filters=6, kernel_size=(5, 5), padding=“valid”, activation=“sigmoid”),
MaxPool2D(2, 2),
Flatten(),
Dense(10, activation=“softmax”)
])

5.5. 批标准化

Batch Normalization, BN
标准化:使数据符合0为均值,1为标准差的分布
批标准化:对一小批数据(batch),做标准化处理。批标准化操作,会让每个像素点进行减均值除以标准差的自更新计算
TF描述标准化:tf.keras.layers.BatchNormalization()
model = tf.keras.models.Sequential([
Conv2D(6, 5, padding=“same”),
BatchNormalization(), # BN层
Activation(‘relu’), # 激活层
MaxPool2D(2, 2, padding=‘same’),
Dropout(0.2), # dropout层
])

5.6. 池化 Pooling

池化用于减少特征数据量
最大值池化可提取图片纹理,均值池化可保留背景特征
TF描述池化:

  1. tf.keras.layers.MaxPool2D(
    pool_size=池化核尺寸, #正方形写核长整数,或(核高h,核宽w),
    strides=池化步长, #步长整数,或(纵向步长h,横向步长w),默认为pool_size
    padding=‘valid’ or ‘same’ # 使用全零填充-same,不使用-valid (默认)
    )
  2. tf.keras.layers.AveragePooling2D

5.7. 舍弃 Dropout

为了缓解过拟合,在神经网络训练过程中,常把隐藏层的部分神经元按照一定比例从神经网络中临时舍弃,在使用神经网络时,再把所有神经元恢复到神经网络中
TF描述舍弃:
tf.keras.layers.Dropout(舍弃的概率)

5.8. 卷积神经网络

借助卷积核提取特征后,送入全连接网络
主要模块:
卷积 -> 批标准化 -> 激活 -> 池化 —> 全连接
Convolutional -> BN -> Activation -> Pooling —> FC
卷积就是特征提取器,就是CBAPD

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值