Lazy懒加载(延迟加载)UITableView

qt qtablewidget懒加载实现无限动态添加(亲测可用) 效果图: 控制台效果: 源码如下: 主函数: 参考:chatgpt 阅读详情

           举个例子,当我们在用网易新闻App时,看着那么多的新闻,并不是所有的都是我们感兴趣的,有的时候我们只是很快的滑过,想要快速的略过不喜欢的内容,但是只要滑动经过了,图片就开始加载了,这样用户体验就不太好,而且浪费内存.

             这个时候,我们就可以利用lazy加载技术,当界面滑动或者滑动减速的时候,都不进行图片加载,只有当用户不再滑动并且减速效果停止的时候,才进行加载.

              刚开始我异步加载图片利用SDWebImage来做,最后试验的时候出现了重用bug,因为虽然SDWebImage实现了异步加载缓存,当加载完图片后再请求会直接加载缓存中的图片,注意注意注意,关键的来了,如果是lazy加载,滑动过程中是不进行网络请求的,cell上的图片就会发生重用,当你停下来能进行网络请求的时候,才会变回到当前Cell应有的图片,大概1-2秒的延迟吧(不算延迟,就是没有进行请求,也不是没有缓存的问题).怎么解决呢?这个时候我们就要在Model对象中定义个一个UIImage的属性,异步下载图片后,用已经缓存在沙盒中的图片路径给它赋值,这样,才cellForRowAtIndexPath方法中,判断这个UIImage对象是否为空,若为空,就进行网络请求,不为空,就直接将它赋值给cell的imageView对象,这样就能很好的解决图片短暂重用问题.

              @下面我的代码用的是自己写的异步加载缓存类,SDWebImage的加载图片的懒加载,会在后面的章节给出.(为什么不同呢,因为SDWebImage我以前使用重来不关心它将图片存储在沙盒中的名字和路径,但是要实现懒加载的话,一定要得到图片路径,所以在找SDWebImage如何存储图片路径上花了点时间)

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. @model类  
  2. #import <Foundation/Foundation.h>  
  3.   
  4. @interface NewsItem : NSObject  
  5.   
  6. @property (nonatomic,copy) NSString * newsTitle;  
  7. @property (nonatomic,copy) NSString * newsPicUrl;  
  8. @property (nonatomic,retain) UIImage * newsPic; //  存储每个新闻自己的image对象  
  9.   
  10. - (id)initWithDictionary:(NSDictionary *)dic;  
  11.   
  12. //  处理解析  
  13. + (NSMutableArray *)handleData:(NSData *)data;  
  14. @end  
  15.   
  16.   
  17. #import "NewsItem.h"  
  18. #import "ImageDownloader.h"  
  19.   
  20. @implementation NewsItem  
  21.   
  22. - (void)dealloc  
  23. {  
  24.     self.newsTitle = nil;  
  25.     self.newsPicUrl = nil;  
  26.     self.newsPic = nil;  
  27.     [super dealloc];  
  28. }  
  29.   
  30. - (id)initWithDictionary:(NSDictionary *)dic  
  31. {  
  32.     self = [super init];  
  33.     if (self) {  
  34.   
  35.   
  36.         self.newsTitle = [dic objectForKey:@"title"];  
  37.         self.newsPicUrl = [dic objectForKey:@"picUrl"];  
  38.           
  39.         //从本地沙盒加载图像  
  40.         ImageDownloader * downloader = [[[ImageDownloader alloc] init] autorelease];  
  41.         self.newsPic = [downloader loadLocalImage:_newsPicUrl];  
  42.   
  43.     }  
  44.   
  45.     return self;  
  46. }  
  47.   
  48. + (NSMutableArray *)handleData:(NSData *)data;  
  49. {  
  50.   
  51.         //解析数据  
  52.         NSError * error = nil;  
  53.         NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];  
  54.         NSMutableArray * originalArray = [dic objectForKey:@"news"];  
  55.   
  56.         //封装数据对象  
  57.         NSMutableArray * resultArray = [NSMutableArray array];  
  58.       
  59.         for (int i=0 ;i<[originalArray count]; i++) {  
  60.             NSDictionary * newsDic = [originalArray objectAtIndex:i];  
  61.             NewsItem * item = [[NewsItem alloc] initWithDictionary:newsDic];  
  62.             [resultArray addObject:item];  
  63.             [item release];  
  64.         }  
  65.   
  66.         return resultArray;  
  67.   
  68. }  
  69.   
  70. @end  

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. @图片下载类  
  2. #import <Foundation/Foundation.h>  
  3.   
  4.   
  5. @class NewsItem;  
  6.   
  7.   
  8. @interface ImageDownloader : NSObject  
  9.   
  10.   
  11. @property (nonatomic,copy) NSString * imageUrl;  
  12. @property (nonatomic,retain) NewsItem * newsItem; //下载图像所属的新闻  
  13.   
  14.   
  15. //图像下载完成后,使用block实现回调  
  16. @property (nonatomic,copy) void (^completionHandler)(void);  
  17.   
  18.   
  19. //开始下载图像  
  20. - (void)startDownloadImage:(NSString *)imageUrl;  
  21.   
  22.   
  23. //从本地加载图像  
  24. - (UIImage *)loadLocalImage:(NSString *)imageUrl;  
  25.   
  26.   
  27. @end  
  28.   
  29.   
  30.   
  31.   
  32. #import "ImageDownloader.h"  
  33. #import "NewsItem.h"  
  34.   
  35.   
  36. @implementation ImageDownloader  
  37.   
  38.   
  39. - (void)dealloc  
  40. {  
  41.     self.imageUrl = nil;  
  42.     Block_release(_completionHandler);  
  43.     [super dealloc];  
  44. }  
  45.   
  46.   
  47.   
  48.   
  49. #pragma mark - 异步加载  
  50. - (void)startDownloadImage:(NSString *)imageUrl  
  51. {  
  52.   
  53.   
  54.     self.imageUrl = imageUrl;  
  55.   
  56.   
  57.     // 先判断本地沙盒是否已经存在图像,存在直接获取,不存在再下载,下载后保存  
  58.     // 存在沙盒的Caches的子文件夹DownloadImages中  
  59.     UIImage * image = [self loadLocalImage:imageUrl];  
  60.   
  61.   
  62.     if (image == nil) {  
  63.   
  64.   
  65.         // 沙盒中没有,下载  
  66.         // 异步下载,分配在程序进程缺省产生的并发队列  
  67.         dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
  68.   
  69.   
  70.             // 多线程中下载图像  
  71.             NSData * imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]];  
  72.   
  73.   
  74.             // 缓存图片  
  75.             [imageData writeToFile:[self imageFilePath:imageUrl] atomically:YES];  
  76.   
  77.   
  78.             // 回到主线程完成UI设置  
  79.             dispatch_async(dispatch_get_main_queue(), ^{  
  80.   
  81.   
  82.                 //将下载的图像,存入newsItem对象中  
  83.                 UIImage * image = [UIImage imageWithData:imageData];  
  84.                 self.newsItem.newsPic = image;  
  85.   
  86.   
  87.                 //使用block实现回调,通知图像下载完成  
  88.                 if (_completionHandler) {  
  89.                     _completionHandler();  
  90.                 }  
  91.                   
  92.             });  
  93.               
  94.         });  
  95.     }  
  96.       
  97. }  
  98.   
  99. #pragma mark - 加载本地图像  
  100. - (UIImage *)loadLocalImage:(NSString *)imageUrl  
  101. {  
  102.   
  103.     self.imageUrl = imageUrl;  
  104.   
  105.   
  106.     // 获取图像路径  
  107.     NSString * filePath = [self imageFilePath:self.imageUrl];  
  108.   
  109.   
  110.     UIImage * image = [UIImage imageWithContentsOfFile:filePath];  
  111.   
  112.   
  113.     if (image != nil) {  
  114.         return image;  
  115.     }  
  116.   
  117.     return nil;  
  118. }  
  119.   
  120. #pragma mark - 获取图像路径  
  121. - (NSString *)imageFilePath:(NSString *)imageUrl  
  122. {  
  123.     // 获取caches文件夹路径  
  124.     NSString * cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];  
  125.   
  126.   
  127.     // 创建DownloadImages文件夹  
  128.     NSString * downloadImagesPath = [cachesPath stringByAppendingPathComponent:@"DownloadImages"];  
  129.     NSFileManager * fileManager = [NSFileManager defaultManager];  
  130.     if (![fileManager fileExistsAtPath:downloadImagesPath]) {  
  131.   
  132.   
  133.         [fileManager createDirectoryAtPath:downloadImagesPath withIntermediateDirectories:YES attributes:nil error:nil];  
  134.     }  
  135.   
  136.   
  137. #pragma mark 拼接图像文件在沙盒中的路径,因为图像URL有"/",要在存入前替换掉,随意用"_"代替  
  138.     NSString * imageName = [imageUrl stringByReplacingOccurrencesOfString:@"/" withString:@"_"];  
  139.     NSString * imageFilePath = [downloadImagesPath stringByAppendingPathComponent:imageName];  
  140.   
  141.   
  142.     return imageFilePath;  
  143. }  
  144.   
  145. @end  


[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. @这里只给出关键代码,网络请求,数据处理,自定义cell自行解决  
  2.   
  3. #pragma mark - Table view data source  
  4.   
  5. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView  
  6. {  
  7.     // Return the number of sections.  
  8.     return 1;  
  9. }  
  10.   
  11. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  
  12. {  
  13.     // Return the number of rows in the section.  
  14.     if (_dataArray.count == 0) {  
  15.         return 10;  
  16.     }  
  17.     return [_dataArray count];  
  18. }  
  19.   
  20. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  
  21. {  
  22.     static NSString *cellIdentifier = @"Cell";  
  23.     NewsListCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier ];  
  24.     if (!cell) {  
  25.         cell = [[[NewsListCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];  
  26.     }  
  27.   
  28.     NewsItem * item = [_dataArray objectAtIndex:indexPath.row];  
  29.   
  30.     cell.titleLabel.text = item.newsTitle;  
  31.   
  32.     //判断将要展示的新闻有无图像  
  33.   
  34.     if (item.newsPic == nil) {  
  35.         //没有图像下载  
  36.         cell.picImageView.image = nil;  
  37.           
  38.         NSLog(@"dragging = %d,decelerating = %d",self.tableView.dragging,self.tableView.decelerating);  
  39.         // ??执行的时机与次数问题  
  40.         if (self.tableView.dragging == NO && self.tableView.decelerating == NO) {  
  41.             [self startPicDownload:item forIndexPath:indexPath];  
  42.         }  
  43.   
  44.     }else{  
  45.         //有图像直接展示  
  46.         NSLog(@"1111");  
  47.         cell.picImageView.image = item.newsPic;  
  48.   
  49.     }  
  50.       
  51.     cell.titleLabel.text = [NSString stringWithFormat:@"indexPath.row = %ld",indexPath.row];  
  52.   
  53.     return cell;  
  54. }  
  55.   
  56. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath  
  57. {  
  58.     return [NewsListCell cellHeight];  
  59. }  
  60.   
  61. //开始下载图像  
  62. - (void)startPicDownload:(NewsItem *)item forIndexPath:(NSIndexPath *)indexPath  
  63. {  
  64.     //创建图像下载器  
  65.     ImageDownloader * downloader = [[ImageDownloader alloc] init];  
  66.   
  67.     //下载器要下载哪个新闻的图像,下载完成后,新闻保存图像  
  68.     downloader.newsItem = item;  
  69.   
  70.     //传入下载完成后的回调函数  
  71.     [downloader setCompletionHandler:^{  
  72.   
  73.         //下载完成后要执行的回调部分,block的实现  
  74.         //根据indexPath获取cell对象,并加载图像  
  75. #pragma mark cellForRowAtIndexPath-->没看到过  
  76.         NewsListCell * cell = (NewsListCell *)[self.tableView cellForRowAtIndexPath:indexPath];  
  77.         cell.picImageView.image = downloader.newsItem.newsPic;  
  78.   
  79.     }];  
  80.   
  81.     //开始下载  
  82.     [downloader startDownloadImage:item.newsPicUrl];  
  83.   
  84.     [downloader release];  
  85. }  
  86.   
  87.   
  88. - (void)loadImagesForOnscreenRows  
  89. {  
  90. #pragma mark indexPathsForVisibleRows-->没看到过  
  91.     //获取tableview正在window上显示的cell,加载这些cell上图像。通过indexPath可以获取该行上需要展示的cell对象  
  92.     NSArray * visibleCells = [self.tableView indexPathsForVisibleRows];  
  93.     for (NSIndexPath * indexPath in visibleCells) {  
  94.         NewsItem * item = [_dataArray objectAtIndex:indexPath.row];  
  95.         if (item.newsPic == nil) {  
  96.             //如果新闻还没有下载图像,开始下载  
  97.             [self startPicDownload:item forIndexPath:indexPath];  
  98.         }  
  99.     }  
  100. }  
  101.   
  102. #pragma mark - 延迟加载关键  
  103. //tableView停止拖拽,停止滚动  
  104. - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate  
  105. {  
  106.     //如果tableview停止滚动,开始加载图像  
  107.     if (!decelerate) {  
  108.   
  109.         [self loadImagesForOnscreenRows];  
  110.     }  
  111.      NSLog(@"%s__%d__|%d",__FUNCTION__,__LINE__,decelerate);  
  112. }  
  113.   
  114. - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView  
  115. {  
  116.     //如果tableview停止滚动,开始加载图像  
  117.     [self loadImagesForOnscreenRows];  
  118.   
  119. }  
UITableView实现对图片的展示 实现简单的UITableView对图片的显示。可以展示多张图片。 立即下载

相关推荐

MaxENT生态位模型实战:从数据准备到论文发表的完整指南

本文提供MaxENT生态位模型从数据准备到论文发表的完整实战指南,涵盖物种分布数据处理、环境变量筛选、参数优化及结果可视化等关键步骤。特别介绍如何通过R语言进行高级建模优化,提升模型AUC值,并分享海洋生物专题研究中的数据处理技巧。适合生态学研究者快速掌握这一强大的物种分布预测工具,产出高质量研究成果。

tensor9flow的博客 301

iOS实训笔记—UITableView预加载

IOS开发实训第十周周报 完成时间 2019.6.4 任课老师 郑贵锋 年级 2016级 专业(方向) 通软 学号 16340006 姓名 蔡倓 总结: 根据小组分工,本周我主要学习的是为提高app流畅度而使用的数据预加载方法 学习知识点归纳 1、加载策略 根据总行数,列表总高度,列表当前偏移值这三个数字决定是否要加载,这里自定义一个 Protocol判断是否需要进行加...

Cait_的博客 1241

使用PlotNeuralNet绘制深度学习网络图的基本操作

使用PlotNeuralNet绘制深度学习网络图的基本操作

weixin_46877907的博客 2110

iOS开发之UITableView(二)懒加载优化

iOS开发中,当代码过于依赖数据时就要考虑使用懒加载。。懒加载其实是一种getter方法,当数据变更时,只需要对数据的代码部分进行修改即可。 一下是一个示例程序: // //  ViewController.m //  0926UITableView02懒加载优化 // //  Created by weib on 15-9-

qq_28884869的博客 763

dify源码本地部署,dify k8s部署

Dify.AI 是一款简单易用且开源的 LLMOps 平台,帮助开发者更简单、更快速地创建 AI 应用。它的核心理念是通过可声明式的 YAML 文件定义 AI 应用的各个方面,包括 Prompt、上下文和插件等。Dify 提供了可视化的 Prompt 编排、运营、数据集管理等功能。这些功能使得开发者能够在数天内完成 AI 应用的开发,或将 LLM 快速集成到现有应用中,并进行持续运营和改进。

shykevin的博客 1015

基于Qt实现的轻量级CAD画图软件

基于Qt开发的轻量级CAD应用程序

weixin_44954230的博客 5658

lazy懒加载(延迟加载)UITableView

http://blog.youkuaiyun.com/hmt20130412/article/details/32173215

LBJ 2042

【任何电机可使用的七段式s曲线-----包括matlab代码和simulink仿真】

S形加加速(T1)→>匀加速(T2)→减加速(T3)→>匀速(T4 )>加减速(T5)>匀减速(T6)-→>减减速(T7)

weixin_44312889的博客 6309

tableView 懒加载

//1、慢慢滑动的时候 手离开屏幕 //2、快速滑,手离开屏幕 -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{     if (decelerate == YES) {         //说明手离开屏幕,但是tableview还在减速,说

zouzhezouzhejiudanle的专栏 649

第二次 PX4仿真环境搭建过程全记录

参考链接 https://blog.youkuaiyun.com/yanwumuxi/article/details/80097294 https://www.ncnynl.com/archives/201709/2013.html 一、安装依赖项 我们使用Debian / Ubuntu LTS 作为Linux的标准支持版本,但是也支持Cent OS 和 Arch Linux的发行版本。 权限设置 警告:永远...

移步换景的博客 2262

COMSOL网格划分技巧总结

在对马赫曾德尔型光学传感器进行模拟仿真时,在采用自动物理场自动控制网格-极细化的情况下透射谱曲线仍不理想,因此需要手动划分网格来对其进行更精细的剖分。 手动划分的基本原则是在作用边界,热点,曲边处做细致划分, 基底,包层等做粗略划分。对于光波导型的微纳结构,在仿真时一般需要用到创建边界层网格。 1.COMSOL所需要的网格数量 网格单元数越多,结果精细度越高,计算所需内存越多。在细化到一定程度后网格收敛,仿真结果提升不明显。 2.网格剖分类型 ...

qq_42453337的博客 4万+

swift学习第十六天:懒加载和tableView

懒加载 懒加载的介绍 swift中也有懒加载的方式 (苹果的设计思想:希望所有的对象在使用时才真正加载到内存中) 和OC不同的是swift有专门的关键字来实现懒加载 lazy关键字可以用于定义某一个属性懒加载 懒加载的使用 格式 lazy var 变量: 类型 = { 创建变量代码 }() 懒加载的使用 // 懒加载的本质...

weixin_30487201的博客 198

YOLO11 改进系列 | 引入2023年 MLCA 的 C3k2_MLCA 模块,近零参数开销的本地-全局通道注意力,适合检测与分割特征增强

本文提出将MLCA(混合局部通道注意力)模块嵌入YOLOv11的C3k2框架中,形成C3k2_MLCA改进结构。该模块通过5×5局部池化和1×1全局池化双路融合,结合ECA式Conv1d生成通道注意力,在几乎不增加参数量的前提下(仅增加66个参数),实现了局部空间信息与全局通道统计的联合建模。相比传统SE和ECA注意力,MLCA保留了空间分布信息,更适合实例分割等需要精细定位的任务。实验表明改进后模型参数量仅增加0.002%,计算量基本不变,是一种高效的注意力增强方案。

qq_44224801的博客 92

Swift-懒加载使用

// 懒加载    lazy var tableView : UITableView = {    let tempTableView = UITableView()    return tempTableView }() 转载于:https://www.cnblogs.com/WJJ-Dream/p/583041...

weixin_30629977的博客 91

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

深度学习工具包 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")

lazy懒载入(延迟载入)UITableView

举个样例,当我们在用网易新闻App时,看着那么多的新闻,并非全部的都是我们感兴趣的,有的时候我们仅仅是非常快的滑过,想要高速的略过不喜欢的内容,可是仅仅要滑动经过了,图片就開始载入了,这样用户体验就不太好,并且浪费内存. 这...

weixin_30932215的博客 133

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Swift- lazy 懒加载

我们在使用OC 的时候会写一些懒加载 用的的时候才创建 提高了系统的性能 Swift 给我们提供了一个属性 lazy 专门的延迟加载属性 方便了我们的编程 也提高了系统的性能 我们在写UI控件要多使用懒加载方式 import UIKit import Foundation let cellName: String = "myCell" class ViewController: UIVie

FIGHTING的专栏 2742

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: 上拉下拉的原理
下一篇: Block调用引起的内存泄露
SMY_API
博客等级 码龄13年 5粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值