Keras使用ImageNet上预训练的模型方式_python

来源:脚本之家  责任编辑:小易  

到底什么是深度学习?它是涵盖了建立和训练神经网络的特殊方法的一个术语。神经网络最早在上世纪五十年代被提出,就像核聚变一样,他们曾是很有前途但很不可思议的实验室想法,迟迟未能在实际中应用。我会在稍后章节详细介绍神经网络是如何工作的,现在你可以把它当作一个作出决策的黑盒子。它们以一个数组作为输入(数组可以代表像素,音频微波,或者单词),在这个数组上运行一系列的函数,输出一个或多个数字。输出结果一般是对你试图从输入中得出的一些特性的预测,例如一张图片上画的是不是一只猫。在黑盒子里运行的功能是由神经网络的内存控制的,权重数组负责决定如何将输入数据进行组合和重组来生成结果。像猫检测这样的实际问题,在处理时需要非常复杂的功能,也就是说它的这些权重数组会非常大。一个最近的计算机视觉网络问题,其权重数组包含大约6千万的数据。使用神经网络的一个最大的障碍是如何给这些巨大的数组赋值,才能很好的将输入信号转换成输出的预测结果。训练研究人员一直致力于训练神经网络,主要原因是神经网络理论上是可教的。在小规模的问题上,根据一系列的样本输入和期望输出,通过机械加工,让权重从一开始的随机数逐步变成可以提供更精准的预测的数字,是一个非常简单的过程。问题的关键是如何在更复杂的问题上做好这件事,比如语音识别或计算机视觉这些权重数量巨大的问题。这是在2012 Imagenet Paper会议引发神经网络复兴以来的一个真正突破。Alex Krizhevsky,Ilya Sutskever 和Geoff Hinton将很多不同的加速学习的程序汇集在一起,包括卷积网络(convolutional networks),巧妙运用GPU,和一些新的数学计算技巧比如如ReLU和dropout,结果显示,他们可以在几周内训练出一个非常复杂的网络,并且这个网络在计算机视觉上可以达到与以往很出色的传统方法几乎一样的效果。这并不是一个单独的或偶然的事件,类似的方法已经在自然语言处理和语音识别上得到了很成功的应用。这就是深度学习的核心-这种新技术让我们可以搭建和训练神经网络来解决以前无法解决的问题。与其它方法的有何不同?大多数机器学习方法的困难点在于从原始输入数据中识别出特征,比如用于识别图片的SIFT或SURF。而深度学习去掉了这一环节,改为用训练过程从输入样本中发觉最有用的模式(pattern)。虽然开始前你仍需要对网络的内部布局做出选择,但自动挖掘特征已经让一切容易了很多。另一方面,神经网络比其它机器学习技术更通用。我已经成功的使用原来的Imagenet network识别它从未被训练过的对象,甚至其它图片相关的任务比如现场分析(scene-type analysis)。底层的架构和训练网络的技术对所有自然数据,如音频,地震传感器或自然语言等,都通用。没有任何其他方法可以如此灵活。为什么要深入研究?最根本的原因是深度学习做的非常好,如果你处理过杂乱的真实数据,那么在未来几年这将是你工具包里的基本要素。直到最近,他才被当作晦涩的令人生畏的领域来学习,但是它的成功带来了极为丰富的资源和项目,使得学习神经网络变得比以往简单很多。我很期待带领你一起学习其中一部分,深入研究网络的内部工作原理,在我们一起体验这项新技术的同时能够有一些有趣的探索www.zgxue.com防采集请勿采集本网。

我就废话不多说了,大家还是直接看代码吧!

ImageNet的网络定义在“examples/imagenet.prototxt”文件中,使用时需要修改里面source和meanfile变量的值,指向自己文件的路径。仔细观察imagenet.prototxt和imagenet_val.prototxt文件可以发现,训练和

import kerasimport numpy as npfrom keras.applications import vgg16, inception_v3, resnet50, mobilenet #Load the VGG modelvgg_model = vgg16.VGG16(weights='imagenet') #Load the Inception_V3 modelinception_model = inception_v3.InceptionV3(weights='imagenet') #Load the ResNet50 modelresnet_model = resnet50.ResNet50(weights='imagenet') #Load the MobileNet modelmobilenet_model = mobilenet.MobileNet(weights='imagenet')

运行下边的命令mkdir-p~/.ipython/kernels 然后运行下边的命令,使用你选择的名字来代替(我使用的tfkernel),并且使用第4步中得到的路径(例如,~/.local/share/jupyter/kernels/pythonX)来替换下方命令

在以上代码中,我们首先import各种模型对应的module,然后load模型,并用ImageNet的参数初始化模型的参数。

深度学习是一门经验科学,许多基础设施的质量也在倍增。幸运的是,现在的开源生态系统可以使任何人建立不错的深度学习基础设施。所以Ian Goodfellow 将这个模型扩展到ImageNet上进行使用。

如果不想使用ImageNet上预训练到的权重初始话模型,可以将各语句的中'imagenet'替换为'None'。

Caffe具有卓越的卷积模型,是计算机视觉领域最受欢迎的工具之一,且2014年ImageNet 大赛的获奖作品使用的就是Caffe框架。Caffe遵循BSD 2-Clasuse 协议。Caffe的高速使得它非常适合于科研和商业领域。利用

补充知识:keras上使用alexnet模型来高准确度对mnist数据进行分类

目前是盛世,各个流派之争,新人和技术层出不穷,各大擂台(例如imagenet)和大会(据说今年nips 8k人参加,一个月前就把票卖光了)热火朝天。平台作为修真练级法宝,自然也是各家PK重要之地。各个平台是

纲要

本文有两个特点:一是直接对本地mnist数据进行读取(假设事先已经下载或从别处拷来)二是基于keras框架(网上多是基于tf)使用alexnet对mnist数据进行分类,并获得较高准确度(约为98%)

本地数据读取和分析

很多代码都是一开始简单调用一行代码来从网站上下载mnist数据,虽然只有10来MB,但是现在下载速度非常慢,而且经常中途出错,要费很大的劲才能拿到数据。

(X_train, y_train), (X_test, y_test) = mnist.load_data()

其实可以单独来获得这些数据(一共4个gz包,如下所示),然后调用别的接口来分析它们。

mnist = input_data.read_data_sets("./MNIST_data", one_hot = True) #导入已经下载好的数据集,"./MNIST_data"为存放mnist数据的目录

x_train = mnist.train.imagesy_train = mnist.train.labelsx_test = mnist.test.imagesy_test = mnist.test.labels

这里面要注意的是,两种接口拿到的数据形式是不一样的。 从网上直接下载下来的数据 其image data值的范围是0~255,且label值为0,1,2,3...9。 而第二种接口获取的数据 image值已经除以255(归一化)变成0~1范围,且label值已经是one-hot形式(one_hot=True时),比如label值2的one-hot code为(0 0 1 0 0 0 0 0 0 0)

所以,以第一种方式获取的数据需要做一些预处理(归一和one-hot)才能输入网络模型进行训练 而第二种接口拿到的数据则可以直接进行训练。

Alexnet模型的微调

按照公开的模型框架,Alexnet只有第1、2个卷积层才跟着BatchNormalization,后面三个CNN都没有(如有说错,请指正)。如果按照这个来搭建网络模型,很容易导致梯度消失,现象就是 accuracy值一直处在很低的值。 如下所示。

在每个卷积层后面都加上BN后,准确度才迭代提高。如下所示

完整代码

import kerasfrom keras.datasets import mnistfrom keras.models import Sequentialfrom keras.layers.core import Dense, Dropout, Activation, Flattenfrom keras.layers.convolutional import Conv2D, MaxPooling2D, ZeroPadding2Dfrom keras.layers.normalization import BatchNormalizationfrom keras.callbacks import ModelCheckpointimport numpy as npimport tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data #tensorflow已经包含了mnist案例的数据 batch_size = 64num_classes = 10epochs = 10img_shape = (28,28,1) # input dimensionsimg_rows, img_cols = 28,28 # dataset input#(x_train, y_train), (x_test, y_test) = mnist.load_data()mnist = input_data.read_data_sets("./MNIST_data", one_hot = True) #导入已经下载好的数据集,"./MNIST_data"为存放mnist数据的目录print(mnist.train.images.shape, mnist.train.labels.shape)print(mnist.test.images.shape, mnist.test.labels.shape)print(mnist.validation.images.shape, mnist.validation.labels.shape) x_train = mnist.train.imagesy_train = mnist.train.labelsx_test = mnist.test.imagesy_test = mnist.test.labels # data initializationx_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)input_shape = (img_rows, img_cols, 1) # Define the input layerinputs = keras.Input(shape = [img_rows, img_cols, 1]) #Define the converlutional layer 1conv1 = keras.layers.Conv2D(filters= 64, kernel_size= [11, 11], strides= [1, 1], activation= keras.activations.relu, use_bias= True, padding= 'same')(inputs)# Define the pooling layer 1pooling1 = keras.layers.AveragePooling2D(pool_size= [2, 2], strides= [2, 2], padding= 'valid')(conv1)# Define the standardization layer 1stand1 = keras.layers.BatchNormalization(axis= 1)(pooling1) # Define the converlutional layer 2conv2 = keras.layers.Conv2D(filters= 192, kernel_size= [5, 5], strides= [1, 1], activation= keras.activations.relu, use_bias= True, padding= 'same')(stand1)# Defien the pooling layer 2pooling2 = keras.layers.AveragePooling2D(pool_size= [2, 2], strides= [2, 2], padding= 'valid')(conv2)# Define the standardization layer 2stand2 = keras.layers.BatchNormalization(axis= 1)(pooling2) # Define the converlutional layer 3conv3 = keras.layers.Conv2D(filters= 384, kernel_size= [3, 3], strides= [1, 1], activation= keras.activations.relu, use_bias= True, padding= 'same')(stand2)stand3 = keras.layers.BatchNormalization(axis=1)(conv3) # Define the converlutional layer 4conv4 = keras.layers.Conv2D(filters= 384, kernel_size= [3, 3], strides= [1, 1], activation= keras.activations.relu, use_bias= True, padding= 'same')(stand3)stand4 = keras.layers.BatchNormalization(axis=1)(conv4) # Define the converlutional layer 5conv5 = keras.layers.Conv2D(filters= 256, kernel_size= [3, 3], strides= [1, 1], activation= keras.activations.relu, use_bias= True, padding= 'same')(stand4)pooling5 = keras.layers.AveragePooling2D(pool_size= [2, 2], strides= [2, 2], padding= 'valid')(conv5)stand5 = keras.layers.BatchNormalization(axis=1)(pooling5) # Define the fully connected layerflatten = keras.layers.Flatten()(stand5)fc1 = keras.layers.Dense(4096, activation= keras.activations.relu, use_bias= True)(flatten)drop1 = keras.layers.Dropout(0.5)(fc1) fc2 = keras.layers.Dense(4096, activation= keras.activations.relu, use_bias= True)(drop1)drop2 = keras.layers.Dropout(0.5)(fc2) fc3 = keras.layers.Dense(10, activation= keras.activations.softmax, use_bias= True)(drop2) # 基于Model方法构建模型model = keras.Model(inputs= inputs, outputs = fc3)# 编译模型model.compile(optimizer= tf.train.AdamOptimizer(0.001), loss= keras.losses.categorical_crossentropy, metrics= ['accuracy'])# 训练配置,仅供参考model.fit(x_train, y_train, batch_size= batch_size, epochs= epochs, validation_data=(x_test,y_test))

以上这篇Keras使用ImageNet上预训练的模型方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持真格学网。

搭建深度学习后台服务器我们的Keras深度学习REST API将能够批量处理图像,扩展到多台机器(包括多台web服务器和Redis实例),并在负载均衡器之后进行循环调度。为此,我们将使用:KerasRedis(内存数据结构存储)Flask(Python的微web框架)消息队列和消息代理编程范例本篇文章的整体思路如下:我们将首先简要讨论Redis数据存储,以及如何使用它促进消息队列和消息代理。然后,我们将通过安装所需的Python包来配置Python开发环境,以构建我们的Keras深度学习REST API。一旦配置了开发环境,就可以使用Flask web框架实现实际的Keras深度学习REST API。在实现之后,我们将启动Redis和Flask服务器,然后使用cURL和Python向我们的深度学习API端点提交推理请求。最后,我们将以对构建自己的深度学习REST API时应该牢记的注意事项的简短讨论结束。第一部分:简要介绍Redis如何作为REST API消息代理/消息队列图片1:Redis可以用作我们深度学习REST API的消息代理/消息队列Redis是内存中的数据存储。它不同于简单的键/值存储(比如memcached),因为它可以存储实际的数据结构。今天我们将使用Redis作为消息代理/消息队列。这包括:在我们的机器上运行Redis将数据(图像)按照队列的方式用Redis存储,并依次由我们的REST API处理为新批输入图像循环访问Redis对图像进行分类并将结果返回给客户端文章中对Redis官网有一个超链接(https://redis.io/topics/introduction),但是要翻出去,所以我就截图一个图片放上去仅供参考。第二部分:安装和配置Redis官网做法,linux系统的安装:自己的安装方法:conda install redis开启方式相同:resdis-server结果:测试和原文的命令一致。第三部分:配置Python开发环境以构建Keras REST API文章中说需要创建新的虚拟环境来防止影响系统级别的python项目(但是我没有创建),但是还是需要安装rest api所需要依赖的包。以下为所需要的包。第四部分:实现可扩展的Keras REST API首先是Keras Redis Flask REST API数据流程图让我们开始构建我们的服务器脚本。为了方便起见,我在一个文件中实现了服务器,但是它可以按照您认为合适的方式模块化。为了获得最好的结果和避免复制/粘贴错误,我建议您使用本文的“下载”部分来获取相关的脚本和图像。为了简单起见,我们将在ImageNet数据集上使用ResNet预训练。我将指出在哪里可以用你自己的模型交换ResNet。flask模块包含flask库(用于构建web API)。redis模块将使我们能够与redis数据存储接口。从这里开始,让我们初始化将在run_keras_server.py中使用的常量.我们将向服务器传递float32图像,尺寸为224 x 224,包含3个通道。我们的服务器可以处理一个BATCH_SIZE=32。如果您的生产系统上有GPU(s),那么您需要调优BATCH_SIZE以获得最佳性能。我发现将SERVER_SLEEP和CLIENT_SLEEP设置为0.25秒(服务器和客户端在再次轮询Redis之前分别暂停的时间)在大多数系统上都可以很好地工作。如果您正在构建一个生产系统,那么一定要调整这些常量。让我们启动我们的Flask app和Redis服务器:在这里你可以看到启动Flask是多么容易。在运行这个服务器脚本之前,我假设Redis服务器正在运行(之前的redis-server)。我们的Python脚本连接到本地主机6379端口(Redis的默认主机和端口值)上的Redis存储。不要忘记将全局Keras模型初始化为None。接下来我们来处理图像的序列化:Redis将充当服务器上的临时数据存储。图像将通过诸如cURL、Python脚本甚至是移动应用程序等各种方法进入服务器,而且,图像只能每隔一段时间(几个小时或几天)或者以很高的速率(每秒几次)进入服务器。我们需要把图像放在某个地方,因为它们在被处理前排队。我们的Redis存储将作为临时存储。为了将图像存储在Redis中,需要对它们进行序列化。由于图像只是数字数组,我们可以使用base64编码来序列化图像。使用base64编码还有一个额外的好处,即允许我们使用JSON存储图像的附加属性。base64_encode_image函数处理序列化。类似地,在通过模型传递图像之前,我们需要反序列化图像。这由base64_decode_image函数处理。预处理图片我已经定义了一个prepare_image函数,它使用Keras中的ResNet50实现对输入图像进行预处理,以便进行分类。在使用您自己的模型时,我建议修改此函数,以执行所需的预处理、缩放或规范化。从那里我们将定义我们的分类方法classify_process函数将在它自己的线程中启动,我们将在下面的_main_中看到这一点。该函数将从Redis服务器轮询图像批次,对图像进行分类,并将结果返回给客户端。在model=ResNet50(weights="imagenet")这一行中,我将这个操作与终端打印消息连接起来—根据Keras模型的大小,加载是即时的,或者需要几秒钟。加载模型只在启动这个线程时发生一次—如果每次我们想要处理一个映像时都必须加载模型,那么速度会非常慢,而且由于内存耗尽可能导致服务器崩溃。加载模型后,这个线程将不断轮询新的图像,然后将它们分类(注意这部分代码应该时尚一部分的继续)在这里,我们首先使用Redis数据库的lrange函数从队列(第79行)中获取最多的BATCH_SIZE图像。从那里我们初始化imageIDs和批处理(第80和81行),并开始在第84行开始循环队列。在循环中,我们首先解码对象并将其反序列化为一个NumPy数组image(第86-88行)。接下来,在第90-96行中,我们将向批处理添加图像(或者如果批处理当前为None,我们将该批处理设置为当前图像)。我们还将图像的id附加到imageIDs(第99行)。让我们完成循环和函数在这个代码块中,我们检查批处理中是否有图像(第102行)。如果我们有一批图像,我们通过模型(第105行)对整个批进行预测。从那里,我们循环一个图像和相应的预测结果(110-122行)。这些行向输出列表追加标签和概率,然后使用imageID将输出存储在Redis数据库中(第116-122行)。我们使用第125行上的ltrim从队列中删除了刚刚分类的图像集。最后,我们将睡眠设置为SERVER_SLEEP时间并等待下一批图像进行分类。下面我们来处理/predict我们的REST API端点稍后您将看到,当我们发布到REST API时,我们将使用/predict端点。当然,我们的服务器可能有多个端点。我们使用@app。路由修饰符以第130行所示的格式在函数上方定义端点,以便Flask知道调用什么函数。我们可以很容易地得到另一个使用AlexNet而不是ResNet的端点,我们可以用类似的方式定义具有关联函数的端点。你懂的,但就我们今天的目的而言,我们只有一个端点叫做/predict。我们在第131行定义的predict方法将处理对服务器的POST请求。这个函数的目标是构建JSON数据,并将其发送回客户机。如果POST数据包含图像(第137和138行),我们将图像转换为PIL/Pillow格式,并对其进行预处理(第141-143行)。在开发这个脚本时,我花了大量时间调试我的序列化和反序列化函数,结果发现我需要第147行将数组转换为C-contiguous排序(您可以在这里了解更多)。老实说,这是一个相当大的麻烦事,但我希望它能帮助你站起来,快速跑。如果您想知道在第99行中提到的id,那么实际上是使用uuid(通用唯一标识符)在第151行生成的。我们使用UUID来防止hash/key冲突。接下来,我们将图像的id和base64编码附加到d字典中。使用rpush(第153行)将这个JSON数据推送到Redis db非常简单。让我们轮询服务器以返回预测我们将持续循环,直到模型服务器返回输出预测。我们开始一个无限循环,试图得到157-159条预测线。从这里,如果输出包含预测,我们将对结果进行反序列化,并将结果添加到将返回给客户机的数据中。我们还从db中删除了结果(因为我们已经从数据库中提取了结果,不再需要将它们存储在数据库中),并跳出了循环(第163-172行)。否则,我们没有任何预测,我们需要睡觉,继续投票(第176行)。如果我们到达第179行,我们已经成功地得到了我们的预测。在本例中,我们向客户机数据添加True的成功值(第179行)。注意:对于这个示例脚本,我没有在上面的循环中添加超时逻辑,这在理想情况下会为数据添加一个False的成功值。我将由您来处理和实现。最后我们称烧瓶。jsonify对数据,并将其返回给客户端(第182行)。这就完成了我们的预测函数。为了演示我们的Keras REST API,我们需要一个_main_函数来实际启动服务器第186-196行定义了_main_函数,它将启动classify_process线程(第190-192行)并运行Flask应用程序(第196行)。第五部分:启动可伸缩的Keras REST API要测试我们的Keras深度学习REST API,请确保使用本文的“下载”部分下载源代码示例图像。从这里,让我们启动Redis服务器,如果它还没有运行:redis-server然后,在另一个终端中,让我们启动REST API Flask服务器:python run_keras_server.py另外,我建议在向服务器提交请求之前,等待您的模型完全加载到内存中。现在我们可以继续使用cURL和Python测试服务器。第七部分:使用cURL访问Keras REST API使用cURL来测试我们的Keras REST API服务器。这是我的家庭小猎犬Jemma。根据我们的ResNet模型,她被归类为一只拥有94.6%自信的小猎犬。curl-X POST-F image=jemma.png 'http://localhost:5000/predict'你会在你的终端收到JSON格式的预测:{"predictions":[{"label":"beagle内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • 关于keras dense层整理
  • 使用keras预训练模型resnet50进行图像分类方式
  • 在keras下实现多个模型的融合方式
  • 使用keras实现densenet和xception的模型融合
  • windows下python3.6.4安装教程
  • django之使用celery和nginx生成静态页面实现性能优化
  • 在python中操作列表之list.extend()方法的使用
  • python查看列的唯一值方法
  • python实现屏幕录制功能的代码
  • python机器学习包mlxtend的安装和配置详解
  • python 获取当前目录下的文件目录和文件名实例代码详解
  • django框架 pagination分页实现代码实例
  • python遍历文件夹 处理json文件的方法
  • python将unicode和str互相转化的实现
  • 如何在后台部署深度学习模型
  • 深度学习的“深度”有什么意义
  • 现在tensorflow和mxnet很火,是否还有必要学习scikit-learn等框架
  • python可以做哪些有趣的事
  • Caffe训练自己的imagenet,ubuntu提示killed
  • 有人使用tensorflow中的imageNet吗
  • 如何构建自己的深度学习基础设施
  • TensorFlow的优势和缺点有哪些
  • 为什么强大的 MXNet 一直火不起来
  • 如何参加 imagenet 测试
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全vbsdos/bathtahtcpythonperl游戏相关vba远程脚本coldfusionruby专题autoitseraphzonepowershelllinux shellluagolangerlang其它首页关于keras dense层整理使用keras预训练模型resnet50进行图像分类方式在keras下实现多个模型的融合方式使用keras实现densenet和xception的模型融合windows下python3.6.4安装教程django之使用celery和nginx生成静态页面实现性能优化在python中操作列表之list.extend()方法的使用python查看列的唯一值方法python实现屏幕录制功能的代码python机器学习包mlxtend的安装和配置详解python 获取当前目录下的文件目录和文件名实例代码详解django框架 pagination分页实现代码实例python遍历文件夹 处理json文件的方法python将unicode和str互相转化的实现python入门教程 超详细1小时学会python 列表(list)操作方法详解python 元组(tuple)操作详解python 字典(dictionary)操作详解pycharm 使用心得(一)安装和首python strip()函数 介绍python 中文乱码问题深入分析python中使用xlrd、xlwt操作excepython科学计算环境推荐——anacpython逐行读取文件内容的三种方python类的动态修改的实例方法使用python的supervisor进行进程监控以及python3.6、opencv安装环境搭建过程(图文pytorch加载预训练模型实例(pretrained)python numpy库安装与基本操作示例详解flask入门模板引擎简单了解python的break、continue、passpython中使用logging模块打印log日志详解机器学习实战之knn算法pandas基于python代码编辑器的选用(详解)
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved