小言_互联网的博客

tensorflow2.0基于keras构建CNN交通标识图像检测模型【tensorflow2.0实战教程 图像识别模型代码】

1025人阅读  评论(0)

【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聊天机器人@~@

历史文章传送门:

seq2seq模型系列【Python十分钟写出聊天机器人】


图像识别系列【基于keras实现图像识别CNN模型,从原理解读到实战】


bert中文文本情感分类【微博评论挖掘之Bert实战应用案例】


转载:https://blog.csdn.net/weixin_37479258/article/details/101061670
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场