姜堰哪里有网站建设的网站开发实战视频教程

张小明 2025/12/31 8:31:01
姜堰哪里有网站建设的,网站开发实战视频教程,做照片软件,做deal网站编程深度学习模型并不容易#xff08;说实话#xff09;#xff0c;但测试一个模型更难。这就是为什么大多数TensorFlow和PyTorch代码没有包含单元测试。但当你的代码将运行在生产环境中时#xff0c;确保它确实按预期工作应该是优先事项。毕竟#xff0c;机器学习与其他任…编程深度学习模型并不容易说实话但测试一个模型更难。这就是为什么大多数TensorFlow和PyTorch代码没有包含单元测试。但当你的代码将运行在生产环境中时确保它确实按预期工作应该是优先事项。毕竟机器学习与其他任何软件并无不同。请注意本文是《生产中的深度学习》课程的第三部分在该课程中我们将探讨如何将笔记本代码转换为可服务于数百万用户的生产就绪代码。在本文中我们将重点讨论如何正确测试机器学习代码分析编写单元测试时的一些最佳实践并展示一些测试几乎是必需的示例场景。我们将从为什么需要在代码中引入测试开始然后快速回顾Python测试的基础知识接着探讨一些实际场景。为何需要单元测试在开发神经网络时大多数人并不关心捕捉所有可能的异常、发现所有边缘情况或调试每个函数。我们只需要看到模型开始训练fit。然后我们只需要提高其准确性直到达到可接受的点。这都很好但是当模型被部署到服务器并在实际的面向公众的应用程序中使用时会发生什么很可能会因为某些用户发送了错误的数据或者因为某些静默的错误破坏了我们的数据预处理流程而崩溃。我们甚至可能发现我们的模型其实一直都有问题。这就是单元测试发挥作用的地方。在问题发生之前就预防它们。单元测试非常有用因为它们早期发现软件错误调试我们的代码确保代码按预期工作简化重构过程加快集成过程充当文档别告诉我你至少不想要以上的一些好处。当然测试可能会占用你宝贵的时间但这100%是值得的。稍后你就会明白。但究竟什么是单元测试单元测试基础简单来说单元测试就是一个函数调用另一个函数或一个单元并检查返回的值是否与预期输出匹配。让我们看一个使用我们的UNet模型的例子让它更清楚。如果你没有跟随这个系列可以在我们的GitHub仓库中找到代码。简而言之我们采用了一个官方TensorFlow谷歌Colab进行图像分割并尝试将其转换为高度优化的、生产就绪的代码。查看前两部分[此处]和[此处]。我们有一个简单的函数通过将所有像素除以255来归一化图像。def_normalize(self,input_image,input_mask): Normalise input image Args: input_image (tf.image): The input image input_mask (int): The image mask Returns: input_image (tf.image): The normalized input image input_mask (int): The new image mask input_imagetf.cast(input_image,tf.float32)/255.0input_mask-1returninput_image,input_mask为了确保它完全按照预期工作我们可以编写另一个使用“_normalize”并检查其结果的函数。它看起来会像这样。deftest_normalize(self):input_imagenp.array([[1.,1.],[1.,1.]])input_mask1expected_imagenp.array([[0.00392157,0.00392157],[0.00392157,0.00392157]])resultself.unet._normalize(input_image,input_mask)self.assertEquals(expected_image,result[0])“test_normalize”函数创建一个假的输入图像使用该图像作为参数调用函数然后确保结果等于预期的图像。“assertEquals”是一个特殊的函数来自Python的unittest包稍后会详细介绍它的作用正如其名。它断言两个值相等。请注意你也可以使用下面这样的方式但使用内置函数有其优势。assertexpected_imageresult[0]就是这样。这就是单元测试。测试既可用于非常小的函数也可用于跨不同模块的更大、更复杂的功能。Python中的单元测试在我们看更多例子之前我想快速回顾一下Python如何支持单元测试。Python标准库中主要的测试框架/运行器是unittest。Unittest使用起来非常简单只有两个要求将测试放在一个类中并使用其特殊的assert函数。一个简单的例子如下importunittestclassUnetTest(unittest.TestCase):deftest_normalize(self):...if__name____main__:unittest.main()需要注意的一些事项我们有一个测试类其中包含一个作为方法的“testnormalize”函数。通常测试函数以“test”作为前缀命名后跟它们要测试的函数名。这是一个约定但也启用了unittest的自动发现功能即库能够自动检测项目或模块中的所有单元测试这样你就不必一个一个地运行它们。要运行单元测试我们调用“unittest.main()”函数该函数发现模块中的所有测试运行它们并打印输出。我们的UnetTest类继承“unittest.TestCase”类。这个类帮助我们设置具有不同输入的唯一测试用例因为它带有“setUp()”和“tearDown()”方法。在setUp()中我们可以定义可以被所有测试访问的输入在tearDown()中我们可以释放它们参见下一章的代码片段。这很有用因为所有测试都应该独立运行通常它们不能共享信息。嗯现在它们可以了。另外两个强大的框架是pytest和nose它们遵循几乎相同的原则。我建议在决定哪种最适合你之前稍微尝试一下。我个人大多数时候使用pytest因为它感觉更简单一些并且支持一些很好的功能如fixtures和测试参数化这里我不详细说明你可以查看官方文档了解更多。但老实说差别不大所以使用其中任何一个都可以。TensorFlow中的测试tf.test但在这里我要讨论另一个不太为人所知的。由于我们使用TensorFlow编写模型我们可以利用“tf.test”它是unittest的扩展但包含了针对TensorFlow代码定制的断言是的当我发现这一点时也很震惊。在这种情况下我们的代码变成了这样importtensorflowastfclassUnetTest(tf.test.TestCase):defsetUp(self):super(UnetTest,self).setUp()...deftearDown(self):passdeftest_normalize(self):...if__name____main__:tf.test.main()它的基本规则完全相同需要注意的是我们需要在“setUp”内部调用“super()”函数这使“tf.test”能够施展它的魔法。很酷吧模拟Mocking你应该了解的另一个超级重要的主题是模拟Mocking和模拟对象mock objects。模拟类和函数在编写Java时非常常见但在Python中却很少被使用。模拟使得在测试代码时使用虚拟对象替换复杂逻辑或繁重的依赖项变得非常容易。虚拟对象指的是结构与我们真实对象相同但包含虚假或无意义数据的简单易编码的对象。在我们的例子中一个虚拟对象可能是一个全为1的2D张量模拟一个实际的图像就像第一个代码片段中的“input_image”。模拟还有助于我们控制代码的行为并模拟昂贵的调用。让我们再看一个使用我们的UNet的例子。假设我们想确保数据预处理步骤是正确的并且我们的代码按预期分割数据并创建训练和测试数据集一个非常常见的测试用例。这是我们想要测试的代码defload_data(self): Loads and Preprocess data self.dataset,self.infoDataLoader().load_data(self.config.data)self._preprocess_data()def_preprocess_data(self): Splits into training and test and set training parameterstrainself.dataset[train].map(self._load_image_train,num_parallel_callstf.data.experimental.AUTOTUNE)testself.dataset[test].map(self._load_image_test)self.train_datasettrain.cache().shuffle(self.buffer_size).batch(self.batch_size).repeat()self.train_datasetself.train_dataset.prefetch(buffer_sizetf.data.experimental.AUTOTUNE)self.test_datasettest.batch(self.batch_size)def_load_image_train(self,datapoint): Loads and preprocess a single training image input_imagetf.image.resize(datapoint[image],(self.image_size,self.image_size))input_masktf.image.resize(datapoint[segmentation_mask],(self.image_size,self.image_size))iftf.random.uniform(())0.5:input_imagetf.image.flip_left_right(input_image)input_masktf.image.flip_left_right(input_mask)input_image,input_maskself._normalize(input_image,input_mask)returninput_image,input_maskdef_load_image_test(self,datapoint): Loads and preprocess a single test imageinput_imagetf.image.resize(datapoint[image],(self.image_size,self.image_size))input_masktf.image.resize(datapoint[segmentation_mask],(self.image_size,self.image_size))input_image,input_maskself._normalize(input_image,input_mask)returninput_image,input_mask无需深入代码细节它实际上所做的是数据分割、一些随机打乱、调整大小和批处理。所以我们想测试这段代码。一切都很好除了那个该死的加载函数。self.dataset,self.infoDataLoader().load_data(self.config.data)难道我们每次运行一个单元测试都要加载整个数据集吗绝对不是。因此我们可以模拟那个函数让它返回一个虚拟数据集而不是调用真实的函数。模拟来拯救。我们可以使用unittest的模拟对象包来完成这个。它提供了一个模拟类“Mock()”来直接创建模拟对象以及一个“patch()”装饰器用于在我们测试的模块内用一个模拟对象替换导入的模块。由于理解其区别并不简单我将在末尾为那些想了解更多细节的人留下一篇精彩文章的链接。对于那些不熟悉的人装饰器只是一个包装另一个函数以扩展其功能的函数。一旦我们声明了包装函数我们就可以注释其他函数来增强它们。看到下面的patch了吗这是一个用“patch”函数包装“test_load_data”的装饰器。更多信息请参阅文章末尾的链接。通过使用“patch()”装饰器我们得到patch(model.unet.DataLoader.load_data)deftest_load_data(self,mock_data_loader):mock_data_loader.side_effectdummy_load_data shapetf.TensorShape([None,self.unet.image_size,self.unet.image_size,3])self.unet.load_data()mock_data_loader.assert_called()self.assertItemsEqual(self.unet.train_dataset.element_spec[0].shape,shape)self.assertItemsEqual(self.unet.test_dataset.element_spec[0].shape,shape)我能看出你对这个感到惊讶。别试图隐藏。测试覆盖率在我们看一些机器学习中特定的测试用例之前我想提另一个重要方面覆盖率。覆盖率是指我们的代码有多少实际上被单元测试覆盖了。覆盖率是一个宝贵的指标可以帮助我们编写更好的单元测试发现测试未覆盖的领域找到新的测试用例并确保测试的质量。你可以像这样简单地检查你的覆盖率安装coverage包$ condainstallcoverage在你的测试文件中运行该包$ coverage run -m unittest /home/aisummer/PycharmProjects/Deep-Learning-Production-Course/model/tests/unet_test.py打印结果$ coverage report -m /home/aisummer/PycharmProjects/Deep-Learning-Production-Course/model/tests/unet_test.py Name Stmts Miss Cover Missing ------------------------------------------------------------- model/tests/unet_test.py35197%52这表示我们覆盖了97%的代码。总共有35条语句我们只漏掉了1条。缺失信息告诉我们哪些代码行还需要覆盖多么方便。测试示例场景我认为是时候探索一些深度学习的不同场景和代码库中单元测试非常有用的部分了。好吧我不会为每一个都编写代码但我认为概述几个用例非常重要。我们已经讨论过其中之一。确保我们的数据格式正确是至关重要的。我能想到的其他一些是数据确保我们的数据格式正确是的我为了完整性再次把它放在这里确保训练标签正确测试我们的复杂处理步骤如图像操作断言数据的完整性、质量和错误测试特征的分布训练运行一个训练步骤并比较权重前后确保它们已更新检查我们的损失函数是否确实可以用于我们的数据评估在迭代不同架构时使用测试确保你的指标例如准确率、精确率和召回率高于某个阈值你可以在训练上运行速度/基准测试以捕捉可能的过拟合当然交叉验证可以以单元测试的形式进行模型架构模型的层确实在堆叠模型的输出形状正确实际上让我们编写最后一个来证明给你看有多简单deftest_ouput_size(self):shape(1,self.unet.image_size,self.unet.image_size,3)imagetf.ones(shape)self.unet.build()self.assertEqual(self.unet.model.predict(image).shape,shape)就是这样。定义预期的形状构建一个虚拟输入构建模型并进行预测这就是全部。对于一个如此有用的测试来说还不错对吧你看单元测试不必很复杂。有时几行代码可以让我们免去很多麻烦。相信我。但另一方面我们也不应该测试每一个可以想象到的东西。这是一个巨大的时间消耗。我们需要找到一个平衡点。我相信在开发你自己的模型时你可以想出更多更多的测试场景。这只是为了大致了解你可以关注的不同领域。集成/验收测试我故意避免提及的是集成测试和验收测试。这些类型的测试是非常强大的工具旨在测试我们的系统与其他系统的集成程度。如果你有一个包含许多服务或客户端/服务器交互的应用程序验收测试是确保一切在更高层次上按预期工作的首选功能。在课程后期当我们将模型部署到服务器时我们绝对需要编写一些验收测试因为我们希望确保模型以用户/客户端期望的形式返回他们期望的结果。当我们的应用程序是实时的并为用户提供服务时我们对其进行迭代我们不能因为一些愚蠢的错误而导致失败还记得第一篇文章中的可靠性原则吗验收测试帮助我们避免这类事情。所以让我们暂时搁置它们等到时机成熟时再处理。为了确保你会在本课程的下一部分发布时收到通知你可以订阅我们的新闻通讯。结论单元测试确实是我们武器库中非常宝贵的工具特别是在构建复杂的深度学习模型时。我的意思是我能想到一百万件可能在机器学习应用程序上出错的事情。尽管编写好的测试可能很困难且耗时但这是你不应该忽视的事情。我的懒惰已经不止一次地反噬我所以我决定从现在开始总是编写它们。但同样我们总是需要找到一个平衡点。然而单元测试只是使我们的代码生产就绪的方法之一。为了确保我们原始的笔记本代码可以在部署环境中可靠地使用我们还必须做更多的事情。到目前为止我们讨论了深度学习的系统设计和编写Python深度学习代码的最佳实践。我们清单上的下一步是为我们的代码库添加日志记录并学习如何调试我们的TensorFlow代码。等不及了。到时候见…参考文献programiz.comPython装饰器wikipedia.org代码覆盖率toptal.comPython模拟入门realpython.comPython测试入门披露请注意以上部分链接可能是联盟链接在你点击后决定购买时我们将在不增加你额外成本的情况下获得佣金。更多精彩内容 请关注我的个人公众号 公众号办公AI智能小助手或者 我的个人博客 https://blog.qife122.com/对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号网络安全技术点滴分享
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

小网站链接怎么找简述什么是百度竞价排名

给联合体其中⼀个成员赋值&#xff0c;其他成员的值也跟着变化。代码语言&#xff1a;javascriptAI代码解释#include <stdio.h> //联合类型的声明 union Un {char c;//1int i;//4 }; int main() {//联合变量的定义 union Un un {0};//计算两个变量的⼤⼩ printf("…

张小明 2025/12/29 11:50:07 网站建设

苏州建行网站首页文化网站策划书内容

LobeChat是否支持Markdown渲染&#xff1f;技术文档写作体验评测 在今天&#xff0c;如果你正在用 AI 写一份技术文档、整理会议纪要&#xff0c;或是调试一段 Python 脚本&#xff0c;你大概率希望看到的不是一堆乱糟糟的原始文本&#xff0c;而是一份结构清晰、代码高亮、公式…

张小明 2025/12/29 11:49:34 网站建设

电影网站建设的核心是wordpress授权系统

AUG&#xff08;Alibaba Cloud User Group&#xff09; 是由龙蜥社区理事长单位阿里云发起的以用户为中心的互动学习交流小组——每期聚焦一个前沿主题&#xff0c;走进一座城市&#xff0c;邀请几十位行业伙伴与阿里云技术专家面对面&#xff0c;聊真问题、看真实践。 这一次…

张小明 2025/12/29 11:49:01 网站建设

大连住房和建设局网站北京vi设计培训

UE5体素引擎终极指南&#xff1a;7天掌握动态世界构建技术 【免费下载链接】UE5VoxelTutorial A collection of voxel mesh generation algorithms 项目地址: https://gitcode.com/gh_mirrors/ue/UE5VoxelTutorial 想要在UE5中创建可破坏、可编辑的动态环境吗&#xff1…

张小明 2025/12/29 11:48:26 网站建设

大连百度做网站推广电话wordpress删除自定义分类

使用TensorRT优化Flan-T5系列模型推理速度 在大语言模型&#xff08;LLM&#xff09;加速落地的今天&#xff0c;一个看似不起眼的技术细节——推理延迟&#xff0c;往往成为决定AI服务能否上线的关键瓶颈。以Google的Flan-T5为例&#xff0c;它在问答、摘要等任务中表现优异&a…

张小明 2025/12/29 11:47:54 网站建设

企业官网响应式网站查询网站信息

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 请创建一个面向初学者的Map循环教学代码&#xff1a;1.从最简单的数组[1,2,3]平方运算开始&#xff1b;2.逐步增加复杂度到对象数组处理&#xff1b;3.每个示例配console.log输出和…

张小明 2025/12/29 11:47:20 网站建设