前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >TensorFlow 基础学习 - 4 (重点是调参)

TensorFlow 基础学习 - 4 (重点是调参)

作者头像
叉叉敌
发布于 2021-12-06 07:25:10
发布于 2021-12-06 07:25:10
78100
代码可运行
举报
文章被收录于专栏:ChasaysChasays
运行总次数:0
代码可运行

准备数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!wget --no-check-certificate \
    https://storage.googleapis.com/laurencemoroney-blog.appspot.com/horse-or-human.zip \
    -O /tmp/horse-or-human.zip

该目录下又分别包含horseshumans子目录。

简而言之:训练集就是用来告诉神经网络模型"这就是马的样子"、"这就是人的样子"等数据。

这里需要注意的是,我们并没有明确地将图像标注为马或人。如果还记得之前的手写数字例子,它的训练数据已经标注了"这是一个1","这是一个7"等等。 稍后,我们使用一个叫做ImageGenerator的类--用它从子目录中读取图像,并根据子目录的名称自动给图像贴上标签。所以,会有一个"训练"目录,其中包含一个"马匹"目录和一个"人类"目录。ImageGenerator将为你适当地标注图片,从而减少一个编码步骤。(不仅编程上更方便,而且可以避免一次性把所有训练数据载入内存,而导致内存不够等问题。)

让我们分别定义这些目录。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Directory with our training horse pictures
train_horse_dir = os.path.join('/tmp/horse-or-human/horses')

# Directory with our training human pictures
train_human_dir = os.path.join('/tmp/horse-or-human/humans')

建模

像前面的例子一样添加卷积层CNN,并将最终结果扁平化,以输送到全连接的层去。

最后我们添加全连接层。

需要注意的是,由于我们面对的是一个两类分类问题,即二类分类问题,所以我们会用sigmoid激活函数作为模型的最后一层,这样我们网络的输出将是一个介于0和1之间的有理数,即当前图像是1类(而不是0类)的概率。

BTW, 如果是是多个分类,比如前面提到的0~9个分类用的softmax激活函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import tensorflow as tf

model = tf.keras.models.Sequential([
        tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(150, 150,3)),
        tf.keras.layers.MaxPooling2D(2,2),

        tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
        tf.keras.layers.MaxPooling2D(2,2),
        tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
        tf.keras.layers.MaxPooling2D(2,2),

        tf.keras.layers.Flatten(),
        tf.keras.layers.Dense(512, activation='relu'),
        tf.keras.layers.Dense(1, activation='sigmoid')

])

调用model.summary()方法打印出神经元网络模型的结构信息

接下来,我们将配置模型训练的参数。我们将用 "binary_crossentropy(二元交叉熵)"衡量损失,因为这是一个二元分类问题,最终的激活函数是一个sigmoid。关于损失度量的复习,请参见机器学习速成班。我们将使用rmsprop作为优化器,学习率为0.001。在训练过程中,我们将希望监控分类精度。

NOTE.我们将使用学习率为0.001rmsprop优化器。在这种情况下,使用RMSprop优化算法随机梯度下降(SGD)更可取,因为RMSprop可以为我们自动调整学习率。(其他优化器,如AdamAdagrad,也会在训练过程中自动调整学习率,在这里也同样有效。)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from tensorflow.keras.optimizers import RMSprop
model.compile(loss=tf.keras.losses.BinaryCrossentropy(),
              optimizer=tf.keras.optimizers.RMSprop(lr=0.001),
              metrics=['acc'])

数据预处理

让我们设置训练数据生成器(ImageDataGenerator),它将读取源文件夹中的图片,将它们转换为float32多维数组,并将图像数据(连同它们的标签)反馈给神经元网络。总共需要两个生成器,有用于产生训练图像,一个用于产生验证图像。生成器将产生一批大小为300x300的图像及其标签(0或1)。

前面的课中我们已经知道如何对训练数据做归一化,进入神经网络的数据通常应该以某种方式进行归一化,以使其更容易被网络处理。在这个例子中,我们将通过将像素值归一化到[0, 1]范围内(最初所有的值都在[0, 255]范围内)来对图像进行预处理。

在Keras中,可以通过keras.preprocessing.image.ImageDataGenerator类使用rescale参数来实现归一化。通过ImageDataGenerator类的.flow(data, labels)或.flow_from_directory(directory),可以创建生成器。然后,这些生成器可以作为输入Keras方法的参数,如fit_generator、evaluate_generator和predict_generator都可接收生成器实例为参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from tensorflow.keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(rescale=1/255)
train_generator = train_datagen.flow_from_directory(
    '/tmp/horse-or-human/',
    target_size=(150, 150),
    batch_size=32,
    class_mode='binary'
)

训练

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
history = model.fit(
    train_generator,
    steps_per_epoch=10,
    epochs=10,
    verbose=1
)

调参

构造神经元网络模型时,

  • 一定会考虑需要几个卷积层
  • 过滤器应该几个
  • 全连接层需要几个神经元

最先想到的肯定是手动修改那些参数,然后观察训练的效果(损失和准确度),从而判断参数的设置是否合理。但是那样很繁琐,因为参数组合会有很多,训练时间很长。再进一步,可以手动编写一些循环,通过遍历来搜索合适的参数。但是最好利用专门的框架来搜索参数,不太容易出错,效果也比前两种方法更好。

Kerastuner就是一个可以自动搜索模型训练参数的库。它的基本思路是在需要调整参数的地方插入一个特殊的对象(可指定参数范围),然后调用类似训练那样的search方法即可。

接下来首先准备训练数据和需要加载的库。

如果没有这个库先安装pip3 install -U keras-tuner,不然会提示错误。ModuleNotFoundError: No module named 'kerastuner

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.optimizers import RMSprop
train_datagen = ImageDataGenerator(rescale=1/255)
validation_datagen = ImageDataGenerator(rescale=1/255)
train_generator = train_datagen.flow_from_directory('/tmp/horse-or-human/',  
        target_size=(150, 150),batch_size=32,class_mode='binary')
# validation_generator = validation_datagen.flow_from_directory('/tmp/validation-horse-or-human/',  
#         target_size=(150, 150), batch_size=32,class_mode='binary')
from kerastuner.tuners import Hyperband
from kerastuner.engine.hyperparameters import HyperParameters
import tensorflow as tf

接着创建HyperParameters对象,然后在模型中插入Choice、Int等调参用的对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
hp=HyperParameters()
def build_model(hp):
    model = tf.keras.models.Sequential()        
    model.add(tf.keras.layers.Conv2D(hp.Choice('num_filters_top_layer',values=[16,64],default=16), (3,3), 
                                     activation='relu', input_shape=(150, 150, 3)))
    model.add(tf.keras.layers.MaxPooling2D(2, 2))
    for i in range(hp.Int("num_conv_layers",1,3)):
        model.add(tf.keras.layers.Conv2D(hp.Choice(f'num_filters_layer{i}',values=[16,64],default=16), (3,3), activation='relu'))
        model.add(tf.keras.layers.MaxPooling2D(2,2))
    model.add(tf.keras.layers.Flatten())
    model.add(tf.keras.layers.Dense(hp.Int("hidden_units",128,512,step=32), activation='relu'))
    model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
    model.compile(loss='binary_crossentropy',optimizer=RMSprop(lr=0.001),metrics=['acc'])
    return model
  • 第一个参数Choice是CNN的过滤器,范围是16~64,最好是32的倍数,默认是16
  • 第二个参数是Int,设置几个CNN,13个,且每个CNN卷积神经网络的过滤器个数为1664,默认16
  • 第三个全连接需要几个神经元,128~512,步长为32。即:128、128+32....

他们的第一个参数是name,随意命名,最好知道且表达出来即可。

然后创建Hyperband对象,这是Kerastuner支持的四种方法的其中一种,可以轻易的限定搜索空间去优化部分参数。具体资料可以到Kerastuner的网站获取。关于其他三种tuner:RandomSearch、 BayesianOptimization 和 Sklearn

最后调用search方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tuner=Hyperband(
    build_model,
    objective='val_acc',
    max_epochs=10,
    directory='horse_human_params',
    hyperparameters=hp,
    project_name='my_horse_human_project'
)
tuner.search(train_generator,epochs=10,validation_data=validation_generator)

搜索到最优参数后,可以通过下面的程序,用tuner对象提取最优参数构建神经元网络模型。并调用summary方法观察优化后的网络结构。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
best_hps=tuner.get_best_hyperparameters(1)[0]
print(best_hps.values)
model=tuner.hypermodel.build(best_hps)
model.summary()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/02/19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MOOC TensorFlow入门实操课程代码回顾总结(一)
0 T-shirt/top(体恤) 1 Trouser(裤子) 2 Pullover(套头衫) 3 Dress(连衣裙) 4 Coat(外套) 5 Sandal(凉鞋) 6 Shirt(衬衫) 7 Sneaker(运动鞋) 8 Bag(袋子) 9 Ankle boot(短靴)
荣仔_最靓的仔
2022/01/05
7410
MOOC TensorFlow入门实操课程代码回顾总结(一)
MOOC TensorFlow入门实操课程代码回顾总结(二)
欢迎来到TensorFlow入门实操课程的学习 MOOC TensorFlow入门实操课程代码回顾总结(一) MOOC TensorFlow入门实操课程代码回顾总结(三) 注: 用于表示python代码 粘贴运行结果 目录 5 图像分类基础应用——猫狗分类案例 5.1 导入库 5.2 下载数据集 5.3 查看样本数目 5.4 创建文件夹,存放训练测试数据 5.5 切分为训练数据和测试数据 5.6 模型构建 5.7 数据预处理 5.8 模型训练 5.9 训练结果可视化 5.10 模型推理 6 迁移学
荣仔_最靓的仔
2022/01/05
5560
MOOC TensorFlow入门实操课程代码回顾总结(二)
深度学习实战-CNN猫狗识别
本文记录了第一个基于卷积神经网络在图像识别领域的应用:猫狗图像识别。主要内容包含:
皮大大
2023/08/23
7390
使用深度学习和OpenCV的早期火灾探测系统
嵌入式处理技术的最新发展已使基于视觉的系统可以在监视过程中使用卷积神经网络检测火灾。在本文中,已经实现了两个定制的CNN模型,以实现用于监视视频的具有成本效益的火灾探测CNN体系结构。第一个模型是受AlexNet架构启发的定制的基本CNN架构。将实现并查看其输出和限制,并创建一个定制的InceptionV3模型。为了平衡效率和准确性,考虑目标问题和火灾数据的性质对模型进行了微调。将使用三个不同的数据集来训练模型。数据集的链接在本文结尾处可用。进入编码部分。
代码医生工作室
2020/07/09
1.2K0
使用深度学习和OpenCV的早期火灾探测系统
用AI训练AI:制作一个简单的猫狗识别模型
这是腾讯云加社区共创官的选题互换挑战赛,一搭眼看到了这个题目,因为之前写过 自己制作数据集并训练,这无非是换个数据源进行训练而已,于是果断选择了这个题目
yichen
2024/03/23
1.4K2
用AI训练AI:制作一个简单的猫狗识别模型
keras系列︱图像多分类训练与利用bottleneck features进行微调(三)
该文摘要总结:利用卷积神经网络来对图像进行特征提取和分类,使用预训练的VGG16网络作为基础网络,通过修改网络结构以适应自己的数据集,并使用合成数据集进行训练。在训练过程中,使用了数据增强技术,包括旋转、翻转和水平翻转等,以提高模型的性能。最终,该模型在测试集上获得了85.43%的准确率,表现良好。
悟乙己
2018/01/02
4.4K0
keras系列︱图像多分类训练与利用bottleneck features进行微调(三)
关于深度学习系列笔记十二(关于猫狗判断实验)
首先小小的庆祝一下自己的微信公众号订阅用户已达到100人了,是小小的虚荣心也是收获也是鞭策,希望自己砥砺前行,努力进步,做到更好。
python与大数据分析
2022/03/11
5020
关于深度学习系列笔记十二(关于猫狗判断实验)
Deep learning with Python 学习笔记(2)
卷积神经网络接收形状为 (image_height, image_width, image_channels)的输入张量(不包括批量维度),宽度和高度两个维度的尺寸通常会随着网络加深而变小。通道数量由传入 Conv2D 层的第一个参数所控制
范中豪
2019/09/10
7240
Deep learning with Python 学习笔记(2)
AI 技术讲座精选:菜鸟学深度学习(二)
【AI100 导读】如何才能创建出自己的卷积神经网络呢?在本篇文章中我们会一起来探讨一下这个问题。我们将会继续处理在该系列第一部分谈到的图像分割问题。 可用来创建卷积神经网络的深度学习库有很多。我们
AI科技大本营
2018/04/26
6780
AI 技术讲座精选:菜鸟学深度学习(二)
[Deep-Learning-with-Python]计算机视觉中的深度学习
卷积网络接收(image_height,image_width,image_channels)形状的张量作为输入(不包括batch size)。MNIST中,将图片转换成(28,28,1)形状,然后在第一层传递input_shape参数。 显示网络架构
用户1631856
2018/08/01
2.2K0
[Deep-Learning-with-Python]计算机视觉中的深度学习
使用预先训练网络和特征抽取大力提升图像识别率
神经网络在项目实践中遇到的一大问题是数据不足。任何人工智能项目,在数据不足面前都会巧妇难为无米之炊,算法再精巧,只要数据量不足,最后的效果都不尽如人意,我们目前正在做的图像识别就是如此,要想让网络准确的识别猫狗图片,没有几万张图片以上是做不到的。
望月从良
2018/08/16
8540
使用预先训练网络和特征抽取大力提升图像识别率
【完结】TensorFlow2.0 快速上手手册
import tensorflow as tf a = tf.constant([1,2,3]) b = tf.constant([4,5,6]) print(a+b)
用户1508658
2019/07/25
3.9K0
【完结】TensorFlow2.0 快速上手手册
机器学习 | 猫狗大战
对于机器学习来说,数据的重要性无可厚非,大部分处理机器学习的问题都是在处理数据,包括数据的清洗,归一化等,好的数据质量能大大提高模型的预测性能
机器视觉CV
2019/07/15
1.5K0
机器学习 | 猫狗大战
使用TensorFlow和OpenCV实现口罩检测
在这段艰难的疫情期间,我们决定建立一个非常简单和基本的卷积神经网络(CNN)模型,使用TensorFlow与Keras库和OpenCV来检测人们是否佩戴口罩。
小白学视觉
2020/06/12
2.7K2
从零开始学keras(七)之kaggle猫狗分类器
【导读】Keras是一个由Python编写的开源人工神经网络库,可以作为Tensorflow、和Theano的高阶应用程序接口,进行深度学习模型的设计、调试、评估、应用和可视化。本系列将教你如何从零开始学Keras,从搭建神经网络到项目实战,手把手教你精通Keras。相关内容参考《Python深度学习》这本书。
墨明棋妙27
2022/08/24
1.3K0
从零开始学keras(七)之kaggle猫狗分类器
如何训练一个神经网络
|---------01.jpg
bye
2020/12/14
4760
AI:是猫还是狗,这是个问题
如果你不喜欢小猫和小狗,你可能不知道他们具体是哪一种品种,但是一般来说,你都能区分出这是猫还是狗,猫和狗的特征还是不一样的,那我们如何用机器学习的方法训练一个网络区分猫狗呢?
不会飞的小鸟
2020/03/01
6691
从零开始构造一个识别猫狗图片的卷积网络
在深度学习的项目实践中,往往会遇到两个非常难以克服的难题,一是算力,要得到精确的结果,你需要设计几千层,规模庞大的神经网络,然后使用几千个GPU,把神经网络布置到这些GPU上进行运算;第二个难以克服的困难就是数据量,要想得到足够精确的结果,必须依赖于足够量的数据来训练网络模型。本节我们先看看第二个问题如何解决。
望月从良
2018/08/13
1.3K0
从零开始构造一个识别猫狗图片的卷积网络
AI人工智能算法工程师系列一(慕K学习分享)
从而提高图像分类的准确率。以下是一个使用VGG16模型的示例,该模型在ImageNet挑战中表现优异。
用户11127530
2024/05/29
2210
教程:如何直接从可视化CNN layers中的特征
注意:在这里,我们只关心构建CNN模型并观察其特征图(feature map),我们不关心模型的准确性。
致Great
2021/01/06
9580
相关推荐
MOOC TensorFlow入门实操课程代码回顾总结(一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验