【AI算法推荐】:tensorflow2.0建模教程系列
【导读】
在tensorflow2.0建模系列教程中,前四节我们用代码演绎了:
系列1:如何用tf2.0进行自定义层网络的设计(add.weight)
系列2:如何用tf2.0进行自定义模型的设计(Model)
系列3:如何用tf2.0实现loss函数和参数调优(loss gradient optimizer)
系列4:.如何用tf2.0实现损失函数正则化,解决模型过拟合问题
系列5:如何用tensorflow2.0基于keras构建复杂的深度学习模型
通过前面几章节解锁 tensorflow2.0的常用操作,我们已经循序渐进掌握了:
1.如何用tensorflow2.0完成自定义层和自定义网络模型的构建。
2.理解tf2.0建模工具API——tensorflow.keras 。
3.掌握如何运用tf.keras 函数式 API 构建复杂的深度学习网络模型。
PS此处复习下Keras:keras 是一个用于构建和训练深度学习模型的高阶 API。它可用于快速设计原型、高级研究和生产。相对于自定义设计层和网络,运用tf.keras 更加便捷,系统化,易于扩展。常见的LSTM/RNN/Conv2D等神经网络都包含在 keras.layer 中。
OK回顾之前所学后,tensorflow2.0教程的PART1告一段落:相信如果仔细阅读后,大家已经get初级tf2.0建模的实战技能:
PART1 tensorflow2.0的核心知识技能点:
1`tensorflow2.0区别1.0于的特点
2网络设计的常用方法和单元操作
3核心API工具 keras
4层的设计和模型的设计
5损失正则化
6参数调优
确认理解以上必备技能后,后面的章节我们会开启PART2:tensorflow2.0项目实战代码,基于强大的Keras构建各种CNN/LSTM/GAN/resnet等模型,包含:
1图片分类实战-构建CNN交通标识图像检测
2文本分类实战-构建LSTM美妆广告引爆微博社交话题热度模型
3目标检测/对抗网络等常见的AI应用算法项目
4排期中。。。。。。 欢迎关注 持续更博
本节会带领大家一起基于keras构建CNN交通标识图像检测模型。基于交通标识图片数据,运用tensorflow2.0里的高阶API Keras ,构建图像分类模型。
《一 图片数据加载》
由于我们的训练集和测试集是分开存储的,所以首先定义一个图片自动加载函数load_data,然后分别读取我们的交通标识数据集:
#定义图片数据集加载函数load_image
def load_image(data_dir):
labels = []
images = []
for d in directories:
label_dir = os.path.join(data_dir, d)
file_names = [os.path.join(label_dir, f)
for f in os.listdir(label_dir)
if f.endswith('.ppm')]
for f in file_names:
# 以指定的尺寸读取图像数据
image_data = image.load_img(f, target_size=(config.img_rows, config.img_cols))
# 将图片像素值转换为0-1
image_data = image.img_to_array(image_data) / 255
images.append(image_data)
labels.append(int(d))
return images,labels
#加载训练集:
train_images, train_labels =load_data(train_data_dir)
#加载测试集:
test_images, test_labels =load_data(test_data_dir)
《二 图片数据预处理—CNN模型输入要求》
我们的图片数据集已经加载完毕,训练集和测试集已经准备到位。下面按照CNN模型的输入要求,我们还需要对图片数据展开预处理工作preprocess data ,包含:
1输入图片数据归一化 。CNN模型输入层要求像素进行归一化。
图片像素原来是0-255,统一映射到0~1之间 ,减少由于拍摄图片
色差或者规格带来的模型训练误差。
2.标签分类Y进行独热编码。 模型输出层要求labels经过one-hot
加工,方便进行多分类softmax的概率预测。
图片数据集的预处理preprocess 代码如下:
#图片数据预处理
def preprocess_data(images, labels):
"""
处理加载的图像数据和标签,用于CNN的输入
"""
images = tf.cast(images,tf.float)
images = images/255
return images, labels
#训练集和测试集运用map函数
train_x,train_y=(train_images, train_labels).map(preprocess_data)
test_x,test_y=(test_images, test_labels).map(preprocess_data)
《三 构建设计CNN卷积网络模型 》
首先我们在构建图片识别类模型中,可能常用到tf.keras提供的layers层和激活函数如下:
Layers 单层网络:
1卷积层Conv2D():提取不同维度的特征
2池化层maxpooling2D():降维/加强上一层的特征
3失活层Dropout():避免过拟合 ,随机选取一定比例的神经元权重为0
4平展层Flatten():将多维度数据展开成一维数据,譬如图片的shape(28,28)展开像素后为28*28.
5全连接层Dense():模拟和预测
Activations激活函数:
relu函数
softmax函数
了解tf.keras提供的layers网络层工具后,下面我们将要构思如何建立一个相对有效的CNN卷积网络模型。网络层之间的传递和逻辑是关键。
基于tf.keras,本文构建的CNN模型网络逻辑如下:
1——CONV1:第一层卷积网络包含:
卷积层1-核数32,尺寸3*3
池化层1-尺寸-2*2
Dropout层1-失活率0.25
2——CONV2:第二层卷积网络包含:
卷积层2-核数64,尺寸3*3
池化层2-尺寸-2*2
Dropout层2-失活率0.25
3——Dense1:全连接层-神经元个数512和激活函数relu
4——Dense2:全连接层-神经元个数59(和标签数等同),激活函数是softmax
以上是我们CNN卷积网络模型的设计逻辑,OK下面我们基于tf2.0 Keras API 动手来实现:
print('构建CNN')
#输入图片尺寸界定
input_shape = (config.img_rows, config.img_cols, 3)
#构建CNN 卷积网络模型
model = tf.keras.models.Sequential([
#第一层CONV1
tf.keras.layers.Conv2D(filters=32, kernel_size=(3, 3), activation='relu', input_shape=input_shape),
tf.keras.layers.maxpooling2D((2,2))
tf.keras.layers.Dropout(0.25)
#第二层CONV2
tf.keras.layers.Conv2D(filters=64, kernel_size=(3, 3), activation='relu'),
tf.keras.layers.maxpooling2D((2,2))
tf.keras.layers.Dropout(0.25)
#全连接层和输出层(softmax)
tf.keras.layers.Flatten(input_shape=(config.img_rows, config.img_cols)),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(59, activation='softmax')
])
《三 编译CNN模型 :选定loss, optimizer,metrics 的方法》
#编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
《四 训练并评估模型》
#训练模型
model.fit(train_x,train_y,epochs=5,batch_size=32)
#评估模型
test_loss,test_acc=model.evaluate(train_x,train_y,epochs=5,batch_size=32)
print('准确率: %.4f,损失:%.4f ' % (test_acc, test_loss))
《五 模型保存与预测》
#保存
model.save('cnn_model.h5')
model = tf.keras.models.load_model('cnn_model.h5')
#预测
predicts=model.predict(target_x)
《六 分布式数据训练模型的保存 Estimator》
Estimator API 用于针对分布式环境训练模型。适合用大型数据集进行分布式训练并导出模型以用于生产。
estimator = tf.keras.estimator.model_to_estimator(model)
如果你对AI算法与最新应用感兴趣
欢迎关注我的博客《深度学习算法项目分享》:
1持续更新AI深度学习算法项目实战代码,
AI项目实战:图片识别/文本分类/聊天机器人/微博社交话题热度模型,
3带你解锁CNN/RNN/LSTM/seq2seq/Bert/GAN系列算法,
从原理解读到项目实战代码。
4十分钟学会写出撩妹神器AI聊天机器人@~@
历史文章传送门:
图像识别系列【基于keras实现图像识别CNN模型,从原理解读到实战】
bert中文文本情感分类【微博评论挖掘之Bert实战应用案例】
转载:https://blog.csdn.net/weixin_37479258/article/details/101061670