【AI with ML】第 2 章 :计算机视觉简介

news2024/11/27 8:28:27

       🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎

📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃

🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​

📣系列专栏 - 机器学习【ML】 自然语言处理【NLP】  深度学习【DL】

​​

 🖍foreword

✔说明⇢本人讲解主要包括Python、机器学习(ML)、深度学习(DL)、自然语言处理(NLP)等内容。

如果你对这个系列感兴趣的话,可以关注订阅哟👋

文章目录

识别服装项目

数据:时尚 MNIST

视觉神经元

设计神经网络

完整代码

训练神经网络

探索模型输出

更长时间的训练——发现过度拟合

停止训练

概括


上一章介绍了机器学习工作原理的基础知识。您了解了如何开始使用神经网络进行编程以将数据与标签匹配,以及如何从那里推断可用于区分项目的规则。合乎逻辑的下一步是将这些概念应用于计算机视觉,我们将让模型学习如何识别图片中的内容,以便它可以“看到”图片中的内容。在本章中,您将使用一个流行的服装项目数据集并构建一个可以区分它们的模型,从而“看到”不同类型服装之间的差异。

识别服装项目

为了我们的第一个例子,让我们考虑一下如何识别图像中的衣服。例如,考虑图 2-1中的项目。

图 2-1。服装示例

这里有许多不同的服装项目,您可以认出它们。你明白什么是衬衫、外套或裙子。但是,您如何向从未见过服装的人解释这一点?鞋子怎么样?这张图片中有两只鞋,但你会如何向别人描述呢?这是我们在第 1 章中谈到的基于规则的编程可能失败的另一个领域。有时用规则来描述一些东西是不可行的。

当然,计算机视觉也不例外。但是想想你是如何学会识别所有这些项目的——通过看很多不同的例子,并获得如何使用它们的经验。我们可以用电脑做同样的事情吗?答案是肯定的,但有局限性。让我们看一下第一个示例,该示例使用名为 Fashion MNIST 的著名数据集教计算机识别衣服。

视觉神经元

在第一章,你看到一个非常简单的场景,机器被赋予了一组 X 和 Y 值,它了解到这些之间的关系是 Y = 2X – 1。这是使用一个非常简单的神经网络完成的,只有一层和一个神经元。

如果您要直观地绘制它,它可能看起来像图 2-4。

我们的每张图像都是 0 到 255 之间的一组 784 个值(28 × 28)。它们可以是我们的 X。我们知道我们的数据集中有 10 种不同类型的图像,所以让我们将它们视为我们的 Y。现在我们想了解 Y 是 X 的函数时的函数是什么样的。

图 2-4。学习线性关系的单个神经元

鉴于我们每张图像有 784 个 X 值,并且我们的 Y 将介于 0 和 9 之间,很明显我们不能像之前那样做 Y = mX + c。

我们能做的就是让几个神经元一起工作。其中每一个都将学习参数,当我们拥有所有这些参数的组合函数时,我们可以看看我们是否可以将该模式与我们想要的答案相匹配(图 2-5)。

图 2-5。扩展我们的模式以获得更复杂的示例

该图顶部的框可以被认为是图像中的像素,或者我们的 X 值。当我们训练神经网络时,我们将它们加载到一层神经元中——图 2-5显示它们只是被加载到第一个神经元中,但值被加载到每个神经元中。考虑随机初始化每个神经元的权重和偏差(m 和 c)。然后,当我们将每个神经元的输出值相加时,我们将得到一个值。这将对输出层中的每个神经元完成,因此神经元 0 将包含像素加起来为标签 0 的概率值,神经元 1 为标签 1,等等。

随着时间的推移,我们希望将该值与所需的输出相匹配——对于此图像,我们可以看到数字 9,即图 2-3中所示的踝靴标签。因此,换句话说,这个神经元应该具有所有输出神经元中的最大值。

鉴于有 10 个标签,随机初始化应该在大约 10% 的时间内得到正确答案。由此,损失函数和优化器可以一个时期一个时期地完成他们的工作,调整每个神经元的内部参数,以提高那 10%。因此,随着时间的推移,计算机将学会“看”什么使鞋子成为鞋子或使裙子成为连衣裙。

设计神经网络

让我们现在探索它在代码中的样子。首先,我们来看看图 2-5中所示的神经网络的设计:

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation=tf.nn.relu),
    keras.layers.Dense(10, activation=tf.nn.softmax)
])

如果您还记得,在第 1 章中,我们有一个Sequential模型来指定我们有很多层。它只有一层,但在这种情况下,我们有多层。

首先,Flatten不是神经元层,而是输入层规范。我们的输入是 28 × 28 的图像,但我们希望将它们视为一系列数值,如图2-5顶部的灰色框。Flatten获取那个“正方形”值(一个二维数组)并将它变成一条线(一个一维数组)。

下一个,Dense,是一层神经元,我们指定我们需要 128 个神经元。这就是图 2-5中所示的中间层。你会经常听到这样的层被描述为 隐藏层。调用者看不到输入和输出之间的层,因此使用术语“隐藏”来描述它们。我们要求 128 个神经元随机初始化其内部参数。通常这时候我会被问到的问题是“为什么是 128?” 这完全是任意的——对于要使用的神经元数量没有固定的规则。在设计层时,您希望选择适当数量的值以使您的模型能够实际学习。更多的神经元意味着它会运行得更慢,因为它必须学习更多的参数。更多的神经元还可能导致一个网络非常擅长识别训练数据,但不擅长识别它以前没有见过的数据(这被称为过度拟合,我们将在本章后面讨论)。另一方面,更少的神经元意味着模型可能没有足够的参数来学习。

随着时间的推移需要进行一些实验才能选择正确的值。此过程通常称为超参数调整。在机器学习中,超参数是用于控制训练的值,与被训练/学习的神经元的内部值相反,后者被称为参数。

可能会注意到该层中还指定了一个激活函数。激活函数是将在层中的每个神经元上执行的代码。TensorFlow 支持其中的一些,但在中间层是relu,代表整流线性单元if-then这是一个简单的函数,如果它大于 0,它只返回一个值。在这种情况下,我们不希望将负值传递到下一层以潜在地影响求和函数,因此我们可以不用编写大量代码,而是可以只需激活图层即可relu

最后,有还有Dense一层,就是输出层。这有 10 个神经元,因为我们有 10 个类。这些神经元中的每一个最终都会有输入像素匹配该类别的概率,因此我们的工作是确定哪个具有最高值。我们可以遍历它们来选择那个值,但是softmax激活函数会为我们做这些。

所以现在当我们训练我们的神经网络时,目标是我们可以输入一个 28 × 28 像素的数组,中间层的神经元将具有权重和偏差(m 和 c 值),当它们组合在一起时会将这些像素匹配到10 个输出值之一。

完整代码

现在我们已经探索了神经网络的架构,让我们看一下使用 Fashion MNIST 数据训练神经网络的完整代码:

import tensorflow as tf
data = tf.keras.datasets.fashion_mnist

(training_images, training_labels), (test_images, test_labels) = data.load_data()

training_images  = training_images / 255.0
test_images = test_images / 255.0

model = tf.keras.models.Sequential([
            tf.keras.layers.Flatten(input_shape=(28, 28)),
            tf.keras.layers.Dense(128, activation=tf.nn.relu),
            tf.keras.layers.Dense(10, activation=tf.nn.softmax)
        ])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(training_images, training_labels, epochs=5)

让我们一块一块地过一遍。首先是访问数据的便捷快捷方式:

data = tf.keras.datasets.fashion_mnist

难的有许多内置数据集,您可以像这样使用一行代码访问这些数据集。在这种情况下,您不必处理 70,000 张图像的下载——将它们分成训练集和测试集,等等——只需要一行代码。这种方法在使用称为TensorFlow Datasets的 API 后得到了改进,但是为了这些早期章节的目的,为了减少您需要学习的新概念的数量,我们将只使用 tf.keras.datasets.

我们load_data可以像这样调用它的方法来返回我们的训练和测试集:

(training_images, training_labels), 
(test_images, test_labels) = data.load_data()

Fashion MNIST 旨在拥有 60,000 张训练图像和 10,000 张测试图像。因此, from 的返回值data.load_data将为您提供一个包含 60,000 个 28 × 28 像素数组的数组,称为training_images,以及一个包含 60,000 个值 (0–9) 的数组,称为training_labels。同样,该test_images数组将包含 10,000 个 28 × 28 像素的数组,该test_labels数组将包含 10,000 个介于 0 和 9 之间的值。

我们的工作将是将训练图像与训练标签相匹配,其方式与我们在第 1 章中将 Y 与 X 相匹配的方式类似。

我们将阻止测试图像和测试标签,以便网络在训练时看不到它们。这些可用于测试具有迄今为止未见数据的网络的功效。

接下来的代码行可能看起来有点不寻常:

training_images  = training_images / 255.0
test_images = test_images / 255.0

Python允许您使用此表示法对整个数组执行操作。回想一下,我们图像中的所有像素都是灰度的,值介于 0 和 255 之间。因此,除以 255 可确保每个像素都由 0 到 1 之间的数字表示。这个过程称为 规范化图像。

为什么归一化数据更适合训练神经网络的数学原理超出了本书的范围,但在 TensorFlow 中训练神经网络时请记住,归一化会提高性能。在处理非规范化数据时,您的网络通常不会学习并且会出现大量错误。第 1 章中的 Y = 2X – 1 示例不需要对数据进行归一化,因为它非常简单,但为了好玩,尝试使用不同的 X 和 Y 值对其进行训练,其中 X 大得多,您很快就会看到它失败!

下一个如前所述,我们定义构成模型的神经网络:

model = tf.keras.models.Sequential([
            tf.keras.layers.Flatten(input_shape=(28, 28)),
            tf.keras.layers.Dense(128, activation=tf.nn.relu),
            tf.keras.layers.Dense(10, activation=tf.nn.softmax)
        ])

什么时候我们编译我们的模型,我们像以前一样指定损失函数和优化器:

 model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

这种情况下的损失函数称为稀疏分类交叉熵,它是 TensorFlow 中内置的损失函数库之一。再次,选择哪个使用损失函数本身就是一门艺术,随着时间的推移,您将了解哪些最适合在哪些场景中使用。该模型与我们在第 1 章中创建的模型之间的一个主要区别在于,我们不是试图预测单个数字,而是选择一个类别。我们的衣服属于 10 种衣服中的一种,因此使用分类损失函数是可行的方法。稀疏分类交叉熵是一个不错的选择。

这同样适用于选择优化器。这 adamsgd优化器是我们在第 1 章中使用的随机梯度下降 ( ) 优化器的演变,它已被证明更快、更有效。由于我们正在处理 60,000 张训练图像,我们可以获得的任何性能改进都会有所帮助,因此这里选择一个。

可能会注意到此代码中还出现了一个新行,指定我们要报告的指标。在这里,我们想在训练时报告网络的准确性。第 1 章中的简单示例只是报告了损失,我们通过查看损失如何减少来解释网络正在学习。在这种情况下,通过查看准确性来了解网络如何学习对我们更有用——它会返回将输入像素与输出标签正确匹配的频率。

接下来,我们将通过在五个时期内将训练图像拟合到训练标签来训练网络:

model.fit(training_images, training_labels, epochs=5)

最后,我们可以做一些新的事情——评估模型,使用一行代码。我们有一组 10,000 张图像和标签用于测试,我们可以将它们传递给经过训练的模型,让它预测它认为每张图像是什么,将其与实际标签进行比较,然后总结结果:

model.evaluate(test_images, test_labels)

训练神经网络

执行代码,你会看到一个时代一个时代的网络训练。运行训练后,您会在最后看到如下所示的内容:

58016/60000 [=====>.] - ETA: 0s - loss: 0.2941 - accuracy: 0.8907
59552/60000 [=====>.] - ETA: 0s - loss: 0.2943 - accuracy: 0.8906
60000/60000 [] - 2s 34us/sample - loss: 0.2940 - accuracy: 0.8906

请注意,它现在正在报告准确性。因此,在这种情况下,使用训练数据,我们的模型仅在五个 epoch 后就达到了大约 89% 的准确率。

但是测试数据呢?这我们的测试数据的结果model.evaluate将如下所示:

10000/1 [====] - 0s 30us/sample - loss: 0.2521 - accuracy: 0.8736

在这种情况下,模型的准确率为 87.36%,考虑到我们只训练了五个 epoch,这还不错。

你可能是想知道为什么测试数据的准确性低于训练数据的准确性。这是很常见的,当您考虑它时,它是有道理的:神经网络只真正知道如何将其训练的输入与这些值的输出相匹配。我们希望,只要有足够的数据,它就能从它看到的例子中进行概括,“学习”鞋子或裙子的样子。但是总会有一些它没有看到的项目的例子,这些项目与它必须混淆的东西有很大的不同。

例如,如果您从小到大只看到运动鞋,而这就是您眼中的鞋子,那么当您第一次看到高跟鞋时,您可能会有些困惑。根据你的经验,它可能是一只鞋,但你不确定。这是一个类似的概念。

探索模型输出

现在该模型已经过训练,并且我们可以使用测试集对其准确性进行很好的衡量,让我们稍微探索一下:

classifications = model.predict(test_images)
print(classifications[0])
print(test_labels[0])

我们将通过将测试图像传递给 来获得一组分类model.predict。然后让我们看看如果我们打印出第一个分类并将其与测试标签进行比较会得到什么:

[1.9177722e-05 1.9856788e-07 6.3756357e-07 7.1702580e-08 5.5287035e-07
 1.2249852e-02 6.0708484e-05 7.3229447e-02 8.3050705e-05 9.1435629e-01]
9

您会注意到分类返回了一组值。这些是 10 个输出神经元的值。在本例中,标签是衣服的实际标签9。仔细查看数组 — 您会发现一些值非常小,而最后一个(数组索引 9)是迄今为止最大的。这些是图像在该特定索引处与标签匹配的概率。因此,神经网络报告的是索引 0 处的衣服有 91.4% 的可能性是标签 9。我们知道它是标签 9,所以它是正确的。

为自己尝试几个不同的值,看看是否可以找到模型出错的地方。

停止训练

到目前为止的每个案例,我们都硬编码了我们正在训练的时期数。虽然这行得通,但我们可能希望训练直到达到所需的准确度,而不是不断尝试不同数量的 epoch 并进行训练和再训练,直到达到所需的值。因此,例如,如果我们想训练直到模型在训练集上达到 95% 的准确率,而不知道需要多少个 epoch,我们该怎么做呢?

最简单的方法是使用 训练回调。让我们看一下使用回调的更新代码:

import tensorflow as tf

class myCallback(tf.keras.callbacks.Callback):
  def on_epoch_end(self, epoch, logs={}):
    if(logs.get('accuracy')>0.95):
      print("\nReached 95% accuracy so cancelling training!")
      self.model.stop_training = True

callbacks = myCallback()
mnist = tf.keras.datasets.fashion_mnist

(training_images, training_labels), 
(test_images, test_labels) = mnist.load_data()

training_images=training_images/255.0
test_images=test_images/255.0

model = tf.keras.models.Sequential([
        tf.keras.layers.Flatten(),
        tf.keras.layers.Dense(128, activation=tf.nn.relu),
        tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])

model.compile(optimizer='adam', 
               loss='sparse_categorical_crossentropy', 
               metrics=['accuracy'])

 model.fit(training_images, training_labels, epochs=50, 
           callbacks=[callbacks])

让我们看看我们在这里做了什么改变。首先,我们创建了一个名为myCallback. 这需要一个tf.keras.callbacks.Callback作为参数。在其中,我们定义了on_epoch_end函数,它将为我们提供有关该时期日志的详细信息。在这些日志中有一个精度值,因此我们要做的就是查看它是否大于 0.95(或 95%);如果是,我们可以通过说停止训练self.model.stop_training = True

一旦我们指定了这个,我们就创建一个callbacks对象作为myCallback函数的一个实例。

现在检查model.fit声明。您会看到我已将其更新为训练 50 个时期,然后添加了一个callbacks参数。为此,我传递了callbacks对象。

训练时,在每个 epoch 结束时,都会调用回调函数。所以在每个 epoch 结束时你会检查,在大约 34 个 epoch 之后你会看到你的训练将结束,因为训练已经达到 95% 的准确率(你的数字可能因为初始随机初始化而略有不同,但是它可能非常接近 34):

56896/60000 [====>..] - ETA: 0s - loss: 0.1309 - accuracy: 0.9500
58144/60000 [====>.] - ETA: 0s - loss: 0.1308 - accuracy: 0.9502
59424/60000 [====>.] - ETA: 0s - loss: 0.1308 - accuracy: 0.9502
Reached 95% accuracy so cancelling training!

概括

在第 1 章中,您了解了机器学习如何基于通过神经网络的复杂模式匹配将特征拟合到标签。在本章中,您将其提升到了一个新的水平,超越了单个神经元,并学习了如何创建您的第一个(非常基础的)计算机视觉神经网络。由于数据的原因,它有些受限。所有图像均为 28 × 28 灰度,衣服位于画面中央。这是一个好的开始,但这是一个非常受控的场景。为了在视觉上做得更好,我们可能需要计算机学习图像的特征,而不仅仅是原始像素。

我们可以通过称为卷积的过程来做到这一点。在下一章中,您将学习如何定义卷积神经网络以理解图像的内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/85938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端大串讲,狂神,狂神,p6 01:00

一 概述 前端框架:vue、React、 uniapp(小程序)。前端脚手架:babel-cli、vue cli、webpack-cli服务器:node.js、java后端前端框架的用法: 方式1:用纯前端就可以独立的去完成一些前端项目的开发,并脱离于后…

正点原子 IMX6ULL 自学笔记(未完待续。。。)

一、Makefile 1、语法 目标…… : 依赖文件集合…… 命令 1 命令 2 …… 例子: 生成main可执行文件需要main.o input.o calcu.o,命令是gcc -o main main.o input.o calcu.o main: main.o input.o calcu.ogcc -o main main.o input.o calcu.omain.o: ma…

C++实现对象行为型-迭代器模式

1.1 基本概念 迭代器模式(Iterator Pattern):提供了一种方法来访问聚合对象,而不用暴露这个对象的内部。 聚合对象的两个基本功能: (1)存储内部数据; (2)…

MySQL表的进阶知识

目录 一、数据库约束 1、not null 2、unique 3、primary key 4、auto_increment 5、default 6、foreign key 7、check 二、插入数据 三、设计表 1、一对一 2、一对多 3、多对多 四、查询 1、聚合查询 a、聚合函数查询 b、group by c、having 2、联合查…

pikachu靶场-8 越权漏洞

越权漏洞 越权漏洞概述 由于没有对用户权限进行严格的判断,导致低权限的账号(比如普通用户)可以去完成高权限账号(比如超级管理员)范围内的操作 平行越权:A用户和B用户属于同一级别用户,但各…

虚拟主播怎么做出来的?今日安利:AI虚拟人物怎么弄?

某天,一位品牌店的老板向我寻求帮助,大概内容就是:“他最近要开拓线上店铺的直播渠道,直播时间较长,雇一位主播又费钱又辛苦,想制作一个符合品牌调性的AI虚拟人物来带货。”于是我跟他分享了制作虚拟主播的…

北京医保定点医院2022年版

文章目录概述官方查询方法49家A类定点医院政府公告初始19家2021年4月新增13家A类医院2021年11月新增7家A类医院2022年6月新增10家A类医院定点中医/专科医院定点社区卫生服务机构附录问题医保电子凭证4家定点医院的查询和修改北京医保个人账户资金定向使用北京医院排行榜单概述 …

基于BINN算法的CCPP全路径覆盖算法

1.CCPP整体算法文档 1.1 ccpp基础介绍 全路径覆盖算法(CCPP: Complete Coverage Path Planning)作为扫地机器人较为关键的组成部分,其问题的本质是:在栅格地图中,全覆盖路径规划问题就演变为寻找机器人的下一个移动位置,只有准确…

java计算机毕业设计ssm职工社保信息管理系统t22xh(附源码、数据库)

java计算机毕业设计ssm职工社保信息管理系统t22xh(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#…

建设银行互联网经营战略优化方案设计

目 录一、绪论 1 (一)项目背景 1 (二)项目意义 1 (三)项目内容和方法 1 二、互联网金融与我国商业银行概述 3 (一)互联网金融的内涵 3 (二)互联网金融的功…

【云计算与大数据计算】Hadoop MapReduce实战之统计每个单词出现次数、单词平均长度、Grep(附源码 )

需要全部代码请点赞关注收藏后评论区留言私信~~~ 下面通过WordCount,WordMean等几个例子讲解MapReduce的实际应用,编程环境都是以Hadoop MapReduce为基础 一、WordCount WordCount用于计算文件中每个单词出现的次数,非常适合采用MapReduce进…

描述统计 | 学习笔记 (全)

一.导论 统计学是通过收集,整理,分析,描述数据等手段,以达到推断所测对象的本质,甚至预测对象未来的一门综合性科学。其目的是探索数据的内在数量规律性,以达到对客观事物的科学认识 统计的本业是消化数据…

一种近红外I区荧光染料ICG-CBT 主要应用领域,是药品监督管理局(FDA)批准的体内应用染料

英文名称:ICG-CBT 保存条件:-20℃ 产品类别:化学试剂 结构式: 产品描述:(ICG)是一种近红外I区荧光染料[1],是药品监督管理局(FDA)批准的体内应用染料。其激发和发射波长分别在785 nm、810 nm…

【C++初阶7-stringOJ】上手用一下

前言 本期通过几道OJ题,上手用用string。 1. 把字符串转换成整数 描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为 0 或者字符串不是一个合法的数值则返回 0 数据范围:字符串长度满足0 ≤ n ≤100 进阶&am…

【读书笔记】万物原理——打开客观世界与主观情感的大门

被尹烨老师推荐种草的,以为是一本讲生命科学的科普书,看上了又以为是说量子物理等高端科学研究的,最后被互补性理论惊到了。这哪里只是一本打开认知客观世界的大门,还让我重识内心。那些看不见摸不着的情感,比如同情心…

数字孪生十大问题有哪些?通俗解释指的是什么?

数字孪生(Digital Twins)之火热,已经成为了一个不争的事实。数字孪生的概念,起源于制造业,现在已广泛应用到了智慧城市、智慧交通、智慧农业、智慧医疗、智能家居等行业。数字孪生十大问题有哪些?指的是什么…

018 | 服饰颜色与族群名称对颜色认知的影响 | 大学生创新训练项目申请书 | 极致技术工厂

研究目的 本项目以瑶、壮、汉三个民族、六个族群为研究对象,通过七个实验探索服饰颜色与族群名称对颜色认知的影响。重点提出以下两个问题: (1)服饰颜色是否影响少数民族个体的颜色偏好? (2)服…

刷完 300 道 LeetCode 题后,我膨胀到要飘起来了!纯正 Java 版

算法题就好像科举考试时代背的八股文,是知识改变命运的代表作。你不刷,不管是校招还是社招,就很过算法题这一关。 我整理的这份 LeetCode 刷题笔记足足 300 道,对算法薄弱和需要提高算法的同学很有帮助。 随便打开一道题解感受下…

【云原生】监视Docker桌面的容器内存和CPU使用情况

目录 一、如何监视Docker桌面的容器内存和CPU使用情况 1、stats命令 2、Docker 统计命令stats是如何工作的 2.1、命令与描述 2.2、OPTIONS 2.3、例子 2.4、格式化 3、满足资源使用扩展 4、如何安装“资源使用情况”扩展插件? 5、总结 一、如何监视Docker桌…

SQL记录

DateDiff函数 定义和用法 DATEDIFF() 函数返回两个日期之间的天数。 语法 DATEDIFF(date1,date2) date1 和 date2 参数是合法的日期或日期/时间表达式。 注释:只有值的日期部分参与计算。 实例 下面是 SELECT 语句: SELECT DATEDIFF(‘2008-11-30’,‘2…