学习预测加载

内容目录

1 PrefetchDNS 2

1.1 prefetchDNS干了什么 2

1.2 哪些地方调用了prefetchDns 5

1.3 flushPendingDNS 8

1.4 DNSCacheDb 8

2 PreConnect 9

2.1 preconnect作了什么 9

2.2 哪些地方调用了preconnect 10

2.2.1 浏览器原本调用preconnect的地方 10

2.2.2 earlybird新加入的调用点 10

2.3 ConnectionCache 11

3 资源预测加载 11

3.1 做了什么 11

3.2 调用点 12

4 Java层的调用者已经没用了 12

5 Db里的数据 13

5.1 模型数据的获取 14

5.2 数据保存 15

5.3 启动时数据的加载和predication数据的从新组织 16

5.4 predication数据的使用 19

6 性能测试 19





1 PrefetchDNS

1.1 prefetchDNS干了什么

这个函数只是触发一个prefetchDNS的意愿,具体操作下层已经被封装好了。

EarlyBird::prefetchDNS

-〉WebCore::prefetchDNS,这个定义在core/platform/network/DNS.cpp中

-〉WebKit::Platform::current()->prescientNetworking().这其实是调用了:

/content/renderer/renderer_webkitplatformsupport_impl.cc:303:RendererWebKitPlatformSupportImpl::prescientNetworking()的prefetchDNS函数。RendererWebKitPlatformSupportImpl类实际上是render这边的platform实现类。放到了content模块里面,可见content模块不光是对外提供接口,适配webkit,也对webkit提供平台相关的实现。

如何实现DNS预取?

getContentClient()->render()是Content_render_client.cc中

getContentClient()->browser()是Content_browser_client.cc中。

而classAwContentRendererClient : public content::ContentRendererClient{是android_webview下的实现。但是AwContentRenderClient的GetPrescientNetworking函数是空的。所以,实际上好像用的是:

WebKit::WebPrescientNetworking*

ChromeContentRendererClient::GetPrescientNetworking() {

return prescient_networking_dispatcher_.get(); }其中PrescientNetworkingDispatcher是关键。

class PrescientNetworkingDispatcher: public WebKit::WebPrescientNetworking。定义与dolphin_blink/chrome/ render/net下。这个类实现了prefetchDNS和preconnect.


void PrescientNetworkingDispatcher::prefetchDNS(

const WebKit::WebString& hostname) {

if (hostname.isEmpty())

return;


std::string hostname_utf8 = UTF16ToUTF8(hostname);

net_predictor_.Resolve(hostname_utf8.data(),hostname_utf8.length());

}

Net_predictor是RendererNetPredictor。

void RendererNetPredictor::DnsPrefetchNames(size_t max_count) {

…

RenderThread::Get()->Send(newChromeViewHostMsg_DnsPrefetch(names));} //本质上发送消息给browser处理。

.dolphin_blink/chrome/browser/renderer_host/chrome_render_message_filter.cc:95:

IPC_MESSAGE_HANDLER(ChromeViewHostMsg_DnsPrefetch, OnDnsPrefetch),可见browser部分的render_host模块里处理了这个消息。

实际工作由/chorme/browser/net/Predictor完成:

void Predictor::DnsPrefetchList(const NameList& hostnames),任务会被分配的browser的io线程的queue里面。

->ResolveList()

->AppendToResolutionQueue().

之后LookupRequest*request = new LookupRequest(this, host_resolver_, url);

Request.start()

->HostResolver::resolve()完成之后调用LookupRequest::OnLookupFinished()。

HostResolve::resolve干了什么:

HostResolverImpl::Resolve(),创建一个job.然后加入到jobs队列里面。Job.schedule()把Job加入dispather.

class HostResolverImpl::Job : public PrioritizedDispatcher::Job,

先尝试从hosts列表里面找如果有就不用从网络上找了,ServeFromHosts就是干这个的。

此外,会启动job:

Job::start()

->StartDnsTask()会创建一个DNSTask并start它。

Class HostResolverImpl::DnsTask.

DNSTask.start()会创建一个DnsTransaction,并start这个transaction.Transaction会创建DnsAttempt,或者是DnsUDPAttempt或者是DnsTCPAttempt,并start这些attempt.他们有个状态机,有个DoLoop(),在loop里面会使用socket发送数据接受数据等。Response来了会把数据读出来,然后调用DnsResponse::InitParse来解析。完成后,各种callback,回到OnTransactionComplete(),他会解析response,得到addresslist:

DnsResponse::Result result =response->ParseToAddressList(&addr_list, &ttl);

之后可能会有个排序,然后调用transaction的OnSuccess(),它调用callback_.Run(),传递接过出去。然后Job::OnDnsTaskComplete()调用HostResolverImpl::OnDnsTaskResolve()通知完成也会调用Job::CompleteRequests()

->resolver_->dispatcher_.OnJobFinished();通知dispatcher一个job完成了可以启动别的job了。

resolver_->CacheResult(key_,entry, ttl);//通过resolver保存到HostCache里面,HostCache里面维护了一个hostname到addrlist的映射map.

req->OnComplete(entry.error, entry.addrlist);

那么HostCache究竟保存在哪里?被谁维护?创建HostResolver时传入了HostCache,但是是谁创建的HostResolver?

IoThread里面有个结构体Globals,里面维护了HostResolver的ref引用。保证它不被释放。在IoThread的initAsync里面会创建这些iothread的数据,包括hostresolver.同时HostCache也被创建,并被传引用给使用者。

HostResolver::CreateSystemResolver(const Options& options,NetLog* net_log) {

scoped_ptr<HostCache> cache;

if (options.enable_caching)

cache =HostCache::CreateDefaultCache();

return scoped_ptr<HostResolver>(newHostResolverImpl(

cache.Pass(),

GetDispatcherLimits(options),

HostResolverImpl::ProcTaskParams(NULL,options.max_retry_attempts),

net_log));

}

1.2 哪些地方调用了prefetchDns

原有的调用点:

  • Chrome::mouseDidMoveOverElement(,鼠标路过一个连接时

  • HTMLAnchorElement::parseAttribute,解析文档的anchor元素时

  • HTMLLinkElement.cpp中的HTMLLinkElement::parseAttribute()调用HTMLLinkElement::process()调用了LinkStyle::process()调用了LinkLoader::loadLink(),而LoadLink调用了prefetchDns。解析link元素的内容时。

新加入的EarlyBird::prefetchDns调用点:

  • HTMLResourcePreloader::preload(),在HTMLParser解析html的空闲时,比如等待script时会启动一个preloadscanner来scan网页内容看有没有需要预先加载的资源,如果有就会加载该资源,加载的方法是:loadingDocument->fetcher()->preload()可见也是会走到resourceFetcher()的,不过走的是preload。如果取消这里预取DNS的操作,转而只在ResourceFetcher::loadResource()那里预取可以么?看代码里面发现,这一步最终也会走到ResourceFetcher::requestResource里,继而又可能会走到ResourceFetcher::loadResource那里,所以貌似这一步可以省略掉,即可以合并到ResourceFetcher::loadResource里。在加载之前,可以预取一下dns.这个调用点的调用场景有如下几种:

    调用点1:HTMLDocumentParser::pumpTokenizer处理每个token时,并且是在waitforscript时才会scan来看是否有需要preload的资源。

    ->HTMLPreloadScanner::scan(HTMLResourcePreloader* preloader,const KURL& startingBaseElementURL)

    ->HTMLResourcePreloader::takeAndPreload()

    ->HTMLResourcePreloader::preload(PassOwnPtr<PreloadRequest>preload)

    ->earlyBird::prefetchDns


调用点2:此外,HTMLDocumentParser::didReceiveParsedChunkFromBackgroundParser()也是在waitforscript时

->HTMLResourcePreloader::takeAndPreload()


HTMLDocumentParser里面有很多处调用preloader的地方,类似的都是在parser空闲,等待script时才触发preloader的scan操作来看是否有需要preload的资源.问题:preloadscanner究竟scan什么东西?那些东西是被认为是可以预取的?HTMLPreloadscanner通过TokenPreloadScanner来扫描token,获取到可以预先加载的资源信息,然后根据这些信息构造出preloadrequest,让preloader去预先加载。在TokenPreloadScanner::StartTagScanner::processAttribute()函数中可以看到,当遇到script或者img节点时,这些节点都是需要被加载的,当解析他们的attributes时,如果遇到src属性,就把其属性值作为一个需要预取的资源地址。记录下来(调用setUrlToLoad),当后来要构造Preloadrequest时,就可以用这里记录的地址了:TokenPreloadScanner::StartTagScanner::createPreloadRequest函数就是用这个地址创建preloadrequest的。TokenPreloadScanner::scan其实就是通过扫描token然后创建preloadrequest的。而TokenPreloadScaner::scan是被HTMLPreloadScanner::scan调用的。拿到了request之后,就可以用HTMLResourcePreloader::takeAndPreload(PreloadRequestStream&r)来处理这些request了。这里的stream其实就是一个request构成的vector。循环加载其中的request:HTMLResourcePreloader::preload(PassOwnPtr<PreloadRequest>preload), 这个函数就调用Document里面的ResourceFetcher的preload函数来加载这个request.可以看出这里加载的内容其实是在拿到了主网页,并解析的过程中,预加载其中包含的子资源。

  • DocumentLoader::startLoadingMainResource(), 加载主网页时,提前预取dns.并且依据oracle里面的资源数据,预取预测的资源的dns.如果加载主网页时现在不预取的话什么时候获取dns?其实,估计加载主resource,也会走到resourceFetcher里面,所以预取DNS的操作我觉得也可以合并到ResourceFetcher::loadResource里面,当然,如果提前的话更好。

  • ResourceFetcher::loadResource() 预取真正要加载的资源的dns。

    目前可以看到针对preloader和mainresource的加载时机和ResourceFetcher::loadResource有些重复,但是其实是把prefetchDns的操作提前了一些。对于系统本来就要预加载的资源,可以在决定要预加载那些资源的时刻就立刻启动dns预取。在决定要加载主资源时,也立刻预取dns,比推迟到ResourceFetcher::loadResource要好。对于一些并没有预加载的资源,就只能推迟到ResourceFetcher::loadResource那里了。

    如果不预取的话,会是什么时候获取的?可以在HostResolver的相关函数里面加一个断点看Callstack。

    如果不prefetchDns的话,Document的ResourceFetcher::requestResource()->resourceFetcher::load()->ResourceLoader::create()每个resourcerequest创建一个resourceLoader->ResourceLoader::start()->WebURLLoader::loadAsynchronously()

    WebURLLoader的client是ResourceLoader。WebURLLoaderImpl::Context是context.

    ->WebURLLoaderImpl::Context::start()

    ->创建ResourceLoaderBridge,然后ResourceLoaderBridge::start

    下面具体可以参看打开tab的流程

1.3 flushPendingDNS

  • 暂时没有被用到

1.4 DNSCacheDb

作用:目前只是避免重复prefetchDNS操作

维护了一个hashset的被resolved的hostname

还维护了一个pendinghost将一些resolve操作缓存起来以后一起提交,但是这个机制目前没有生效,是否可以去掉?

2 PreConnect

2.1 preconnect作了什么

和prefetchDns类似,处理的逻辑在PrescientNetworkingDispatcher里。也是发送消息给browser.

void PrescientNetworkingDispatcher::preconnect(

const WebKit::WebURL& url,

WebKit::WebPreconnectMotivation motivation) {

if (isPreconnectEnabledForMotivation(motivation))

content::RenderThread::Get()->Send(newChromeViewHostMsg_Preconnect(url));

}

在browser这边:dolphin_blink/chrome/browser/render_host/chrome_render_message_filter.cc文件中有:ChromeRenderMessageFilter::OnMessageReceived:

IPC_MESSAGE_HANDLER(ChromeViewHostMsg_Preconnect, OnPreconnect),

和prefetchDns类似,具体操作也是由实际工作由/chorme/browser/net/Predictor完成:

-〉Predictor::PreconnectUrl()

->dolphin_blink/chrome/browser/net/preconnect.cc中的PreconnectOnIOThread()

->HttpStreamFactoryImpl::PreconnectStreams

->intHttpStreamFactoryImpl::Job::Preconnect(int num_streams)

->intHttpStreamFactoryImpl::Job::StartInternal() {

一个状态机,启动

-〉intHttpStreamFactoryImpl::Job::RunLoop(int result) {

-〉intHttpStreamFactoryImpl::Job::DoLoop(int result) {

→ 继续看,以后网络连接这块可以再深入看看。

2.2 哪些地方调用了preconnect

2.2.1 浏览器原本调用preconnect的地方

HTMLAnchorElement::PrefetchEventHandler::prefetch(), 这个函数是处理anchorelement时作出预先连接。实际上这个prefetch()的调用点有:

  • HTMLAnchorElement::PrefetchEventHandler::handleMouseOver(Event*event)

    鼠标over一个anchorelement上面的事件发生时

  • voidHTMLAnchorElement::PrefetchEventHandler::handleLeftMouseDown(Event*event)

    鼠标down在一个anchorelement时

  • HTMLAnchorElement::PrefetchEventHandler::handleGestureTapUnconfirmed(Event*event)

    手势动作

  • HTMLAnchorElement::PrefetchEventHandler::handleGestureTapDown(Event*event)

    手势down

2.2.2 earlybird新加入的调用点

  • DocumentLoader::startLoadingMainResource()

    加载主资源时,预先连接

    从plo中找出潜在的子资源的地址,预先连接

  • voidHTMLResourcePreloader::preload(PassOwnPtr<PreloadRequest>preload)

    预加载子资源时,预先连接。

  • ResourceFetcher::loadResource

    正式加载子资源时,提前建立连接。

2.3 ConnectionCache

HashMap<void*, HostCountMap*>m_preconnectedHostPortPair;

一个Doc*对应一个map,map里面是key和链接数的映射,key是域名和端口组成的字符串.

这个结构用来记录链接的域名,端口,在开启一个新的链接前检查一个文档对于一个域名的连接数,不能超过限制。

Hittestconnection并没有使用。可以去掉?

3 资源预测加载

3.1 做了什么

根据网页的url找出预测的资源的url,提前加载资源。

DocumentLoader::startLoadingSpeculativeResource()

->Downloader::prefetchResource()//针对每个资源

->ResourceFetcher::requestSpeculativeResource()

->ResourceFetcher::requestResource

3.2 调用点

基本上所有准备加载主资源的地方都要加载预测资源:

  1. FrameLoader::init()

  2. FrameLoader::loadWithNavigationAction()

4 Java层的调用者已经没用了

Java层有一些PLO相关代码:

DolphinBrowserEn下:

./src/mobi/mgeek/TunnyBrowser/BrowserActivity.java:1911: NetworkPLOFactory.getInstance().updatePloData();

DolphinCoreLibrary下:

./src/com/dolphin/browser/dolphinwebkit/DolphinNetworkPLO.java:32: * @see com.dolphin.browser.core.INetworkPLO#updatePloData()

./src/com/dolphin/browser/dolphinwebkit/DolphinNetworkPLO.java:35: public void updatePloData() {

./src/com/dolphin/browser/dolphinwebkit/DolphinNetworkPLO.java:36: sCoreInstance.updatePloData();

./src/com/dolphin/browser/core/NullNetworkPLO.java:24: publicvoid updatePloData() {

./src/com/dolphin/browser/core/INetworkPLO.java:11: public voidupdatePloData();

dolphinwebview下:

./src/dolphin/webkit/PLO.java:42: public final void updatePloData() {

./src/dolphin/webkit/PLO.java:44: JniUtil.updatePloData(); //

./src/dolphin/webkit/WebkitCallback.java:21: // TODO: when most jetpack are upgraded, we could moveupdatePloData()

./src/dolphin/webkit/WebkitCallback.java:23: // PLO.getInstance().updatePloData();

./src/dolphin/webkit/JniUtil.java:271: public static synchronized void updatePloData() {

上述调用jni的updatePloData接口,native实现在PageLoadOracle.cpp中的voidjniUtil_updatePloData()。是为了从java层调用plo的保存操作。现在已经不再使用了,是否可以去掉?或者依然保持对shell的接口?

5 Db里的数据

Resourcefile: r.plo

recordFile: p.plo

resource文件格式:

loop()

{

urllen 1byte int

url urllen bytes 字串没有尾巴0

charsetlen 1 byte int

charset charsetlen bytes 字串,没有尾巴0

lastvisittime 4bytes int

resourceType 1 byte enum

}

record文件格式:

loop()

{

webpageurllen 1byte int

webpageurl webpageurllen bytes, 字符串

lastvisittime 4bytes int

resource_cnt 1 byte int

resourceids resource_cnt resource ids, int

}

5.1 模型数据的获取

数据怎么来的?

每在一个网页上加载了一个资源就调用:

void PageLoadHistoryDb::reportPageLoadResource(const KURL&webPageUrl, const KURL& resourceUrl, String resourceCharset,PageLoadResourceType resourceType)


webPageUrl是document->baseUrl().

ResourceUrl就是资源url,是resourceFetcher::requestResource()里需要加载的资源url.

这个函数做如下几件事:

  • 记录resource

    记录下resource的url, charset, type, lastvisit time, 生成一个resourceid.、

    db::m_resource保存所有的resource,是resource的 vector.

    db::m_resourceUrl2IdMap是一个resourceurl => resource id的映射

  • 生成record

    一个record和一个网页document的baseurl关联。描述了一个网页的资源加载情况

    如果record已经有了,使用已有的

    db::m_update:保存所有的record信息,一个vector

    db::m_updateUrl2IdMap: 维护从webpage=>recordid的映射

    把刚加载的resourceid和本record关联,record里有一个vector来保存所有加载的资源id

5.2 数据保存

当所有AwContent实例被释放时,就会保存数据。所以这个不需要shell触发

Record的保存:

record有两种,一种是browser启动后新加载的资源对应的record,保存在db::m_update里,还有一种是启动时从数据文件里读取的以往的历史记录,保存在m_record里。

优先保存m_update里面的内容。

Loop(for record: records)

{

webpageurl= record.webpageurl; //得到webpageurl

if(webpageurl处理过)continue; //跳过webpageurl相同的

vec<resourceids>= record.getresourceIds(); //拿到该page加载过得resourceid

// 按照record文件格式写文件

write(webpageurl);

write(resourceids)

write(lastvisit time)

}

上面的resourceid保存前,做了一些过滤,去掉resourceurl太长的,和非法的,比如url是空的。然后从新排序得到新的resourceid后写到文件里。

Resource信息的保存:

保存record时,去掉了一些resource,所以这里保存新的resource

5.3 启动时数据的加载和predication数据的从新组织

启动时,record数据加载到db::m_record和m_recordUrl2IdMap里。

resource数据加载到m_resource和m_resourceUrl2IdMap里。

此时,m_update是空的。

initPageLoadPredictionData()对所有的record组织后生成方便predication使用的数据。

基本过程:循环遍历每一个record:

因为一个record对应一个webpageurl.把webpageurlsplit成不同的domain串:news.sina.com.cn可以包括sina.com.cn和news.sina.com.cn.

为每一各不同domain串生成一个predication结构。所以一个record可能生成多个prediction结构。每个结构对应一个domain串。当然不同的record可能会共享相同的domain串。也就会共享同一个predication结构。这样该predication结构的计数就会增加,用以表明该prediction对应的domain的使用频率。这个变量是:PageLoadPredicatio.m_webPageCount。

把该record加载过的资源id都取出来,找到对应资源的信息,加入到每个prediction里面。PageLoadPrediction::m_resourceMap保存了resourceid=>resource 访问频率的映射。

从每个资源url中可以提取资源的domain,所以可以把资源的domain保存到prediction里面。表示该prediction可能需要的资源domain.这个可以用来作为DNS解析和tcp预链接用到的domain.

为了便于保存,可以把所有资源的urldomain保存到一个m_domain里面,然后只在predication里面保存id.

PageLoadPrediction::m_domainMap保存了domainID=> domian访问频率的映射。

当所有的record处理完毕,就有了一如下关系的数据:


不同的网页doman串-----match---- 不同的predication---包含----资源1(id,freq),资源2(id,freq) resource_domain1(id,freq), resource_domain2(id,freq).

上述freq是重复频率的意思。资源和资源的domain是会重复的。他代表了一个域名所对应的若干相关网页里某些资源被重复使用的频率。以此作为筛选排序的准则。

之后,对所有predication中资源和资源domain数据排序,得到:

PageLoadPredication::m_predictedResource--- 排序过后的resourceid

PageLoadPredication::m_predictedDnsDomain和m_predictedTcpDomain---排序过后的resourcedomain.

筛除意义不大的predication:

有些prefection里面的数据量比较少,如果

PageLoadPredicatio::m_webPageCount<PREDICTION_MIN_WEBPAGE_COUNT,m_webPageCount表示为该predication提供过信息的record的数量。也就是网页的数量。或者说为这个domain做过贡献的webpage的数量。数量过低,说明该在domain上访问的网页比较少。可以ignore.该predication.


ResourceDomain 分DNS和tcp两种:就是哪些domain用来prefetchDNS,哪些用来tcppre connect.原则:

在一个predication内:

根据一个domain.freq/predication.m_webPagCOunt就是该domain的使用百分比。

建立tcp链接和dns解析都对使用百分比有要求。tcp链接要求更高。

百分比高的domain优先建立tcp链接,数量达到tcp链接上限后剩下的如果达到dns解析的百分比要求,就进行dns解析。Tcp链接和dns解析都有上限。

//1. if predict percentage is larger thanPREDICTION_MIN_TCP_DOMAIN_RATE, add it to domain candidate for TCPconnect

//2. if predict percentage is larger thanPREDICTION_MIN_DNS_DOMAIN_RATE, add it to domain candidate for DNSresolve

//3. if domain candidate count for TCP connect is larger thanPREDICTION_TOPK_TCPDOMAIN, keep top PREDICTION_TOPK_TCPDOMAIN onesand leave others for DNS resolve

//4. if domain candidate count for DNS connect is larger thanPREDICTION_TOPK_DNSDOMAIN, keep top PREDICTION_TOPK_TCPDOMAIN onesand drop others

//Example:

// d1 (100%), d2 (99%), d3 (98%), d4 (97%), d5 (90%), d6(90%),d7(80%), d8(50%)

// PREDICTION_MIN_TCP_DOMAIN_RATE = 95%,PREDICTION_MIN_DNS_DOMAIN_RATE = 75%

// PREDICTION_TOPK_TCPDOMAIN = 2, PREDICTION_TOPK_DNSDOMAIN =3

//

//based on predict percentage only,

// candidate for TCP connect: d1 (100%), d2 (99%), d3 (98%), d4 (97%)

// candidate for DNS resolve: d5 (90%), d6 (90%), d7 (80%)

//considered restricted prediction count(PREDICTION_TOPK_TCPDOMAIN,PREDICTION_TOPK_DNSDOMAIN)

// candidate for TCP connect: d1 (100%), d2 (99%)

// candidate for DNS resolve: d3 (98%), d4 (97%), d5 (90%)


对每个predication进行上面的domain的筛选后,一个predication内部就有了:

OwnPtr<Vector<uint32_t>> m_predictedDnsDomain; 保存了可以用来dns预取的domainid.

OwnPtr<Vector<uint32_t>> m_predictedTcpDomain; 保存了可以建立链接的domainid.

5.4 predication数据的使用

voidDocumentLoader::startLoadingMainResource()加载网页时,除了可以prefetch该网页自己域名的DNS外。对于资源,可以根据这个网页的url拿到他的domain,根据domain从predication列表里找匹配的predication,然后取出该predication里面保存的m_predictedDnsDomain。这几是需要prefetch的DNSdomain. 需要建立链接的domain在m_predictedTcpDomain里保存着。

6 性能测试

服务器现在不可用,手动脚本测试:

  1. 运行测试输入网站列表,得到log.

  2. 分析log得到输出结果,简化输出,每行只需要包括网站地址,耗时。

  3. 循环执行1,2得到不同的输出log文件在一个目录下,文件名为1.log,2.log.....

  4. 写一个脚本,加载所有的log文件并把同样网址的耗时取平均值打印出来。


en的top移动站点:

http://m.wikipedia.org

http://m.dictionary.com

http://mozcalc.herokuapp.com/

http://harmmade.com/

http://library.texthtml.net/

http://m.youtube.com

http://acrylicstyle.com/

https://bamm.tv/

http://phone.mensaapp.org/

http://ozon.sonar1.mobi/

http://feinstaubinfo.at/

http://m.wallcup.com/

http://m.thefancy.com/

https://m.airbnb.com

http://beta.drglearning.com/client/

http://cabra.hathix.com/chevre/

http://dictionary.almapps.com/

http://iliterobotics.org/

http://m.le-guide-sante.org/

http://littlealchemy.com/touch/

http://read.alezaa.com

https://www.moneytrail.net/

https://youzeek.com

http://touch.dailymotion.com/

http://www.asahitechnologies.com/

http://www.metacritic.com/

http://www.theoutlinerofgiants.com/

http://www.google.com

https://www.yahoo.com/

http://www.amazon.com

http://m.espn.go.com

http://m.foxnews.com/

http://m.ebay.com/

http://mobile.walmart.com/

http://t.msn.com/

http://www.yandex.ru/

https://m.wellsfargo.com

http://edition.cnn.com/

http://cn.bing.com/

http://m.huffpost.com/us/

http://toma.hk/

http://m.flikie.com

http://www.metacafe.com/

http://geekshadow.github.io/rtl2player/

http://www.menshealth.co.uk/_mobile

http://www.elle.com/_mobile/

http://m.imdb.com

http://www.wikia.com/Wikia

http://m.videobash.com/

http://gorillavid.in/


没有预测模型代码的build使用buddytest122

有预测模型的build使用buddytest155

使用资源模型后,通过采集记录数据后跑一次如下网站的耗时:

http://m.wikipedia.org 16.77

http://m.dictionary.com 18.40

http://mozcalc.herokuapp.com/ 2.62

http://harmmade.com/ 5.49

http://library.texthtml.net/ 30.02

http://m.youtube.com 30.02

http://acrylicstyle.com/ 30.02

https://bamm.tv/ 30.19

http://phone.mensaapp.org/ 3.01

http://ozon.sonar1.mobi/ 510.35

http://feinstaubinfo.at/ 100.00

http://m.wallcup.com/ 100.00

http://m.thefancy.com/ 100.00

https://m.airbnb.com 100.00

http://beta.drglearning.com/client/ 100.00

http://cabra.hathix.com/chevre/ 100.00

http://dictionary.almapps.com/ 100.00

http://iliterobotics.org/ 100.00

http://m.le-guide-sante.org/ 100.00

http://littlealchemy.com/touch/ 100.00

http://read.alezaa.com 100.00

https://www.moneytrail.net/ 100.00

https://youzeek.com 100.00

http://touch.dailymotion.com/ 100.00

http://www.asahitechnologies.com/ 100.00

http://www.metacritic.com/ 100.00

http://www.theoutlinerofgiants.com/ 4.48

http://www.google.com 14.87

https://www.yahoo.com/ 5.51

http://www.amazon.com 14.14

http://m.espn.go.com 29.94

http://m.foxnews.com/ 19.74

http://m.ebay.com/ 5.10

http://mobile.walmart.com/ 4.51

http://t.msn.com/ 9.51

http://www.yandex.ru/ 29.90

https://m.wellsfargo.com 5.99

http://edition.cnn.com/ 6.94

http://cn.bing.com/ 1.88

http://m.huffpost.com/us/ 9.62

http://toma.hk/ 33.30

http://m.flikie.com 5.94

http://www.metacafe.com/ 30.04

http://geekshadow.github.io/rtl2player/ 6.13

http://www.menshealth.co.uk/_mobile 12.09

http://www.elle.com/_mobile/ 7.12

http://m.imdb.com 26.56

http://www.wikia.com/Wikia 9.84

http://m.videobash.com/ 29.96

http://gorillavid.in/ 4.74


使用没有资源模型的代码跑一次网站列表的耗时:

http://m.wikipedia.org 13.65

http://m.dictionary.com 9.34

http://mozcalc.herokuapp.com/ 2.65

http://harmmade.com/ 4.31

http://library.texthtml.net/ 9.34

http://m.youtube.com 30.11

http://acrylicstyle.com/ 29.93

https://bamm.tv/ 13.02

http://phone.mensaapp.org/ 8.77

http://ozon.sonar1.mobi/ 690.28

http://feinstaubinfo.at/ 100.00

http://m.wallcup.com/ 100.00

http://m.thefancy.com/ 100.00

https://m.airbnb.com 100.00

http://beta.drglearning.com/client/ 100.00

http://cabra.hathix.com/chevre/ 100.00

http://dictionary.almapps.com/ 100.00

http://iliterobotics.org/ 100.00

http://m.le-guide-sante.org/ 100.00

http://littlealchemy.com/touch/ 100.00

http://read.alezaa.com 100.00

https://www.moneytrail.net/ 100.00

https://youzeek.com 100.00

http://touch.dailymotion.com/ 100.00

http://www.asahitechnologies.com/ 100.00

http://www.metacritic.com/ 100.00

http://www.theoutlinerofgiants.com/ 100.00

http://www.google.com 100.00

https://www.yahoo.com/ 100.00

http://www.amazon.com 100.00

http://m.espn.go.com 100.00

http://m.foxnews.com/ 100.00

http://m.ebay.com/ 3.81

http://mobile.walmart.com/ 5.50

http://t.msn.com/ 9.53

http://www.yandex.ru/ 10.42

https://m.wellsfargo.com 6.48

http://edition.cnn.com/ 5.87

http://cn.bing.com/ 1.92

http://m.huffpost.com/us/ 12.85

http://toma.hk/ 30.24

http://m.flikie.com 13.38

http://www.metacafe.com/ 9.27

http://geekshadow.github.io/rtl2player/ 29.81

http://www.menshealth.co.uk/_mobile 29.98

http://www.elle.com/_mobile/ 30.13

http://m.imdb.com 29.82

http://www.wikia.com/Wikia 29.98

http://m.videobash.com/ 30.05

http://gorillavid.in/ 10.85

深度学习deepctr 推荐算法召回youtube和排序deepfm,保存与加载、预测和部署 参考:https://github.com/shenweichen/DeepCTR 1、youtube召回算法 深度召回算法dssm,fm,ncf,sdm,mind 用tensorflow 1.X,不然deepmatch会报eager错误 import pandas as pd from sklearn.utils import shuffle from sklearn.model_selection import train_test_split from deepctr.inputs import Sp 阅读详情

相关推荐

光伏功率预测Python机器学习项目实战:从数据加载到模型调参避坑指南

光伏功率预测是新能源领域典型的回归任务,核心在于利用历史发电功率与气象因素预测未来功率输出。其原理基于机器学习模型捕捉辐照度、温度等特征与功率间的非线性关系,技术价值在于提升预测精度以支持电网调度。应用场景涵盖光伏电站运维、电力系统规划等。本文分享一份完整的Python机器学习光伏功率预测项目源码,包含训练与测试数据,详细拆解环境配置、特征工程、模型训练与评估,并总结五个常见避坑点,帮助算法工程师和学生快速上手。

weixin_29085865的博客 236

什么是 Preload、Prefetch 和 Preconnect?

今天我们将研究一下能显著提升页面性能的方法 —— 资源提示与指令。你也许听说过 preload,prefetch 和 preconnect,可是我们想研究的更深一点,搞清他们之间的区别并且充分的利用它们。它们带来的好处包括允许前端开发人员来优化资源的加载,减少往返路径并且在浏览页面时可以更快的加载到资源。 Preload Preload 是一个新的控制特定资源如何被加载的新的 Web 标准,这是已经在 2016 年 1 月废弃的 subresource prefetch 的升级版。这个指令可以在 &lt

CamilleZJ的博客 3669

宿舍网速跑不满?可能是PPPoE的锅!实测OpenWrt切换DHCP+深澜认证,轻松跑满校园百兆宽带

本文探讨了校园网PPPoE协议的性能瓶颈问题,并提供了通过OpenWrt路由器切换DHCP+深澜认证的技术方案,实测可显著提升网速至百兆宽带满速。文章详细介绍了配置步骤、性能对比及常见问题解决方案,帮助用户优化校园网体验。

weixin_31310913的博客 386

深入理解 WKWebView (渲染篇) —— DOM 树的构建

当客户端 App 主进程创建 WKWebView 对象时,会创建另外两个子进程:渲染进程与网络进程。主进程 WKWebView 发起请求时,先将请求转发给渲染进程,渲染进程再转发给网络进程,网络进程请求服务器。如果请求的是一个网页,网络进程会将服务器的响应数据 HTML 文件字符流吐给渲染进程。渲染进程拿到 HTML 文件字符流,首先要进行解析,将 HTML 文件字符流转换成 DOM 树,然后在 DOM 树的基础上,进行渲染操作,也就是布局、绘制。最后渲染进程通知主进程

lihui49的博客 7464

通过python下载西门子技术中心文档

本篇文章纯粹记录如何下载通过python下载西门子技术中心文档,所下载文档完全自己学习使用,非商业用途

John_09040211的博客 561

AI编码的“黑箱危机”终结者:OpenSpec如何让你的代码从“猜谜”变“契约”?

OpenSpec的真正价值,在于它将AI编码从"经验驱动"推向"契约驱动"——当人类与AI对"目标是什么"达成显式共识,编码就从"猜谜游戏"变成了"工程实现"。这种转变不仅提升效率,更重塑了开发者与AI的关系:AI从"替代者"回归"协作者",而人类则聚焦于"定义正确的事"而非"正确地做事"。对于开发者,OpenSpec提供了驾驭AI的缰绳;对于团队,它构建了协作的基石;对于行业,它预示着AI编码工业化的开端。

haolove527的专栏 1350

浏览器预加载扫描器的词法分析器实现

浏览器的预加载扫描器通过一个高度简化的词法分析器,在 HTML 还未完全解析时,提前提取关键资源标签,大幅度提升了首屏渲染性能。而这个词法器不像传统编译器要求“精度”,而是设计为“足够快、足够准”的compromise 工具。比完美更重要的是及时。

2401_86373285的博客 812

实战分享:一文读懂RS-232总线

RS-232标准接口(又称EIARS-232)是常用的串行通信接口标准之一,它是由美国电子工业协会(Electronic IndustryAssociation,EIA)联合贝尔系统公司、调制解调器厂家及计算机终端生产厂家于1970年共同制定,其全名是“数据终端设备(DTE)和数据通信设备(DCE)之间串行二进制数据交换接口技术标准”。

阿荣嵌入式 8523

SmartPhone上调试成难题?

今天用vs2005写个smartphone的小程序想调试一下,结果却发现没法调试,在网上搜索半天,又是看什么安全策略又是看什么数字签名的,最后找到个老兄给出的方法,试了一下是可行的,拿出来给大家分享一下:把C:/Program Files/Microsoft Visual Studio 8/SmartDevices/SDK/SDKTools/sdkcerts.cab拷贝到设备上,运行该文件。然

kerlw的专栏 2100

H.264 Profile与Level详解:如何为不同应用场景选择合适的编码配置

本文深入解析了H.264编码标准中的Profile与Level概念,指导开发者如何为不同应用场景选择合适的配置。文章对比了Baseline、Main和High三大Profile的特性与适用场景,并解释了Level如何限定视频的分辨率、帧率与码率上限。通过实战指南,帮助读者在视频通话、在线点播和专业制作等场景中,平衡画质、兼容性与性能,实现高效编码。

rgv2345678的博客 241

AI硬件加速:CPU vs GPU性能对比

AI硬件加速:CPU vs GPU性能对比 关键词:人工智能、硬件加速、CPU、GPU、性能对比、硬件架构、并行计算、优化策略、项目实战 摘要: 本文将深入探讨AI

AI天才研究院 1914

Chromium扩展(Extension)通信机制分析

Chromium的Extension由Page和Content Script组成。如果将Extension看作是一个App,那么Page和Content Script就是Extension的Module。既然是Module,就避免不了需要相互通信。也正是由于相互通信,使得它们形成一个完整的App。本文接下来就分析Extension的Page之间以及Page与Content Script之间的通信机制。

老罗的Android之旅 6万+

SPICE仿真软件:Ngspice_(2).安装与配置

在Netlist文件中直接定义模型。V1 1 0 5R1 2 0 1k* Analysis库文件中可以包含多种电路元件模型和参数。

kkchenjj的博客 1588

Python----机器学习(PyTorch模型的保存与加载+预测)

在 PyTorch 中,模型的保存与加载以及预测的过程相对简单。首先,可以通过 `torch.save()` 方法将模型的状态字典(`state_dict`)保存到指定的文件中,以便于后续使用。加载模型时,使用 `torch.load()` 方法读取保存的文件,并通过 `model.load_state_dict()` 将参数加载到模型中。为了进行预测,需要将模型设置为评估模式(`model.eval()`),然后使用输入数据进行前向传播,得到预测结果。这一流程确保了模型在训练和推断阶段的一致性与可复用性。

weixin_64110589的博客 1457

001、NPU是什么?为什么嵌入式设备需要它?

本文通过作者调试工业相机板卡的经历,引出嵌入式设备为何需要NPU(神经网络处理器)的探讨。文章对比了CPU和NPU的设计哲学差异,指出NPU通过专用乘加器阵列和优化的数据流,能高效处理神经网络运算。作者分析了嵌入式设备使用NPU的三大优势:算力提升、功耗降低和实时性保障,并介绍了三类常见NPU形态。通过一个YOLOv5模型调试案例,揭示了NPU使用中的常见陷阱,最后给出五条实用建议,强调理解NPU原理和局限的重要性。文章生动展现了NPU在嵌入式AI应用中的关键作用。

m0_50546716的博客 127

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

机器学习如何预测Web应用性能?从首屏加载到服务延迟

应用性能预测是可观测性与AIOps的核心能力,其本质是将时序指标转化为可决策的风险概率。原理上依赖特征工程对多源数据(如RUM、Prometheus、OpenTelemetry)进行对齐建模,结合XGBoost、LightGBM或Prophet等算法实现分钟级延迟/错误率预测。技术价值在于变被动告警为主动干预,显著降低MTTR并支撑容量预判。典型场景覆盖大促流量洪峰下的FCP劣化预警、微服务调用链P99延迟漂移识别等。本文聚焦真实生产案例中的特征构建逻辑与模型选型依据,详解如何避免时序失真与基线偏差。

weixin_33217202的博客 256

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

深度学习模型推理实战:参数保存、加载与预测

机器学习的最终目标是将训练好的模型应用于新数据,这依赖于模型的参数持久化与高效推理。在深度学习工程实践中,训练与推理是两个截然不同的阶段:训练依赖反向传播与梯度更新,而推理仅需前向传播。理解模型本质上是一组权重矩阵与偏置数组,以及固定的计算顺序,是掌握模型加载与预测的关键。本文以手写数字识别为例,使用NumPy实现模型参数的保存与加载,并详解推理阶段的前向传播、softmax数值稳定性、数据预处理一致性以及批量维度处理等核心细节。通过实际代码演示,帮助开发者避开准确率骤降、nan输出等常见陷阱,并实现从Nu

weixin_29054399的博客 204

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

JAVA学习-练习试用Java实现“使用Deeplearning4j加载预训练的模型 :进行迁移学习或预测任务”

以下是一个简单的示例,展示如何使用Deeplearning4j加载预训练的模型,并使用它进行迁移学习或预测任务。在上面的代码中,我们首先使用'KerasModelImport'类来加载预训练的Keras模型。这里我们假设你有一个ResNet-50的模型,它的JSON配置和权重文件已经放在了类路径中。然后,我们设置了模型的输入类型,这是根据你的输入数据的大小来确定的。(文章为作者在学习java过程中的一些个人体会总结和借鉴,如有不当、错误的地方,请各位大佬批评指正,定当努力改正,如有侵权请联系作者删帖。

weixin_69763181的博客 426

Spark 中利用 MLflow 加载机器学习模型并对 pandas-on-Spark DataFrame 进行预测

本文围绕 Apache Spark 的 pandas-on-Spark(即 `pyspark.pandas`)与 MLflow 的集成模块 `pyspark.pandas.mlflow` 展开,系统讲解如何把任意实现了 MLflow `pyfunc` flavor 的模型(scikit-learn、PyTorch、TensorFlow 等)加载为统一的预测器,并直接作用在分布式 pandas-on

gitblog_07678的博客 474

Keras加载模型进行预测,预测值一直为某一类

1、自定义模型 keras方便进行深度学习,我们可以像搭建积木一样去构建自己的识别网络、训练、保存得到最终的模型。 2、加载模型预测 在这里遇到了问题,发现预测的结构一直为某一类,且训练的样本没有出现不平衡现象,每类的样本比例都为1:1。困扰了好久,发现网上有人给出了答案,是图像加载的方式有问题: iamge_path = r"D:\tfTest\Negative\01324.jpg" ima =cv2.imread(iamge_path) ima_w , ima_h, channels = ima.sha

qq_42811161的博客 5269

处理新能源充电站负荷预测数据集并应用AI算法进行预测 可通过数据加载、预处理、特征工程等进行处理 通过大数据分析和机器学习,AI模型能够根据历史能耗数据、天气情况、对充电站的能耗进行精准预测等

处理新能源充电站负荷预测数据集并应用AI算法进行预测 可通过数据加载、预处理、特征工程等进行处理 通过大数据分析和机器学习,AI模型能够根据历史能耗数据、天气情况、对充电站的能耗进行精准预测等

2401_88440984的博客 1405

Keras学习(十)-加载已经训练好的模型进行预测(以全连接imdb为例)

#加载已经训练好的模型进行预测的 from keras.models import load_model from keras.layers.embeddings import Embedding from keras.preprocessing import sequence from keras.preprocessing.text import Tokenizer from keras.mo...

宋建国的博客 4102

【机器学习】Kaggle实战Rossmann商店销售预测(项目背景、数据介绍/加载/合并、特征工程、构建模型、模型预测)

使用商店、促销和竞争对手数据预测销售Rossmann在欧洲国家经营着3000多家日化用品超市。目前,Rossmann商店经理的任务是提前6周预测他们的日销售额。商店的销售受到许多因素的影响,包括促销、竞争、学校和国家假日、季节性和地域性。由于数以千计的管理者根据自己的特殊情况预测销售,结果的准确性可能会有很大的差异。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 1万+

PyTorch深度学习项目实战:从数据集加载到模型预测全流程

深度学习项目的落地不仅依赖算法设计,更需要打通从数据到推理的完整工程链路。在神经网络开发中,数据集加载、模型构建、训练循环、权重保存与预测推理是每个实践者必须掌握的基础能力。本文以PyTorch框架为核心,系统讲解如何通过Dataset与DataLoader高效管理图像数据,如何基于nn.Module构建可扩展的网络结构,并详细拆解训练过程中损失函数、优化器、学习率调度与模型评估的协同配合。同时,文章深入探讨了模型权重(state_dict)的保存与加载、断点续训以及批量预测等工程实践要点。这套标准化流程不

weixin_29079643的博客 193
上一篇: 学习广告过滤
下一篇: memory corruption检查的一些工具
csshell2002
博客等级 码龄11年 30粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值