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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

關(guān)于推出適用于設(shè)備端推薦的自適應(yīng)框架

Tensorflowers ? 來源:TensorFlow ? 作者:TensorFlow ? 2021-06-15 17:55 ? 次閱讀

發(fā)布人:Ellie Zhou、Tian Lin、Shuangfeng Li 以及 Sushant Prakash

簡(jiǎn)介和動(dòng)機(jī)

我們非常高興地宣布推出一種自適應(yīng)框架,用于使用您自己的數(shù)據(jù)以及高級(jí)用戶建模架構(gòu)構(gòu)建設(shè)備端推薦 ML 解決方案。

在之前開源了設(shè)備端推薦解決方案后,我們發(fā)現(xiàn)社區(qū)中的許多人都對(duì)引入設(shè)備端推薦系統(tǒng) AI 頗有興趣。受反饋內(nèi)容的激勵(lì)與啟發(fā),我們考慮了各種不同的用例,并創(chuàng)建了一種框架,該框架可以生成適應(yīng)不同種類的數(shù)據(jù)、特征和架構(gòu)的 TensorFlow Lite 推薦模型,對(duì)之前的模型進(jìn)行了完善。

此框架的優(yōu)勢(shì)

靈活:自適應(yīng)框架支持用戶以可配置方式創(chuàng)建模型。

優(yōu)化了模型表征: 為了完善之前的模型,我們的新推薦模型可以利用多種特征,而非單單一種特征。

個(gè)性化推薦在如今的數(shù)字化生活中越來越重要。隨著越來越多的用戶操作已轉(zhuǎn)移至邊緣設(shè)備,支持設(shè)備端推薦系統(tǒng)將變?yōu)橐粋€(gè)重要方向。與完全基于服務(wù)器的傳統(tǒng)推薦系統(tǒng)相比,設(shè)備端解決方案具有獨(dú)特的優(yōu)勢(shì),如保護(hù)用戶隱私、快速地對(duì)設(shè)備端用戶操作作出反應(yīng)、利用輕量級(jí) TensorFlow Lite 推理,以及繞過網(wǎng)絡(luò)依賴。我們歡迎您體驗(yàn)此框架并在您的應(yīng)用中創(chuàng)建推薦體驗(yàn)。

框架

https://tensorflow.google.cn/lite/examples/recommendation/overview

在本文中,我們將

介紹完善后的模型架構(gòu)和框架自適應(yīng)性。

帶您循序漸進(jìn)地了解如何利用框架。

根據(jù)使用公開數(shù)據(jù)集完成的研究提供數(shù)據(jù)分析。

您可以在 TensorFlow 網(wǎng)站上找到更多詳細(xì)信息。

TensorFlow 網(wǎng)站

https://tensorflow.google.cn/lite/examples/recommendation/overview

模型

推薦模型通常根據(jù)用戶之前的活動(dòng)預(yù)測(cè)用戶未來活動(dòng)。我們的框架支持模型使用上下文信息展開預(yù)測(cè),框架可以按照以下架構(gòu)進(jìn)行描述:

在上下文方面,由編碼器聚合所有用戶活動(dòng)的表征,以生成上下文嵌入。我們支持三種不同類型的編碼器:1) 詞袋(又名為 BOW),2) 1-D 卷積(又名為 CNN)和 3) LSTM。在標(biāo)簽方面,同樣會(huì)將正樣本標(biāo)簽項(xiàng)和詞匯表中的所有其他負(fù)樣本標(biāo)簽項(xiàng)編碼為向量。將上下文和標(biāo)簽嵌入與點(diǎn)積進(jìn)行結(jié)合并提供給 softmax 交叉熵?fù)p失。

在框架內(nèi)部,將 ContextEncoder、LabelEncoder 和 DotProductSimilarity 的 tf.keras 層封裝為 RecommendationModel 中的重要組件。

為了為每個(gè)用戶活動(dòng)建立模型,我們可以使用活動(dòng)項(xiàng)目編號(hào)(稱為基于編號(hào)的模型)、項(xiàng)目的多個(gè)特征(稱為基于特征的模型)或二者的組合?;谔卣鞯哪P蜁?huì)使用多個(gè)特征,集中性地對(duì)用戶行為進(jìn)行編碼。借助我們的框架,您可以可配置方式創(chuàng)建基于編號(hào)或基于特征的模型。

與上一版本類似,系統(tǒng)會(huì)在訓(xùn)練后導(dǎo)出 TensorFlow Lite 模型,可以直接在推薦候選條目中提供前 K 個(gè)預(yù)測(cè)。

分步教程

為了展示這個(gè)全新的自適應(yīng)框架,我們使用多個(gè)特征對(duì)含有 MovieLens 數(shù)據(jù)集的設(shè)備端電影推薦模型進(jìn)行了訓(xùn)練,并將其整合到演示版應(yīng)用中(模型和應(yīng)用僅用于演示目的)。MovieLens 1M 數(shù)據(jù)集包含 6039 位用戶對(duì) 3951 部電影的評(píng)分,每個(gè)用戶僅對(duì)一小部分電影進(jìn)行評(píng)分。

MovieLens

https://grouplens.org/datasets/movielens/

讓我們了解一下如何在此 Notebook 中分步使用框架。

Notebook

https://github.com/tensorflow/examples/blob/master/lite/examples/recommendation/ml/ondevice_recommendation.ipynb

(a) 環(huán)境準(zhǔn)備

git clone https://github.com/tensorflow/examples

cd examples/lite/examples/recommendation/ml/

pip install -r requirements.txt

(b) 準(zhǔn)備訓(xùn)練數(shù)據(jù)

請(qǐng)參考 movielens 示例生成文件準(zhǔn)備訓(xùn)練數(shù)據(jù)。需要注意的是,預(yù)計(jì) TensorFlow Lite 輸入特征為 FixedLenFeature,因此請(qǐng)?zhí)畛浠蚪厝√卣鳎⒃谳斎肱渲弥性O(shè)置特征長(zhǎng)度。您可以按照您的想法隨意使用以下命令來處理示例數(shù)據(jù)集。

FixedLenFeature

https://tensorflow.google.cn/api_docs/python/tf/io/FixedLenFeature

python -m data.example_generation_movielens

--data_dir=data/raw

--output_dir=data/examples

--min_timeline_length=3

--max_context_length=10

--max_context_movie_genre_length=32

--min_rating=2

--train_data_fraction=0.9

--build_vocabs=True

MovieLens 數(shù)據(jù)包含 ratings.dat(列: 用戶編號(hào)、 電影編號(hào)、 評(píng)分、 時(shí)間戳)和 movies.dat(列:電影編號(hào)、 標(biāo)題、 類型)。在示例生成腳本中,我們同時(shí)采用了這兩個(gè)文件,僅將評(píng)分保持在 2 分以上、構(gòu)成用戶電影交互時(shí)間線,作為標(biāo)簽的示例活動(dòng)以及之前的用戶活動(dòng)作為預(yù)測(cè)上下文。請(qǐng)查找生成的 tf.Example:

0 : {

features: {

feature: {

key : “context_movie_id”

value: { int64_list: { value: [ 1124, 2240, 3251, 。。。, 1268 ] } }

}

feature: {

key : “context_movie_rating”

value: { float_list: {value: [ 3.0, 3.0, 4.0, 。。。, 3.0 ] } }

}

feature: {

key : “context_movie_year”

value: { int64_list: { value: [ 1981, 1980, 1985, 。。。, 1990 ] } }

}

feature: {

key : “context_movie_id”

value: { int64_list: { value: [ 1124, 2240, 3251, 。。。, 1268 ] } }

}

feature: {

key : “context_movie_genre”

value: { bytes_list: { value: [ “Drama”, “Drama”, “Mystery”, 。。。, “UNK” ] } }

}

feature: {

key : “l(fā)abel_movie_id”

value: { int64_list: { value: [ 3252 ] } }

}

}

}

(c) 創(chuàng)建輸入配置

準(zhǔn)備好數(shù)據(jù)后,請(qǐng)?jiān)O(shè)置輸入配置,例如,這是 movielens 電影推薦模型的一個(gè)示例配置。

activity_feature_groups {

features {

feature_name: “context_movie_id”

feature_type: INT

vocab_size: 3953

embedding_dim: 8

feature_length: 10

}

features {

feature_name: “context_movie_rating”

feature_type: FLOAT

feature_length: 10

}

encoder_type: CNN

}

activity_feature_groups {

features {

feature_name: “context_movie_genre”

feature_type: STRING

vocab_name: “movie_genre_vocab.txt”

vocab_size: 19

embedding_dim: 4

feature_length: 32

}

encoder_type: CNN

}

label_feature {

feature_name: “l(fā)abel_movie_id”

feature_type: INT

vocab_size: 3953

embedding_dim: 8

feature_length: 1

}

(d) 訓(xùn)練模型

模型訓(xùn)練器將根據(jù)輸入配置構(gòu)建含有簡(jiǎn)單界面的推薦模型。

python -m model.recommendation_model_launcher --

--training_data_filepattern “data/examples/train_movielens_1m.tfrecord”

--testing_data_filepattern “data/examples/test_movielens_1m.tfrecord”

--model_dir “model/model_dir”

--vocab_dir “data/examples”

--input_config_file “configs/sample_input_config.pbtxt”

--batch_size 32

--learning_rate 0.01

--steps_per_epoch 2

--num_epochs 2

--num_eval_steps 2

--run_mode “train_and_eval”

--gradient_clip_norm 1.0

--num_predictions 10

--hidden_layer_dims “32,32”

--eval_top_k “1,5”

--conv_num_filter_ratios “2,4”

--conv_kernel_size 4

--lstm_num_units 16

在推薦模型內(nèi)部,核心組件將被打包到 keras 層(context_encoder.py、label_encoder.py 和 dotproduct_similarity.py),其中每一層都可以被自身使用。下圖介紹了代碼結(jié)構(gòu):

context_encoder.py

https://github.com/tensorflow/examples/blob/master/lite/examples/recommendation/ml/model/context_encoder.py

label_encoder.py

https://github.com/tensorflow/examples/blob/master/lite/examples/recommendation/ml/model/label_encoder.py

dotproduct_similarity.py

https://github.com/tensorflow/examples/blob/master/lite/examples/recommendation/ml/model/dotproduct_similarity.py

通過此框架,您可以通過命令直接執(zhí)行模型訓(xùn)練啟動(dòng)器:

python -m model.recommendation_model_launcher

--input_config_file “configs/sample_input_config.pbtxt”

--vocab_dir “data/examples”

--run_mode “export”

--checkpoint_path “model/model_dir/ckpt-1000”

--num_predictions 10

--hidden_layer_dims “32,32”

--conv_num_filter_ratios “2,4”

--conv_kernel_size 4

--lstm_num_units 16

導(dǎo)出至 TensorFlow Lite 后,可以在 Notebook 中找到推理代碼,同時(shí)我們會(huì)推薦讀者查看該處的詳細(xì)信息。

Notebook

https://github.com/tensorflow/examples/blob/master/lite/examples/recommendation/ml/ondevice_recommendation.ipynb

框架自適應(yīng)性

我們的框架會(huì)提供 protobuf 接口,用戶可在此接口中對(duì)特征組、類型和其他信息進(jìn)行配置,以相應(yīng)地構(gòu)建模型。在此接口中,您可以配置:

protobuf

https://github.com/tensorflow/examples/blob/master/lite/examples/recommendation/ml/configs/input-config.proto

特征

框架通常將特征分為 3 種類型:整型、字符串和浮點(diǎn)數(shù)。由于需要為整型和字符串特征創(chuàng)建嵌入空間,因此需要指定嵌入維度、詞匯表名稱和大小。浮點(diǎn)數(shù)特征值可直接使用。此外,對(duì)于設(shè)備端模型,我們建議使用可直接進(jìn)行配置的固定長(zhǎng)度特征。

message Feature {

optional string feature_name = 1;

// Supported feature types: STRING, INT, FLOAT.

optional FeatureType feature_type = 2;

optional string vocab_name = 3;

optional int64 vocab_size = 4;

optional int64 embedding_dim = 5;

optional int64 feature_length = 6;

}

特征組

一個(gè)用戶活動(dòng)的一個(gè)特征可能具有多個(gè)值。例如,一部電影可以屬于多個(gè)類別,每部電影將具有多個(gè)類型的特征值。為了處理不同特征形狀,我們引入了“特征組”,用于將特征合并為組。可以將長(zhǎng)度相同的特征放置到同一特征組中,以一起進(jìn)行編碼。在輸入配置中,您可以設(shè)置全局特征組和活動(dòng)特征組。

message FeatureGroup {

repeated Feature features = 1;

// Supported encoder types: BOW, CNN, LSTM.

optional EncoderType encoder_type = 2;

}

輸入配置

您可以使用輸入配置界面同時(shí)設(shè)置所有特征和特征組。

message InputConfig {

repeated FeatureGroup global_feature_groups = 1;

repeated FeatureGroup activity_feature_groups = 2;

optional Feature label_feature = 3;

}

input_pipeline.py 和 recommendation_model.py 會(huì)使用輸入配置將訓(xùn)練數(shù)據(jù)處理為 tf.data.Dataset,并相應(yīng)地構(gòu)建模型。在 ContexEncoder 內(nèi)部,我們將為所有特征組創(chuàng)建 FeatureGroupEncoders,并將其用于計(jì)算輸入特征中的特征組嵌入。通過頂部隱藏層饋送串聯(lián)特征組嵌入,以獲得最終上下文嵌入。值得注意的是,最終上下文嵌入和標(biāo)簽嵌入維度應(yīng)該相同。

input_pipeline.py

https://github.com/tensorflow/examples/blob/master/lite/examples/recommendation/ml/model/input_pipeline.py

recommendation_model.py

https://github.com/tensorflow/examples/blob/master/lite/examples/recommendation/ml/model/recommendation_model.py

請(qǐng)?jiān)诟戒洸糠植榭词褂貌煌斎肱渲蒙傻牟煌P蛨D。

附錄

https://github.com/tensorflow/examples/blob/master/lite/examples/recommendation/ml/ondevice_recommendation.ipynb

實(shí)驗(yàn)與分析

我們會(huì)借此機(jī)會(huì),針對(duì)基于編號(hào)和基于特征的模型,分析其在不同配置下的性能,并提供一些實(shí)證結(jié)果。

對(duì)于基于編號(hào)的模型,僅會(huì)將 movie_id 用作輸入特征。對(duì)于基于特征的模型,會(huì)使用 movie_id 和 movie_genre 特征。兩種類型的模型都嘗試使用了 3 種編碼器類型 (BOW/CNN/LSTM) 和 3 種上下文歷史長(zhǎng)度 (10/50/100)。

由于 MovieLens 數(shù)據(jù)集是一個(gè)實(shí)驗(yàn)數(shù)據(jù)集,其中大約含有 4000 部候選電影和 19 種電影類型,因此我們會(huì)在實(shí)驗(yàn)中縮小嵌入維度,以模擬生成場(chǎng)景。對(duì)于上述實(shí)驗(yàn)結(jié)果圖表,將編號(hào)嵌入維度設(shè)置為 8 并將電影類型嵌入維度設(shè)置為 4。如果以 context10_cnn 為例,基于特征的模型性能比基于編號(hào)的模型性能高出 58.6%。此外,平均結(jié)果顯示基于特征的模型性能要高出 48.35%。因此,在這種情況中,基于特征的模型性能要優(yōu)于基于編號(hào)的模型,因?yàn)?movie_genre 特征向模型引入了其他信息。

MovieLens

https://grouplens.org/datasets/movielens/

此外,候選項(xiàng)目的大部分基礎(chǔ)特征的詞匯表都相對(duì)較小,因此嵌入空間也相對(duì)較小。例如,電影類型詞匯表要比電影編號(hào)詞匯表小很多。在這種情況中,使用基礎(chǔ)特征會(huì)減小模型的內(nèi)存大小,從而令其更適合設(shè)備端。

編輯:jq

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

    關(guān)注

    5046

    文章

    18832

    瀏覽量

    298797
  • 網(wǎng)絡(luò)
    +關(guān)注

    關(guān)注

    14

    文章

    7395

    瀏覽量

    88228
  • ML
    ML
    +關(guān)注

    關(guān)注

    0

    文章

    143

    瀏覽量

    34447

原文標(biāo)題:推出適用于設(shè)備端推薦的自適應(yīng)框架

文章出處:【微信號(hào):tensorflowers,微信公眾號(hào):Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    軌到軌運(yùn)算放大器AiP8612適用于低功耗便攜式設(shè)備

    軌到軌運(yùn)算放大器AiP8612適用于低功耗便攜式設(shè)備
    的頭像 發(fā)表于 09-04 09:44 ?122次閱讀
    軌到軌運(yùn)算放大器AiP8612<b class='flag-5'>適用于</b>低功耗便攜式<b class='flag-5'>設(shè)備</b>

    選擇適用于汽車應(yīng)用的基準(zhǔn)電壓

    電子發(fā)燒友網(wǎng)站提供《選擇適用于汽車應(yīng)用的基準(zhǔn)電壓.pdf》資料免費(fèi)下載
    發(fā)表于 09-02 11:26 ?0次下載
    選擇<b class='flag-5'>適用于</b>汽車應(yīng)用的基準(zhǔn)電壓

    如何在自己的固件中增加wifi自適應(yīng)性相關(guān)功能,以通過wifi自適應(yīng)認(rèn)證測(cè)試?

    目前官方提供了自適應(yīng)測(cè)試固件 ESP_Adaptivity_v2.0_26M_20160322.bin 用于進(jìn)行 wifi 自適應(yīng)認(rèn)證測(cè)試. 請(qǐng)問如何在自己的固件中增加 wifi 自適應(yīng)
    發(fā)表于 07-12 08:29

    適用于測(cè)量設(shè)備的36V雙通道高精度運(yùn)算放大器SC7506

    適用于測(cè)量設(shè)備的36V雙通道高精度運(yùn)算放大器SC7506
    的頭像 發(fā)表于 06-17 10:00 ?283次閱讀
    <b class='flag-5'>適用于</b>測(cè)量<b class='flag-5'>設(shè)備</b>的36V雙通道高精度運(yùn)算放大器SC7506

    AC/DC電源模塊:適用于各種功率需求的電子設(shè)備

    BOSHIDA ?AC/DC電源模塊:適用于各種功率需求的電子設(shè)備 AC/DC電源模塊是一種廣泛應(yīng)用于不同電子設(shè)備中的電源轉(zhuǎn)換模塊。它具有輸出穩(wěn)定、高效率、可靠性強(qiáng)等特點(diǎn),
    的頭像 發(fā)表于 05-24 11:20 ?468次閱讀
    AC/DC電源模塊:<b class='flag-5'>適用于</b>各種功率需求的電子<b class='flag-5'>設(shè)備</b>

    PMP22165.1-適用于 Xilinx 通用自適應(yīng)計(jì)算加速平臺(tái) (ACAP) 的電源 PCB layout 設(shè)計(jì)

    電子發(fā)燒友網(wǎng)站提供《PMP22165.1-適用于 Xilinx 通用自適應(yīng)計(jì)算加速平臺(tái) (ACAP) 的電源 PCB layout 設(shè)計(jì).pdf》資料免費(fèi)下載
    發(fā)表于 05-19 10:45 ?0次下載
    PMP22165.1-<b class='flag-5'>適用于</b> Xilinx 通用<b class='flag-5'>自適應(yīng)</b>計(jì)算加速平臺(tái) (ACAP) 的電源 PCB layout 設(shè)計(jì)

    微軟正式發(fā)布適用于Windows的Sudo

    微軟已在 Windows 11 Insider Preview Build 26052 中發(fā)布適用于 Windows 的 Sudo,并將其在 MIT 協(xié)議下進(jìn)行開源。
    的頭像 發(fā)表于 03-19 09:20 ?662次閱讀
    微軟正式發(fā)布<b class='flag-5'>適用于</b>Windows的Sudo

    什么是自適應(yīng)光學(xué)?自適應(yīng)光學(xué)原理與方法的發(fā)展

    目前,世界上大型的望遠(yuǎn)鏡系統(tǒng)都采用了自適應(yīng)光學(xué)技術(shù),自適應(yīng)光學(xué)的出現(xiàn)為補(bǔ)償動(dòng)態(tài)波前擾動(dòng),提高光波質(zhì)量提供了新的研究方向。 60多年來,自適應(yīng)光學(xué)技術(shù)獲得蓬勃發(fā)展,現(xiàn)已應(yīng)用于天文學(xué)
    發(fā)表于 03-11 10:27 ?1395次閱讀

    Versal 自適應(yīng)SoC設(shè)計(jì)指南

    電子發(fā)燒友網(wǎng)站提供《Versal 自適應(yīng)SoC設(shè)計(jì)指南.pdf》資料免費(fèi)下載
    發(fā)表于 12-14 16:22 ?1次下載
    Versal <b class='flag-5'>自適應(yīng)</b>SoC設(shè)計(jì)指南

    IGBT適用于ZVS 還是 ZCS?

    IGBT適用于ZVS 還是 ZCS?
    的頭像 發(fā)表于 12-01 16:10 ?979次閱讀
    IGBT<b class='flag-5'>適用于</b>ZVS 還是 ZCS?

    LabVIEW開發(fā)自適應(yīng)降噪ANC

    LabVIEW開發(fā)自適應(yīng)降噪ANC 在許多情況下,信號(hào)很嘈雜,必須消除噪聲。自適應(yīng)降噪(ANC)是可用于消除信號(hào)噪聲的主要實(shí)時(shí)方法之一。可以使用LabVIEW自適應(yīng)濾濾器工具包來設(shè)計(jì)A
    發(fā)表于 11-30 19:38

    Toshiba推出適用于USB設(shè)備和電池組保護(hù)的30V N溝道共漏MOSFET

    ?Toshiba Electronic Devices & Storage Corporation ("Toshiba")日前推出了“SSM10N961L”。這是一款低導(dǎo)通電阻、30V N溝道共漏MOSFET,適用于帶USB的設(shè)備
    的頭像 發(fā)表于 11-08 16:22 ?550次閱讀

    自適應(yīng)巡航系統(tǒng)的組成及原理

    在ACC系統(tǒng)中,測(cè)距雷達(dá)用于測(cè)量自車與前方車輛的車頭距、相對(duì)速度、相對(duì)加速度,是自適應(yīng)巡航控制系統(tǒng)中的關(guān)鍵設(shè)備之一,也是決定該系統(tǒng)造價(jià)的主要元件。其主要組成包括發(fā)射天線,接受天線,DPS(數(shù)字信號(hào)處理)處理單元,數(shù)據(jù)線等。
    發(fā)表于 11-01 09:55 ?869次閱讀
    <b class='flag-5'>自適應(yīng)</b>巡航系統(tǒng)的組成及原理

    用于變壓器局部放電在線監(jiān)測(cè)的改進(jìn)NLMS自適應(yīng)濾波算法

    電子發(fā)燒友網(wǎng)站提供《用于變壓器局部放電在線監(jiān)測(cè)的改進(jìn)NLMS自適應(yīng)濾波算法.pdf》資料免費(fèi)下載
    發(fā)表于 10-10 11:44 ?0次下載
    <b class='flag-5'>用于</b>變壓器局部放電在線監(jiān)測(cè)的改進(jìn)NLMS<b class='flag-5'>自適應(yīng)</b>濾波算法

    Diodes公司推出適用于車用LED產(chǎn)品應(yīng)用的電感轉(zhuǎn)換器(SEPIC)控制器

    Diodes 公司 (Diodes) (Nasdaq:DIOD) 推出一款適用于各種車用 LED 產(chǎn)品應(yīng)用的升壓/單初級(jí)電感轉(zhuǎn)換器 (SEPIC) 控制器。
    的頭像 發(fā)表于 09-26 14:13 ?896次閱讀