首页 文章 精选 留言 我的

精选列表

搜索[AI造物大赏],共10000篇文章
优秀的个人博客,低调大师

1-AI--Activity生命周期

1.ActivityLifeCycle:测试生命周期的Activity 2.CommonActivity是一个普通的Activity 3.DialogActivity是对话框型的Activity activity生命周期.gif 一、Activity 1.ActivityLifeCycle.java public class ActivityLifeCycle extends AppCompatActivity { private static final String TAG = "ActivityLifeCycle"; @BindView(R.id.btn_task_activity) Button mBtnTaskActivity; @BindView(R.id.btn_dialog_activity) Button mBtnDialogActivity; @Override//Activity第一次创建时调用 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.ac_lifecycle); ButterKnife.bind(this); Log.e(TAG, "onCreate: "); Log.e("TASK_ID", "Task id is " + getTaskId()); } @Override//Activity可见的时候调用 protected void onStart() { super.onStart(); Log.e(TAG, "onStart: "); } @Override//Activity位于栈顶,获取焦点时调用 protected void onResume() { super.onResume(); Log.e(TAG, "onResume: "); } @Override//Activity移除栈顶,失去焦点时调用 protected void onPause() { super.onPause(); Log.e(TAG, "onPause: "); } @Override//由停止状态变为运行状态之前调用 protected void onRestart() { super.onRestart(); Log.e(TAG, "onRestart: "); } @Override//Activity不可见的时候调用 protected void onStop() { super.onStop(); Log.e(TAG, "onStop: "); } @Override//Activity销毁的时候调用 protected void onDestroy() { super.onDestroy(); Log.e(TAG, "onDestroy: "); } @OnClick({R.id.btn_task_activity, R.id.btn_dialog_activity}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.btn_task_activity: //跳转到TaskActivity startActivity(new Intent(this, TaskActivity.class)); break; case R.id.btn_dialog_activity: //跳转到DialogActivity startActivity(new Intent(this, DialogActivity.class)); break; } } } 2.CommonActivity.java public class CommonActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.ac_task); ButterKnife.bind(this); } } 3.DialogActivity public class DialogActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.ac_dialog); } } 二、生命周期测试结果: 1.打开:onCreate==>onStart==>onResume E/ActivityLifeCycle: onCreate: E/ActivityLifeCycle: onStart: E/ActivityLifeCycle: onResume: 2.跳转普通Activity:onPause==>onStop E/ActivityLifeCycle: onPause: E/ActivityLifeCycle: onStop: 3.从跳转的Activity返回:onRestart==>onStart==>onResume E/ActivityLifeCycle: onRestart: E/ActivityLifeCycle: onStart: E/ActivityLifeCycle: onResume: 4.跳转到对话框Activity:onPause E/ActivityLifeCycle: onPause: 5.从对话框Activity返回:onResume E/ActivityLifeCycle: onResume: 6.旋转屏幕(相当于关闭再开启):onPause==>onStop==>onDestroy==>onCreate==>onStart==>onResume E/ActivityLifeCycle: onPause: E/ActivityLifeCycle: onStop: E/ActivityLifeCycle: onDestroy: E/ActivityLifeCycle: onCreate: E/ActivityLifeCycle: onStart: E/ActivityLifeCycle: onResume: 7.关闭:onPause==>onStop==>onDestroy E/ActivityLifeCycle: onPause: E/ActivityLifeCycle: onStop: E/ActivityLifeCycle: onDestroy: 附录、布局: 1.ActivityLifeCycle布局:ac_lifecycle.xml <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/btn_task_activity" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:text="打开TaskActivity" android:textAllCaps="false" app:layout_constraintTop_toTopOf="parent" tools:layout_editor_absoluteX="30dp"/> <Button android:id="@+id/btn_dialog_activity" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:text="打开DialogActivity" android:textAllCaps="false" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.873" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"/> </android.support.constraint.ConstraintLayout> 2.CommonActivity布局:ac_task.xml <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/btn_start_self" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:text="打开自己" android:textAllCaps="false" app:layout_constraintTop_toTopOf="parent" tools:layout_editor_absoluteX="30dp"/> <Button android:id="@+id/button_start_others" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="8dp" android:layout_marginStart="8dp" android:layout_marginTop="16dp" android:text="打开别人" app:layout_constraintStart_toEndOf="@+id/btn_start_self" app:layout_constraintTop_toTopOf="parent"/> </android.support.constraint.ConstraintLayout> 3.DialogActivity布局:ac_dialog.xml <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="A01_DialogActivity" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" tools:layout_editor_absoluteY="233dp" tools:ignore="MissingConstraints"/> </android.support.constraint.ConstraintLayout> 4.DialogActivity对话框主题 <activity android:name=".DialogActivity" android:label="DialogActivity" android:theme="@style/Theme.AppCompat.Light.Dialog"> </activity> 后记、 1.声明: [1]本文由张风捷特烈原创,转载请注明 [2]欢迎广大编程爱好者共同交流 [3]个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正 [4]你的喜欢与支持将是我最大的动力 2.连接传送门: 更多安卓技术欢迎访问:安卓技术栈 我的github地址:欢迎star 简书首发,腾讯云+社区同步更新张风捷特烈个人网站,编程笔记请访问:http://www.toly1994.com 3.联系我 QQ:1981462002 邮箱:1981462002@qq.com 微信:zdl1994328 4.欢迎关注我的微信公众号,最新精彩文章,及时送达: 公众号.jpg

优秀的个人博客,低调大师

【AI科幻】地球陨落 · 全新世界

进入黑洞之后,醒来的周蒙和艾娃接触到了一个全新的世界。 不知经过了多长时间,迷迷糊糊之间,只听得周遭一片嘈杂声,慢慢的,周蒙睁开了眼睛,见到的是自己被一群人围观议论的场景,而在自己的身旁,艾娃也静静的躺在那里。 看到主角已醒,现场的议论声渐渐地停止。看到艾娃在自己身旁,脑子还处于懵逼状态的周蒙本能的赶紧摇醒了她。面对醒来第一眼就看到自己被人围观的情况,意识渐渐清醒的两人突然发现了不对劲,疑惑的看向彼此,眼中明显的表达出:这是哪里?我们不是被黑洞吸走了吗? “嘿,兄弟,你们是哪儿人啊?怎么穿着宇航服晕倒在中央广场?”见到周蒙两人情形,一个白皮肤、长着络腮大胡的壮汉问道。 “抱歉,我现在脑子还有点晕,请问这里是火星吗?”由于人生地不熟,周蒙回避了那个问题,并尝试打探一些消息。 听到周蒙的回答,壮汉僵了一下,以惊奇的眼光看着周蒙回答:“这里是地球啊!兄弟,虽然《火星救援VR》游戏很好玩,但也不要失去理智啊。”听到前半句,周蒙和艾娃的眼睛里明显闪过一丝亮光,可是听到后面的,两个人又懵了。《火星救援》是什么他俩都知道,毕竟作为宇航员,这部古老的电影还是看过的,可是,VR又是什么东西? 无奈之下,周蒙和艾娃只能采取“失忆”的万年老梗,以避免当前局面的尴尬,只说自己的最后印象是自己穿着宇航服站在火星上面。 不知是这里的人脑神经太粗,还是以这种方式出现的人太多,他们并没有什么疑惑。因为没有人认识他们,最后两人只得跟着一开始搭话的壮汉马特回他家。 在前往广场边缘的过程中,马特向周蒙两人大概介绍了一下现在的情况。据马特表述,现在是公元4500年,现在他们所待的这颗星球其实并不是真正的“地球”,而是另一颗宜居星球。至于真正的地球,早在公元3100年就因为能源枯竭而被人们所抛弃。 听到这个消息,周蒙和艾娃两人十分震惊。他们记得自己是被黑洞吸过来的,那么现在的情形应该是他们在黑洞中进行了一次时空穿越,直接到了1500年以后。 “帕克,过来接我。”当走到广场边缘时,马特对着手腕上的手表说了一句话,然后就没有声息了。就在周蒙和艾娃疑惑、打算上前询问之时,只看见一辆急速行驶、没有车胎的小轿车稳稳当当的停在了他们面前,并打开了前后座的车门。 带着惊讶的表情,两人被马特请进了后座。只见坐下之后,艾娃小声的“呀”了一声,原来除了外形独特之外,这辆汽车竟然是没有驾驶座和方向盘的,而马特也只是坐在了副驾驶。 作为一名汽车爱好者,周蒙实在按耐不住内心的激动,立马就向马特提出疑问。马特并没有立即回答,只是对着空气说了一串地址,然后汽车就漂浮起来,平稳的向前开去。 “这是无人驾驶悬浮汽车,你没见过吗?啊,对了,你们失忆了。”拍了拍脑门,马特才想起来现在他们两个是失忆人士。“这种汽车现在每个家庭都有,他不需要我们亲自动手驾驶,只要对着系统说出目的地就行,你看周围。” 周蒙和艾娃想着左右两边的窗户看去,只见半空中有很多这种小汽车,并且没有一辆是有驾驶员的,人们都只是坐在旁边干自己的事。 “马特,这究竟是怎么办到的?好神奇啊!”艾娃满脸好奇的追问。 马特笑道:“这你们可就问对人了,毕竟我是这方面的专家。”紧接着,马特就像他们解释了一下无人驾驶悬浮汽车的构造、原理以及相关技术等,包括深度学习算法、计算机视觉、语音识别、自然语言理解等被称之为“人工智能”技术的具体细节。马特还称,刚才他所呼叫的“帕克”就是这辆汽车的系统,并让其与周蒙两人打了招呼、聊了会儿天。 而就在艾娃听得一脸迷茫、周蒙却一脸痴迷的时候,经过几个空中红绿灯的帕克已经缓缓地停在了一栋公寓高层的延展平台上。 “主人,欢迎回家,请问有什么需要服务的?”刚下车,一道温柔的声音乍然响起,令初来乍到的两人受到了今天的又一次惊吓。 “哦~亲爱的丽娜,你吓到了我的客人了。”看到两人的反应,马特对着空气戏说道。“不要害怕,这是我的智能管家丽娜,就是我刚才在车上跟你们说的聊天机器人类似,只不过功能更全面。她可是我的依靠,没有她,我还真不知道怎么生活呢。” 随后,周蒙和艾娃走进了马特的家。一进去,只见到处都是类似人一样的机器,它们自发为马特更衣、按摩,或是打扫屋子、准备午餐,一切都在有条不絮的进行着。 被机器人牵引到沙发边坐下,直到感受到手中茶杯的热度,周蒙和艾娃两人才如梦似醒般,就差没掐自己看看自己是不是在做梦。 见两人眼中迷惑之色渐浓,为了待会儿饭桌上不被问东问西,已经被机器人舒缓筋骨的马特瘫在沙发上,直接向两人介绍了一下家中的情况。 “这些都是我做的机器人,由丽娜控制。它们已经具备了基本的意识,纵然没有我的命令,它们也会根据以往的习惯或是察言观色来为我进行服务,直到我做出其他的指令。” 根据马特的描述,周蒙两人了解到这是一种叫做“智能家居”的模式。除了语音命令机器人做各类事情之外,根据手环或是无人车的定位系统,丽娜会提前让机器人和智能家居用品提前启动,比如在夏冬两季提前开空调,让主人体会到极致的服务…… 听到这里,再进行一下联想,此时此刻,周蒙和艾娃才真的意识到了这里与自己星球的不同。 瞬间,他们心里达成了一个共识:找到穿越时空的方法,将这些技术带回母星,开始人工智能研究,将智能化时代提前,造福人类。 【未完待续】 原文发布时间: 2016-12-07 18:23 本文作者: 韩璐 本文来自云栖社区合作伙伴镁客网,了解相关信息可以关注镁客网。

优秀的个人博客,低调大师

苹果AI秀——Core ML强势来袭

前言 最近WWDC2017刚刚过去两周,作为iOS客户端开发的我,看到了苹果高逼格的Core ML,决定花两天研究研究。 其实机器学习在移动端应用已经有了一定的支持了,Caffe2 已经支持iOS、Android移动端上的应了,但今年iOS11中的Core ML将大大降低了机器学习的门槛。因此,写一篇自己的学习笔记,以及分享下关于深度学习相关的理解,如有不足之处,还请大家多多指正。 Core ML简介 iOS 11的Core ML 大大降低了开发者在苹果设备上使用机器学习技术预测模型的门槛和成本。苹果制定了自己的模型文件格式,统一的格式和全新的 API 设计使得 Core ML 支持苹果生态下多个平台。Core ML 的核心是加速在 iPhone、iPad、Apple Watch 上的人工智能任务,支持深度神经网络、循环神经网络、卷积神经网络、支持向量机、树集成、线性模型等 demo演示 示例在模拟器上运行,读取相册图片,使用Core ML 进行图像识别 可以将经过Caffe框架训练后生成的 .caffemodel 使用coremltools转换工具转成 .mlmodel文件.只需要给定模型的输入,就能得到模型的预测结果。使用了Core ML之后只需要很少的代码就可以构建起一个机器学习的应用。咱们只需要关注模型的预测输出就可以,而避免了关注复杂的模型网络层次。.mlmodel 文件包含了权重和模型结构等信息,并可以自动生成相关的代码,节省开发者大量时间。 Demo实践 本demo是以Caffe框架训练出的 .caffemodel模型转换为 .mlmodel 需要以下几个文件: 环境需求: 需求: python 2.7 (mac默认的python环境),如果没有,请安装指定环境的python:brew install python==2.7 需求: CoreMLTools点击下载页面上的whl文件, 这是转换工具,备用, 安装pip ,在 pip 下安装numpy (1.12.1+) , protobuf (3.1.0+) ,six ,setuptools ,wheel,coremltools ,virtualenv 创建: 新建文件夹 convert-test , 在文件夹下放入以下文件: bvlc_alexnet.caffemodel , deploy.prototxt ,synset_words.txt , 新建一个python文件,coremlconvert.py如下: #!/usr/bin/python import coremltools coreml_model = coremltools.converters.caffe.convert( ('bvlc_reference_caffenet.caffemodel','deploy.prototxt'), image_input_names='data', class_labels = 'synset_words.txt', ) coreml_model.author = 'Yi Xie' coreml_model.licence = 'Unknown' coreml_model.short_description = 'number recogation model' coreml_model.input_description['data'] ='Input image to be classified' coreml_model.output_description['prob'] ='Probability of each category' coreml_model.output_description['classLabel'] ='Most likely image category' coreml_model.save('BVLC.mlmodel') 转换 virtualenv -p /usr/bin/python2.7 env source env/bin/activate pip install coremltools python coremlconvert.py 然后就在目录下生成对应的.mlmodel 文件 把.mlmodel 文件拖拽到 Xcode 工程中后,勾选对应的 target,这样 Xcode9生成对应的代码。生成的类名就是 .mlmodel文件,输入和输出的变量名和类型也可以在 Xcode 中查看: 同时也会生成相应的头文件: BVLC.h 包含了:BVLCInput、BVLCOutput 以提供测试图片输入和预测结果输出 数据格式处理 由于.mlmodel 输入的数据格式是 CVPixelBufferRef,因此以BLVC为例,我们需要将227*227的RGB的UIImage转换为CVPixelBufferRef数据输入 - (CVPixelBufferRef)pixelBufferFromCGImage:(UIImage *)originImage { CGImageRef image = originImage.CGImage; NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey, [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey, nil]; CVPixelBufferRef pxbuffer = NULL; CGFloat frameWidth = CGImageGetWidth(image); CGFloat frameHeight = CGImageGetHeight(image); CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, frameWidth, frameHeight, kCVPixelFormatType_32ARGB, (__bridge CFDictionaryRef) options, &pxbuffer); NSParameterAssert(status == kCVReturnSuccess && pxbuffer != NULL); CVPixelBufferLockBaseAddress(pxbuffer, 0); void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer); NSParameterAssert(pxdata != NULL); CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef context = CGBitmapContextCreate(pxdata, frameWidth, frameHeight, 8, CVPixelBufferGetBytesPerRow(pxbuffer), rgbColorSpace, (CGBitmapInfo)kCGImageAlphaNoneSkipFirst); NSParameterAssert(context); CGContextConcatCTM(context, CGAffineTransformIdentity); CGContextDrawImage(context, CGRectMake(0, 0, frameWidth, frameHeight), image); CGColorSpaceRelease(rgbColorSpace); CGContextRelease(context); CVPixelBufferUnlockBaseAddress(pxbuffer, 0); return pxbuffer; } 模型调用 - (NSString*)result:(UIImage *)image { BVLC *model = [[BVLC alloc] init]; NSError *error; UIImage *scaledImage = [image scaleToSize:CGSizeMake(227, 227)];//调整输入图片尺寸 CVPixelBufferRef buffer = [image pixelBufferFromCGImage:scaledImage]; BVLCInput *input = [[catInput alloc] initWithData:buffer]; BVLCOutput *output = [model predictionFromFeatures:input error:&error]; return output.classLabel;//预测结果输出 } 小结 使用了 Core ML之后使得model集成更加的简洁,其支持多种的数据类型,使得模型转化更加的广泛,同时其支持了硬件的优化,适配了主流的机器学习框架。 附录1 Caffe简单入门 caffe 简介 Caffe 是伯克利视觉和学习中心开发的基于C++/CUDA/phthon实现的卷积神经网络框架,提供了面向命令、Matlab、Python的接口。该框架实现了CNN架构,速度快、由于其利用了MKL、OpenBLAS、cuBLAS等计算库,支持GPU加速。并且他适合做图像特征的提取。Caffe 还提供了一套模型训练、预测、微调、发布、数据预处理、自动化测试的工具,比较适合初学者入门。另外比较常用的还有Google的TensorFlow,微软的Theano. caffe 环境配置 下载 git clone https://github.com/bvlc/caffe.git 安装 brew install -vd snappy leveldb gflags glog szip lmdb 添加science源来安装 OpenCV 和 hdf5 brew tap homebrew/science brew install hdf5 opencv 使用Anaconda Python这个工具包含了大量的Python工具包来解决以上依赖问题而且安装新的软件包也特别容易。如果用Anaconda Python的话HDF5已经包含其中了 可以略过。并且opencv这里有两行需要改一下: -DPYTHON_LIBRARY=#{py_prefix}/lib/libpython2.7.dylib -DPYTHON_INCLUDE_DIR=#{py_prefix}/include/python2.7 然后是BOOST和BOOST-Python 安装这个主要是为了之后Python接口的编译 brew install --build-from-source --with-python -vd protobuf brew install --build-from-source -vd boost boost-python 接着安装Python依赖 for req in $(cat requirements.txt); do pip install $req; done 首先mv Makefile.config.example Makefile.config 在编译之前我们需要修改make.config 的几个地方然后 CPU_ONLY := 1 的注释去掉(删除#), 然后就是后面的Python路径,用Anaconda Python的话将下面的注释去掉: ANACONDA_HOME := $(HOME)/anaconda PYTHON_INCLUDE := $(ANACONDA_HOME)/include \ $(ANACONDA_HOME)/include/python2.7 \ $(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include\ 然后就可以在caffe文件夹下执行make了: make all make test make runtest make pycaffe 如果出现错误提示为:`fatal error: caffe/proto/caffe.pb.h: No such file or directory` 解决方式: - protoc src/caffe/proto/caffe.proto --cpp_out=. - sudo mkdir include/caffe/proto - sudo mv src/caffe/proto/caffe.pb.h include/caffe/proto 注意:在训练之前需要,确认修改脚本中所引用的.prototxt文件,将最后一行改为solver_mode:CPU ##附录2 Caffe 示例 Mnist 以最经典的Mnist作为介绍: - 下载Mnist数据集合,可以在Caffe源码框架的data/mnist使用get_mnist.sh进行下载,得到二进制的测试和训练集,caffe 也可以直接以图片集的形式作为输入。 - cd data/minist/ - ./get_mnist.sh ![caffe2](https://yqfile.alicdn.com/05d0d9f275e6e3b9e66f4baa947231f818931ffe.png) - 转换格式 下载到的原始数据为二进制文件,需要转换为LEVELDB或者LMDB才能被Caffe识别。 执行脚本:`./examples/mnist/create_mnist.sh` 此时在目录下会生成两个目录,每个包含两个文件data.mdb 和 lock.mdb ![caffe3](https://yqfile.alicdn.com/7ffd421a80eb696822e47cf025ea0e548dc4a0d4.png) - 启动Caffe训练 运行:`examples/mnist/train_lenet.sh` ####测试自己图片 - ./build/tools/caffe.bin test -model=examples/mnist/lenet_train_test.prototxt -weights=examples/mnist/lenet_iter_10000.caffemodel - ./build/examples/cpp_classification/classification.bin examples/mnist/deploy.prototxt examples/mnist/lenet_iter_10000.caffemodel examples/mnist/mean.binaryproto examples/mnist/synset_words.txt examples/images/3.jpg ##附录3 卷积神经网路(CNN) ###概述 参考了网上一些博客,总结一下对于CNN的一些理解。**图像分类本质上是对输入图像的操作,最终输出一组最好地描述了图像内容的分类或分类的概率**。想要让计算机能够区分开不同类别的图片,以及各自的特征,这是人大脑自动进行着的过程。当我们看到一幅狗的图片时,如果有诸如爪子或四条腿之类的明显特征,我们便能将它归类为狗。同样地,**计算机也可以通过寻找诸如边缘和曲线之类的低级特点来分类图片,继而通过一系列卷积层级建构出更为抽象的概念。** 卷积神经网络,会联想到神经科学或生物学。CNN是从视觉皮层的生物学上获得启发的。因为在视觉皮层有小部分细胞对特定部分的视觉区域敏感。由于大脑中的一些个体神经细胞只有在特定方向的边缘存在时才能做出反应。**例如,一些神经元只对垂直边缘兴奋,另一些对水平或对角边缘兴奋。所有这些神经元都以柱状结构的形式进行排列,而且一起工作才能产生视觉感知。这种一个系统中的特定组件有特定任务的观点(视觉皮层的神经元细胞寻找特定特征)在机器中同样适用,这就是 CNN 的基础。** CNN卷积网络的核心思想是将:局部互联、权值共享以及降采样这三种结构思想结合起来获得了某种程度的位移、尺度、形变鲁棒性,以达到图像降维的特征学习与分类 ![CNN](https://yqfile.alicdn.com/2dd39898b342c09401b1be8f09e83a4791c24d2b.jpeg) ###图像的卷积 ####微观角度: 如上图:一张 32 * 32 的图片作为输入,经过卷积得到**C1**的6张 28 * 28的特征图,这个过程称为特征映射。**每层都有多个特征图,对于每个的特征图是由前一层通过卷积运算得来,卷积的运算的作用实质上是对特征的一种提取,同时也是忽略一些无关噪声因素。**对于上图,**C1**的6张特征图是由多个5 * 5的卷积核与输入图像,卷积运算得来,其目的就是为提取原始图像的多种特征。 ####宏观角度: 每个滤波器可以被看成是特征标识符。这里的特征指的是例如直边缘、原色、曲线之类的东西。所有的图像都共有的一些最基本的特征。 **知乎上“机器之心”的例子**:一组滤波器是 7 x 7 曲线检测器,作为曲线过滤器,它将有一个像素结构,在曲线形状旁时会产生更高的数值,以提取出图像的中局部的曲线特征。 ![CNN_0](https://yqfile.alicdn.com/48176ad66b919e27332dc082ecd3bec791a588e0.png) 左图:滤波器的像素表示;右图:曲线检测器可视化;对比两图可以看到数值和形状的对应 ![CNN_1](https://yqfile.alicdn.com/417f4c899515773dc471dce081e9dbaf5312cc2a.png) 从数学的角度来看,当我们将过滤器置于输入内容的左上角时,它将计算滤波器和这一区域像素值之间的点积。 ![CNN_2](https://yqfile.alicdn.com/6217949a3e82051c85c0e2d1932a9c33e4e9d78c.png) 如果输入图像上某个形状看起来很像过滤器表示的曲线,那么所有点积加在一起将会得出一个很大的值! ![CNN_3](https://yqfile.alicdn.com/f30263e4bc8c82ef25181b3454429b699084be58.png) 在滤波器滑动的过程中,如果没有检测到曲线,这时该卷积得到的值就很小。这是因为图像的这一部分和曲线检测器相似性较小。这本质上卷积层的输出就是一个激活映射。因此,在这个曲线检测器的例子里,激活映射将会显示出图像里最像曲线的区域。过滤器越多,检测的图片特定特征也越多,激活映射的深度越大,对输入的特征也就越多。 ![CNN_4](https://yqfile.alicdn.com/e8fdaf11875e0709bc0e7ae7c2eef99f35b75f29.png) **上图是,对输入图像上进行第一次卷积运算得到的特征映射图** **S2**层是降采样层,根据图像的局部相关特性,对图像进行降采样,减少了参数量,这就是CNN中的稀疏链接。降采样层得到的就是6张14 * 14 的图片,相当于在2 * 2的点阵中取一个点,可以设置取点的规则。 ![CNN1](https://yqfile.alicdn.com/7d8c1f70d9234b76b06bcee7b75f331fa3d3f89d.jpeg) ####如上如所示卷积和下采样过程: - 卷积:用一个可训练的滤波器fx去卷积一个输入的图像(只有输入是图像,之后面的每一层经过就是卷积、采样得到只是图片的特征,相当于每一层的运算,在降低参数量的同时也在提取上一层的特征),然后加一个偏置bx,得到卷积层Cx。 - 降采样:每邻域四个像素求和变为一个像素,然后通过标量Wx+1加权,再增加偏置bx+1,然后通过一个Sigmoid激活函数,产生一个大概缩小四倍的特征映射图Sx+1。 所以从一个平面到下一个平面的映射可以看作是作卷积运算,S-层可看作是模糊滤波器,起到二次特征提取的作用。隐层与隐层之间空间分辨率递减,而每层所含的平面数递增,这样可用于检测更多的特征信息。 - 注:深度神经网络中还存在一个问题就是梯度消失,使用Sigmoid、tanh等饱和激活函数时,在神经网络进行误差反向传播时,各个层都要乘以激活函数的一阶导,梯度会衰减,当网络层数过多时,甚至会导致梯度消失。这就使得训练收敛变慢,因此我们会使用ReLU这种非饱和激活函数,以保证收敛速度。(《21天实战Caffe》有详细介绍) ###CNN 相比于ANN优势在于 ####局部感受野: 通过感受野和权值共享减少了神经网络需要训练的参数的个数,假设有1000x1000像素的图像,有1百万个隐层神经元,那么他们全连接的话(每个隐层神经元都连接图像的每一个像素点),就有1000x1000x1000000=10^12个连接,也就是10^12个权值参数。然而图像的空间联系是局部的,就像人是通过一个局部的感受野去感受外界图像一样,每一个神经元都不需要对全局图像做感受,每个神经元只感受局部的图像区域,然后在更高层,将这些感受不同局部的神经元综合起来就可以得到全局的信息了。这样就减少连接的数目,也就是减少神经网络需要训练的权值参数的个数了。如下图右:假如局部感受野是10x10,隐层每个感受野只需要和这10x10的局部图像相连接,所以1百万个隐层神经元就只有一亿个连接,即10^8个参数。比原来减少了四个数量级。 ![CNN2](https://yqfile.alicdn.com/ff49e1aeb5ed4a7d2644bbbea95161cf1cd7c10e.jpeg) ####权值共享: 假设隐含层的每一个神经元都连接10x10个图像区域,也就是说每一个神经元存在10x10=100个连接权值参数。如果我们每个神经元这100个参数是相同。也就是说每个神经元用的是同一个卷积核去卷积图像。这样我们就只有100个参数。不管你隐层的神经元个数有多少,两层间的连接我只有100个参数。 ![CNN3](https://yqfile.alicdn.com/8837a0c0c496d4e75f5712356d1339d6f52853e3.jpeg) 如果仅仅只依靠这100个参数,提取特征,不能很好的提取图像的全部特征。一种卷积核就相当是提出图像的一种特征,例如某个方向的边缘。如果需要提取不同的特征,就要多加几种卷积核。假设有100种滤波器,每种滤波器的参数不一样,表示提取输入图像的不同特征。这样每种滤波器去卷积图像就得到对图像的不同特征的放映,我们称之为特征图。所以100种卷积核就有100个特征图。这100个特征图就组成了一层神经元。一层有参数个数 = 100种卷积核x每种卷积核共享100个参数=100x100=10K。也就是说,隐层的参数个数和隐层的神经元个数无关,只和滤波器的大小和滤波器种类的多少有关。 ###CNN 进一步理解 当进入下一层卷积层时,第一层的输入是原始图像,而第二卷积层的输入正是第一层输出的激活映射。也就是说,这一层的输入大体描绘了低级特征在原始图片中的位置。在此基础上再采用一组滤波器(让它通过第 2 个卷积层),输出将是表示了更高级的特征的激活映射。**随着网络越深和经过更多卷积层后,将得到更为复杂特征的激活映射。越深入网络,过滤器的感受野越大,意味着它们能够处理更大范围的原始输入内容(或者说它们可以对更大区域的像素空间产生反应)。** 检测高级特征之后,最后就是完全连接层,**这一层处理输入内容(该输入可能是卷积层、ReLU 层或是池化层的输出)后会输出一个 N 维向量,N 是该程序必须选择的分类数量。**例如,如果你想得到一个数字分类程序,像Mnist那样对手写数字进行分类,10个数字,N 就等于10。这个 N 维向量中的每一数字都代表某一特定类别的概率。 针对于某一个数字分类结果矢量是: [0 0 .2 0 .55 0 0 .2 0 .05],这就意味着该图片有 20% 的概率是 2、55% 的概率是 4、20% 的概率是 7、还有 5% 的概率是 9。完全连接层观察上一层的输出(其表示了更高级特征的激活映射)并确定这些特征与哪一分类最为吻合。如果像本例demo中可以检测山地车、飞机、手机等日常物体的程序。当预测某一图像的内容为山地车时,那么激活映射中的高数值便会代表一些车轮或脚踏板之类的特征。同理,如预测某一图片的内容为飞机,激活映射中的高数值便会代表诸如机翼等高级特征。完全连接层观察高级特征和哪一分类最为吻合和拥有怎样的特定权重,因此当计算出权重与先前层之间的点积后,你将得到不同分类的正确概率。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册