如何在后台部署深度学习模型 深度学习中利用caffe如何训练自己的模型
\u5982\u4f55\u4ece\u96f6\u4f7f\u7528 Keras + TensorFlow \u5f00\u53d1\u4e00\u4e2a\u590d\u6742\u6df1\u5ea6\u5b66\u4e60\u6a21\u578b\u6700\u8fd1\u521a\u5f00\u59cb\u4f7f\u7528theano, \u7ecf\u9a8c\u4e0d\u591a\uff0c\u8fde\u4e2a\u57fa\u672c\u7684\u6a21\u578b\u90fd\u8dd1\u4e0d\u901a\uff0c\u4e8e\u662f\u53bb\u770b\u4e86\u4e0bKeras\uff0c\u6e90\u7801\u6bd4\u8f83\u7b80\u6d01\uff0c\u53ef\u4ee5\u5f53\u4f5ctheano\u7684\u793a\u4f8b\u6559\u7a0b\u6765\u770b\uff0c\u611f\u53d7\u5982\u4e0b\uff1a
\u6587\u6863\u770b\u4f3c\u5f88\u5168\uff0c\u6bcf\u4e2alayer\u662f\u5e72\u5565\u7684\uff0c\u6bcf\u4e2a\u53c2\u6570\u662f\u5565\u90fd\u5199\u4e86\uff0c\u4f46\u662f\u4e0d\u53bb\u8bfb\u4ee3\u7801\uff0c\u5b9e\u9645\u5f88\u591a\u4eba\u662f\u65e0\u6cd5\u4ece\u6587\u6863\u7406\u89e3\u5176\u5177\u4f53\u7528\u6cd5\u7684\u3002\u8fd9\u70b9\u770bissue\u91cc\u7684\u8ba8\u8bba\u91cc\u53ef\u4ee5\u770b\u51fa\u3002\u540c\u6837\uff0cexample\u4f3c\u4e4e\u5f88\u591a\uff0c\u800c\u4e14\u90fd\u80fd\u76f4\u63a5run\uff0c\u8fd8\u90fd\u662freal world\u7684\u6570\u636e\u96c6\uff0c\u770b\u4f3c\u5f88\u597d\uff0c\u4f46\u662f\u5b9e\u9645\u4e0a\uff0c\u5bf9\u4e8e\u65b0\u624b\uff0c\u5982\u679c\u9700\u8981\u7684\u6a21\u578b\u8ddfexample\u91cc\u7684\u4e0d\u5b8c\u5168\u4e00\u6837\uff0c\u4e0d\u5bb9\u6613\u641e\u61c2\u5230\u5e95\u9700\u8981\u628a\u8f93\u5165\u8f93\u51fa\u7684\u6570\u636e\u641e\u6210\u5565\u683c\u5f0f\u3002\u4e3e\u4e2a\u4f8b\u5b50\uff0cexample\u90fd\u662f\u505a\u7684classification\u7684\uff0c\u6ca1\u6709\u505asequence labeling\u7684\u4f8b\u5b50\uff0c\u5982\u679c\u60f3\u62ff\u6765\u505a\u4e2apos tagging\uff0c\u4e0d\u77e5\u9053\u6570\u636e\u5982\u4f55\u7ec4\u7ec7\u3002\u5f53\u7136\uff0c\u8fd9\u4e9b\u5176\u5b9e\u82b1\u4e00\u5929\u8bfb\u4e0b\u4ee3\u7801\u6216\u8005\u597d\u597d\u7ffb\u7ffbissue\u8ba8\u8bba\u5c31\u53ef\u4ee5\u89e3\u51b3\u4e86\uff0c\u4f46\u6211\u76f8\u4fe1\u4e0d\u5c11\u4eba\u4e0d\u4f1a\u53bb\u8ba4\u771f\u8bfb\u4ee3\u7801\u6216\u8005\u770b\u8ba8\u8bba\uff0c\u800c\u662f\u76f4\u63a5\u6362\u4e2a\u5de5\u5177\u3002\u6211\u611f\u89c9\u76ee\u524d\u7684doc\u53ea\u6709\u61c2\u4e86\u4ee3\u7801\u7684\u4eba\u624d\u80fd\u770b\u61c2\uff0c\u4e0d\u61c2\u5f97\u770b\u6587\u6863\u8fd8\u662f\u6ca1\u5565\u7528\u3002
2.\u9879\u76ee\u5f88\u7b80\u5355\u6240\u4ee5\u5f00\u53d1\u8005\u4e0d\u591a\uff0c\u4f46\u662f\u5f88\u6d3b\u8dc3\uff0c\u6bcf\u5929\u90fd\u6709\u65b0\u4e1c\u897f\u52a0\u8fdb\u53bb\u3002\u4eca\u5929\u589e\u52a0\u4e86\u4e00\u4e2a\u65b0\u7684\u5206\u652f\u540e\u7aef\u53ef\u4ee5\u7528theano\u6216\u8005tensorflow\u4e86\uff0c\u4e0d\u8fc7\u8c8c\u4f3c\u7531\u4e8e\u4e0d\u652f\u6301scan\uff0cbackend\u7528tensorflow\u7684\u6ca1\u5b9e\u73b0recurrent layer\u3002\u4ed6\u4eec\u4e5f\u610f\u8bc6\u5230\u6587\u6863\u7684\u95ee\u9898\uff0c\u89c9\u5f97\u9700\u8981\u4e3a\u5c0f\u767d\u7528\u6237\u591a\u52a0\u70b9tutorial\u800c\u4e0d\u662f\u5149\u7ed9develop\u770b\u3002
\u6211\u6ca1\u7528\u8fc7\u5176\u4ed6\u7684framework\uff0c\u4ec5\u8bf4keras\u62ff\u6765\u5b66\u4e60theano\u57fa\u672c\u7528\u6cd5\uff0c\u5f88\u4e0d\u9519
\u5e93\u672c\u8eab\u7684\u4ee3\u7801\uff0c\u6bd4\u8f83\u7b80\u5355\u6613\u8bfb\uff0c\u6211\u4f5c\u4e3apython\u83dc\u9e1f\uff0c\u4e5f\u80fd\u770b\u61c2\u3002\u76ee\u524dmodel\u6709sequential\u548cgrapgh\u4e24\u79cd\uff0c\u524d\u8005\u5e76\u4e0d\u662f\u6307recurrent\u800c\u662f\u8bf4\u7f51\u7edc\u662f\u4e00\u5c42\u5c42\u5806\u7684\uff08\u4e5f\u5305\u62ecrecurrent\uff09.\u5176\u4ed6\u7684\u4e3b\u8981\u6982\u5ff5\u5305\u62eclayer\uff0cregularizer, optimizer,objective\u90fd\u5206\u79bb\u5f00\u3002layer\u7528\u4e8ebuild\u6bcf\u5c42\u7684\u8f93\u51fa\u51fd\u6570\uff0cmodel\u4f1a\u7528\u6700\u540e\u4e00\u5c42\u7684\u8f93\u51fa\uff0c\u6839\u636eobjective\u548c\u6bcf\u4e2alayer\u7684regularizer\u6765\u786e\u5b9a\u6700\u7ec8\u7684cost\uff0c\u7136\u540e\u5728update\u65f6\u7528optimizer\u6765\u66f4\u65b0\u53c2\u6570\u3002\u628a\u8fd9\u56db\u4e2a\u770b\u4e0b\u52a0\u4e0amodel\u91cc\u7684fit\u51fd\u6570\uff0c\u5c31\u4f1a\u7528theano\u5566\u3002\u5f88\u591a\u6a21\u578b\u90fd\u80fdcover\uff0cseq2seq\u8fd9\u79cd\u4e5f\u6709\u73b0\u6210\u7684\u53ef\u7528\u3002\u5efa\u8bae\u4e0d\u8981\u5149\u770bexample\uff0c\u591a\u770b\u770bgithub\u4e0a\u7684 issues\u8ba8\u8bba\uff0c\u5b9e\u5728\u627e\u4e0d\u5230\uff0c\u76f4\u63a5\u63d0\u95ee\u3002\u6548\u7387\u65b9\u9762\uff0c\u6211\u4e0d\u61c2theano\u600e\u4e48\u4f18\u5316\uff0c\u611f\u89c9keras\u7684\u8fd9\u79cd\u5c01\u88c5\uff0c\u6ca1\u4ec0\u4e48\u6210\u672c\uff0c\u8ddf\u81ea\u5df1\u7528\u539f\u751ftheano\u662f\u4e00\u6837\u7684\u3002\u5f53\u7136\uff0ctheano\u672c\u8eab\u5c31\u597d\u6162\u554a\u3002\u3002\u4f30\u8ba1\u662f\u6211\u4e0d\u61c2\u7528\u5427\u3002\u3002
\u4f5c\u8005\uff1a\u5723\u884c
\u94fe\u63a5\uff1ahttps://www.zhihu.com/question/30091667/answer/47951446
\u6765\u6e90\uff1a\u77e5\u4e4e
\u8457\u4f5c\u6743\u5f52\u4f5c\u8005\u6240\u6709\uff0c\u8f6c\u8f7d\u8bf7\u8054\u7cfb\u4f5c\u8005\u83b7\u5f97\u6388\u6743\u3002
matlab \u548cpython\u6ca1\u6709\u7528\u8fc7\u3002\u5982\u679c\u662f\u4e60\u60ef\u7528opencv\u7684\u8bdd\uff0c\u53ef\u4ee5\u4f7f\u7528memory_data\uff0c\u8bf7\u53c2\u8003\u8fd9\u4e2a\u94fe\u63a5\u91cc\u7684\u4f8b\u5b50\uff1aC++ Image Classification with memory_data_param \u00b7 Issue #1443 \u00b7 BVLC/caffe \u00b7 GitHub
\u7ed9\u4e00\u4e2a\u5177\u4f53\u70b9\u7684\u4f8b\u5b50\u5427\uff08\u4e0d\u77e5\u9053\u8d34\u4ee3\u7801\u662f\u4e0d\u662f\u6709\u70b9\u4e0d\u5408\u77e5\u4e4e\u6c14\u8d28\uff1f\uff09\uff0c\u603b\u5171\u5206\u4e09\u6b65\uff1a
\u7b2c\u4e00\u6b65\uff0c\u6784\u9020\u7f51\u7edc\uff1a
enum Phase p = TEST;
Net caffe_test_net(argv[1],p);
caffe_test_net.CopyTrainedLayersFrom(argv[2]);
\u7b2c\u4e8c\u6b65\uff0c\u6784\u9020\u6570\u636e\u5e76\u52a0\u5165\u5230\u7f51\u7edc\u8f93\u5165\u5c42\uff1a
//create the input data
vector md_images;
vector md_labels;
//////operations for the input data
Mat original = imread("images\\lena_gray.png"); //\u968f\u4fbf\u7684\u56fe\u7247\uff0c\u6ca1\u6709\u5b9e\u7528\u610f\u4e49\uff0c\u53ef\u5ffd\u7565
Mat *sub_img = new Mat;
for (int i = 0; i < 10; i++){
original(Range(i, i + 28), Range(i, i + 28)).copyTo(*sub_img); // 28x28\uff0c\u53ef\u4ee5\u76f4\u63a5\u7528lenet
md_images.push_back(*sub_img);
md_labels.push_back(0);
}
\u7b2c\u4e09\u6b65\uff0c\u6267\u884ctest\u64cd\u4f5c\uff1a
for (int i = 0; i < 10; i++){
const vector*>& result = caffe_test_net.ForwardPrefilled();
搭建深度学习后台服务器
我们的Keras深度学习REST API将能够批量处理图像,扩展到多台机器(包括多台web服务器和Redis实例),并在负载均衡器之后进行循环调度。
为此,我们将使用:
KerasRedis(内存数据结构存储)
Flask (Python的微web框架)
消息队列和消息代理编程范例
在我们的机器上运行Redis
将数据(图像)按照队列的方式用Redis存储,并依次由我们的REST API处理
为新批输入图像循环访问Redis
对图像进行分类并将结果返回给客户端
- conda install redis
- resdis-server
- redis-server
- python run_keras_server.py
- curl -X POST -F [email protected] 'http://localhost:5000/predict'
- {"predictions": [{"label": "beagle","probability": 0.9461546540260315},{"label": "bluetick","probability": 0.031958919018507004},{"label": "redbone","probability": 0.006617196369916201},{"label": "Walker_hound","probability": 0.0033879687543958426},{"label": "Greater_Swiss_Mountain_dog","probability": 0.0025766862090677023}],"success": true}
- # import the necessary packagesimport requests# initialize the Keras REST API endpoint URL along with the input# image pathKERAS_REST_API_URL = "http://localhost:5000/predict"IMAGE_PATH = "jemma.png"
- # load the input image and construct the payload for the requestimage = open(IMAGE_PATH, "rb").read()payload = {"image": image}# submit the requestr = requests.post(KERAS_REST_API_URL, files=payload).json()# ensure the request was sucessfulif r["success"]: # loop over the predictions and display them for (i, result) in enumerate(r["predictions"]): print("{}. {}: {:.4f}".format(i + 1, result["label"], result["probability"]))# otherwise, the request failedelse: print("Request failed")
- python simple_request.py
本篇文章的整体思路如下:
我们将首先简要讨论Redis数据存储,以及如何使用它促进消息队列和消息代理。然后,我们将通过安装所需的Python包来配置Python开发环境,以构建我们的Keras深度学习REST API。一旦配置了开发环境,就可以使用Flask web框架实现实际的Keras深度学习REST API。在实现之后,我们将启动Redis和Flask服务器,然后使用cURL和Python向我们的深度学习API端点提交推理请求。最后,我们将以对构建自己的深度学习REST API时应该牢记的注意事项的简短讨论结束。
第一部分:简要介绍Redis如何作为REST API消息代理/消息队列
图片1:Redis可以用作我们深度学习REST API的消息代理/消息队列
Redis是内存中的数据存储。它不同于简单的键/值存储(比如memcached),因为它可以存储实际的数据结构。今天我们将使用Redis作为消息代理/消息队列。这包括:
文章中对Redis官网有一个超链接(https://redis.io/topics/introduction),但是要翻出去,所以我就截图一个图片放上去仅供参考。
第二部分:安装和配置Redis
官网做法,linux系统的安装:
自己的安装方法:
开启方式相同:
结果:
测试和原文的命令一致。
第三部分:配置Python开发环境以构建Keras REST API
文章中说需要创建新的虚拟环境来防止影响系统级别的python项目(但是我没有创建),但是还是需要安装rest api所需要依赖的包。以下为所需要的包。
第四部分:实现可扩展的Keras REST API
首先是Keras Redis Flask REST API数据流程图
让我们开始构建我们的服务器脚本。为了方便起见,我在一个文件中实现了服务器,但是它可以按照您认为合适的方式模块化。为了获得最好的结果和避免复制/粘贴错误,我建议您使用本文的“下载”部分来获取相关的脚本和图像。
为了简单起见,我们将在ImageNet数据集上使用ResNet预训练。我将指出在哪里可以用你自己的模型交换ResNet。flask模块包含flask库(用于构建web API)。redis模块将使我们能够与redis数据存储接口。从这里开始,让我们初始化将在run_keras_server.py中使用的常量.
我们将向服务器传递float32图像,尺寸为224 x 224,包含3个通道。我们的服务器可以处理一个BATCH_SIZE = 32。如果您的生产系统上有GPU(s),那么您需要调优BATCH_SIZE以获得最佳性能。我发现将SERVER_SLEEP和CLIENT_SLEEP设置为0.25秒(服务器和客户端在再次轮询Redis之前分别暂停的时间)在大多数系统上都可以很好地工作。如果您正在构建一个生产系统,那么一定要调整这些常量。
让我们启动我们的Flask app和Redis服务器:
在这里你可以看到启动Flask是多么容易。在运行这个服务器脚本之前,我假设Redis服务器正在运行(之前的redis-server)。我们的Python脚本连接到本地主机6379端口(Redis的默认主机和端口值)上的Redis存储。不要忘记将全局Keras模型初始化为None。接下来我们来处理图像的序列化:
Redis将充当服务器上的临时数据存储。图像将通过诸如cURL、Python脚本甚至是移动应用程序等各种方法进入服务器,而且,图像只能每隔一段时间(几个小时或几天)或者以很高的速率(每秒几次)进入服务器。我们需要把图像放在某个地方,因为它们在被处理前排队。我们的Redis存储将作为临时存储。
为了将图像存储在Redis中,需要对它们进行序列化。由于图像只是数字数组,我们可以使用base64编码来序列化图像。使用base64编码还有一个额外的好处,即允许我们使用JSON存储图像的附加属性。
base64_encode_image函数处理序列化。类似地,在通过模型传递图像之前,我们需要反序列化图像。这由base64_decode_image函数处理。
预处理图片
我已经定义了一个prepare_image函数,它使用Keras中的ResNet50实现对输入图像进行预处理,以便进行分类。在使用您自己的模型时,我建议修改此函数,以执行所需的预处理、缩放或规范化。
从那里我们将定义我们的分类方法
classify_process函数将在它自己的线程中启动,我们将在下面的__main__中看到这一点。该函数将从Redis服务器轮询图像批次,对图像进行分类,并将结果返回给客户端。
在model = ResNet50(weights="imagenet")这一行中,我将这个操作与终端打印消息连接起来——根据Keras模型的大小,加载是即时的,或者需要几秒钟。
加载模型只在启动这个线程时发生一次——如果每次我们想要处理一个映像时都必须加载模型,那么速度会非常慢,而且由于内存耗尽可能导致服务器崩溃。
加载模型后,这个线程将不断轮询新的图像,然后将它们分类(注意这部分代码应该时尚一部分的继续)
在这里,我们首先使用Redis数据库的lrange函数从队列(第79行)中获取最多的BATCH_SIZE图像。
从那里我们初始化imageIDs和批处理(第80和81行),并开始在第84行开始循环队列。
在循环中,我们首先解码对象并将其反序列化为一个NumPy数组image(第86-88行)。
接下来,在第90-96行中,我们将向批处理添加图像(或者如果批处理当前为None,我们将该批处理设置为当前图像)。
我们还将图像的id附加到imageIDs(第99行)。
让我们完成循环和函数
在这个代码块中,我们检查批处理中是否有图像(第102行)。如果我们有一批图像,我们通过模型(第105行)对整个批进行预测。从那里,我们循环一个图像和相应的预测结果(110-122行)。这些行向输出列表追加标签和概率,然后使用imageID将输出存储在Redis数据库中(第116-122行)。
我们使用第125行上的ltrim从队列中删除了刚刚分类的图像集。最后,我们将睡眠设置为SERVER_SLEEP时间并等待下一批图像进行分类。下面我们来处理/predict我们的REST API端点
稍后您将看到,当我们发布到REST API时,我们将使用/predict端点。当然,我们的服务器可能有多个端点。我们使用@app。路由修饰符以第130行所示的格式在函数上方定义端点,以便Flask知道调用什么函数。我们可以很容易地得到另一个使用AlexNet而不是ResNet的端点,我们可以用类似的方式定义具有关联函数的端点。你懂的,但就我们今天的目的而言,我们只有一个端点叫做/predict。
我们在第131行定义的predict方法将处理对服务器的POST请求。这个函数的目标是构建JSON数据,并将其发送回客户机。如果POST数据包含图像(第137和138行),我们将图像转换为PIL/Pillow格式,并对其进行预处理(第141-143行)。
在开发这个脚本时,我花了大量时间调试我的序列化和反序列化函数,结果发现我需要第147行将数组转换为C-contiguous排序(您可以在这里了解更多)。老实说,这是一个相当大的麻烦事,但我希望它能帮助你站起来,快速跑。
如果您想知道在第99行中提到的id,那么实际上是使用uuid(通用唯一标识符)在第151行生成的。我们使用UUID来防止hash/key冲突。
接下来,我们将图像的id和base64编码附加到d字典中。使用rpush(第153行)将这个JSON数据推送到Redis db非常简单。
让我们轮询服务器以返回预测
我们将持续循环,直到模型服务器返回输出预测。我们开始一个无限循环,试图得到157-159条预测线。从这里,如果输出包含预测,我们将对结果进行反序列化,并将结果添加到将返回给客户机的数据中。我们还从db中删除了结果(因为我们已经从数据库中提取了结果,不再需要将它们存储在数据库中),并跳出了循环(第163-172行)。
否则,我们没有任何预测,我们需要睡觉,继续投票(第176行)。如果我们到达第179行,我们已经成功地得到了我们的预测。在本例中,我们向客户机数据添加True的成功值(第179行)。注意:对于这个示例脚本,我没有在上面的循环中添加超时逻辑,这在理想情况下会为数据添加一个False的成功值。我将由您来处理和实现。最后我们称烧瓶。jsonify对数据,并将其返回给客户端(第182行)。这就完成了我们的预测函数。
为了演示我们的Keras REST API,我们需要一个__main__函数来实际启动服务器
第186-196行定义了__main__函数,它将启动classify_process线程(第190-192行)并运行Flask应用程序(第196行)。
第五部分:启动可伸缩的Keras REST API
要测试我们的Keras深度学习REST API,请确保使用本文的“下载”部分下载源代码示例图像。从这里,让我们启动Redis服务器,如果它还没有运行:
然后,在另一个终端中,让我们启动REST API Flask服务器:
另外,我建议在向服务器提交请求之前,等待您的模型完全加载到内存中。现在我们可以继续使用cURL和Python测试服务器。
第七部分:使用cURL访问Keras REST API
使用cURL来测试我们的Keras REST API服务器。这是我的家庭小猎犬Jemma。根据我们的ResNet模型,她被归类为一只拥有94.6%自信的小猎犬。
你会在你的终端收到JSON格式的预测:
第六部分:使用Python向Keras REST API提交请求
如您所见,使用cURL验证非常简单。现在,让我们构建一个Python脚本,该脚本将发布图像并以编程方式解析返回的JSON。
让我们回顾一下simple_request.py
我们在这个脚本中使用Python请求来处理向服务器提交数据。我们的服务器运行在本地主机上,可以通过端口5000访问端点/predict,这是KERAS_REST_API_URL变量(第6行)指定的。
我们还定义了IMAGE_PATH(第7行)。png与我们的脚本在同一个目录中。如果您想测试其他图像,请确保指定到您的输入图像的完整路径。
让我们加载图像并发送到服务器:
我们在第10行以二进制模式读取图像并将其放入有效负载字典。负载通过请求发送到服务器。在第14行发布。如果我们得到一个成功消息,我们可以循环预测并将它们打印到终端。我使这个脚本很简单,但是如果你想变得更有趣,你也可以使用OpenCV在图像上绘制最高的预测文本。
第七部分:运行简单的请求脚本
编写脚本很容易。打开终端并执行以下命令(当然,前提是我们的Flask服务器和Redis服务器都在运行)。
使用Python以编程方式使用我们的Keras深度学习REST API的结果
第八部分:扩展深度学习REST API时的注意事项
如果您预期在深度学习REST API上有较长一段时间的高负载,那么您可能需要考虑一种负载平衡算法,例如循环调度,以帮助在多个GPU机器和Redis服务器之间平均分配请求。
记住,Redis是内存中的数据存储,所以我们只能在队列中存储可用内存中的尽可能多的图像。
使用float32数据类型的单个224 x 224 x 3图像将消耗602112字节的内存。
绛旓細鐒跺悗,鎴戜滑灏嗛氳繃瀹夎鎵闇鐨凱ython鍖呮潵閰嶇疆Python寮鍙戠幆澧,浠ユ瀯寤烘垜浠殑Keras娣卞害瀛︿範REST API銆備竴鏃﹂厤缃簡寮鍙戠幆澧,灏卞彲浠ヤ娇鐢‵lask web妗嗘灦瀹炵幇瀹為檯鐨凨eras娣卞害瀛︿範REST API銆傚湪瀹炵幇涔嬪悗,鎴戜滑灏嗗惎鍔≧edis鍜孎lask鏈嶅姟鍣,鐒跺悗浣跨敤cURL鍜孭ython鍚戞垜浠殑娣卞害瀛︿範API绔偣鎻愪氦鎺ㄧ悊璇锋眰銆傛渶鍚,鎴戜滑灏嗕互瀵规瀯寤鸿嚜宸辩殑娣卞害瀛︿範REST API...
绛旓細纭欢鏂归潰锛岃鏍规嵁妯″瀷璁$畻閲忓拰鏃跺欢瑕佹眰锛岀粨鍚堟垚鏈拰鍔熻楄姹傦紝閫夊悎閫傜殑宓屽叆寮忓钩鍙銆傛瘮濡傛ā鍨嬭绠楅噺澶х殑锛屽彲鑳藉氨瑕侀夋嫨甯PU鐨凷oC锛岀敤opencl/opengl/vulkan缂栫▼锛涗篃鍙互璇曡瘯NPU锛屼笉杩囩幇鍦∟PU鏀寔鐨勭畻瀛愪笉澶氾紝涓浜涜嚜瀹氫箟Op澶氱殑缃戠粶鍙兘閮ㄧ讲涓嶄笂鍘诲浜庡皬妯″瀷锛屾垨鑰呭抚鐜囪姹備笉楂樼殑锛屽彲鑳界敤CPU灏卞浜嗭紝涓嶈繃涓鑸渶...
绛旓細瀹為獙瀹ゆ病鏈夋湇鍔″櫒鍙互鐢℅ooglecolab璺娣卞害瀛︿範妯″瀷銆傚叿浣撴搷浣滄楠ゅ涓嬶細1銆佸垱寤篶olab鏂囦欢锛氳繘鍏oogle浜戠洏鍚庯紝鍒涘缓涓涓猚olab鏂囦欢銆傜涓娆′娇鐢紝浼氬瓨鍦╟olab閫夐」涓嶆樉绀虹殑鎯呭喌锛岀偣鍑诲叧鑱旀洿澶氬簲鐢ㄥ嵆鍙傜偣鍑籧olab閫夐」鍚庝細璺宠浆鍒颁竴涓〉闈紝涓巎upyter鍩烘湰涓妯′竴鏍凤紝鍙緭鍏ヤ唬鐮佹锛岃兘杩炴帴鏈嶅姟鍣紝鏈夋枃浠剁洰褰曘乧olab鏂...
绛旓細2銆佸埄鐢╓eb妗嗘灦鍔犺浇鍗风Н绁炵粡缃戠粶妯″瀷銆傜洰鍓嶏紝璁稿Web妗嗘灦閮芥敮鎸佸皢娣卞害瀛︿範妯″瀷閮ㄧ讲鍒癢eb绔紝濡俆ensorFlow.js鍜孠eras.js绛夈傞氳繃杩欎簺妗嗘灦锛屾垜浠彲浠ヨ交鏉惧湴灏咰NN妯″瀷閮ㄧ讲鍒癢eb娴忚鍣ㄤ腑銆3銆佸垱寤篧eb椤甸潰骞跺埄鐢↗avaScript璋冪敤妯″瀷銆傚湪Web椤甸潰涓姞杞紺NN妯″瀷锛屽苟閫氳繃JavaScript缂栧啓浠g爜鏉ヨ皟鐢ㄨ妯″瀷锛岃緭鍏ユ暟鎹苟鑾峰彇杈撳嚭...
绛旓細瀛︿範娣卞害瀛︿範闇瑕佹湁涓鍙版ц兘寮哄ぇ鐨勭數鑴戯紝鍦ㄨ繘琛妯″瀷璁粌鏃堕渶瑕佸ぇ閲忚绠楄祫婧愩傞偅涔濡備綍鍦鐢佃剳涓婅繘琛屾繁搴﹀涔犲憿锛熺涓姝ユ槸閫夋嫨鍚堥傜殑璁$畻鏈洪厤缃傞氬父闇瑕佷竴鍙板叿鏈夎壇濂藉浘褰㈠鐞嗗櫒锛圙PU锛夊拰澶у閲忓唴瀛樼殑璁$畻鏈猴紝姣斿8GB鎴栦互涓婄殑鍐呭瓨鍜孨VIDIAGeForce鎴朅MDRadeon绯诲垪鐨凣PU銆傚綋鐒讹紝濡傛灉浣犵殑棰勭畻杈冮珮锛屽彲浠ラ夋嫨鐩稿簲鏇撮珮...
绛旓細1銆侀鍏堥殢渚垮啓涓涓猵ytroch妯″瀷骞惰浆涓簅nnx妯″瀷銆2銆佸叾娆″垱寤篘ative C++椤圭洰銆3銆佹渶鍚庢鏌ヨ緭鍏ワ紝瀹夊崜閮ㄧ讲娣卞害瀛︿範妯″瀷鏃跺嵆鍙瀯寤鸿緭鍏ユ暟鎹
绛旓細璇ュ皬绋嬪簭閮ㄧ讲绁炵粡缃戠粶妯″瀷鏂规硶濡備笅锛1銆佺‘瀹氱缁忕綉缁滄ā鍨嬶細閫夋嫨涓涓凡缁忚缁冨ソ鐨勭缁忕綉缁滄ā鍨嬶紝鍙互浣跨敤TensorFlow鎴朘eras绛娣卞害瀛︿範妗嗘灦杩涜璁粌銆2銆佽浆鎹㈡ā鍨嬫牸寮忥細灏嗚缁冨ソ鐨勬ā鍨嬭浆鎹负寰俊灏忕▼搴忔敮鎸佺殑鏍煎紡锛屽彲浠ヤ娇鐢═ensorFlow.js鎴朤FLite绛夊伐鍏疯繘琛岃浆鎹3銆佹墦鍖呮ā鍨嬶細灏嗚浆鎹㈠悗鐨勬ā鍨嬫墦鍖呮垚寰俊灏忕▼搴忔敮鎸...
绛旓細Keras 鏄彁渚涗竴浜涢珮鍙敤鐨 Python API 锛岃兘甯姪浣犲揩閫熺殑鏋勫缓鍜岃缁冭嚜宸辩殑娣卞害瀛︿範妯″瀷锛屽畠鐨勫悗绔槸 TensorFlow 鎴栬 Theano 銆傛湰鏂囧亣璁句綘宸茬粡鐔熸倝浜 TensorFlow 鍜屽嵎绉缁忕綉缁滐紝濡傛灉锛屼綘杩樻病鏈夌啛鎮夛紝閭d箞鍙互鍏堢湅鐪嬭繖涓10鍒嗛挓鍏ラ棬 TensorFlow 鏁欑▼鍜屽嵎绉缁忕綉缁滄暀绋嬶紝鐒跺悗鍐嶅洖鏉ラ槄璇昏繖涓枃绔犮傚湪杩欎釜鏁欑▼涓紝...
绛旓細浣犲彲浠ュ湪瀹樼綉涓婁笅杞絘naconda銆傛渶鍚庯紝浣犻渶瑕佷竴涓狦PU銆娣卞害瀛︿範璁粌閫氬父闇瑕佸ぇ閲忕殑璁$畻璧勬簮锛屽洜姝や娇鐢ㄤ竴涓己澶х殑GPU鍙互鏄捐憲鍔犲揩璁粌閫熷害銆傚鏋滀綘娌℃湁GPU锛屽垯鍙互浣跨敤浜戝钩鍙帮紝濡侫WS銆丄zure鎴朑oogleCloud绛夈備簩銆佸畨瑁匱ensorFlow鍦ㄥ畨瑁匱ensorFlow涔嬪墠锛屼綘闇瑕佸畨瑁匔UDA鍜宑uDNN銆侰UDA鏄疦VIDIA寮鍙戠殑骞惰璁$畻骞冲彴鍜岀紪绋妯...
绛旓細鍙互鐩存帴鍏堟壘鍒拌嚜宸遍渶瑕佺殑璁粌妯″瀷锛屼竴鑸潵璇撮兘鍙互鎵惧埌鐨