游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

图像识别基于Keras的手写数字识别(含代码)

  前沿
  人工智能的浪潮已经席卷全球,深度学习(DeepLearning)和人工智能(ArtificialIntelligence,AI)等词汇也不断地充斥在我们身边。人工智能的发展是一个三起两落的变化,90年代期间,知识推理神经网络机器学习;2005年左右,机器学习知识(语义网)神经网络;而从2017年之后,基于深度学习的神经网络知识(知识图谱)机器学习。
  卷积神经网络(convolutionalneuralnetwork,CNN)作为深度学习中的代表,最早的灵感是来源于1961年Hubel和Wiesel两位神经生物学家,在对猫视觉皮层细胞的实验中,发现大脑可视皮层是分层的(CNN中的分层网络结构与其如出一辙)。深度学习作为机器学习(ML)的一个子领域,由于计算机能力的提高和大量数据的可用性,得到了戏剧性的复苏。但是,深度学习是否能等同或代表人工智能,这一点笔者认为有待商榷,深度学习可以认为是目前人工智能发展阶段的重要技术。由于本文主要撰写关于深度学习的入门实战,关于细节概念不做深入研究,下面笔者从实际案例,介绍深度学习处理图像的大致流程。
  目录:
  以手写识别数字为例,作为深度学习的入门项目,本文以Keras深度学习库为基础。其中使用的tensorflow等模块需要提前配置好,同时注意模型,图片保存、载入的文件路径问题。在自己的计算机上运行时,需要创建或修改。下面的流程包括:使用Keras载入MNIST数据集,构建Lenet训练网络模型,使用Keras进行模型的保存、载入,使用Keras实现对手写数字数据集的训练和预测,最后画出误差迭代图。
  手写数字数据集介绍:
  手写数字识别几乎是深度学习的入门数据集了。在keras中内置了MNIST数据集,其中测试集包含60000条数据,验证集包含10000条数据,为单通道的灰度图片,每张图片的像素大小为2828。一共包含10个类别,为数字0到9。
  导入相关模块:importthenecessarypackagesimportnumpyasnpfromkeras。utilsimportnputilsfromkeras。optimizersimportAdamfromkeras。preprocessing。imageimportImageDataGeneratorfromkeras。modelsimportSequentialfromkeras。layers。convolutionalimportConv2Dfromkeras。layers。convolutionalimportMaxPooling2Dfromkeras。layers。coreimportActivationfromkeras。layers。coreimportFlattenfromkeras。layers。coreimportDensefromkerasimportbackendasKfromkeras。modelsimportloadmodel
  载入MNIST数据集
  Keras可实现多种神经网络模型,并可以加载多种数据集来评价模型的效果,下面我们使用代码自动加载MNIST数据集。loadminitdatafromkeras。datasetsimportmnist(xtrain,ytrain),(xtest,ytest)mnist。loaddata()
  显示MNIST训练数据集中的前面6张图片:plot6imagesasgrayscaleimportmatplotlib。pyplotaspltplt。subplot(321)plt。imshow(xtrain〔0〕,cmapplt。getcmap(gray))plt。subplot(322)plt。imshow(xtrain〔1〕,cmapplt。getcmap(gray))plt。subplot(323)plt。imshow(xtrain〔2〕,cmapplt。getcmap(gray))plt。subplot(324)plt。imshow(xtrain〔3〕,cmapplt。getcmap(gray))plt。subplot(325)plt。imshow(xtrain〔4〕,cmapplt。getcmap(gray))plt。subplot(326)plt。imshow(xtrain〔5〕,cmapplt。getcmap(gray))showplt。show()
  数据的预处理
  首先,将数据转换为4维向量〔samples〕〔width〕〔height〕〔pixels〕,以便于后面模型的输入reshapethedatatofourdimensions,duetotheinputofmodelreshapetobe〔samples〕〔width〕〔height〕〔pixels〕xtrainxtrain。reshape(xtrain。shape〔0〕,28,28,1)。astype(float32)xtestxtest。reshape(xtest。shape〔0〕,28,28,1)。astype(float32)
  为了使模型训练效果更好,通常需要对图像进行归一化处理normalizationxtrainxtrain255。0xtestxtest255。0
  最后,原始MNIST数据集的数据标签是09,通常要将其表示成onehot向量。如训练数据标签为1,则将其转化为向量〔0,1,0,0,0,0,0,0,0,0〕onehotytrainnputils。tocategorical(ytrain)ytestnputils。tocategorical(ytest)
  模型的建立与计算
  训练模型的参数设置:parametersEPOCHS10INITLR1e3BS32CLASSNUM10normsize28
  本文使用Lenet网络架构,下面定义Lenet网络结构,若要更改网络结构,如用VGGNet,GoogleNet,Inception,ResNets或自己构建不同的网络结构,可以直接在这一块函数内进行修改。definelenetmodeldeflmodel(width,height,depth,NBCLASS):modelSequential()inputShape(height,width,depth)ifweareusingchannelslast,updatetheinputshapeifK。imagedataformat()channelsfirst:fortensorflowinputShape(depth,height,width)firstsetofCONVRELUPOOLlayersmodel。add(Conv2D(20,(5,5),paddingsame,inputshapeinputShape))model。add(Activation(relu))model。add(MaxPooling2D(poolsize(2,2),strides(2,2)))secondsetofCONVRELUPOOLlayersmodel。add(Conv2D(50,(5,5),paddingsame))model。add(Activation(relu))model。add(MaxPooling2D(poolsize(2,2),strides(2,2)))first(andonly)setofFCRELUlayersmodel。add(Flatten())model。add(Dense(500))model。add(Activation(relu))softmaxclassifiermodel。add(Dense(NBCLASS))model。add(Activation(softmax))returntheconstructednetworkarchitecturereturnmodel
  再附上两个经典的模型:
  VGG16:importinspectimportosimportnumpyasnpimporttensorflowastfimporttimeVGGMEAN〔103。939,116。779,123。68〕classVgg16:definit(self,vgg16npypathNone):ifvgg16npypathisNone:pathinspect。getfile(Vgg16)pathos。path。abspath(os。path。join(path,os。pardir))pathos。path。join(path,vgg16。npy)vgg16npypathpathprint(path)self。datadictnp。load(vgg16npypath,encodinglatin1)。item()print(npyfileloaded)defbuild(self,rgb):loadvariablefromnpytobuildtheVGG:paramrgb:rgbimage〔batch,height,width,3〕valuesscaled〔0,1〕starttimetime。time()print(buildmodelstarted)rgbscaledrgb255。0ConvertRGBtoBGRred,green,bluetf。split(axis3,numorsizesplits3,valuergbscaled)assertred。getshape()。aslist()〔1:〕〔224,224,1〕assertgreen。getshape()。aslist()〔1:〕〔224,224,1〕assertblue。getshape()。aslist()〔1:〕〔224,224,1〕bgrtf。concat(axis3,values〔blueVGGMEAN〔0〕,greenVGGMEAN〔1〕,redVGGMEAN〔2〕,〕)assertbgr。getshape()。aslist()〔1:〕〔224,224,3〕self。conv11self。convlayer(bgr,conv11)self。conv12self。convlayer(self。conv11,conv12)self。pool1self。maxpool(self。conv12,pool1)self。conv21self。convlayer(self。pool1,conv21)self。conv22self。convlayer(self。conv21,conv22)self。pool2self。maxpool(self。conv22,pool2)self。conv31self。convlayer(self。pool2,conv31)self。conv32self。convlayer(self。conv31,conv32)self。conv33self。convlayer(self。conv32,conv33)self。pool3self。maxpool(self。conv33,pool3)self。conv41self。convlayer(self。pool3,conv41)self。conv42self。convlayer(self。conv41,conv42)self。conv43self。convlayer(self。conv42,conv43)self。pool4self。maxpool(self。conv43,pool4)self。conv51self。convlayer(self。pool4,conv51)self。conv52self。convlayer(self。conv51,conv52)self。conv53self。convlayer(self。conv52,conv53)self。pool5self。maxpool(self。conv53,pool5)self。fc6self。fclayer(self。pool5,fc6)assertself。fc6。getshape()。aslist()〔1:〕〔4096〕self。relu6tf。nn。relu(self。fc6)self。fc7self。fclayer(self。relu6,fc7)self。relu7tf。nn。relu(self。fc7)self。fc8self。fclayer(self。relu7,fc8)self。probtf。nn。softmax(self。fc8,nameprob)self。datadictNoneprint((buildmodelfinished:ds(time。time()starttime)))defavgpool(self,bottom,name):returntf。nn。avgpool(bottom,ksize〔1,2,2,1〕,strides〔1,2,2,1〕,paddingSAME,namename)defmaxpool(self,bottom,name):returntf。nn。maxpool(bottom,ksize〔1,2,2,1〕,strides〔1,2,2,1〕,paddingSAME,namename)defconvlayer(self,bottom,name):withtf。variablescope(name):filtself。getconvfilter(name)convtf。nn。conv2d(bottom,filt,〔1,1,1,1〕,paddingSAME)convbiasesself。getbias(name)biastf。nn。biasadd(conv,convbiases)relutf。nn。relu(bias)returnreludeffclayer(self,bottom,name):withtf。variablescope(name):shapebottom。getshape()。aslist()dim1fordinshape〔1:〕:dimdxtf。reshape(bottom,〔1,dim〕)weightsself。getfcweight(name)biasesself。getbias(name)Fullyconnectedlayer。Notethattheoperationautomaticallybroadcaststhebiases。fctf。nn。biasadd(tf。matmul(x,weights),biases)returnfcdefgetconvfilter(self,name):returntf。constant(self。datadict〔name〕〔0〕,namefilter)defgetbias(self,name):returntf。constant(self。datadict〔name〕〔1〕,namebiases)defgetfcweight(self,name):returntf。constant(self。datadict〔name〕〔0〕,nameweights)
  GoogleNet:fromkeras。modelsimportModelfromkeras。utilsimportplotmodelfromkerasimportregularizersfromkerasimportbackendasKfromkeras。layersimportInput,Flatten,Dense,Dropout,BatchNormalization,concatenatefromkeras。layers。convolutionalimportConv2D,MaxPooling2D,AveragePooling2DGlobalConstantsNBCLASS20LEARNINGRATE0。01MOMENTUM0。9ALPHA0。0001BETA0。75GAMMA0。1DROPOUT0。4WEIGHTDECAY0。0005LRN2DNORMTrueDATAFORMATchannelslastTheano:channelsfirstTensorflow:channelslastUSEBNTrueIMWIDTH224IMHEIGHT224EPOCH50defconv2Dlrn2d(x,filters,kernelsize,strides(1,1),paddingsame,dilationrate(1,1),activationrelu,usebiasTrue,kernelinitializerglorotuniform,biasinitializerzeros,kernelregularizerNone,biasregularizerNone,activityregularizerNone,kernelconstraintNone,biasconstraintNone,lrn2dnormLRN2DNORM,weightdecayWEIGHTDECAY):l2normalizationifweightdecay:kernelregularizerregularizers。l2(weightdecay)biasregularizerregularizers。l2(weightdecay)else:kernelregularizerNonebiasregularizerNonexConv2D(filtersfilters,kernelsizekernelsize,stridesstrides,paddingpadding,dilationratedilationrate,activationactivation,usebiasusebias,kernelinitializerkernelinitializer,biasinitializerbiasinitializer,kernelregularizerkernelregularizer,biasregularizerbiasregularizer,activityregularizeractivityregularizer,kernelconstraintkernelconstraint,biasconstraintbiasconstraint)(x)iflrn2dnorm:batchnormalizationxBatchNormalization()(x)returnxdefinceptionmodule(x,params,concataxis,paddingsame,dilationrate(1,1),activationrelu,usebiasTrue,kernelinitializerglorotuniform,biasinitializerzeros,kernelregularizerNone,biasregularizerNone,activityregularizerNone,kernelconstraintNone,biasconstraintNone,lrn2dnormLRN2DNORM,weightdecayNone):(branch1,branch2,branch3,branch4)paramsifweightdecay:kernelregularizerregularizers。l2(weightdecay)biasregularizerregularizers。l2(weightdecay)else:kernelregularizerNonebiasregularizerNone1x1pathway1Conv2D(filtersbranch1〔0〕,kernelsize(1,1),strides1,paddingpadding,dilationratedilationrate,activationactivation,usebiasusebias,kernelinitializerkernelinitializer,biasinitializerbiasinitializer,kernelregularizerkernelregularizer,biasregularizerbiasregularizer,activityregularizeractivityregularizer,kernelconstraintkernelconstraint,biasconstraintbiasconstraint)(x)1x13x3pathway2Conv2D(filtersbranch2〔0〕,kernelsize(1,1),strides1,paddingpadding,dilationratedilationrate,activationactivation,usebiasusebias,kernelinitializerkernelinitializer,biasinitializerbiasinitializer,kernelregularizerkernelregularizer,biasregularizerbiasregularizer,activityregularizeractivityregularizer,kernelconstraintkernelconstraint,biasconstraintbiasconstraint)(x)pathway2Conv2D(filtersbranch2〔1〕,kernelsize(3,3),strides1,paddingpadding,dilationratedilationrate,activationactivation,usebiasusebias,kernelinitializerkernelinitializer,biasinitializerbiasinitializer,kernelregularizerkernelregularizer,biasregularizerbiasregularizer,activityregularizeractivityregularizer,kernelconstraintkernelconstraint,biasconstraintbiasconstraint)(pathway2)1x15x5pathway3Conv2D(filtersbranch3〔0〕,kernelsize(1,1),strides1,paddingpadding,dilationratedilationrate,activationactivation,usebiasusebias,kernelinitializerkernelinitializer,biasinitializerbiasinitializer,kernelregularizerkernelregularizer,biasregularizerbiasregularizer,activityregularizeractivityregularizer,kernelconstraintkernelconstraint,biasconstraintbiasconstraint)(x)pathway3Conv2D(filtersbranch3〔1〕,kernelsize(5,5),strides1,paddingpadding,dilationratedilationrate,activationactivation,usebiasusebias,kernelinitializerkernelinitializer,biasinitializerbiasinitializer,kernelregularizerkernelregularizer,biasregularizerbiasregularizer,activityregularizeractivityregularizer,kernelconstraintkernelconstraint,biasconstraintbiasconstraint)(pathway3)3x31x1pathway4MaxPooling2D(poolsize(3,3),strides1,paddingpadding,dataformatDATAFORMAT)(x)pathway4Conv2D(filtersbranch4〔0〕,kernelsize(1,1),strides1,paddingpadding,dilationratedilationrate,activationactivation,usebiasusebias,kernelinitializerkernelinitializer,biasinitializerbiasinitializer,kernelregularizerkernelregularizer,biasregularizerbiasregularizer,activityregularizeractivityregularizer,kernelconstraintkernelconstraint,biasconstraintbiasconstraint)(pathway4)returnconcatenate(〔pathway1,pathway2,pathway3,pathway4〕,axisconcataxis)classGoogleNet:staticmethoddefbuild(width,height,depth,NBCLASS):INPSHAPE(height,width,depth)imginputInput(shapeINPSHAPE)CONCATAXIS3Dataformat:tensorflow,channelslast;theano,channelslastifK。imagedataformat()channelsfirst:INPSHAPE(depth,height,width)imginputInput(shapeINPSHAPE)CONCATAXIS1xconv2Dlrn2d(imginput,64,(7,7),2,paddingsame,lrn2dnormFalse)xMaxPooling2D(poolsize(2,2),strides2,paddingsame)(x)xBatchNormalization()(x)xconv2Dlrn2d(x,64,(1,1),1,paddingsame,lrn2dnormFalse)xconv2Dlrn2d(x,192,(3,3),1,paddingsame,lrn2dnormTrue)xMaxPooling2D(poolsize(2,2),strides2,paddingsame)(x)xinceptionmodule(x,params〔(64,),(96,128),(16,32),(32,)〕,concataxisCONCATAXIS)3axinceptionmodule(x,params〔(128,),(128,192),(32,96),(64,)〕,concataxisCONCATAXIS)3bxMaxPooling2D(poolsize(2,2),strides2,paddingsame)(x)xinceptionmodule(x,params〔(192,),(96,208),(16,48),(64,)〕,concataxisCONCATAXIS)4axinceptionmodule(x,params〔(160,),(112,224),(24,64),(64,)〕,concataxisCONCATAXIS)4bxinceptionmodule(x,params〔(128,),(128,256),(24,64),(64,)〕,concataxisCONCATAXIS)4cxinceptionmodule(x,params〔(112,),(144,288),(32,64),(64,)〕,concataxisCONCATAXIS)4dxinceptionmodule(x,params〔(256,),(160,320),(32,128),(128,)〕,concataxisCONCATAXIS)4exMaxPooling2D(poolsize(2,2),strides2,paddingsame)(x)xinceptionmodule(x,params〔(256,),(160,320),(32,128),(128,)〕,concataxisCONCATAXIS)5axinceptionmodule(x,params〔(384,),(192,384),(48,128),(128,)〕,concataxisCONCATAXIS)5bxAveragePooling2D(poolsize(1,1),strides1,paddingvalid)(x)xFlatten()(x)xDropout(DROPOUT)(x)xDense(outputdimNBCLASS,activationlinear)(x)xDense(outputdimNBCLASS,activationsoftmax)(x)CreateaKerasModelmodelModel(inputimginput,output〔x〕)model。summary()SaveaPNGoftheModelBuildplotmodel(model,tofile。。imgsGoogLeNet。png)returntheconstructednetworkarchitecturereturnmodel
  设置优化方法,loss函数,并编译模型:modellmodel(widthnormsize,heightnormsize,depth1,NBCLASSCLASSNUM)optAdam(lrINITLR,decayINITLREPOCHS)model。compile(losscategoricalcrossentropy,optimizeropt,metrics〔accuracy〕)
  本文使用生成器以节约内存:UsegeneratorstosavememoryaugImageDataGenerator(rotationrange30,widthshiftrange0。1,heightshiftrange0。1,shearrange0。2,zoomrange0。2,horizontalflipTrue,fillmodenearest)Hmodel。fitgenerator(aug。flow(xtrain,ytrain,batchsizeBS),stepsperepochlen(xtrain)BS,epochsEPOCHS,verbose2)
  结果分析
  作出训练阶段的损失、精确度迭代图,本文将epoch设置为10,已达到0。98的准确率(代码、图像如下所示)。plottheiterationprocessNEPOCHSplt。figure()plt。plot(np。arange(0,N),H。history〔loss〕,labelloss)plt。plot(np。arange(0,N),H。history〔acc〕,labeltrainacc)plt。title(TrainingLossandAccuracyonmnistimgclassifier)plt。xlabel(Epoch)plt。ylabel(LossAccuracy)plt。legend(loclowerleft)plt。savefig(。。figureFigure2。png)
  公众号:帕帕科技喵
  欢迎关注与讨论

夏商西周兴亡说课稿下面是小编收集的人教版历史七年级上册《夏商西周兴亡》说课稿,欢迎阅读!尊敬的各位评委老师:大家好,今天我说课的题目是人教版七年级历史上册第第二单元国家的产生和社会的……人音版一年级上册龙咚锵导学案教学目标:1、用轻快、有弹性的声音有感情的演唱歌曲,表现过年的愉快心情。2、了解多元文化,培养学生的表现能力。教学重难点:休止符的演唱。一、教学过程:……热爱生命教学设计教学目的:1。感受作者对生命的热爱之情。2。学会通过对意象的把握和分析体会作者的感情。3。体会本诗的语言魅力。4。以积极主动的态度和充沛的情感投入到文章……基色解释及造句基色拼音【注音】:jise基色解释【意思】:见原色。基色造句1、当然,它的基色是粉红色的。2、穿着的时候,裤子、裙子、鞋子或者钱包必须有一样……分数应用题【教学内容】p98页练习十九611。【教学要求】1、复习分数应用题的结构特征和解题规律,能正确运用单位1的量分率分率的对应量。2、能正确分析分率句,把握分数应用题的解题的关键。……丁丁冬冬学识字(三)3教案教学要求:1、知识与技能:(1)学习部首:鱼、贝。(2)认字11个,写字3个。(3)积累相关词语。2、过程与方法:利用形声字的特点识字学词。……关于失败的歇后语歇后语是汉语一种特殊语言形式。它一般将一句话分成两部分来表达某个含义,前一部分是隐喻或比喻,后一部分是意义解释。下面是关于失败歇后语集锦,请参考!歇后语是中国劳动人民自古……郦道元三峡阅读练习题及答案三峡自三峡七百里中,两岸连山,略无阙处。重岩叠嶂,隐天蔽日,自非亭午夜分,不见曦月。至于夏水襄陵,沿泝阻绝。或王命急宣,有时朝发白帝,暮到江陵,其间千二百里,虽乘奔……统计分析数据教学案例分析〔教学目标〕1、知识目标:学生通过对期中考试成绩的统计分析,使学生掌握数据筛选、数据排序、分类汇总的基本操作。2、能力目标:以学生自主、合作、探究的学习方法,通过对……义务教育课程标准实验教科书语文(人教版)七年级下册单元说明第探险,既是人对自然的探索,又是人对自身的挑战。本单元的主题是探险。人类对未知世界的好奇心与生俱来。为此,一批批探险家出现了,他们的探索和发现,推动了文明的进步。近现代以来……中班数学活动图形娃娃活动来源:《图形娃娃》这节课,主要是要求幼儿巩固和进一步认识各种图形。幼儿的思维是具体形象的,在学习过程中要着重感知事物的明显特征。然而几何图形的认识往往过于单调、抽象。……人音版第13册行进中的歌教案教材:人民音乐出版社第13册第四单元教学年级:七年级课型:欣赏课课时:一课时教学内容:欣赏《中国人民解放军进行曲》《婚礼进行曲》《葬礼进行曲》(片断)、……
语文考试反思200字范文语文考试考完了,反思写好了吗?下面是小编为大家收集的关于语文考试反思200字范文,欢迎大家阅读!语文考试反思200字范文一:语文卷子的第一题和第二题我没有错,所以,我要继……标点符号教学反思标点符号是书面语中用来表示停顿、语调和语词的性质和作用的符号,常用的标点符号有句号、分号、逗号、顿号、冒号、问号、叹号、引号、括号、破折号、省略号、书名号等。下面是我对标点符号……学会看病教案设计教学目标1认识11个生字。联系上下文或、词典理解打蔫、残忍、喋喋不休、雪上加霜、按图索骥、艰涩、忐忑不安等词语。2有感情地朗读课文,体会母亲对儿子的爱。课时安……课文让学生动起来教学反思范文新课程改革已全面实施。今年,我校的九年级化学课也使用了新课程标准(沪教版)实验教材。新课程改革的宗旨是要改变课程实施过程中过于强调接受学习、死记硬背、机械训练的现状,倡导学生主……爱惜粮食为国分忧同学们,当我们看到鲜艳的五星红旗冉冉升起,当我们唱起雄壮的国歌时,我们心中充满了自豪和幸福。我们为自己是伟大的中华人民共和国公民而自豪,我们为今天的幸福生活而歌唱。但同时,你们……小学花的勇气教案一、教学目标:1、认识4个生字。2、正确、流利、有感情地朗读课文。3、理解含义深刻的词句的意思,领会作者语言的精妙。4、理解作者对生命的感悟,树立无所畏……对不同学习程度的学生,巧献锦囊妙计张浩淼一贯领跑型:抢占复习中的制高点开学前诊断领跑型的考生主要指那些所谓的尖子生,其奋斗目标直指北大、清华、复旦等名校录取。这些学生具有良好的学习习惯,领悟和……扬起自信的风帆的教案设计教学目标:1看到自己的进步,发现自己的长处。2理解自信心与实力之间的关系。3告诉学生个人自信与民族自信的关系。教学重点掌握树立和增强自信的三种基本……知而不言的造句【中文】:知而不言【读音】:zhrbyn【正音】:言;不能读成yn。【辨形】:不;不能写成卞。【知而不言的意思】:明明知道不说。【出处】:《庄子列……五年级长方体和正方体的体积的教学反思本课学习之前,孩子们们已经掌握了长方体体积的计算公式Vabh和正方体体积的计算公式Va3,为了沟通这两个公式之间的联系,减轻学生记忆的负担,培养学生的抽象概括能力,也为以后学习……与朱元思书语文教学设计【教学目标】一、知识与能力目标1。切实掌握文言基本知识,夯实文言基础。2。充分利用朗读与想象,培养文言语感,激发学习文言文的兴趣。3。品味写景的妙语佳句……主动认错教学目标认知:1、知道主动承认错误是诚实的表现,有利于自己的进步。2、知道隐瞒错误是错上加错,而且危害大。情感:1、自己做错了事,愿意主动承认。……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网