精华内容
下载资源
问答
  • 这是MindSpore学习之路第篇 零代码实现人车检测 目录上传文件夹到OBS客户端创建项目项目名称命名最好这样:数据集名称最好这么命名:数据集输入路径是训练集在OBS中的位置数据集输出位置是标注数据在OBS中的...

    这是MindSpore学习之路第四篇
    零代码实现人车检测

    上传文件夹到OBS客户端

    创建项目

    项目名称命名最好这样:

    默认名
    在这里插入图片描述
    项目为人车检测,所以这样命名(有下划线)
    在这里插入图片描述

    数据集名称最好这么命名:

    在这里插入图片描述

    数据集输入路径是指训练集在OBS中的位置

    数据集输出位置是指标注数据在OBS中的位置

    这个人车检测项目,是有监督学习,训练集没有标注标签“人”和“车”,需要在ModelArts中进行自动标注和人工标注。标注后的训练集叫标注数据,存储在输出位置。

    人工标注

    有些图片可能比较模糊,导致自动标注无法完成,需要手动标注。
    在这里插入图片描述

    开始训练,训练设置

    在这里插入图片描述
    在这里插入图片描述

    训练完成,部署(预测)

    官方教程链接

    官方视频教程链接7:24

    官方教程文档链接

    官方教程文档链接

    展开全文
  • 对于国内众多教授计算机科学的教育机构来说,如何快速准确获知学生的计算机水平,从而更的为其提供选课参考、指导制定学习计划和学习目标,最终达到因材施教的效果成为了这些机构开始关注的问题。本文设计并实现了...
  • tensorflow模型持久化

    2019-07-30 15:38:37
    (微调是初始化网络参数的时候不再是随机初始化,而是使用先前训练的权重参数进行初始化,在此基础上对网络的全部或者局部参数进行重新训练的过程)。为了实现模型的复用或微调,我将从以下个方面进行说明: ...

    使用tensorflow的过程中,我们常常会用到训练好的模型。我们可以直接使用训练好的模型进行测试或者对训练好的模型做进一步的微调。(微调是指初始化网络参数的时候不再是随机初始化,而是使用先前训练好的权重参数进行初始化,在此基础上对网络的全部或者局部参数进行重新训练的过程)。为了实现模型的复用或微调,我将从以下四个方面进行说明:

    模型是指什么?
    如何保存模型?
    如何恢复模型?
    如何进行微调?

    模型是什么

    tensorflow训练后需要保存的模型主要包含两部分,一是网络图,二是网络图里的参数值。保存的模型文件结构如下(假设每过1000次保存一次):

    checkpoint
    MyModel-1000.meta
    MyModel-1000.data-00000-of-00001
    MyModel-1000.index
    MyModel-2000.meta
    MyModel-2000.data-00000-of-00001
    MyModel-2000.index
    MyModel-3000.meta
    MyModel-3000.data-00000-of-00001
    MyModel-3000.index
    .......
    
    1. checkpoint
      checkpoint是一个文本文件,如下所示。其中有model_checkpoint_path和all_model_checkpoint_paths两个属性。model_checkpoint_path保存了最新的tensorflow模型文件的文件名,all_model_checkpoint_paths则有未被删除的所有tensorflow模型文件的文件名。
    model_checkpoint_path: "MyModel-3000"
    all_model_checkpoint_paths: "MyModel-1000"
    all_model_checkpoint_paths: "MyModel-2000"
    all_model_checkpoint_paths: "MyModel-3000"
    ......
    

    2 .meta文件
    .meta 文件用于保存网络结构,且以 protocol buffer 格式进行保存。protocol buffer是Google 公司内部使用的一种轻便高效的数据描述语言。类似于XML能够将结构化数据序列化,protocol buffer也可用于序列化结构化数据,并将其用于数据存储、通信协议等方面。相较于XML,protocol buffer更小、更快、也更简单。

    3 .data-00000-of-00001 文件和 .index 文件
    在tensorflow 0.11之前,保存的文件结构如下。tensorflow 0.11之后,将ckpt文件拆分为了.data-00000-of-00001 和 .index 两个文件。.ckpt是二进制文件,保存了所有变量的值及变量的名称。拆分后的.data-00000-of-00001 保存的是变量值,.index文件保存的是.data文件中数据和 .meta文件中结构图之间的对应关系(也就是变量的名称)

    checkpoint
    MyModel.meta
    MyModel.ckpt
    

    如何保存模型

    tensorflow 提供tf.train.Saver类及tf.train.Saver类下面的save方法共同保存模型。下面分别说明tf.train.Saver类及save方法:

    tf.train.Saver(var_list=None, reshape=False, sharded=False, max_to_keep=5,
        keep_checkpoint_every_n_hours=10000.0, name=None, restore_sequentially=False, 
        saver_def=None, builder=None, defer_build=False, allow_empty=False,
        write_version=saver_pb2.SaverDef.V2, pad_step_number=False)
    就常用的参数进行说明:
    var_list:如果我们不对tf.train.Saver指定任何参数,默认会保存所有变量。如果你只想保存一部分变量,
              可以通过将需要保存的变量构造list或者dictionary,赋值给var_list。
    max_to_keep:tensorflow默认只会保存最近的5个模型文件,如果你希望保存更多,可以通过max_to_keep来指定
    keep_checkpoint_every_n_hours:设置每隔几小时保存一次模型
    
    
    save(sess,save_path,global_step=None,latest_filename=None,meta_graph_suffix="meta",
          write_meta_graph=True, write_state=True)
    就常用的参数进行说明:
    sess:在tensorflow中,只有开启session时数据才会流动,因此保存模型的时候必须传入session。
    save_path: 模型保存的路径及模型名称。
    global_step:定义每隔多少步保存一次模型,每次会在保存的模型名称后面加上global_step的值作为后缀
    write_meta_graph:布尔值,True表示每次都保存图,False表示不保存图(由于图是不变的,没必要每次都去保存)
    
    注意:保存变量的时候必须在session中;保存的变量必须已经初始化;
    
    1. 简单实例
    import tensorflow as tf
    w1 = tf.Variable(tf.random_normal(shape=[2]), name='w1')
    w2 = tf.Variable(tf.random_normal(shape=[5]), name='w2')
    w3 = tf.Variable(tf.random_normal(shape=[1]), name='w3')
    saver = tf.train.Saver()#未指定任何参数,默认保存所有变量。等价于saver = tf.train.Saver(tf.trainable_variables())
    save_path = './checkpoint_dir/MyModel'#定义模型保存的路径./checkpoint_dir/及模型名称MyModel
    
    with tf.Session() as sess:
    	sess.run(tf.global_variables_initializer())
    	saver.save(sess, save_path)
    

    执行后,在checkpoint_dir目录下创建模型文件如下:

    checkpoint
    MyModel.data-00000-of-00001
    MyModel.index
    MyModel.meta
    
    1. 经典实例
    import tensorflow as tf
    from six.moves import xrange
    import os
    
    w1 = tf.Variable(tf.random_normal(shape=[2]), name='w11')#变量w1在内存中的名字是w11;恢复变量时应该与name的名字保持一致
    w2 = tf.Variable(tf.random_normal(shape=[5]), name='w22')
    w3 = tf.Variable(tf.random_normal(shape=[5]), name='w33')
    
    #保存一部分变量[w1,w2];只保存最近的5个模型文件;每2小时保存一次模型
    saver = tf.train.Saver([w1, w2],max_to_keep=5, keep_checkpoint_every_n_hours=2)
    save_path = './checkpoint_dir/MyModel'#定义模型保存的路径./checkpoint_dir/及模型名称MyModel
    
    # Launch the graph and train, saving the model every 1,000 steps.
    with tf.Session() as sess:
    	sess.run(tf.global_variables_initializer())
    	for step in xrange(100):
    		if step % 10 == 0:
    			# 每隔step=10步保存一次模型( keep_checkpoint_every_n_hours与global_step可同时使用,表示'与',通常任选一个就够了);
    			#每次会在保存的模型名称后面加上global_step的值作为后缀
    			# write_meta_graph=False表示不保存图
    			saver.save(sess, save_path, global_step=step, write_meta_graph=False)
    			# 如果模型文件中没有保存网络图,则使用如下语句保存一张网络图(由于网络图不变,只保存一次就行)
    			if not os.path.exists('./checkpoint_dir/MyModel.meta'):
    				# saver.export_meta_graph(filename=None, collection_list=None,as_text=False,export_scope=None,clear_devices=False)
    				# saver.export_meta_graph()仅仅保存网络图;参数filename表示网络图保存的路径即网络图名称
    				saver.export_meta_graph('./checkpoint_dir/MyModel.meta')#定义网络图保存的路径./checkpoint_dir/及网络图名称MyModel.meta
                                    #注意:tf.train.export_meta_graph()等价于tf.train.Saver.export_meta_graph()
    

    执行后,在checkpoint_dir目录下创建模型文件如下:

    checkpoint
    MyModel.meta
    MyModel-50.data-00000-of-00001
    MyModel-50.index
    MyModel-60.data-00000-of-00001
    MyModel-60.index
    MyModel-70.data-00000-of-00001
    MyModel-70.index
    MyModel-80.data-00000-of-00001
    MyModel-80.index
    MyModel-90.data-00000-of-00001
    MyModel-90.index
    

    如何恢复模型

    tensorflow保存模型时将网络图和网络图里的参数值分开保存。因此,在恢复模型时,也要分为2步:构造网络图和加载参数。

    1. 构造网络图
      构造网络图可以手动创建(需要创建一个跟保存的模型一模一样的网络图),也可以从meta文件里加载graph进行创建,如下:
    #首先恢复graph
    saver = tf.train.import_meta_graph('./checkpoint_dir/MyModel.meta')
    
    1. 恢复参数
      恢复参数有两种方式
    with tf.Session() as sess:
        #恢复最新保存的权重
        saver.restore(sess, tf.train.latest_checkpoint('./checkpoint_dir'))
        #指定一个权重恢复
        saver.restore(sess, './checkpoint_dir/MyModel-50')#注意不要加文件后缀名。若权重保存为.ckpt则需要加上后缀
    

    如何进行微调

    上面叙述了如何恢复模型,那么,对于恢复出来的模型应该如何使用呢?这里以tensorflow官网给出的vgg为例进行说明。
    恢复出来的模型有四种用途:

    • 查看模型参数
    • 直接使用原始模型进行测试
    • 扩展原始模型(直接使用扩展后的网络进行测试,扩展后需要重新训练的情况见微调部分)
    • 微调:使用训练好的权重参数进行初始化,在此基础上对网络的全部或局部参数进行重新训练
    1. 查看模型参数
    import tensorflow as tf
    import vgg
    
    # build graph
    graph = tf.Graph
    inputs = tf.placeholder(dtype=tf.float32, shape=[None, 224, 224, 3], name='inputs')
    net, end_points = vgg.vgg_16(inputs, num_classes=1000)
    
    saver = tf.train.Saver()
    with tf.Session() as sess:
    	saver.restore(sess, './vgg_16.ckpt')  # 权重保存为.ckpt则需要加上后缀
    	"""
    	   查看恢复的模型参数
    	   tf.trainable_variables()查看的是所有可训练的变量;
    	   tf.global_variables()获得的与tf.trainable_variables()类似,只是多了一些非trainable的变量,比如定义时指定为trainable=False的变量;
    	   sess.graph.get_operations()则可以获得几乎所有的operations相关的tensor
        """
    	tvs = [v for v in tf.trainable_variables()]
    	print('获得所有可训练变量的权重:')
    	for v in tvs:
    		print(v.name)
    		print(sess.run(v))
    	
    	gv = [v for v in tf.global_variables()]
    	print('获得所有变量:')
    	for v in gv:
    		print(v.name, '\n')
    	
    	# sess.graph.get_operations()可以换为tf.get_default_graph().get_operations()
    	ops = [o for o in sess.graph.get_operations()]
    	print('获得所有operations相关的tensor:')
    	for o in ops:
    		print(o.name, '\n')
    
    1. 直接使用原始模型进行测试
    import tensorflow as tf
    import vgg
    import numpy as np
    import cv2
    
    image = cv2.imread('./cat.18.jpg')
    print(image.shape)
    res = cv2.resize(image, (224,224))
    res_image = np.expand_dims(res, 0)
    print(res_image.shape, type(res_image))
    
    #build graph
    graph = tf.Graph
    inputs = tf.placeholder(dtype=tf.float32, shape=[None, 224, 224, 3], name='inputs')
    net, end_points = vgg.vgg_16(inputs, num_classes=1000)
    print(end_points)
    saver = tf.train.Saver()
    
    with tf.Session() as sess:
    	#恢复权重
    	saver.restore(sess, './vgg_16.ckpt')#权重保存为.ckpt则需要加上后缀
    	
    	# Get input and output tensors
            # 需要特别注意,get_tensor_by_name后面传入的参数,如果没有重复,需要在后面加上“:0”
            # sess.graph等价于tf.get_default_graph()
    	input = sess.graph.get_tensor_by_name('inputs:0')
    	output = sess.graph.get_tensor_by_name('vgg_16/fc8/squeezed:0')
    	
    	# Run forward pass to calculate pred
            #使用不同的数据运行相同的网络,只需将新数据通过feed_dict传递到网络即可。
    	pred = sess.run(output, feed_dict={input:res_image})
    	#得到使用vgg网络对输入图片的分类结果
    	print(np.argmax(pred, 1))
    
    1. 扩展原始模型
    import tensorflow as tf
    import vgg
    import numpy as np
    import cv2
    
    image = cv2.imread('./cat.18.jpg')
    print(image.shape)
    res = cv2.resize(image, (224, 224))
    res_image = np.expand_dims(res, 0)
    print(res_image.shape, type(res_image))
    
    # build graph
    graph = tf.Graph
    inputs = tf.placeholder(dtype=tf.float32, shape=[None, 224, 224, 3], name='inputs')
    net, end_points = vgg.vgg_16(inputs, num_classes=1000)
    print(end_points)
    saver = tf.train.Saver()
    
    with tf.Session() as sess:
    	# 恢复权重
    	saver.restore(sess, './vgg_16.ckpt')  # 权重保存为.ckpt则需要加上后缀
    	
    	# 明确的网络的输入输出,通过get_tensor_by_name()获取变量
    	input = sess.graph.get_tensor_by_name('inputs:0')
    	output = sess.graph.get_tensor_by_name('vgg_16/fc8/squeezed:0')
    	
    	# add more operations to the graph
    	# 这里只是简单示例,也可以加上新的网络层。
    	pred = tf.argmax(output, 1)
    	
    	# 使用不同的数据运行扩展后的网络(这里扩展后的网络不涉及变量,可以直接使用扩展后的网络进行测试)
    	pred = sess.run(pred, feed_dict={input: res_image})
    	print(pred)
    
    1. 微调
    import vgg
    import numpy as np
    import cv2
    from skimage import io
    import os
    
    # -----------------------------------------准备数据--------------------------------------
    #这里以单张图片作为示例,简单说明原理
    image = cv2.imread('./cat.18.jpg')
    print(image.shape)
    res_image = cv2.resize(image, (224, 224), interpolation=cv2.INTER_CUBIC)#vgg_16有全连接层,需要固定输入尺寸
    print(res_image.shape)
    res_image = np.expand_dims(res_image, axis=0)#网络输入为四维[batch_size, height, width, channels]
    print(res_image.shape)
    labels = [[1,0]]#标签
    
    # -----------------------------------------恢复图------------------------------------------
    #恢复图的方式有很多,这里采用手动构造一个跟保存权重时一样的graph
    graph = tf.get_default_graph()
    
    input = tf.placeholder(dtype=tf.float32, shape=[None, 224, 224, 3], name='inputs')
    y_ = tf.placeholder(dtype=tf.float32, shape=[None, 2], name='labels')
    
    # net=[batch, 2]其中2表示二分类,注意官网给出的vgg_16最终的输出没有经过softmax层
    net, end_points = vgg.vgg_16(input, num_classes=2)  # 保存的权重模型针对的num_classes=1000,这里改为num_classes=2,因此最后一层需要重新训练
    print(net, end_points)  # net是网络的输出;end_points是所有变量的集合
    
    #add more operations to the graph
    y = tf.nn.softmax(net)  # 输出0-1之间的概率
    cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
    output_vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES,scope='vgg_16/fc8')  # 注意这里的scope是定义graph时 name_scope的名字,不要加:0
    print(output_vars)
    
    # loss只作用在var_list列表中的变量,也就是说只训练var_list中的变量,其余变量保持不变。若不指定var_list,则默认重新训练所有变量
    train_op = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy,var_list=output_vars)
    
    # ----------------------------------------恢复权重------------------------------------------
    var = tf.global_variables()  # 获取所有变量
    print(var)
    # var_to_restore = [val for val in var if 'conv1' in val.name or 'conv2' in val.name]#保留变量中含有conv1、conv2的变量
    var_to_restore = [val for val in var if 'fc8' not in val.name]  # 保留变量名中不含有fc8的变量
    print(var_to_restore)
    
    saver = tf.train.Saver(var_to_restore)  # 恢复var_to_restore列表中的变量(最后一层变量fc8不恢复)
    
    with tf.Session() as sess:
    	# restore恢复变量值也是变量初始化的一种方式,对于没有restore的变量需要单独初始化
    	# 注意如果使用全局初始化,则应在全局初始化后再调用saver.restore()。相当于先通过全局初始化赋值,再通过restore重新赋值。
    	saver.restore(sess, './vgg_16.ckpt')  # 权重保存为.ckpt则需要加上后缀
    
    	var_to_init = [val for val in var if 'fc8' in val.name]  # 保留变量名中含有fc8的变量
    
    	# tf.variable_initializers(tf.global_variables())等价于tf.global_variables_initializer()
    	sess.run(tf.variables_initializer(var_to_init))  # 没有restore的变量需要单独初始化
    	# sess.run(tf.global_variables_initializer())
    
    	# 用w1,w8测试权重恢复成功没有.正确的情况应该是:w1的值不变,w8的值随机
    	w1 = sess.graph.get_tensor_by_name('vgg_16/conv1/conv1_1/weights:0')
    	print(sess.run(w1, feed_dict={input: res_image}))
    
    	w8 = sess.graph.get_tensor_by_name('vgg_16/fc8/weights:0')
    	print('w8', sess.run(w8, feed_dict={input: res_image}))
    	
    	sess.run(train_op, feed_dict={input:res_image, y_:labels})
    

    补充

    1 .pb格式的文件

    上面提到对于恢复的模型可以直接用来进行测试。对于不再需要改动的模型,我们可以将其保存为.pb格式的文件。

    为什么要生成pb文件呢?简单来说就是直接通过tf.saver保存的模型文件其参数和图是分开的。这种形式方便对程序进行微小的改动。但是对于训练好,以后不再需要改动的模型这种形式就不是很必要了。

    pb文件就是将变量的值固定下来,直接“烧”到图里面。这个时候只需用户提供一个输入,我们就可以通过模型得到一个输出给用户。pb文件一方面可提供给用户做离线的预测;另一方面,对于线上的模型,一般是通过C++或者C语言编写的程序进行调用。所以模型最终都是写成pb格式的文件。

    2 .npy格式的文件

    tensorflow保存的模型文件只能在tensorflow框架下使用,不利于将模型权重导入到其他框架使用,同时保存的模型文件无法直接查看。因此经常会考虑转换为.npy格式。.npy文件里的权重值是以数组的形式保存着的,方便查看。

    展开全文
  • 一个的教师,并不他能教学生,在班主任工作这一方面也应有他的独到之处.同时,也才能体现一个教师的管理能力. 运动队的训练.首先,通过见习,看指导老师如何带训练队,从他的训练过程中,结合自己?..
  • 如何成为演讲者? 演讲的常见误区? Part1 演讲是什么? 百度百科解释:演讲又叫讲演或演说,是在公众场所,以有声语言为主要手段,以体态语言为辅助手段,针对某个具体问题,鲜明、完整地发表自己的见解和...
  • 半年来,我较地发挥了自己在个方面的优势,取得良好效果。 第一个优势,是我和保险媒体比较熟,了解刊物用稿的具体要求。 刚才,通过乐平总的述职,大家知道,xx个险上半年的业绩相当突出,可圈可点的事很多。...
  • 目录 一、算法测试 1、模型评估 2、鲁棒性 (robustness) ...我们实际希望的,是在新样本上能表现得很的学习器,为了达到这个目的,应该从训练样本中尽可能推演出适用于所有潜在样本的“普通规律”,这..

    目录

    一、算法测试

    1、模型评估

    2、鲁棒性 (robustness)

    3、模型安全

    4、响应速度

    二、业务测试

    三、白盒测试

    四、模型监控

    五、算法测试学习入门


     这里写图片描述

    一、算法测试

    1、模型评估

    如何评估模型?可以通过泛化能力。泛化能力指的是学习方法对未知数据的预测能力。就好比运动员平时都是在训练场进行训练,而评估运动员的真实实力要看在大赛中的表现。 我们实际希望的,是在新样本上能表现得很好的学习器,为了达到这个目的,应该从训练样本中尽可能推演出适用于所有潜在样本的“普通规律”这样才能在遇到新样本时做出正确的预测,泛化能力比较好。 当学习器把训练样本学得“太好”了的时候,很可能已经把训练样本自身的一些特点当作了所有潜在样本都会具有的一般性质,这样就会导致泛化性能下降。这种现象在机器学习中称为“过拟合“,与之相对是“欠拟合”指的是对训练样本的一般性质尚未学习。 有多种因素可能导致过拟合,其中最常见的情况是由于学习能力过于强大,以至于把训练样本所包含的不太一般的特性都学到了,而欠拟合则通常是由于学习能力低下而造成的。

    如何看泛化能力的好坏呢? 通过泛化误差。 先解释下各种名词 ,从数据中分析得到模型的过程称为“训练”,用于“训练”的数据称为“训练数据”。其中每个样本称为一个“训练样本”,训练样本组成的集合称为“训练集”,测试样本组成的集合称为“测试集”。 模型在训练集上的误差通常称为 “训练误差” 或 “经验误差”,在测试集上的误差通常称为“测试误差”,而在新样本上的误差称为 “泛化误差” 。机器学习的目的是得到泛化误差小的学习器。然而,在实际应用中,新样本是未知的,所以 以测试集上的“测试误差”作为泛化误差的近似。使用一个“测试集”来测试学习器对新样本的判别能力。需要注意的是,测试样本尽量不在训练集中出现、未在训练过程中使用过。

    performance measure是衡量模型的泛化能力的评价标准。 

    • 准确率(accuracy)
    • 精确率(precision)==查准率、召回率( recall)==查全率,F1值 ,ROC与AUC —分类算法评价指标 F1值 是精确率和召回率的调和均值 
    • MSE(均方误差),RMSE(均方根误差),MAE(平均绝对误差)、R-Squared(拟合度) —-回归算法评价指标

    都是评估模型好坏的指标,相互之间有一定关系,只是侧重点会不同。 

    1)准确率(accuracy)

    对于给定的测试数据集,分类器正确分类的样本数与总样本数之比,是最常见也是最基本的评价算法性能指标。 有些场景下,只看这一个指标是不够的。比如 : 在二分类中,当正反比例不平衡的情况下,尤其是当我们对少数的分类更感兴趣的时时候,准确率评价基本就没什么参考价值。 举个例子:有个100条样本数据的测试集,其中80个正例,20个反例。那如果模型把所有样本都预测为正例,那模型的准确率至少都是80%。当模型遇到新样本时,它都区分不出一个反例。这种模型也就没用了。

    2)精确率和召回率

    精确率是针对我们预测结果而言的,它表示的是预测为正的样本中有多少是真正的正样本。 而召回率是针对我们原来的样本而言的,它表示的是样本中的正例有多少被预测正确了。 一般来说,精确率高时,召回率往偏低,而精确率低时,召回率偏高。 只有在一些简单的任务中才可能使精确率和召回率都很高。

    精确率和召回率 实例 
    这里写图片描述

    3)评价指标跑出来看又怎么评判呢? 

    这里运行得出的准确率是0.96,好还是不好呢,是否可以测试通过。要1.0准确率才测试通过吗?

    看实际项目的应用场景、目前的技术水平、产品经理的需求定义,测试人员把各指标值反馈出来,在测试报告中体现出来。

    比如说无人驾驶,如果它的准确率是96%,大家会不会去坐无人驾驶的汽车呢?反正我是不敢的,这是在用生命来测试算法。 我们来看下2016年的新闻 ,百度自动驾驶负责人王劲 2016年9月 ,去年的这个时候,我们的图象识别,识别汽车这一项,刚好也是89%。我们认为这个89%,要达到97%的准确率,需要花的时间,会远远超过5年。而人类要实现无人驾驶,主要靠摄像头来实现安全的保障的话,我们认为要多少呢?我们认为起码这个安全性的保障,要达到99.9999%,所以这个是一个非常非常远的一条路。我们认为不是5年,10年能够达得到的。 一般的人工智能系统,如搜索、翻译等可允许犯错,而无人驾驶系统与生命相关,模型性能要求很高。

    2、鲁棒性 (robustness)

    鲁棒性也就是所说健壮性,简单来说就是在模型在一些异常数据情况下是否也可以比较好的效果。 也就是我们在最开始讲人工智能三个特征中的 处理不确定性的能力。 比如人脸识别,对于模糊的图片,人带眼镜,头发遮挡,光照不足等情况下的模型表现情况。 算法鲁棒性的要求简单来说就是 “好的时候”要好,“坏的时候”不能太坏。 在AlphaGo 和李世石对决中,李世石是赢了一盘的。李世石九段下出了“神之一手” Deepmind 团队透露:错误发生在第79手,但AlphaGo直到第87手才发觉,这期间它始终认为自己仍然领先。这里点出了一个关键问题:鲁棒性。人类犯错:水平从九段降到八段。机器犯错:水平从九段降到业余。 

    测试方法就是用尽可能多的异常数据来覆盖进行测试。

    3、模型安全

    攻击方法有:试探性攻击、对抗性攻击两种。

    • 试探性攻击:攻击者的目的通常是通过一定的方法窃取模型,或是通过某种手段恢复一部分训练机器学习模型所用的数据来推断用户的某些敏感信息。 主要分为模型窃取和训练数据窃取 
    • 对抗性攻击:对数据源进行细微修改,让人感知不到,但机器学习模型接受该数据后做出错误的判断。 比如图中的雪山,原本的预测准确率为94%,加上噪声图片后,就有99.99%的概率识别为了狗。 

    目前模型安全还是比较难的领域,像构造对抗性样本,这里就简单介绍下一下。

    4、响应速度

    响应速度是指从数据输入到模型预测输出结果的所需的时间。对算法运行时间的评价。 

    测试方法: 

    time.time() / time.clock() 

    time命令 

    time python test.py 

    定义装饰器timethis,将装饰器放在函数定义之前 

    这里只是简单看下模型运行所需的时间。并没有涉及大数据集群,分布式下的算法性能。

    二、业务测试

    包括业务逻辑测试,业务 & 数据正确性测试。主要关注业务代码是否符合需求,逻辑是否正确,业务异常处理等情况。可以让产品经理提供业务的流程图,对整体业务流程有清晰的了解。业务测试大家肯定都非常熟悉了,都是相通的,这里不花时间介绍啦。

    三、白盒测试

    白盒测试方法有很多,这里以只说下代码静态检查。 先让算法工程师将代码的逻辑给测试人员讲解,通过讲解理清思路。 然后测试做代码静态检查,看是否会有基本的bug。 工具的话使用pylint来做代码分析。

    四、模型监控

    服务监控大家应该都知道,这里就不介绍了。只说下模型监控。 项目发布到线上后,模型在线上持续运行,需要以固定间隔检测项目模型的实时表现,可以是每隔半个月或者一个月,通过性能指标对模型进行评估。对各指标设置对应阀值,当低于阀值触发报警。如果模型随着数据的演化而性能下降,说明模型已经无法拟合当前的数据了,就需要用新数据训练得到新的模型。机器学习算法项目的测试就介绍到这里。

    五、算法测试学习入门

    机器学习理论和实战书籍视频推荐,给有兴趣学习机器学习的同学。 
    这里写图片描述

    展开全文
  • 在这半个月的时间里,我们主要学习了社会主义核心价值观、“个全面”战略布局与治国理政、如何公务员、公务礼仪、机关公文写作与处理、丰台区经济社会发展情况等课程,并参加了拓展训练和现场教学。...
  • ③转变态度,开发潜能”,更的胜任现职工作或担负更高级别的职务,从而促进组织效率的提高和组织目标的实现。 ... ... ... 第二章 六大要素分析 什么时候需要培训 培训谁(对象) 谁培训...
  • C/C++领域的手开源项目,小伙伴们接 5个值得学习和手的企业级开源项目! 互联网开发十大顶级开源项目巡礼! 推荐几个炫酷的Python开源项目 书籍推荐 我的Java后端开发小书架分享 必读计算机编程好书推荐!...
  • 全书共36章,分为篇。前两篇每章讲述一个有代表性的真实案例。第三篇讨论了调试工具和调试系统的设计方法。第篇收录了使用调试器探索计算机世界的若干学习笔记,包括在调试器中细品CPU,通过调试器观察和解码堆...
  • 我是如何成为算法工程师的,超详细的学习路线 B站优质视频资源推荐,起飞! 别再折腾开发环境了,一劳永逸的搭建方法 助你编程能力「突飞猛进」的干货分享 更新中... 视频 程序员必备的8个学习网站,再也不用交...
  • pytorch教程

    2019-01-18 00:34:18
     一般而言,N层的神经网络并不会把输入层算计去,因此,一个一层的网络是没有隐藏层、只有输入层和输出层的网络。输出层一般是没有激活函数的。  一般神经网络的损失函数是非凸的,容量更小的网络更容易陷入...
  • 如何掌握切土豆丝的技巧 简介 大家,新尝试一个教学系列,实时记录一些和徒弟们的日常。将一些特别的后厨技巧和实用方法教给他们的同时也通过视频的方式教给所有人。这期就和大家聊一聊切土豆丝的...
  • C#数据结构

    2013-12-10 11:49:54
    理数据时,必须解决个方面的问题:一是如何在计算机中方便、高效地表示和 组织数据;二是如何在计算机存储器(内存和外存)中存储数据;三是如何对存 储在计算机中的数据进行操作,可以有哪些操作,如何实现这些...
  • question desc:有人上高速,把车给刮的不像样子,如何 question_type: 交通事故 0.9999163150787354 ********************************************************* question desc:有个老头去世了,儿女们在争夺财产,...
  • 1.1.1 修炼第一层境界:剑四方,试问天下谁与争锋 11 1.1.2 修炼第二层境界:世界如此之大,要学的东西很多 11 1.1.3 修炼第三层境界:最深即最浅,最浅即最深,不过如此 12 1.1.4 点评"修炼三层境界" 13 1.1.5 ...
  • 文本分类是标记句子或文档,例如电子邮件垃圾邮件分类和情感分析。 下面是一些很的初学者文本分类数据集。 路透社Newswire主题分类(路透社-21578)。1987年路透社出现的一系列新闻文件,按类别编制索引。另见...
  • 文本分类是标记句子或文档,例如电子邮件垃圾邮件分类和情感分析。 下面是一些很的初学者文本分类数据集。 路透社Newswire主题分类(路透社-21578)。1987年路透社出现的一系列新闻文件,按类别编制索引。另见...
  • 的是如何驾驭所有前端框架。对,你没有看错,是所有,而不是某一个。 如果是介绍如何驾驭某一个框架,那么本文的标题可能就要改成“御剑之术”,但本文介绍的是“御剑之道”。 现代...
  • 设施较齐全、环境较,以多、中、高层住宅为主用地 R21 住宅用地 住宅建筑用地(含保障性住宅用地)及其附属道路、停车场、小游园等用地 R22 服务设施用地 居住小区及小区级以下的幼托、文化、体育、商业、卫生...
  • 以公司制为主体的市场经济的基本成份,它包含两个层次的含义:一是作为市场经济的基本成份,凡符合市场经济要求的,与市场经济要求相适应的企业制度均可称为现代企业制度。二是公司制为核心的具体形式,按公司...
  • 商务智能架构图表

    2011-10-21 19:47:31
    利用计算机的强大运算能力,人类可以使用三维或维的方式表现液体流型、分子动力学的复杂科学模型。 比如利用经验数据,科学可视化在天体物理学(模拟宇宙爆炸等)、地理学(模拟温室效应)、气象学(龙卷风或大气...
  • C++MFC教程

    热门讨论 2013-05-21 13:37:15
    |------ 1.1 如何学好VC |------ 1.2 理解Windows消息机制 |------ 1.3 利用Visual C++/MFC开发Windows程序的优势 |------ 1.4 利用MFC进行开发的通用方法介绍 |------ 1.5 MFC中常用类,宏,函数介绍 +-- 第二章 ...
  • SQL语法大全

    2014-03-30 11:00:11
    SQL语法大全 SQL语法大全 1. ASP与Access数据库连接: dim conn,mdbfile mdbfile=server.mappath("数据库名称.mdb") set conn=server.createobject("adodb.connection") conn.open "driver={microsoft access ...
  • 软件工程教程

    热门讨论 2012-07-06 23:10:29
    实现:事物是如何工作的特殊细节(如何做) 扩展机制 约 束:允许对模型元素添加新的规则 构造型:基于已有的建模元素引入新的建模元素 标记值:允许为模型元素添加新的特性,是带有相关值得关键字 JAVA开发平台体系...

空空如也

空空如也

1 2
收藏数 27
精华内容 10
关键字:

如何练好四指