如何设计好词袋模型的类类型 如何改进传统词袋模型

\u8bcd\u888b\u6a21\u578b\u662f\u4ec0\u4e48\u610f\u601d

Bag of words\uff0c\u4e5f\u53eb\u505a\u201c\u8bcd\u888b\u201d\uff0c\u5728\u4fe1\u606f\u68c0\u7d22\u4e2d\uff0cBag of words model\u5047\u5b9a\u5bf9\u4e8e\u4e00\u4e2a\u6587\u672c\uff0c\u5ffd\u7565\u5176\u8bcd\u5e8f\u548c\u8bed\u6cd5\uff0c\u53e5\u6cd5\uff0c\u5c06\u5176\u4ec5\u4ec5\u770b\u505a\u662f\u4e00\u4e2a\u8bcd\u96c6\u5408\uff0c\u6216\u8005\u8bf4\u662f\u8bcd\u7684\u4e00\u4e2a\u7ec4\u5408\uff0c\u6587\u672c\u4e2d\u6bcf\u4e2a\u8bcd\u7684\u51fa\u73b0\u90fd\u662f\u72ec\u7acb\u7684\uff0c\u4e0d\u4f9d\u8d56\u4e8e\u5176\u4ed6\u8bcd\u662f\u5426\u51fa\u73b0\uff0c\u6216\u8005\u8bf4\u5f53\u8fd9\u7bc7\u6587\u7ae0\u7684\u4f5c\u8005\u5728\u4efb\u610f\u4e00\u4e2a\u4f4d\u7f6e\u9009\u62e9\u4e00\u4e2a\u8bcd\u6c47\u90fd\u4e0d\u53d7\u524d\u9762\u53e5\u5b50\u7684\u5f71\u54cd\u800c\u72ec\u7acb\u9009\u62e9\u7684\u3002

\u8fd9\u79cd\u5047\u8bbe\u867d\u7136\u5bf9\u81ea\u7136\u8bed\u8a00\u8fdb\u884c\u4e86\u7b80\u5316\uff0c\u4fbf\u4e8e\u6a21\u578b\u5316\uff0c\u4f46\u662f\u5176\u5047\u5b9a\u5728\u6709\u4e9b\u60c5\u51b5\u4e0b\u662f\u4e0d\u5408\u7406\u7684\uff0c\u4f8b\u5982\u5728\u65b0\u95fb\u4e2a\u6027\u5316\u63a8\u8350\u4e2d\uff0c\u91c7\u7528Bag of words\u7684\u6a21\u578b\u5c31\u4f1a\u51fa\u73b0\u95ee\u9898\u3002\u4f8b\u5982\u7528\u6237\u7532\u5bf9\u201c\u5357\u4eac\u9189\u9152\u9a7e\u8f66\u4e8b\u6545\u201d\u8fd9\u4e2a\u77ed\u8bed\u5f88\u611f\u5174\u8da3\uff0c\u91c7\u7528bag of words\u5ffd\u7565\u4e86\u987a\u5e8f\u548c\u53e5\u6cd5\uff0c\u5219\u8ba4\u4e3a\u7528\u6237\u7532\u5bf9\u201c\u5357\u4eac\u201d\u3001\u201c\u9189\u9152\u201d\u3001\u201c\u9a7e\u8f66\u201d\u548c\u201c\u4e8b\u6545\u201d\u611f\u5174\u8da3\uff0c\u56e0\u6b64\u53ef\u80fd\u63a8\u8350\u51fa\u548c\u201c\u5357\u4eac\u201d\uff0c\u201c\u516c\u4ea4\u8f66\u201d\uff0c\u201c\u4e8b\u6545\u201d\u76f8\u5173\u7684\u65b0\u95fb\uff0c\u8fd9\u663e\u7136\u662f\u4e0d\u5408\u7406\u7684\u3002

\u52e4\u52b3\u7684\u4eba\u4f1a\u6709\u5404\u79cd\u5e78\u8fd0\uff0c\u61d2\u60f0\u7684\u4eba\u5219\u53ea\u6709\u4e00\u79cd\u4e0d\u5e78\u3002
\u52e4\u52b3\u5e94\u4ee5\u6240\u505a\u7684\u5de5\u4f5c\u4e3a\u5c3a\u5ea6\u3002

如何设计好词袋模型的类类型
回顾过去自己写过的一些词袋模型,比如 BoW图像检索Python实战 、 图像检索(CBIR)三剑客之BoF、VLAD、FV 以及Bag of Words cpp实现,这些写出来的要么只是助于自己理解词袋模型的有关理论,要么也只是面向实验的一些验证,或者更直接点可以说只是些小玩具摆了。
在我2016年的计划列表里,存放着一条由2015年拖过来的目标,就是写出一个可以面向商业级别的词袋模型,这条计划伴随着成功将VLfeat的一些c接口打通而变成了可能,并且在过去的大半年里,自己也一直留意在具体编写的时候选用哪些库比较合适的问题。机缘巧合,这一段时间又重新开始造起了轮子,并有了初步的成功,所以在此梳理总结一下。在谈怎样设计一个词袋模型的类类型之前,先谈谈库的选用问题。
选取合适的库
在具体编写一个面向应用级别的词袋模型的时候,大概会经历这么几个步骤:SIFT特征抽取,特征采样,聚类,构建KD树,统计词频,计算词频权重,计算词频直方图,保存数据。这8个步骤在具体实现的时候,会设计到一些库的选取问题,下面对其进行细谈。
1) SIFT特征抽取提取选用哪个库?
提取SIFT的库有很多,主要有以下几个大家用得比较多:
Lowe的 SIFT ,效果只提供SIFT的二进制可执行文件,弃用;
Robwhess的 OpenSIFT ,开源,效果也还不错,需要一些别的依赖库,不再更新,弃用;
OpenCV的SIFT,这个当然在使用上是最方便的,文档全,不依赖别的库,但SIFT的实现效果并不是很好,弃用;
VLfeat里的 SIFT ,SIFT的实现效果是比较好的,缺点是c接口文档不怎么全,网上提供的资料也比较少,但多读读它的C源码,还是可以搞定的,而且在不用依赖其他的库,所以选择这个库来提取SIFT还是很好的,在实际提取的时候,我选用的是 covdet 函数来提取SIFT,它是一个功能更强大的提取co-variant特征提取器。
在去年的时候,基本弄清了VLfeat中的一些函数的C接口调用方式,covdet这个函数通过阅读写给matlab的接口源码转成的C,对比matlab提取的结果和自己转成C之后提取的结果,两者完全一致。
2) 矩阵运算库的选取

虽然使用矩阵操作并不是必须的,除了OpenCV的矩阵,还有可能引入其他的矩阵运算库,这些矩阵的引入会给后面的实现带来巨大的方便,比如聚类,KD树的构建以及后面词频统计等。作为运算的基础库,在矩阵库的选择上主要有下面几个用得比较多:

Eigen ,使用的只需要把头文件包含进工程里即可,提供了多个平台的版本,比如可以运行于安卓上,矩阵运算操作还是比较方便的,更新得比较快,不过在PC平台上开发,我比较倾向于使用下面要说的Armadillo。
Armadillo ,这个库是我非常喜欢的矩阵运算库,此矩阵库在使用语法上Matlabjie借鉴了Matlab的语法使用习惯,所以熟悉Matlab的开发者在使用此库的时候会觉得非常的舒服,并且有名的MLPack是建立在它的基础之上,另外它的矩阵运算效率也是非常高的,使用的时候同Eigen一样只需要包含头文件目录即可,最新版本中添加了KMeans聚类。因而,基于以上这些优点,在实现词袋模型的时候,对于矩阵运算库的选取,选择这个无疑是最优的。
选用矩阵库虽然能极大的方便我们的程序编写,但是会涉及到数据类型的转换,比如STL的vector存储的数据要转成Armadillo的矩阵进行运算,如果数据频繁的进行类型的转换,必然会降低程序的运行效率,因而在程序的编写中,不必要转换的尽量避免转换。

3) 多线程并行处理

为了使程序的SIFT特征提取、KMeans聚类、统计词频等过程支持并行处理,在选择并行计算库的时候,有两种选择,一种是采用OpenMP,另一种是选择MPI。OpenMP是采用的是内存共享的方式,只需要对原程序进行小幅调整即可实现并行处理,并且语法易读已写;MPI需要对原来的程序进行大幅重构,写出来的代码也不是很好读。所以,在多线程并处计算库选择这块,选择OpenMP是比较好的。

词袋模型的类类型设计

终于可以讲核心的了,这一部分讲讲在编写程序的时候自己对词袋模型的类类型设计的一点心得。先上自己写的词袋模型的类类型,设计了两个类,一个是 SIFT特征提取的类类型 ,另一个是 词袋模型的类类型 。先谈谈 SIFT特征提取的类类型 :

class siftDesctor{
public:
siftDesctor(){};
std::string imageName;
std::vector<std::vector<float>> frame;
std::vector<std::vector<float>> desctor;
void covdet_keypoints_and_descriptors(cv::Mat &img, std::vector<std::vector<float>> &frames, std::vector<std::vector<float>> &desctor, bool rooSIFT, bool verbose);
std::vector<float> rootsift(std::vector<float> &dst);

void Serialize(std::ofstream &outfile) const {
std::string tmpImageName = imageName;
int strSize = (int)imageName.size();
outfile.write((char *)&strSize, sizeof(int));
outfile.write((char *)&tmpImageName[0], sizeof(char)*strSize); // 写入文件名

int descSize = (int)desctor.size();
outfile.write((char *)&descSize, sizeof(int));

// 写入sift特征
for(int i = 0; i < descSize; i++ ){
outfile.write((char *)&(desctor[i][0]), sizeof(float) * 128);
outfile.write((char *)&(frame[i][0]), sizeof(float) * 6);
}

}

static siftDesctor Deserialize(std::ifstream &ifs) {
siftDesctor siftDesc;
int strSize = 0;
ifs.read((char *)&strSize, sizeof(int)); // 写入文件名
siftDesc.imageName = "";
siftDesc.imageName.resize(strSize);
ifs.read((char *)&(siftDesc.imageName[0]), sizeof(char)*strSize); // 读入文件名

int descSize = 0;
ifs.read((char *)&descSize, sizeof(int));

// 读入sift特征和frame
for(int i = 0; i < descSize; i++ ){
std::vector<float> tmpDesc(128);
ifs.read((char *)&(tmpDesc[0]), sizeof(float) * 128);
siftDesc.desctor.push_back(tmpDesc);

std::vector<float> tmpFrame(6);
ifs.read((char *)&(tmpFrame[0]), sizeof(float) * 6);
siftDesc.frame.push_back(tmpFrame);
}

return siftDesc;
}

};
在设计SIFT特征提取的类类型的时候,对于每一幅图像,提取SIFT特征之后,由于需要保存图像名、128维的SIFT特征以及6维的frame,因为 imageName 、 desctor 和 frame 这三个成员是必须的,这里说一下对于 imageName 这个成员,在最后保存方式文件名的时候,更合理的方式是不应该带入文件所在目录路径的,因为最终写入的数据有可能转移到别的计算机上,带入路径不便于共享后使用者对数据的处理,这个地方我在刚开始设计的时候有欠考虑。另外,刚开始在设计 covdet_keypoints_and_descriptors() 方法的时候,是在方法里读入图片然后在提取特征的,当时想得是想让这样一个特征提取器更加的方便使用(只需要传入图像待路径的文件名就可以处理),但后来发现其实根本没必要这么设计这个方法,这种蹩脚的方式使得后面在显示结果的时候,你需要再次读入图片,降低了程序的执行效率,因而改成了现在的这种传入已读入数据的方式。

上面除了三个重要的成员变量,两个序列化和反序列化的方法是极其重要的,序列化的目的使得上面三个重要的成员变量得以保存,这样可以避免当我们想再次聚类时又要提取特征的尴尬;反序列化使得我们可以读取保存的数据,因而,三个成员变量加两个方法都是必不可少的。

再谈 词袋模型的类类型 ,先看类定义:

class bowModel {
public:
bowModel(){};
bowModel(int _numWords,std::vector<siftDesctor> _imgFeatures, std::vector<std::vector<int>> _words):numWords(_numWords),imgFeatures(_imgFeatures),words(_words){};

int numNeighbors = 1;
int numWords;
std::vector<siftDesctor> imgFeatures;
std::vector<std::vector<int>> words;
cv::Mat centroids_opencvMat;

cv::flann::Index opencv_buildKDTree(cv::Mat ¢roids_opencvMat);

void Serialize(std::ofstream &outfile) const {
int imgFeatsSize = (int)imgFeatures.size();
outfile.write((char *)&imgFeatsSize, sizeof(int));
// 写入imgFeatures和words
for(int i = 0; i < imgFeatsSize; i++ ){
imgFeatures[i].Serialize(outfile);
outfile.write((char *)&(words[i][0]), sizeof(int) * imgFeatures[i].desctor.size());
}

}

static bowModel Deserialize(std::ifstream &ifs) {
bowModel BoW;
int imgFeatsSize;
ifs.read((char *)&imgFeatsSize, sizeof(int));

BoW.words.resize(imgFeatsSize);

for (int i = 0; i < imgFeatsSize; i++) {
// 读入imgFeatures
auto siftDesc = siftDesctor::Deserialize(ifs);
BoW.imgFeatures.push_back(siftDesc);
// 读入words
BoW.words[i].resize(siftDesc.desctor.size());
ifs.read((char *)&(BoW.words[i][0]), sizeof(int) * siftDesc.desctor.size());
}
return BoW;
}

};
上面最重要的有三个东西,一是成员 std::vector<siftDesctor> imgFeatures ,另外是序列化和反序列化方法。对于每一个图片提取的特征,将 imageName 、 desctor 和 frame 通过实例化一个siftDesctor将其保存起来,这样我们将所有图片的siftDesctor实例用STL的vector保存下来,在序列化的时候,对每一个实例通过调用 SIFT特征提取的类类型 中定义的序列化方法将其保存下来,读取数据的时候,其过程基本就是原来的一个拟过程。通过这样设计这样两个 SIFT特征提取的类类型 和 词袋模型的类类型 ,在数据读写的时候,通过内外两重循环,内部循环完成一个实例的数据读写,外部循环完成所有图片实例的读写,使得我们可以比较优雅地完成图片的特征提取、数据保存以及读写。

对于数据读写,做过一番调研,一种是通过HDF5的方式,一种是通过BOOST库。HDF5很适合大数据量的保存,而且读写高效,但在C++里,写起来没有在Python里使用HDF5方便,BOOST也查阅过相应的资料,写起来也比较繁杂,所以最后选择了只用fstream来进行数据读写保存了,测了一下,数据读写还是比较高效的,所以暂且采用这种方案。

  • 璇嶈妯″瀷鏄壒寰佹眹鑱氱被鏂规硶鍚
    绛旓細涓昏鏄┖闂寸壒寰佹眹鑱氥備紶缁熺殑璇嶈妯″瀷闇瑕佸湪鐗瑰緛姹囪仛闃舵閲囩敤绌洪棿閲戝瓧濉旀ā鍨嬫潵琛ュ厖绌洪棿淇℃伅锛岀劧鑰岀┖闂撮噾瀛楀妯″瀷鐨鐗瑰緛缁存暟闅忕┖闂村垝鍒嗗眰鏁板鍔犲憟鎸囨暟澧為暱銆
  • 璇嶈妯″瀷鏈変粈涔堜綔鐢
    绛旓細Bag of words锛屼篃鍙仛鈥璇嶈鈥濓紝鍦ㄤ俊鎭绱腑锛孊ag of words model鍋囧畾瀵逛簬涓涓枃鏈紝蹇界暐鍏惰瘝搴忓拰璇硶锛屽彞娉曪紝灏嗗叾浠呬粎鐪嬪仛鏄竴涓瘝闆嗗悎锛屾垨鑰呰鏄瘝鐨勪竴涓粍鍚堬紝鏂囨湰涓瘡涓瘝鐨勫嚭鐜伴兘鏄嫭绔嬬殑锛屼笉渚濊禆浜庡叾浠栬瘝鏄惁鍑虹幇锛屾垨鑰呰褰撹繖绡囨枃绔犵殑浣滆呭湪浠绘剰涓涓綅缃夋嫨涓涓瘝姹囬兘涓嶅彈鍓嶉潰鍙ュ瓙鐨勫奖鍝嶈...
  • 璇嶈妯″瀷鏈変粈涔堜綔鐢
    绛旓細璇ユā鍨嬪拷鐣ユ帀鏂囨湰鐨勮娉曞拰璇簭绛夎绱狅紝灏嗗叾浠呬粎鐪嬩綔鏄嫢骞蹭釜璇嶆眹鐨勯泦鍚堬紝鏂囨。涓瘡涓崟璇嶇殑鍑虹幇閮芥槸鐙珛鐨勩侭oW浣跨敤涓缁勬棤搴忕殑鍗曡瘝(words)鏉ヨ〃杈句竴娈垫枃瀛楁垨涓涓枃妗.銆傝繎骞存潵锛孊oW妯″瀷琚箍娉涘簲鐢ㄤ簬璁$畻鏈鸿瑙変腑锛屼笌搴旂敤浜庢枃鏈殑BoW 绫绘瘮锛屽浘鍍忕殑鐗瑰緛锛坒eature锛夎褰撲綔鍗曡瘝锛圵ord锛夈傚熀浜庢枃鏈殑BoW妯″瀷鐨涓...
  • 鎴戞槸杩欐牱涓姝ユ鐞嗚В--涓婚妯″瀷(Topic Model)銆丩DA(妗堜緥浠g爜)
    绛旓細鍚屾椂锛屽畠鏄竴绉嶅吀鍨嬬殑璇嶈妯″瀷锛屽嵆涓绡囨枃妗f槸鐢变竴缁勮瘝鏋勬垚锛岃瘝涓庤瘝涔嬮棿娌℃湁鍏堝悗椤哄簭鐨勫叧绯汇傛澶栵紝涓绡囨枃妗e彲浠ュ寘鍚涓富棰橈紝鏂囨。涓瘡涓涓瘝閮界敱鍏朵腑鐨勪竴涓富棰樼敓鎴愩備汉绫绘槸鎬庝箞鐢熸垚鏂囨。鐨勫憿锛熼鍏堝厛鍒楀嚭鍑犱釜涓婚锛岀劧鍚庝互涓瀹氱殑姒傜巼閫夋嫨涓婚锛屼互涓瀹氱殑姒傜巼閫夋嫨杩欎釜涓婚鍖呭惈鐨勮瘝姹囷紝鏈缁堢粍鍚堟垚涓绡囨枃绔犮傚...
  • 浜哄伐鏅鸿兘娉拌开鏉疊棰樿В鏋
    绛旓細鎶鏈В鏋愶細鐗瑰緛鎻愬彇鎶鏈細浠庡浘鍍忚搴︼紝鍙傝禌鑰呭彲閫夋嫨SIFT銆丼URF銆丠OG鎴栨繁搴﹀涔犵殑CNN鏉ユ彁鍙栫壒寰併傛枃鏈柟闈紝璇嶈妯″瀷鍜岃瘝宓屽叆濡俉ord2Vec銆丗astText鏄父鐢ㄦ墜娈碉紝瀹冧滑鑳芥崟鎹夋枃鏈殑璇箟淇℃伅銆傝瀺鍚堟ā鍨嬩笌绠楁硶锛氶夋墜浠渶鑰冭檻濡侰oncatenation銆丅i-Encoder銆乀ransformer銆丮LP鍜孉ttention绛夋柟娉曪紝浠ュ皢鍥惧儚鍜屾枃鏈壒寰佹棤缂濊瀺鍚...
  • 璇嶈妯″瀷鍜岃瑷妯″瀷鍖哄埆
    绛旓細褰㈠紡涓嶅悓銆璇嶈妯″瀷鏄湪鑷劧璇█澶勭悊鍜屼俊鎭绱笅琚畝鍖栫殑琛ㄨ揪妯″瀷锛岃瑷妯″瀷鏄牴鎹瑷瀹㈣浜嬪疄锛岃岃繘琛岀殑璇█鎶借薄鏁板寤烘ā鏄竴绉嶅搴斿叧绯绘墍浠ヨ瘝琚嬫ā鍨嬪拰璇█妯″瀷褰㈠紡涓嶅悓銆傝瑷妯″瀷涓昏鏈変袱涓綔鐢紝鍒ゆ柇涓鍙ヨ瘽鏄惁绗﹀悎璇硶鍜岀敓鎴愭枃鏈紝璇█妯″瀷涓昏鏈変袱涓綔鐢ㄥ簲鐢ㄥ湪鐢佃剳瑙嗚棰嗗煙銆
  • 鏂囨湰鍒嗙被鐗瑰緛宸ョ▼姒傝堪
    绛旓細浣曚负鐗瑰緛宸ョ▼鍛紵椤惧悕鎬濅箟锛屽氨鏄鍘熷鏁版嵁杩涜涓绯诲垪宸ョ▼澶勭悊锛屽皢鍏舵彁鐐间负鐗瑰緛锛屼綔涓鸿緭鍏ヤ緵绠楁硶鍜妯″瀷浣跨敤銆 鏈川涓婅锛岀壒寰佸伐绋嬫槸涓涓〃绀哄拰灞曠幇鏁版嵁鐨勮繃绋嬶紱瀹為檯宸ヤ綔涓紝鐗瑰緛宸ョ▼鐨勭洰鐨勬槸鍘婚櫎鍘熷鏁版嵁涓殑鏉傝川鍜屽啑浣欙紝璁捐鏇撮珮鏁堢殑鐗瑰緛浠ュ埢鐢绘眰瑙g殑闂涓庨娴嬫ā鍨嬩箣闂寸殑鍏崇郴銆 濂界殑鐗瑰緛宸ョ▼鍙互 ...
  • Transformer妯″瀷瑙f瀽璁板綍
    绛旓細Transformer 涓 RNN 涓嶅悓锛屽彲浠ユ瘮杈冨ソ鍦板苟琛岃缁冦俆ransformer 鏈韩鏄笉鑳藉埄鐢ㄥ崟璇嶇殑椤哄簭淇℃伅鐨勶紝鍥犳闇瑕佸湪杈撳叆涓坊鍔犱綅缃 Embedding锛屽惁鍒 Transformer 灏辨槸涓涓璇嶈妯″瀷浜嗐俆ransformer 鐨勯噸鐐规槸 Self-Attention 缁撴瀯锛屽叾涓敤鍒扮殑 Q, K, V鐭╅樀閫氳繃杈撳嚭杩涜绾挎у彉鎹㈠緱鍒般俆ransformer 涓 Multi-Head Attention...
  • 鎴戠敤浜100琛孭ython浠g爜,瀹炵幇浜嗕笌濂崇灏亰寰俊(闄勪唬鐮)
    绛旓細瀵逛簬model绫伙紝鎴戜滑涓涓竴涓潵浠嬬粛銆俰nitialize() 鍑芥暟鍜 __init__() 鍑芥暟 鏄璞″垵濮嬪寲鍜屽疄渚嬪寲锛屽叾涓寘鎷熀鏈弬鏁扮殑璧嬪笺妯″瀷鐨瀵煎叆銆佹ā鍨嬬殑璁粌銆佹ā鍨嬬殑淇濆瓨銆佹渶鍚庤繑鍥炵敤鎴蜂竴涓璞°俖_train_model() 鍑芥暟锛屽闂杩涜鍒嗚瘝锛屼娇鐢 gesim 瀹炵幇璇嶈妯″瀷锛岀粺璁℃瘡涓壒寰佺殑 tf-idf , 寤虹珛绋鐤忕煩闃...
  • 鐗瑰緛宸ョ▼(鐧鹃潰鏈哄櫒瀛︿範)
    绛旓細鍦ㄦ暟鎹┍鍔ㄧ殑鏈哄櫒瀛︿範涓栫晫閲岋紝鏁版嵁鐨勮川閲忓拰鐗瑰緛鐨勫伐绋嬪寲澶勭悊鑷冲叧閲嶈銆妯″瀷鐨琛ㄧ幇涓嶄粎鍙栧喅浜庨夋嫨鐨勭畻娉曪紝鏇村湪浜庣壒寰佺殑绮惧績璁捐涓庤浆鎹傞鍏堬紝鐗瑰緛褰掍竴鍖栨槸鍏抽敭涓鐜紝閫氳繃绾挎у綊涓鍖(0-1)鍜岄浂鍧囧煎綊涓鍖栵紝娑堥櫎閲忕翰褰卞搷锛岀‘淇濇搴︿笅闄嶆ā鍨嬪湪涓嶅悓鐗瑰緛闂寸ǔ瀹氭敹鏁涳紝璁╂暟鍊肩壒寰侀棿鐨勬洿鏂版骞呬竴鑷淬傞潰瀵绫诲埆鍨嬬壒寰侊紝...
  • 扩展阅读:100种包装盒设计图 ... 主题的三大类型 ... 简单平面设计图 ... 词袋模型介绍 ... 常见的推荐模型 ... 意图识别模型 ... 模型的三个类型 ... 词袋模型是如何构建的 ... 模型有哪些类型 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网