0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

飛槳框架高層API 十行代碼搞定深度學習

工程師鄧生 ? 來源:機器之心 ? 作者:機器之心 ? 2020-12-02 17:52 ? 次閱讀

向往深度學習技術,可是深度學習框架太難學怎么辦?百度傾心打造飛槳框架高層 API,零基礎也能輕松上手深度學習,一起來看看吧?另:文末有福利,一定要看完呦~

高層 API,What

深度學習作為人工智能時代的核心技術,近年來無論學術、還是工業(yè)領域,均發(fā)揮著愈加重要的作用。然而,深度學習理論太難學,開發(fā)過程太復雜,又將許多人拒之于深度學習的門外。

為了簡化深度學習的學習過程、降低深度學習的開發(fā)難度,百度飛槳框架歷經(jīng)近一年的打磨,不斷地優(yōu)化深度學習 API,并針對開發(fā)者的使用場景進行封裝,在飛槳框架的最新版本中,推出了高低融合、科學統(tǒng)一的飛槳全新 API 體系。

飛槳框架將 API 分為兩種,基礎 API 和高層 API。用制作披薩舉例,一般有兩種方法:一種是我們準備好面粉、牛奶、火腿等食材,精心加工后,就能制作出美味的披薩;而第二種則是我們買商家預烤制的披薩餅,以及調(diào)好的餡料,直接加熱就可以吃到披薩了。

那么這兩種方法有什么區(qū)別呢?采用方法一,自己準備食材,可以隨心所欲的搭配料理,制作醬料,從而滿足我們的不同口味,但是,這更適合「老司機」,如果是新人朋友,很有可能翻車;而方法二,用商家預烤制的披薩餅與餡料,直接加熱就可以非??焖俚耐瓿膳_的制作,而且味道會有保障;但是,相比于方法一,我們會少一些口味的選擇。

用框架來類比,基礎 API 對應方法一,高層 API 對應方法二。使用基礎 API,我們可以隨心所欲的搭建自己的深度學習模型,不會受到任何限制;而使用方法二,我們可以很快的實現(xiàn)模型,但是可能會少一些自主性。

但是,與制作披薩不同的是,飛槳框架可以做到真正的「魚與熊掌」可以兼得。因為高層 API 本身不是一個獨立的體系,它完全可以和基礎 API 互相配合使用,做到高低融合,使用起來會更加便捷。使我們在開發(fā)過程中,既可以享受到基礎 API 的強大,又可以兼顧高層 API 的快捷。

高層 API,All

飛槳框架高層 API 的全景圖如下:

從圖中可以看出,飛槳框架高層 API 由五個模塊組成,分別是數(shù)據(jù)加載、模型組建、模型訓練、模型可視化和高階用法。針對不同的使用場景,飛槳框架提供了不同高層 API,從而降低開發(fā)難度,讓每個人都能輕松上手深度學習。

我們先通過一個深度學習中經(jīng)典的手寫數(shù)字分類任務,來簡單了解飛槳高層 API。然后再詳細的介紹每個模塊中所包含的 API。

importpaddle

frompaddle.vision.transforms importCompose, Normalize

frompaddle.vision.datasets importMNIST

importpaddle.nn asnn

# 數(shù)據(jù)預處理,這里用到了歸一化

transform = Compose([Normalize(mean=[ 127.5],

std=[ 127.5],

data_format= ‘CHW’)])

# 數(shù)據(jù)加載,在訓練集上應用數(shù)據(jù)預處理的操作

train_dataset = paddle.vision.datasets.MNIST(mode= ‘train’, transform=transform)

test_dataset = paddle.vision.datasets.MNIST(mode= ‘test’, transform=transform)

# 模型組網(wǎng)

mnist = nn.Sequential(

nn.Flatten,

nn.Linear( 784, 512),

nn.ReLU,

nn.Dropout( 0.2),

nn.Linear( 512, 10))

# 模型封裝,用 Model 類封裝

model = paddle.Model(mnist)

# 模型配置:為模型訓練做準備,設置優(yōu)化器,損失函數(shù)和精度計算方式

model.prepare(optimizer=paddle.optimizer.Adam(parameters=model.parameters),

loss=nn.CrossEntropyLoss,

metrics=paddle.metric.Accuracy)

# 模型訓練,

model.fit(train_dataset,

epochs= 10,

batch_size= 64,

verbose= 1)

# 模型評估,

model.evaluate(test_dataset, verbose= 1)

# 模型保存,

model.save( ‘model_path’)

從示例可以看出,在數(shù)據(jù)預處理、數(shù)據(jù)加載、模型組網(wǎng)、模型訓練、模型評估、模型保存等場景,高層 API 均可以通過 1~3 行代碼實現(xiàn)。相比傳統(tǒng)方法動輒幾十行的代碼量,高層 API 只需要十來行代碼,就能輕松完成一個 MNIST 分類器的實現(xiàn)。以極少的代碼就能達到與基礎 API 同樣的效果,大幅降低了深度學習的學習門檻。

如果是初次學習深度學習框架,使用飛槳高層 API,可以「凡爾賽」說出「好煩哦,飛槳高層 API 怎么這么快就完成開發(fā)了,我還想多寫幾行代碼呢!」

高層 API,How

接下來以 CV 任務為例,簡單介紹飛槳高層 API 在不同場景下的使用方法。

本示例的完整代碼可以在 AI Studio 上獲取,無需準備任何軟硬件環(huán)境即可直接在線運行代碼,相當方便哦:https://aistudio.baidu.com/aistudio/projectdetail/1243085

一、數(shù)據(jù)預處理與數(shù)據(jù)加載

對于數(shù)據(jù)加載,在一些典型的任務中,我們完全可以使用飛槳框架內(nèi)置的數(shù)據(jù)集,完成數(shù)據(jù)的加載。飛槳框架將常用的數(shù)據(jù)集作為領域 API,集成在 paddle.vision.datasets 目錄中,包含了 CV 領域中常見的 MNIST、Cifar、Flowers 等數(shù)據(jù)集。

而在數(shù)據(jù)預處理場景中,飛槳框架提供了 20 多種常見的圖像預處理 API,方便我們快速實現(xiàn)數(shù)據(jù)增強,如實現(xiàn)圖像的色調(diào)、對比度、飽和度、大小等各種數(shù)字圖像處理的方法。圖像預處理 API 集成在 paddle.vision.transforms 目錄中,使用起來非常方便。只需要先創(chuàng)建一個數(shù)據(jù)預處理的 transform,在其中存入需要進行的數(shù)據(jù)預處理方法,然后在數(shù)據(jù)加載的過程中,將 transform 作為參數(shù)傳入即可。

此外,如果我們需要加載自己的數(shù)據(jù)集,使用飛槳框架標準數(shù)據(jù)定義與數(shù)據(jù)加載 API paddle.io.Dataset 與 paddle.io.DataLoader,就可以「一鍵」完成數(shù)據(jù)集的定義與數(shù)據(jù)的加載。這里通過一個案例來展示如何利用 Dataset 定義數(shù)據(jù)集,示例如下:

frompaddle.io importDataset

classMyDataset(Dataset):

“”“

步驟一:繼承 paddle.io.Dataset 類

”“”

def__init__(self):

“”“

步驟二:實現(xiàn)構造函數(shù),定義數(shù)據(jù)讀取方式,劃分訓練和測試數(shù)據(jù)集

”“”

super(MyDataset, self).__init__

self.data = [

[ ‘traindata1’, ‘label1’],

[ ‘traindata2’, ‘label2’],

[ ‘traindata3’, ‘label3’],

[ ‘traindata4’, ‘label4’],

def__getitem__(self, index):

“”“

步驟三:實現(xiàn)__getitem__方法,定義指定 index 時如何獲取數(shù)據(jù),并返回單條數(shù)據(jù)(訓練數(shù)據(jù),對應的標簽

”“”

data = self.data[index][ 0]

label = self.data[index][ 1]

returndata, label

def__len__(self):

“”“

步驟四:實現(xiàn)__len__方法,返回數(shù)據(jù)集總數(shù)目

”“”

returnlen(self.data)

# 測試定義的數(shù)據(jù)集

train_dataset = MyDataset

print( ‘=============train dataset=============’)

fordata, label intrain_dataset:

print(data, label)

只需要按照上述規(guī)范的四個步驟,我們就實現(xiàn)了一個自己的數(shù)據(jù)集。然后,將 train_dataset 作為參數(shù),傳入到 DataLoader 中,即可獲得一個數(shù)據(jù)加載器,完成訓練數(shù)據(jù)的加載。

【Tips:對于數(shù)據(jù)集的定義,飛槳框架同時支持 map-style 和 iterable-style 兩種類型的數(shù)據(jù)集定義,只需要分別繼承 paddle.io.Dataset 和 paddle.io.IterableDataset 即可。】

二、網(wǎng)絡構建

在網(wǎng)絡構建模塊,飛槳高層 API 與基礎 API 保持一致,統(tǒng)一使用 paddle.nn 下的 API 進行組網(wǎng)。paddle.nn 目錄下包含了所有與模型組網(wǎng)相關的 API,如卷積相關的 Conv1D、Conv2D、Conv3D,循環(huán)神經(jīng)網(wǎng)絡相關的 RNN、LSTM、GRU 等。

對于組網(wǎng)方式,飛槳框架支持 Sequential 或 SubClass 進行模型組建。Sequential 可以幫助我們快速的組建線性的網(wǎng)絡結構,而 SubClass 支持更豐富靈活的網(wǎng)絡結構。我們可以根據(jù)實際的使用場景,來選擇最合適的組網(wǎng)方式。如針對順序的線性網(wǎng)絡結構可以直接使用 Sequential ,而如果是一些比較復雜的網(wǎng)絡結構,我們使用 SubClass 的方式來進行模型的組建,在 __init__ 構造函數(shù)中進行 Layer 的聲明,在 forward 中使用聲明的 Layer 變量進行前向計算。

下面就來分別看一下 Sequential 與 SubClass 的實例。

1、Sequential

對于線性的網(wǎng)絡模型,我們只需要按網(wǎng)絡模型的結構順序,一層一層的加到 Sequential 后面即可,具體實現(xiàn)如下:

# Sequential 形式組網(wǎng)

mnist = nn.Sequential(

nn.Flatten,

nn.Linear(784, 512),

nn.ReLU,

nn.Dropout(0.2),

nn.Linear(512, 10)

2、SubClass

使用 SubClass 進行組網(wǎng)的實現(xiàn)如下:

# SubClass 方式組網(wǎng)

classMnist( nn. Layer):

def__init__( self) :

super(Mnist, self).__init_ _

self.flatten = nn.Flatten

self.linear_1 = nn.Linear( 784, 512)

self.linear_2 = nn.Linear( 512, 10)

self.relu = nn.ReLU

self.dropout = nn.Dropout( 0. 2)

defforward( self, inputs) :

y = self.flatten(inputs)

y = self.linear_1(y)

y = self.relu(y)

y = self.dropout(y)

y = self.linear_2(y)

returny

?

上述的 SubClass 組網(wǎng)的結果與 Sequential 組網(wǎng)的結果完全一致,可以明顯看出,使用 SubClass 組網(wǎng)會比使用 Sequential 更復雜一些。不過,這帶來的是網(wǎng)絡模型結構的靈活性。我們可以設計不同的網(wǎng)絡模型結構來應對不同的場景。

3、飛槳框架內(nèi)置模型

除了自定義模型結構外,飛槳框架還「貼心」的內(nèi)置了許多模型,真正的一行代碼實現(xiàn)深度學習模型。目前,飛槳框架內(nèi)置的模型都是 CV 領域領域的模型,都在 paddle.vision.models 目錄下,包含了常見的 vgg 系列、resnet 系列等模型。使用方式如下:

import paddle

from paddle.vision.models import resnet18

# 方式一: 一行代碼直接使用

resnetresnet = resnet18

# 方式二: 作為主干網(wǎng)絡進行二次開發(fā)

classFaceNet( paddle. nn. Layer):

def__init__( self, num_keypoints= 15, pretrained=False) :

super(FaceNet, self).__init_ _

self.backbone = resnet18(pretrained)

self.outLayer1 = paddle.nn.Linear( 1000, 512)

self.outLayer2 = paddle.nn.Linear( 512, num_keypoints* 2)

defforward( self, inputs) :

out = self.backbone(inputs)

out = self.outLayer1(out)

out = self.outLayer2(out)

returnout

三、模型可視化

在我們完成模型的構建后,有時還需要可視化模型的網(wǎng)絡結構與參數(shù),只要我們用 Model 進行模型的封裝后,然后調(diào)用 model.summary 即可實現(xiàn)網(wǎng)絡模型的可視化,具體如下:

mnist = nn.Sequential(

nn.Flatten,

nn.Linear(784, 512),

nn.ReLU,

nn.Dropout(0.2),

nn.Linear(512, 10))

# 模型封裝,用 Model 類封裝

model = paddle.Model(mnist)

model.summary

其輸出如下:

---------------------------------------------------------------------------

Layer ( type) Input Shape Output Shape Param #

===========================================================================

Flatten -795[[32, 1, 28, 28]][ 32, 784] 0

Linear -5[[32, 784]][ 32, 512] 401, 920

ReLU -3[[32, 512]][ 32, 512] 0

Dropout -3[[32, 512]][ 32, 512] 0

Linear -6[[32, 512]][ 32, 10] 5, 130

===========================================================================

Total params: 407, 050

Trainable params: 407, 050

Non-trainable params: 0

---------------------------------------------------------------------------

Input size (MB): 0.10

Forward/backward pass size (MB): 0.57

Params size (MB): 1.55

Estimated Total Size (MB): 2.22

---------------------------------------------------------------------------

{ ‘total_params’: 407050, ‘trainable_params’: 407050}

?

Model.summary 不僅會給出每一層網(wǎng)絡的形狀,還會給出每層網(wǎng)絡的參數(shù)量與模型的總參數(shù)量,非常方便直觀的就可以看到模型的全部信息

四、模型訓練

1、使用高層 API 在全部數(shù)據(jù)集上進行訓練

過去常常困擾深度學習開發(fā)者的一個問題是,模型訓練的代碼過于復雜,常常要寫好多步驟,才能使程序運行起來,冗長的代碼使許多開發(fā)者望而卻步。

現(xiàn)在,飛槳高層 API 將訓練、評估與預測 API 都進行了封裝,直接使用 Model.prepare、Model.fit、Model.evaluate、Model.predict就可以完成模型的訓練、評估與預測。

對比傳統(tǒng)框架動輒一大塊的訓練代碼。使用飛槳高層 API,可以在 3-5 行內(nèi),完成模型的訓練,極大的簡化了開發(fā)的代碼量,對初學者開發(fā)者非常友好。具體代碼如下:

# 將網(wǎng)絡結構用 Model 類封裝成為模型

model = paddle.Model(mnist)

# 為模型訓練做準備,設置優(yōu)化器,損失函數(shù)和精度計算方式

model.prepare(optimizer=paddle.optimizer.Adam(parameters=model.parameters),

loss=paddle.nn.CrossEntropyLoss,

metrics=paddle.metric.Accuracy)

# 啟動模型訓練,指定訓練數(shù)據(jù)集,設置訓練輪次,設置每次數(shù)據(jù)集計算的批次大小,設置日志格式

model.fit(train_dataset,

epochs=10,

batch_size=64,

verbose=1)

# 啟動模型評估,指定數(shù)據(jù)集,設置日志格式

model.evaluate(test_dataset, verbose=1)

# 啟動模型測試,指定測試集

Model.predict(test_dataset)

2、使用高層 API 在一個批次的數(shù)據(jù)集上訓練、驗證與測試

有時我們需要對數(shù)據(jù)按 batch 進行取樣,然后完成模型的訓練與驗證,這時,可以使用 train_batch、eval_batch、predict_batch 完成一個批次上的訓練、驗證與測試,具體如下:

# 模型封裝,用 Model 類封裝

model = paddle.Model(mnist)

# 模型配置:為模型訓練做準備,設置優(yōu)化器,損失函數(shù)和精度計算方式

model.prepare(optimizer=paddle.optimizer.Adam(parameters=model.parameters),

loss=nn.CrossEntropyLoss,

metrics=paddle.metric.Accuracy)

# 構建訓練集數(shù)據(jù)加載器

train_loader = paddle.io.DataLoader(train_dataset, batch_size= 64, shuffle= True)

# 使用 train_batch 完成訓練

forbatch_id, data inenumerate(train_loader):

model.train_batch([data[ 0]],[data[ 1]])

# 構建測試集數(shù)據(jù)加載器

test_loader = paddle.io.DataLoader(test_dataset, places=paddle.CPUPlace, batch_size= 64, shuffle= True)

# 使用 eval_batch 完成驗證

forbatch_id, data inenumerate(test_loader):

model.eval_batch([data[ 0]],[data[ 1]])

# 使用 predict_batch 完成預測

forbatch_id, data inenumerate(test_loader):

model.predict_batch([data[ 0]])

五、高階用法

除此之外,飛槳高層 API 還支持一些高階的玩法,如自定義 Loss、自定義 Metric、自定義 Callback 等等。

自定義 Loss 是指有時我們會遇到特定任務的 Loss 計算方式在框架既有的 Loss 接口中不存在,或算法不符合自己的需求,那么期望能夠自己來進行 Loss 的自定義。

自定義 Metric 和自定義 Loss 的場景一樣,如果遇到一些想要做個性化實現(xiàn)的操作時,我們也可以來通過框架完成自定義的評估計算方法。

自定義 Callback 則是可以幫助我們收集訓練時的一些參數(shù)以及數(shù)據(jù),由于 Model.fit封裝了訓練過程,如果我們需要保存訓練時的 loss、metric 等信息,則需要通過 callback 參數(shù)收集這部分信息。

更多更豐富的玩法,可以掃描關注文末的二維碼獲取~

高層 API,Next

上文以 CV 任務為例,介紹了飛槳框架高層 API 的使用指南。后續(xù),飛槳框架還計劃推出 NLP 領域專用的數(shù)據(jù)預處理模塊,如對數(shù)據(jù)進行 padding、獲取數(shù)據(jù)集詞表等;在組網(wǎng)方面,也會實現(xiàn) NLP 領域中組網(wǎng)專用的 API,如組網(wǎng)相關的 sequence_mask,評估指標相關的 BLEU 等;最后,針對 NLP 領域中的神器 transformer,我們也會對其進行特定的優(yōu)化;待這些功能上線后,我們會第一時間告訴大家,敬請期待吧~

高層 API,Where

看完前面飛槳高層 API 的使用介紹,是不是有種躍躍欲試的沖動呀?

體驗方式一:在線體驗

無需準備任何軟硬件環(huán)境,直接訪問以下地址,即可在線跑代碼看效果:https://aistudio.baidu.com/aistudio/projectdetail/1243085

體驗方式二:本地體驗

如果你還想在自己本地電腦上體驗,那需要確保本地電腦上已成功安裝飛槳開源框架 2.0。

下面介紹飛槳開源框架 2.0 的安裝方法,可以參考下面的命令,直接使用 pip 安裝。安裝后,就可以開始使用高層 API 啦。

# CPU 版

$ pip3 install paddlepaddle== 2.0.0rc0 -i https: //mirror.baidu.com/pypi/simple

# GPU

$ pip3 install paddlepaddle_gpu== 2.0.0rc0 -i https: //mirror.baidu.com/pypi/simple

高層 API,You

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 框架
    +關注

    關注

    0

    文章

    398

    瀏覽量

    17405
  • 代碼
    +關注

    關注

    30

    文章

    4723

    瀏覽量

    68236
  • 深度學習
    +關注

    關注

    73

    文章

    5466

    瀏覽量

    120891
  • 飛槳
    +關注

    關注

    0

    文章

    33

    瀏覽量

    2275
收藏 人收藏

    評論

    相關推薦

    凌智電子加入技術伙伴計劃,攜手PaddleX為視覺模組產(chǎn)品賦能添“智”

    近日,福州市凌睿智捷電子有限公司(以下簡稱凌智電子)正式加入技術伙伴計劃。雙方將共同探索人工智能技術在邊緣端部署中的創(chuàng)新與應用。凌智電子將憑借其在邊緣計算領域的豐富經(jīng)驗,結合
    的頭像 發(fā)表于 11-01 08:07 ?175次閱讀
    凌智電子加入<b class='flag-5'>飛</b><b class='flag-5'>槳</b>技術伙伴計劃,攜手PaddleX為視覺模組產(chǎn)品賦能添“智”

    NVIDIA推出全新深度學習框架fVDB

    在 SIGGRAPH 上推出的全新深度學習框架可用于打造自動駕駛汽車、氣候科學和智慧城市的 AI 就緒型虛擬表示。
    的頭像 發(fā)表于 08-01 14:31 ?499次閱讀

    如何利用AI進行提升自我呢?

    利用AI進行學習是一個高效且富有創(chuàng)新性的過程。以下是一些建議,幫助你充分利用AI進行學習: 選擇適合的AI學習工具 : 深度學習
    的頭像 發(fā)表于 07-19 10:46 ?471次閱讀

    PyTorch深度學習開發(fā)環(huán)境搭建指南

    PyTorch作為一種流行的深度學習框架,其開發(fā)環(huán)境的搭建對于深度學習研究者和開發(fā)者來說至關重要。在Windows操作系統(tǒng)上搭建PyTorc
    的頭像 發(fā)表于 07-16 18:29 ?703次閱讀

    基于Python的深度學習人臉識別方法

    基于Python的深度學習人臉識別方法是一個涉及多個技術領域的復雜話題,包括計算機視覺、深度學習、以及圖像處理等。在這里,我將概述一個基本的流程,包括數(shù)據(jù)準備、模型選擇、訓練過程、以及
    的頭像 發(fā)表于 07-14 11:52 ?1131次閱讀

    深度學習常用的Python庫

    深度學習常用的Python庫,包括核心庫、可視化工具、深度學習框架、自然語言處理庫以及數(shù)據(jù)抓取庫等,并詳細分析它們的功能和優(yōu)勢。
    的頭像 發(fā)表于 07-03 16:04 ?523次閱讀

    TensorFlow與PyTorch深度學習框架的比較與選擇

    深度學習作為人工智能領域的一個重要分支,在過去年中取得了顯著的進展。在構建和訓練深度學習模型的過程中,
    的頭像 發(fā)表于 07-02 14:04 ?848次閱讀

    百度發(fā)布文心大模型4.0 Turbo與框架3.0,引領AI技術新篇章

    SUMMIT深度學習開發(fā)者大會2024上,向世界展示了百度在AI領域的最新成果——文心大模型4.0 Turbo和框架3.0,并詳細披露
    的頭像 發(fā)表于 06-29 16:03 ?570次閱讀

    百度文心大模型4.0 Turbo,正式發(fā)布 用戶規(guī)模已達3億

    的最新數(shù)據(jù),并正式發(fā)布文心大模型4.0 Turbo、框架3.0等最新技術,披露文心生態(tài)最新成果。 ?01?文心大模型4.0 Turb
    的頭像 發(fā)表于 06-29 10:06 ?804次閱讀

    星火Lite API開放免費永久,星火Pro/Max API價格0.2元

    5月22日,科大訊宣布旗下訊星火Lite API完全免費向公眾開放,滿足在線聯(lián)網(wǎng)搜索及低算力推理與模型精調(diào)等特殊需求。同時,訊星火Pro/Max
    的頭像 發(fā)表于 05-22 11:43 ?1012次閱讀

    工大高科與科大訊簽訂戰(zhàn)略合作框架協(xié)議

    近日,工大高科與科大訊正式簽署戰(zhàn)略合作框架協(xié)議,共同致力于智能化礦山的建設與發(fā)展。根據(jù)協(xié)議,雙方將深度合作,共同研發(fā)和應用前沿的智能礦山解決方案。
    的頭像 發(fā)表于 05-20 11:23 ?468次閱讀

    星火API接入機體設備的方法與代碼

    星火API接入機體設備的方法與代碼
    的頭像 發(fā)表于 05-15 09:56 ?835次閱讀

    NVIDIA宣布推出基于Omniverse Cloud API構建的全新軟件框架

    NVIDIA 在 GTC 大會上宣布推出基于 Omniverse Cloud API(應用編程接口)構建的全新軟件框架。
    的頭像 發(fā)表于 03-25 09:09 ?480次閱讀

    【鴻蒙】OpenHarmony 4.0藍牙代碼結構簡析

    OpenHarmony 4.0藍牙代碼結構簡析前言 OpenHarmony 4.0上藍牙倉和目錄結構進行一次較大整改,本文基于4.0以上版本對藍牙代碼進行分析,便于讀者快速了解和學習
    的頭像 發(fā)表于 02-26 16:08 ?1418次閱讀
    【鴻蒙】OpenHarmony 4.0藍牙<b class='flag-5'>代碼</b>結構簡析

    規(guī)模突破1億!文心一言披露最新用戶規(guī)模

    “文心一言用戶規(guī)模突破1億。”12月28日,百度首席技術官、深度學習技術及應用國家工程研究中心主任王海峰在第屆WAVE SUMMIT深度學習
    的頭像 發(fā)表于 12-29 15:58 ?541次閱讀