标签 AI 下的文章

在本系列的 上一篇文章 中,我们用 TensorFlow 构建了第一个神经网络,然后还通过 Keras 接触了第一个数据集。在本系列的第七篇文章中,我们将继续探索神经网络,并使用数据集来训练模型。我们还将介绍另一个强大的机器学习 Python 库 scikit-learn。不过在进入正题之前,我要介绍两个轰动性的人工智能应用:ChatGPT 和 DALL-E 2。(LCTT 译注:此文原文发表于 2023 年初,恰值以 ChatGPT 为代表的 AI 热潮开始掀起。)

OpenAI 是一个人工智能研究实验室,它在人工智能和机器学习领域做了很多研究。 埃隆·马斯克 Elon Musk 是该组织的联合创始人之一。2022 年 11 月,该实验室推出了一款名为 ChatGPT 的在线工具。它是一个可以像人类一样聊天的人工智能聊天机器人。它是使用监督学习和强化学习技术训练的 大型语言模型 large language model (LLM)。ChatGPT 使用了 OpenAI 的 GPT-3.5 语言模型,这是 GPT-3( 生成式预训练变换器 Generative Pre-trained Transformer )的改进版本,GPT-3 是一种使用深度学习来生成类似人类文本的语言模型。(LCTT 译注:OpenAI 已于 2023 年 3 月 14 日 发布了 GPT-4.0,它支持图文混合的输入输出,并大幅提升了推理能力和准确性。)我仍然记得第一次使用 ChatGPT 时的兴奋。它清楚地展现了人工智能的能力。ChatGPT 的回答质量很高,通常与人类给出的答案没有区别。你可以使用它来纠正语法错误、改写句子、总结段落、编写程序等。实际上,我就用 ChatGPT 改写了本文中的许多句子。此外,我还故意使用有语法错误的文本测试了 ChatGPT,它纠正后的句子非常准确。它重新措辞和总结段落的能力也很惊人。

程序员甚至有可能使用 ChatGPT 在短时间内解决编程难题。在 编程探险挑战赛 2022 Advent of Code 2022 中,就有人这样宣称(LCTT 译注:比赛官方只是没有完全禁止使用人工智能作为辅助,但是并不很推崇这样的作法。消息来源)。事实上在 2022 年 12 月,也就是 ChatGPT 发布的一个月后,Stack Overflow 发布了一条新的规定,禁止提交 GPT 或 ChatGPT 生成答案。(LCTT 译注:消息来源:Temporary policy Generative AI (e.g., ChatGPT) is banned - Meta Stack Overflow

图 1:ChatGPT 生成的程序

图 1 显示了 ChatGPT 编写的将两个矩阵相加的 Python 程序。我要求用 BASIC、FORTRAN、Pascal、Haskell、Lua、Pawn、C、c++、Java 等语言编写程序,ChatGPT 总能给出答案,甚至对于像 Brainfuck 和 Ook! 这样生僻的编程语言也是如此。我很确定 ChatGPT 没有从互联网上复制程序代码。更确切地说,我认为 ChatGPT 是基于对上述编程语言的语法知识生成了这些答案的,这些知识是从训练它的大量数据中获得的。许多专家和观察人士认为,随着 ChatGPT 的发展,人工智能已经成为主流。ChatGPT 的真正力量将在未来几个月或几年里被看到。

OpenAI 的另一个令人惊叹的在线人工智能工具是 DALL-E 2,它以卡通机器人 WALL-E(LCTT 译注:电源《机器人总动员》中的主角)和著名画家/艺术家 萨尔瓦多·达利 Salvador Dalí 的名字命名。DALL-E 2 是一个可以根据英文描述来生成绘画的人工智能系统。该工具支持丰富的图像风格,如油画、卡通、漫画、现实主义、超现实主义、壁画等。它还可以模仿著名画家的风格,如达利、毕加索、梵高等。由 DALL-E 2 生成的图像质量非常高。我用下面的描述测试了这个工具:“一个快乐的人在海滩旁看日出的立体主义画作”。图 2 是 DALL-E 2 根据我的描述生成的图像之一。立体主义是毕加索推广的一种绘画风格。问问你的任何一个画家朋友,他/她都会说这确实是一幅立体主义风格的画。令人惊讶的是软件——它也许很复杂——能够模仿像毕加索、梵高、达利这样的大师。我强烈建议你体验一下它。这种体验将非常有趣,同时也体现了人工智能的威力。但请记住,像 ChatGPT 和 DALL-E 2 这样的工具也会带来很多问题,比如版权侵犯、学生的作业抄袭等。(LCTT 译注:本文的题图就是 DALL-E 3 生成的。)

图 2: DALL-E 2 生成的立体主义画作

介绍 scikit-learn

scikit-learn 是一个非常强大的机器学习 Python 库。它是一个采用 新 BSD 许可协议 new BSD licence (LCTT 译注:即三句版 BSD 许可证) 的自由开源软件。scikit-learn 提供了回归、分类、聚类和降维等当面的算法,如 支持向量机 Support Vector Machine (SVM)、随机森林、k-means 聚类等。

在下面关于 scikit-learn 的介绍中,我们将通过代码讨论支持向量机。支持向量机是机器学习中的一个重要的监督学习模型,可以用于分类和回归分析。支持向量机的发明人 Vladimir Vapnik 和 Alexey Chervonenkis。他们还一起提出了 VC 维 Vapnik–Chervonenkis dimension 概念,这是一个评估模型分类能力的理论框架。

图 3 是使用支持向量机对数据进行分类的程序。第 1 行从 scikit-learn 导入 svm 模块。跟前面几篇中介绍的 python 库一样,scikit-learn 也可以通过 Anaconda Navigator 轻松安装。第 2 行定义了一个名为 X 的列表,其中包含训练数据。X 中的所有元素都是大小为 3 的列表。第 3 行定义了一个列表 y,其中包含列表 X 中数据的类别标签。在本例中,数据属于两个类别,标签只有 0 和 1 两种。但是使用该技术可以对多个类别的数据进行分类。第 4 行使用 svm 模块的 SVC() 方法生成一个支持向量分类器。第 5 行使用 svm 模块的 fit() 方法,根据给定的训练数据(本例中为数组 Xy)拟合 svm 分类器模型。最后,第 6 行和第 7 行基于该分类器进行预测。预测的结果也显示在图 3 中。可以看到,分类器能够正确区分我们提供的测试数据。

图 3: 使用 SVM 进行分类

图 4 中的代码是一个使用 SVM 进行回归的例子。第 1 行次从 scikit-learn 导入 svm 模块。第 2 行定义了一个名为 X 的列表,其中包含训练数据。注意,X 中的所有元素都是大小为 2 的列表。第 3 行定义了一个列表 y,其中包含与列表 X 中的数据相关的值。第 4 行使用 svm 模块的 SVR() 方法生成支持向量回归模型。第 5 行使用 svm 模块的 fit() 方法,根据给定的训练数据(本例中为数 Xy)拟合 svm 回归模型。最后,第 6 行根据该 svm 回归模型进行预测。此预测的结果显示在图 4 中。除了 SVR() 之外,还有 LinearSVR()NuSVR() 两种支持向量回归模型。将第 4 行替换为 regr = svm.LinearSVR()regr = svm.NuSVR(),并执行代码来查看这些支持向量回归模型的效果。

图 4:使用 SVM 进行回归

现在让我们把注意力转到神经网络和 TensorFlow 上。但在下一篇讲无监督学习和聚类时,我们还会学习 scikit-learn 提供的其他方法。

神经网络和 TensorFlow

在上一篇中我们已经看到了 TensorFlow 的 nn 模块提供的 ReLU ( 整流线性单元 rectified linear unit )和 Leaky ReLU 两个激活函数,下面再介绍两个其他激活函数。tf.nn.crelu() 是串联 ReLU 激活函数。tf.nn.elu() 指数线性单元 exponential linear unit 激活函数。我们将在后续用 TensorFlow 和 Keras 训练我们的第一个模型时用到其中一个激活函数。

在开始训练模型之前,我想向你分享 TensorFlow 的提供的“神经网络实验场”工具。它通过可视化的方式帮助你理解神经网络的工作原理。你可以直观地向神经网络中添加神经元和隐藏层,然后训练该模型。你可以选择 Tanh、Sigmoid、Linear 和 ReLU 等激活函数。分类模型和回归模型都可以使用该工具进行分析。训练的效果以动画的形式显示。图 5 显示了一个示例神经网络和它的输出。你可以通过 https://playground.tensorflow.org 访问它。

图 5:神经网络实验场

训练第一个模型

现在,我们使用 上一篇 提到的 MNIST 手写数字数据集来训练模型,然后使用手写数字图像对其进行测试。完整的程序 digital.py 相对较大,为了便于理解,我将程序拆分成几个部分来解释,并且添加了额外的行号。

import numpy as np
from tensorflow import keras, expand_dims
from tensorflow.keras import layers
num_classes = 10
input_shape = (28, 28, 1)
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data( )

第 1 行到第 3 行加载必要的包和模块。第 4 行将类别的数量定义为 10,因为我们试图对 0 到 9 进行分类。第 5 行将输入维度定义为 (28,28,1),这表明我们使用是 28 x 28 像素的灰度图像数据。第 6 行加载该数据集,并将其分为训练数据和测试数据。关于该数据集的更多信息可以参考 上一篇 的相关介绍。

x_train = x_train.astype("float32") / 255
x_test = x_test.astype("float32") / 255
x_train = np.expand_dims(x_train, 3)
x_test = np.expand_dims(x_test, 3)
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

第 7 行和第 8 行将图像像素值从 [0,255] 转换到 [0,1]。其中 astype() 方法用于将整数值类型转换为浮点值。第 9 行和第 10 行将数组 x_testx_train 的维度从 (60000,28,28) 扩展为 (60000,28,28,1)。列表 y_trainy_test 包含从 0 到 9 的 10 个数字的标签。第 11 行和第 12 行将列表 y_trainy_test 转换为二进制类别矩阵。

   try:
      model = keras.models.load_model(“existing_model”)
   except IOError:
      model = keras.Sequential(
        [
        keras.Input(shape=input_shape),
        layers.Conv2D(32, kernel_size=(3, 3), activation=”relu”),
        layers.MaxPooling2D(pool_size=(2, 2)),
        layers.Conv2D(64, kernel_size=(3, 3), activation=”relu”),
        layers.MaxPooling2D(pool_size=(2, 2)),
        layers.Flatten( ),
        layers.Dropout(0.5),
        layers.Dense(num_classes, activation=”softmax”),
        ]
      )
      batch_size = 64
      epochs = 25
      model.compile(loss=”categorical_crossentropy”, optimizer=”adam”, metrics=[“accuracy”])
      model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.1)
      model.save(“existing_model”)

训练模型是一个处理器密集和高内存消耗的操作,我们可不希望每次运行程序时都要重新训练一遍模型。因此,在第 13 行和第 14 行中,我们先尝试从 existing_model 目录加载模型。第一次执行此代码时,没有模型存在,因此会引发异常。第 16 到 21 行通过定义、训练和保存模型来处理这个异常。第 16 行代码(跨越多行)定义了模型的结构。这一行的参数决定了模型的行为。我们使用的是一个序列模型,它有一系列顺序连接的层,每一层都有一个输入张量和一个输出张量。我们将在下一篇文章中讨论这些定义模型的参数。在此之前,将这个神经网络看作一个黑箱就可以了。

第 17 行将批大小定义为 64,它决定每批计算的样本数量。第 18 行将 epoch 设置为 25,它决定了整个数据集将被学习算法处理的次数。第 19 行对模型的训练行为进行了配置。第 20 行根据给定的数据和参数训练模型。对这两行代码的详细解释将推迟到下一篇文章中。最后,第 21 行将训练好的模型保存到 existing_model 目录中。模型会以多个 .pb 文件的形式保存在该目录中。注意,第 16 到 21 行位于 except 块中。

print(model.summary( ))
score = model.evaluate(x_test, y_test, verbose=0)
print(“Test loss:”, score[0])
print(“Test accuracy:”, score[1])

第 22 行打印我们训练的模型的摘要信息(见图 6)。回想一下,在加载数据集时将其分为了训练数据和测试数据。第 23 行使用测试数据来测试我们训练的模型的准确性。第 24 行和第 25 行打印测试的详细信息(见图 8)。

图 6:模型的细节信息

img = keras.utils.load_img("sample1.png").resize((28, 28)).convert('L')
img = keras.utils.img_to_array(img)
img = img.reshape((1, 28, 28, 1))
img = img.astype('float32')/255
score = model.predict(img)
print(score)
print("Number is", np.argmax(score))
print("Accuracy", np.max(score) * 100.0)

现在,是时候用实际数据来测试我们训练的模型了。我在纸上写了几个数字,并扫描了它们。图 7 是我用来测试模型的一个图像。第 26 行加载图像,然后将其大小调整为 28 x 28 像素,最后将其转换为灰度图像。第 27 到 29 行对图像进行必要的预处理,以便将它输入到我们训练好的模型中。第 30 行预测图像所属的类别。第 31 到 33 行打印该预测的详细信息。图 8 显示了程序 digital.py 的这部分输出。从图中可以看出,虽然图像被正确识别为 7,但置信度只有 23.77%。进一步,从图 8 中可以看到它被识别为 1 的置信度为 12.86%,被识别为 8 或 9 的置信度约为 11%。此外,该模型甚至在某些情况下会是分类错误。虽然我找不到导致性能低于标准的准确原因,但我认为相对较低的训练图像分辨率以及测试图像的质量可能是主要的影响因素。这虽然不是最好的模型,但我们现在有了第一个基于人工智能和机器学习原理的训练模型。希望在本系列的后续文章中,我们能构建出可以处理更困难任务的模型。

图 7:测试手写数字样例

在本文介绍了 scikit-learn,在下一篇文章中我们还会继续用到它。然后介绍了一些加深对神经网络的理解的知识和工具。我们还使用 Keras 训练了第一个模型,并用这个模型进行预测。下一篇文章将继续探索神经网络和模型训练。我们还将了解 PyTorch,这是一个基于 Torch 库的机器学习框架。PyTorch 可以用于开发 计算机视觉 computer vision (CV) 和 自然语言处理 natural language processing (NLP) 相关的应用程序。

图 8:digit.py 脚本的输出

致谢:感谢我的学生 Sreyas S. 在撰写本文过程中提出的创造性建议。

(题图:DA/c8e10cac-a5a5-4d53-b5eb-db06f448e60e)


via: https://www.opensourceforu.com/2023/02/ai-an-introduction-to-scikit-learn-and-our-first-trained-model/

作者:Deepu Benson 选题:lujun9972 译者:toknow-gh 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

1 X 计划在奥斯汀建立内容审核总部

据报道,该部门将招聘 100 名全职员工,将主要关注 CSE 问题。这也是埃隆·马斯克在收购其前身平台 Twitter 不久后裁撤的第一个信任与安全团队。该团队还将协助执行其他审核规定,如禁止仇恨言论,审核员将调查 “垃圾信息和欺诈” 等问题,并提供客户支持。

(插图:DA/13bbe5a9-8b1d-42a8-9b16-ade0ee875a67)

消息来源:The Verge
老王点评:连老马这么刚的人都需要向现实低头,无限制的自由不是自由。

2 利用 AI 来优化 Python 代码的性能

一款在 GitHub 上的下载量已超过 90 万次的剖析器可以优化 Python 代码。这个名为 “Scalene” 的工具可以测量每行代码平均和峰值所花费的时间和内存,以及有多少时间花在高效的库上,有多少时间花在 Python 代码上,用户可以利用由 ChatGPT 驱动的引擎获得优化建议。

但也有另外一个 研究 发现,AI 编程助手降低了代码质量和可维护性。报告指出,GitHub Copilot 与向代码库推送“错误代码”强相关。

(插图:DA/250878bb-930c-4869-b490-990a2aea634d)

消息来源:The New Stack
老王点评:在我看来,绝大部分编程工作都会被 AI 取消,就像高级语言取代汇编一样,将来的编程就是用人类语言描述大致需求,AI 优化你的需求,用底层的编程语言来实现。

3 美国汽车行业试图取消调幅收音机

汽车制造商表示,电动汽车的兴起推动了调幅收音机的转变,因为车载电子设备会对调幅收音机信号产生干扰。据估计,要屏蔽电缆和组件以减少干扰,在 7 年内将花费汽车制造商 38 亿美元。根据尼尔森公司 2023 年春季的一项最新调查显示,调幅广播每月覆盖约 7800 万美国人,而这一数字在 2016 是 1.07 亿。但一些人希望保留调幅收音机,因为它在应急通信中发挥着重要作用,至少覆盖了 90% 的美国人口。他们认为汽车制造商越来越希望将广播和其他汽车功能置于付费墙之后,这是汽车制造商的另一个利润中心。

(插图:DA/0d2c9644-aa6e-48d5-b3c5-c08e3020677d)

消息来源:MSN
老王点评:其实背后都是生意。

1 苹果公司的第三方应用商店招致广泛批评

为遵守欧盟的《数字市场法案》(DMA),苹果宣布将在欧洲地区允许第三方应用商店,然而与此同时苹果设置了很多限制,以至于对绝大部分应用开发商而言,在第三方商店提供应用得不偿失。根据苹果制定的 “核心技术使用费”,安装量超过 100 万次后,必须每年为每个首次安装支付 0.5 欧元。以 Meta 为例,其旗下应用大多有数亿用户,需要每年为第三方应用商店额外支付数亿美元的费用。

(插图:DA/e1eb9a27-047d-4a35-b025-1d7df4074687)

消息来源:Slashdot
老王点评:这显然违反了 DMA,我看这样苹果是过不了 3 月份欧盟的审查。

2 苹果的大语言模型出现在新的 iOS 代码中

在 iOS 17.4 的第一个测试版中发现的代码显示,其中包含了一个新的 SiriSummarization 私有框架,可以调用 OpenAI 的 ChatGPT API。苹果公司不太可能在 iOS 中使用 OpenAI 模型来支持任何人工智能功能。相反,它在这里所做的是针对 ChatGPT 测试自己的人工智能模型。代码显示,苹果公司总共测试了四种不同的人工智能模型。

(插图:DA/dc5a42f6-65eb-4542-8767-ed691df9240b)

消息来源:9to5mac
老王点评:或许苹果正在偷偷打造自己的大模型?毕竟现在看起来随便什么阿猫阿狗都在做自己的大模型。

3 Chrome 推出 Windows on Arm 版本

虽然还没有正式宣布,但有用户发现 Chrome Canary 页面现在悄悄托管了 “Windows 11 Arm” 的二进制文件。除了 x86 平台外,Chrome 还支持各种 Arm 操作系统,如安卓、Chrome OS 和 Mac OS。不过在此之前,官方的谷歌 Chrome 浏览器从未在 Windows on Arm 上获得过支持,在 Arm 平台上的 Windows 只能通过缓慢的翻译层将 Chrome 浏览器作为 x86 应用程序运行。今年高通将发布首款用于 Windows 的与苹果硅芯片同级的 Arm 芯片,因此,将这个全球最流行的浏览器提升到原生质量水平对运行在 Arm 上的 Windows 来说至关重要。

(插图:DA/d0e8ce41-4459-471a-90a0-c11773662d76)

消息来源:Ars Technica
老王点评:要是连 Windows 都愿意跑在 Arm 上,不知道英特尔怎么想。

1 苹果公布第三方应用商店的详细规则

iPhone 的应用程序生态系统即将经历自 2008 年苹果应用程序商店推出以来最大的一次调整。iOS 系统将首次允许第三方应用程序商店。这些变化将随 3 月份的 iOS 17.4 一起到来,欧盟用户将可以下载被称作“替代应用程序市场”的第三方商店。这些市场必须通过苹果公司的审批,一旦安装到你的设备上,你就可以下载任何你想要的东西,包括违反苹果应用程序商店指导原则的应用程序,你甚至可以将这些市场设置为默认商店。苹果仍计划密切关注应用程序的发布过程,所有应用程序都必须经过苹果公司的 “公证”,通过第三方市场的分发仍由苹果公司的系统管理。开发者只能在不同的应用商店发布一个版本的应用程序,而且他们仍必须遵守一些基本的平台要求,比如进行恶意软件扫描。

(插图:DA/33a24ae4-c147-49a2-bf25-5af1c5a9ba76)

消息来源:The Verge
老王点评:看来是有管理的放开,不知道什么时候可以全球都这样。

2 NASA 的机智号火星直升机任务结束

经过 3 年时间和 5 次飞行任务的 72 次飞行, 机智号 Ingenuity 直升机在火星上的任务终于结束了,比原计划时间长 33 倍多。图片显示,它的一个旋翼受损,将无法再次起飞。2021 年 2 月 18 日,机智号与 毅力号 Perseverance 火星车一起降落在火星上,并于该年 4 月 19 日首次升离火星表面,证明了火星上的动力可控飞行是可能的。随着飞行操作的结束,工程团队将对直升机系统进行最后的测试,并下载机载内存中剩余的图像和数据。但毅力号火星车目前距离直升机太远,无法尝试在其最终落地点拍摄图像。

(插图:DA/632fe316-fb56-4df4-a594-c8eb43aa4090)

消息来源:NASA
老王点评:了不起,期待中国的火星直升机。

3 谷歌云为 Hugging Face 开发者免费提供 AI 算力

谷歌云与人工智能模型库 Hugging Face 建立了新的合作关系,开发者无需支付谷歌云订阅费用即可构建、训练和部署人工智能模型。现在,使用 Hugging Face 平台的外部开发者将可以 “经济高效” 地访问谷歌的张量处理单元(TPU)和 GPU 超级计算机,其中包括数千台英伟达 H100。Hugging Face 上有超过 35 万个模型供开发者使用,开发者也可以将自己的模型上传到该平台,就像程序员将自己的代码放到 GitHub 上一样。谷歌的一些模型在 Hugging Face上,但其旗帜性的大型语言模型,如现在为聊天机器人 Bard 提供支持的 Gemini,以及文本到图像模型 Imagen 都不在该平台中。

(插图:DA/2a749cdc-0b16-4f33-9509-19e99a6f2898)

消息来源:The Verge
老王点评:可惜这两个平台我们都无法访问。

1 研究发现人类仍比人工智能便宜

麻省理工学院(MIT)在一项研究中发现,对美国各种任务自动化的成本吸引力进行了建模,重点关注了使用计算机视觉的工作,例如教师和财产评估师。他们发现,按美元工资计算,只有 23% 的工人可以被有效取代。而在零售、运输和仓储等细分领域,计算机视觉的成本效益比最为有利。在大多数工作中,人类仍比人工智能便宜。

(插图:DA/b8e0fef1-22cf-41fd-8d4a-77e6caba3266)

消息来源:彭博社
老王点评:从不太长的长期来看,AI 肯定比人类更便宜,而被取代的职位其实是被通过装备 AI 提升了效率的人类取代的。

2 Chrome 将内置人工智能写作助手

谷歌正在为 Chrome 浏览器添加新的人工智能功能,包括整理浏览器标签、定制主题以及帮助用户撰写评论和论坛帖子等在线内容的工具。在下个月发布的 Chrome 浏览器中,用户可以在输入框中写几个字,右键单击然后选择 “帮我写”,就可以使用这项仍在试验阶段的功能。谷歌表示 Chrome 浏览器内置的写作工具可以帮用户撰写商业评论、RSVP 信息、租房咨询和在线论坛帖子等。

(插图:DA/20873a33-4fba-4dc8-83fa-fb991d5a3c5d)

消息来源:Tech Crunch
老王点评:这下灌水更容易了。

3 FreeBSD 开发者讨论在其基本系统中使用 Rust

通过允许 Rust 代码进入 FreeBSD 的基础系统,他们可以用这种编程语言重新编写各种组件,例如 ZFS 守护进程、devd、WiFi 用户空间代码等,从而从使用 Rust 编程语言中受益。但也有缺点,主要是编译时间加倍。由于需要编译基于 LLVM 的 Rustc 编译器和 Rust 的所有附加功能,基本系统的编译时间大约增加了一倍。

(插图:DA/b8265ad9-0aad-4d67-a07e-e66bdc015bb0)

消息来源:Phoronix
老王点评:按现在的趋势,Rust 已经在 Windows、Linux 中开始发挥基础设施作用了,或许以后能成为和 C 一样的基础设施语言。

在本文中我们将继续学习概率论的知识。

在本系列的 上一篇文章中,我们学习了使用 Anaconda,加强了概率论的知识。在本文中我们将继续学习概率论的知识,学习使用 seaborn 和 Pandas 进行数据可视化,并进一步介绍 TensorFlow 和 Keras 的使用。

让我们从增长人工智能和机器学习的理论知识开始。众所周知人工智能、机器学习、数据科学、深度学习等是当今计算机科学的热门话题。然而,计算机科学还其他热门的话题,比如 区块链 blockchain 物联网 Internet of Things (IoT)、 量子计算 quantum computing 等。那么,人工智能领域的发展是否会对这些技术产生积极的影响呢?

首先,让我们讨论一下区块链。根据维基百科的定义,“区块链是一种分布式账本,它由不断增长的记录(称为 区块 block )组成,这些记录使用加密技术安全地连接在一起。”乍一看,人工智能和区块链似乎是两个高速发展的独立技术。但令人惊讶的是,事实并非如此。区块链相关的行话是 完整性 integrity ,人工智能相关的行话是数据。我们将大量数据交给人工智能程序去处理。虽然这些应用程序产生了惊人的结果,但我们如何信任它们呢?这就提出了对可解释的人工智能的需求。它可以提供一定的保证,以便最终用户可以信任人工智能程序提供的结果。许多专家认为,区块链技术可以用来提高人工智能软件做出的决策的可信度。另一方面, 智能合约 smart contract (区块链技术的一部分)可以从人工智能的验证中受益。从本质上讲,智能合约和人工智能通常都是做决策。因此,人工智能的进步将对区块链技术产生积极影响,反之亦然。

下面让我们讨论一下人工智能和物联网之间的影响。早期的物联网设备通常没有强大的处理能力或备用电池。这使得需要大量处理能力的机器学习的软件无法部署在物联网设备上。当时,大多数物联网设备中只部署了基于规则的人工智能软件。基于规则的人工智能的优势在于它很简单,需要相对较少的处理能力。如今的物联网设备具备更强大的处理能力,可以运行更强大的机器学习软件。特斯拉开发的高级驾驶辅助系统 特斯拉自动驾驶仪 Tesla Autopilo 是物联网与人工智能融合的典范。人工智能和物联网对彼此的发展产生了积极影响。

最后,让我们讨论人工智能和量子计算是如何相互影响的。尽管量子计算仍处于起步阶段,但 量子机器学习 quantum machine learning (QML)是其中非常重要的课题。量子机器学习基于两个概念:量子数据和量子-经典混合模型。量子数据是由量子计算机产生的数据。 量子神经网络 quantum neural network (QNN)用于模拟量子计算模型。TensorFlow Quantum 是一个用于量子-经典混合机器学习的强大工具。这类工具的存在表明,在不久的将来将会有越来越多的基于量子计算的人工智能解决方案。

seaborn 入门

seaborn 是一个基于 Matplotlib 的数据可视化 Python 库。用它能够绘制美观且信息丰富的统计图形。通过 Anaconda Navigator 可以轻松安装 seaborn。我用 ESPNcricinfo 网站上 T20 国际板球赛的击球记录,创建了一个名为 T20.csv 的 CSV( 逗号分隔值 comma-separated value )文件,其中包含以下 15 列:球员姓名、职业生涯跨度、比赛场次、局数、未出局次数、总得分、最高得分、平均得分、面对球数、击球率、百分次数、五十分次数、零分次数、四分次数和六分次数。图 1 是使用 Pandas 库读取这个 CSV 文件的程序代码。我们已经在前面介绍过 Pandas 了。

图 1:使用 seaborn 的简单例子

下面逐行解释程序代码的作用。第 1 行和第 2 行导入 Pandas 和 seaborn 包。第 3 行从 JupyterLab 的工作目录中读取文件 T20.csv。第 4 行打印元数据和第一行数据。图 1 显示了这行数据,它显示了 T20 国际板球赛中得分最高的 Virat Kohli 的击球记录。第 5 行将元数据和 T20.csv 中的前五行数据保存到 Best5.csv 中。在执行该行代码时会在 JupyterLab 的工作目录中创建这个文件。第 6 行根据列百分次数按升序对 CSV 文件进行排序,并将前 10 名世纪得分手的详细信息存储到 Highest100.csv 中。该文件也将存储在 JupyterLab 的工作目录中。最后,第7行代码提取了第 5 列(总得分)和第 7 列(平均得分)的数据信息,并生成散点图。图 2 显示了程序在执行时生成的散点图。

图 2:seaborn 绘制的散点图

在程序末尾添加如下代码行并再次运行。

sns.kdeplot(data=df.iloc[:, [5, 7]].head(50), x=’Ave’, y=’Runs’)

图 3:使用 seaborn 绘制的核密度估计图

这行代码调用 kdeplot() 函数绘制第 5 列和第 7 列数据的 核密度估计 Kernel Distribution Estimation (KDE)图。KDE 图可以描述连续或非参数数据变量的概率密度函数。这个定义可能无法让您了解函数 kdeploy() 将要执行的实际操作。图 3 是在单个图像上绘制的 KDE 图和散点图。从图中我们可以看到,散点图绘制的数据点被 KDE 图分组成簇。seaborn 还提供了许多其他绘图功能。在图 1 中程序的第 7 行分别替换为下面的的代码行(一次一行),并再次执行该程序,你会看到不同风格的绘图显示。探索 seaborn 提供的其他绘图功能,并选择最适合你需求的功能。

sns.histplot(data=df.iloc[:, [5, 7]].head(50), x=’Ave’, y=’Runs’)
sns.rugplot(data=df.iloc[:, [5, 7]].head(50), x=’Ave’, y=’Runs’)

更多概率论

在本系列之前的一篇文章中,我们看到可以用正态分布来对现实场景进行建模。但正态分布只是众多重要概率分布中的一种。图 4 中的程序绘制了三种概率分布。

图 4:绘制多种概率分布的程序

下面我来解释这个程序。第 1 行导入 NumPy 的 random 模块。第 2 行和第 3 行导入用于绘图的 Matplotlib 和 seaborn。第 5 行生成带有参数 n(试验次数)和 p(成功概率)的 二项分布 binomial distribution 数据。

二项分布是一种离散概率分布,它给出了在一系列 n 次独立实验中成功的数量。第三个参数 size 决定了输出的形状。第 6 行绘制生成的数据的直方图。由于参数 kde=True,它还会绘制 KDE 图。第三个参数 color='r' 表示绘图时使用红色。第 7 行生成一个泊松分布。泊松分布是一种离散概率分布,它给出了二项分布的极限。参数 lam 表示在固定时间间隔内发生预期事件的次数。这里的参数 size 也决定了输出的形状。第 8 行将生成的数据绘制为绿色的直方图。第 9 行生成大小为 1000 的指数分布。第 10 行将生成的数据绘制为蓝色的直方图。最后,第 11 绘制三个概率分布的所有图像(见图 5)。NumPy 的 random 模块提供了大量的其他概率分布,如 Dirichlet 分布、Gamma 分布、几何分布、拉普拉斯分布等。学习和熟悉它们将是非常值得的。

图 5:概率分布的图像

现在,让我们学习线性回归。使用线性回归分析可以根据一个变量来预测一个变量的值。线性回归的一个重要应用是数据拟合。线性回归非常重要,因为它很简单。机器学习中的监督学习范式实际上就是回归建模。因此,线性回归可以被认为是一种重要的机器学习策略。这种学习范式通常被统计学家称为统计学习。线性回归是机器学习中的重要操作。NumPy 和 SciPy 都提供了线性回归的函数。下面我们展示使用 NumPy 和 SciPy 进行线性回归的示例。

图 6:使用 NumPy 进行线性回归

图 6 是使用 NumPy 进行线性回归的程序。第 1 行和第 2 行导入 NumPy 和 Matplotlib。第 4 行和第 5 行初始化变量 ab。第 6 行使用函数 linspace() 在 0 和 1 之间等间隔地生成 100 个数字。第 7 行使用变量 ab 和数组 x 生成数组 y 中的值。函数 randn() 返回标准正态分布的数据。第 8 行将数组 xy 中的值绘制成散点图(见图 7),图中的 100 个数据点用红色标记。第 9 行使用函数 polyfit() 执行称为 最小二乘多项式拟合 least squares polynomial fit 的线性回归技术。函数 polyfit() 的输入参数包括数组 xy,以及第三个表示拟合多项式的阶数的参数,在本例中为 1,表示拟合一条直线。该函数的返回值是多项式的系数,代码中将其存储在数组 p 中。第 10 行使用函数 polyval() 对多项式求值,并将这些值存储在数组y_l中。第 11 行用蓝色绘制拟合得到的直线(见图 7)。最后,第 12 行显示所有的图像。可以用这条回归直线预测可能的 (x, y) 数据对。

图 7:线性回归散点图 1

图 8 是使用 SciPy 进行线性回归的程序代码。

图 8:使用 SciPy 进行线性回归

下面我解释一下这个程序的工作原理。第 1 行和第 2 行导入库 NumPy 和 Matplotlib。第 3 行从库 SciPy 导入 stats 模块。第 4 到 8 行与前面的程序执行类似的任务。第 9 行使用 SciPy 的 stats 模块的 linregression() 函数计算两组测量值的线性最小二乘回归——在本例中是数组 xy 中的值。该函数返回值中的 mc 分别表示回归直线的 斜率 slope 截距 intercept 。第 10 行使用斜率和截距的值生成回归线。第 11 行用绿色绘制回归线。最后,第 12 行显示所有的图像(见图 9),其中数据点以黄色显示,回归线以绿色显示。

图 9:线性回归散点图 2

在本系列的前面几篇文章中,我们学习了概率和统计学的一些概念。尽管还不够全面的,但我认为这已经打下了一个良好的基础,现在是时候将注意力转移到其他同样重要的问题上了。

Keras 简介

Keras 一般与 TensorFlow 一起使用。因此,我们先从使用 TensorFlow 开始。图 10 所示的程序虽然只包含四行代码,但确实构建了在本系列中的第一个神经网络。下面我来介绍它的工作原理。第 1 行导入库 TensorFlow。第 2 行创建了一个名为 x 的张量。第 3 行和第 4 行分别在张量 x 上应用 ReLU( 整流线性单元 Rectified Linear Unit )和 Leaky ReLU 激活函数。在神经网络中,激活函数定义了节点的输出由输入计算出的规则。ReLU 激活函数是定义为 Relu(x) = max(0,x)。第 3 行代码的输出如图 10 所示。可以观察到,在应用 ReLU 激活函数后,张量 x 中的负值被替换为零。Leaky ReLU 是 ReLU 激活函数的改进版本。从图 10 中的第 4 行代码的输出可以看出 Leaky ReLU 激活函数保留了全量的正值和 20% 的负值。在后面我们将会继续讨论 Keras,同时学习更多神经网络和激活函数的知识。

图 10:使用 TensorFlow 实现的神经网络

下面我们开始使用 Keras。Keras 的安装也可以通过 Anaconda Navigator 轻松完成。图 11 所示的程序导入了我们的第一个数据集并显示了其中的一个数据样本。在下一篇文章中,我们将使用这个数据集来训练和测试模型,从而开启我们开发人工智能和机器学习程序的下一个阶段。

图 11:第一个数据集

下面介绍这个程序的工作原理。第 1 行导入 Keras。第 2 行从 Keras 导入手写数字数据集 MNIST。它包含 6 万个训练样本和 1 万个测试样本。第 3 行导入 Matplotlib。第 5 行加载 MNIST 数据集。第 6 到 9 行打印训练集和测试集的维数和维度。图 12 显示了这些代码行的输出。可以看出,训练集和测试集都是三维的,所有数据样本的分辨率都是 28 × 28。第 10 行加载了第 1234 个训练图像。第 11 行和第 12 行显示这个图像。从图 12 可以看到它是数字 3 的手写图像。

图 12:数据样例

本文中我们开始涉及到神经网络,并通过 Keras 接触到了第一个数据集。在下一篇文章中,我们将继续讲解神经网络和 Keras,并通过使用该数据集训练自己的模型。我们还会遇到 scikit-learn, 它是另一个强大的机器学习 Python 库 。

(题图:DA/2f8f2e0c-c9a7-4a55-8a03-3b5105721013)


via: https://www.opensourceforu.com/2023/01/ai-introduction-to-keras-and-our-first-data-set/

作者:Deepu Benson 选题:lujun9972 译者:toknow-gh 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出