数据专栏

智能大数据搬运工,你想要的我们都有

科技资讯

科技学院

科技百科

科技书籍

网站大全

软件大全

「深度学习福利」大神带你进阶工程师,立即查看>>>
Counting 计数
Natural Number 自然数
Odd Number 奇数
Even Number 偶数
Mathematical Symbol 数学符号
Arithmetic 数术
Subtraction 减法
Multiplication 乘法
Division 除法
Mixed Operation 混合运算
Single Digit 个位数
Decimal System 十进制
Interger 整数
Number Axis 数轴
Negative Number 负数
Absolute Value 绝对值
Algebra 代数
Proprtion 比例
Factor 因子
Fraction 分数
Reduction of a Fraction 约数
Prime Nuber 质数
Composite Number 合数
Relatively Prime 互质
Pythagorean Theotem 勾股定理
Irrational Number 无理数
Real Number 实数
Basic Geometry 基本几何
Point 点
Line 线
Plane 面
Square 正方形
Circle 圆
Perimeter 周长
Area 面积
Half-Line 射线
Angle 角
Tangent Line 切线
Arc Length 弧长
Graph Transformation 图形变换
Projective Geometry 射影几何
Three-view Drawing 三视图
Cube 立方体
Surface Area 表面积
Volume 体积
Cylindrical 圆柱
Cone 圆锥
Sphere 球
Achimedean Spiral 阿基米德螺线
Rectangular Coordinate System 直角坐标系
Power 幂
Extraction of a Root 开方
Elementary Algebra 初等代数
Equation 方程
Polynomial 多项式
Vieta Theorem 韦达定理
Bisection Method 二分法
Syllogism 三段论
Proposition 命题
Necessary and Sufficient Condition 充要条件
Aggregate 集合
Venn Diagram 韦恩图
Mapping 映射
Variable 变量
Function 函数
Function Image 函数图像
Field of Definition 定义域
Range 值域
Slope 斜率
Derivative 导数
Logarithm 对数
Monotonic Function 单调函数
Axis of Symmetry 对称轴
Parabola 抛物线
Composite Function 复合函数
Tangent 正切
Cosine 余弦
Sine 正弦
Trigonometric Function 三角函数
Curve 曲线
Plane Vector 平面向量
Fermat's Theorem 费马定理
Probability 概率
Statistics 统计
Variance 方差
Mean Value 均值
Classical Probability 古典概型
Mathematical Expectation 数学期望
Normal Distribution 正态分布
Random Sampling 随机抽样
Sequence of Number 数列
General Term Formula 通项公式
Permutation 排列
Combination 组合
Imaginary Number 虚数
Complex Number 复数
Linear 线性变换
Transformation Vector Algebra 向量代数
Space Vector 空间向量
Eigenvalue 特征值
Vector Product 向量积
Polar Coordinates 极坐标
Parametric Equation 参数方程
Ellipse 椭圆
Hyperbola 双曲线
Conic Section 圆锥曲线
Limit 极限
Continuity 连续
Infinitesimal 无穷小
Differential 微分
Integration 积分
Integration By Substitution 换元积分
L'Hopital's Rule 洛必达法则
Indefinite Integral 不定积分
Infinite 无限
Discrete Variable 离散变量
Convergence 收敛
Infinite Series 无穷级数
Taylor's Series 泰勒级数
Taylor's Formula 泰勒公式
Differential Equation of Higher Order 高阶微分方程
Linear Regression 线性回归
Green Formula 格林公式
Variable limit Integral 变限积分
Cauchy Mean Value Theorem 柯西中值定理
Determinant 行列式
Homogeneous Linear Equations 齐次线性方程组
Rank 秩
Partial Derivative 偏导数
Partial Differential Equation 偏微分方程
Order 阶
Markov Chain 马尔科夫链
Ordinary Differential Equation 常微分方程
Surface Equation 曲面方程
Multivariable Calculus 多元微积分
Multiple Integral 重积分
Surface Integral 曲面积分
Stochastic Analysis 随即分析
Bernoulli Equation 伯努利方程
Law of Large Numbers 大数定律
Differential Geometry 微分几何
Euler Equations 欧拉方程
Infintesimal Transformation 无穷小变换
Trigonometric Series 三角级数
Lagrange Mean Value Theorem 拉格朗日中值定理
Calculus of Variations 变分法
Euclidean Space 欧氏空间
Jordan Canonical Form 诺尔当标准型
Divergence Theorem 散度定理
Eigenvector 本征矢
Orthogonalization 正交化
Vector Space 矢量空间
Laplace Transform 拉普拉斯变换
Least Square Method 最小二乘法
Gauss Formula 高斯公式
Stokes Theorem 斯托克斯定理
Real Analysis 实分析
Number Theory 数论
Fourier Series 傅里叶级数
Lobachevskian Axiom of Parallels 罗氏平行公理
Non-Euclidean Geometry 非欧几何
Clairaut Equation 克莱罗方程
Algebraic Geometry 代数几何
Cayley Number 凯莱数
Orthogonal Matrix 正交矩阵
Riemannian Surface 黎曼曲面
Complex Variable Function 复变函数
Zeta Function z函数
Complex Plane 复平面
Complex Analysis 复分析
Dirichlet Series 迪利克雷级数
Harmonic Analysis 调和分析
Meromorphic Function 半纯函数
Holomorphic Function 全纯函数
Field Theory 域论
Algebraic Number Theory 代数数论
Wilson Theorem 威尔逊定理
Hilbert Space 希尔伯特空间
Operator Algebras 算子代数
Functional Analysis 泛函分析
Burnside Conjecture 伯恩赛德猜想
Analytic Number Theory 解析数论
Axiomatization 公理化
Projective Algebraic Variety 射影代数族
Algebraic Topology 代数拓扑
Path Integral 路径积分
Homotopy 同伦
Cryptography 密码学
Godel's Incompleteness Theorem 哥德尔不完全性定理
Russell's paradox 罗素悖论
Hypercomplex System 超复数系
Combinatorics 组合学
Homeomorphism 同胚
Poincare Conjecture 庞加莱猜想
Smooth Manifold 光滑流形
Boolean Algebra 布尔代数
Banach Space 巴拿赫空间
Homological Mirror Symmetry 同调镜像对称
Cohomology 上同调
Goldbach Conjecture 哥德巴赫猜想
Topological Degree 拓扑度
Hairy Ball Theorem 毛球定理
Groupoids 群胚
Knot Theory 扭结理论
Grobner Basis G基
Klein Four-group 克莱因四元群
Quintic Equation 五次方程
Symplectic Geometry 辛几何
Chaos Theory 混沌理论
Abel Theorem 阿贝尔定理
Galois Theory 伽罗瓦理论
Group Theory 群论
Lie Group 李群
Lie Algebra 李代数
P-adic Analysis P进数分析
Game Theory 博弈论
Cybernetics 控制论
Clifford Algebra 克里福德代数
Automorphic Form 自守形式
Operations Research 运筹学
Optimization 最优化
Hypergeometric Function 超几何函数
Differentiable Manifold 微分流形
Gamma Function 伽玛函数
Modulus Theta Function 模T函数
BSD Conjecture 不知所云的BSD猜想
Navier-Stokes Equation 胡搅蛮缠的N-S方程
Yang-Mills Theory 低能勿进的杨-米尔斯
Hodge Conjecture 令人绝望的霍奇猜想
NP-Complete Problems 生无可恋的NP-C问题
Stein Manifold 施泰因流形
Noether's Theorem 诺特定理
System Entropy 系统熵
Gauge Theory 规范场论
Superstring Theory 超弦理论
Hermitian Operator 厄米特算子
Actuarial Studies 保险精算
Economic Forecasting 经济预测
Stock Market Analysis 股市分析
Stochastic Simulation 随机模拟
人工智能
2020-06-10 09:48:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
算法思想:
1. 计算所求向量距离已知向量的距离;
思想和二维思想一样。
2. 对所有距离进行排序,取前k个,统计各个标签出现的次数(总数为k) ; // {'A': 1, 'B': 2}
3. 统计后,对其进行排序; // [('B', 2), ('A', 1)
4. 返回第一个也就是距离最近的点的分类。// B

python实现: #kNN.py from numpy import * import operator def createDataSet(): group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) labels = ['A','A','B','B'] return group, labels def classify0(intX, dataSet, labels, k): dataSetSize = dataSet.shape[0] diffMat = tile(intX, (dataSetSize,1)) - dataSet sqDiffMat = diffMat ** 2 sqDistances = sqDiffMat.sum(axis=1) distances = sqDistances ** 0.5 sortedDistIndicies = distances.argsort() classCount = {} for i in range(k): voteIlabel = labels[sortedDistIndicies[i]] print voteIlabel classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 print classCount sortedClassCount = sorted(classCount.iteritems(), key = operator.itemgetter(1),reverse=True) print sortedClassCount return sortedClassCount[0][0]
进入kNN.py的目录,执行python命令:
mac和linux系统直接cd到kNN.py的目录,执行python即可;
如果是windows则需要先进入到python.exe的目录,然后执行python,或者执行:c:\Python2.6\python.exe
import kNN
group,labels = kNN.createDataSet()
group 验证
## dataSetSize,diffMat = kNN.classify0([0,0], group, labels, 3)
a = kNN.classify0([0,0], group, labels, 3)

输出: B {'B': 1} B {'B': 2} A {'A': 1, 'B': 2} [('B', 2), ('A', 1)]
代码及测试数据可见: https://github.com/zhongsb/machineLearning/tree/master
参考:《机器学习实战》[Peter Harrington]
关注博主微信号,获取更及时消息。
人工智能
2020-06-10 07:32:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
今天,跟大家交流的是:土壤恶化后带来的一系列问题,及造成土壤恶化的原因。
一、土壤恶化后,带来的问题
土壤出现红苔、白霜
第一个后果:表现为品质差。
比如说,原来我们讲瓜果飘香,香瓜、香菜在那个时候,味道都是非常浓郁的,带着一种清新的味道。现在想一想,还有吗?该香的已经不香了,该甜的已经不甜了,就是说品质在下降,品质下降商品率就降低,价格自然也不好。
第二个后果:就是产量。
原来的时候,一亩地投入1袋复合肥,投入100块钱,产量能达到800斤或1000斤。在土地集约化的现在,可耕种面积少了,我们还想着让他增加产量,就有很多的朋友大量施肥。后来不断有朋友发现:原来用一袋化肥能达到800-1000斤的产量,现在用2袋肥料还达不到1000斤。这就说明投入增加了,但是产量没有增加,也就是说投入和产量并不成正比。
人工智能
2020-06-09 16:31:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
1.导读
驾车导航是数字地图的核心用户场景,用户在进行导航规划时,高德地图会提供给用户3条路线选择,由用户根据自身情况来决定按照哪条路线行驶。
同时各路线的 ETA(estimated time of arrival,预估到达时间) 会直接显示给用户,这是用户关心的核心点之一。用户给定起点和终点后,我们的任务是预测起终点的ETA,ETA的准确率越高,给用户带来的出行体验越好。
2.基于深度学习模型的探索和实践
2.1模型选择
传统机器学习模型在ETA中,比较常用的有线性回归、RF(随机森林)、GBDT(梯度提升决策树)等回归预测类模型。线性模型表达能力较差,需要大量特征工程预先分析出有效的特征;RF通过样本随机和特征随机的方式引入更多的随机性,解决了决策树泛化能力弱的问题;GBDT是通过采用加法模型(即基函数的线性组合),以及不断减小训练过程产生的残差来达到回归的算法。
传统机器学习模型相对简单易懂,也能达到不错的效果,但存在两个问题: 模型的表达能力跟选取的特征有关,需要人工事先分析出有效的特征。 没有考虑上游对下游路段的影响,产生了如丢失上下游关联信息、下游受上游影响导致的不确定性等问题。
第一个问题很好理解,深度学习模型能很好地弥补这方面。针对第二个问题,以历史速度信息选取存在的不确定性为例来说明一下,历史速度信息是一个区分周一到周日七个工作日、10分钟间隔的历史平均时间,可以根据该路段的预计进入时间所在10分钟区间来选定。如下图(历史平均速度)从0:00-24:00的变化曲线,可以看到一天中特别是早晚高峰,速度值存在较大波动。
而在选取历史平均时间时,依赖的是预计进入时间,这个时间依赖于上游路段的预计通行时间,因此其选取存在不确定性,进而导致ETA计算不准确。
考虑到以上问题的存在,我们选择利用RNN的时间序列思想将路线中上下游路段串联起来进行路段ETA的预测。
另外考虑到RNN存在的长依赖问题,且结合实际业务情况,我们选择使用LSTM模型来进行建模,LSTM的门结构具有的选择性还能让模型自行学习选择保留哪些上游的特征信息进行预测。
2.2网络架构
上图为整个模型的框架图,主要分为两部分,使用LSTM模块对路线中的路段ETA的预测和最终使用N层全连接模块对累计路段ETA及路线各特征进行完整路线的ETA预测。
2.3路段ETA预测
上图为各路段ETA预测使用的LSTM结构图,Xt为路线中第t个路段的特征信息,主要包含对应的实时路况信息、历史路况信息、路段的静态特征等。
LSTM本是输入时间序列数据的模型,我们利用该思想,将路线中各路段序列依次输入模型。
2.4完整路线ETA预测
在LSTM模块得到累计路线ETA预测值后,结合该路线的静态属性,使用全连接模块将其整合成最终输出的完整路线ETA预测值。
路线的属性特征主要指一些人工提取的特征,如该路线的长度、导航规划发起特征日、是否早晚高峰时段等,用以加强模型在不同场景下的表达能力。
损失函数选用线性回归常用的平方形式:MSE,公式如下:
其中,N是路线数量,ETA路线j为路线ETA,即预测值;用户实走j为用户在该路线的实走时间,即真值。
3.模型效果
衡量模型效果,即路线上ETA的预测值时,主要考虑的是准确率。一般情况下,用户对ETA偏长和偏短的容忍度不同,对偏长容忍度更高。比如用户要去机场,ETA给的时间偏短10分钟比偏长10分钟对用户的损害更大。因此准确度的指标设计倾向于ETA偏长,定义为满足用户一定容忍范围的请求比例,即准确率作为主要衡量指标。
在北京市上的实验结果显示,ETA准确率得到提升,MSE loss下降比例28.2%,效果有了明显的提升。
4.小结
本文介绍了引入深度学习模型,帮助建模导航规划的预估到达时间预测,成功解决了线性模型的不足,也为后续引入更多特征、进行更多探索打开了空间,如历史速度信息的不确定度、时效性、周期性、突发事件、路网结构等。
人工智能
2020-06-09 14:39:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
一般去拍证件照时底色是蓝色或者红色,但有的证件需要其他颜色。要办的证件很多,如果每办一次就要去拍很麻烦,
那么通过百度的 人像分割 。再稍加一点代码即可实现照片换底色功能,很省事很便捷。
这里直接从接口开始。没有百度账号,第一次使用百度AI建议看 接入指南 哦 https://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjgn3
本文讲解使用 Java 语言
-------------后端代码-------------
1.创建一个springboot项目,推荐使用maven构建 lombok https://mvnrepository.com/artifact/org.projectlombok/lombok aip-sdk https://mvnrepository.com/artifact/com.baidu.aip/java-sdk commons-fileupload https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload fastjson https://mvnrepository.com/artifact/com.alibaba/fastjson hutool-all https://mvnrepository.com/artifact/cn.hutool/hutool-all
2.创建类,单例加载百度AISDK import com.baidu.aip.bodyanalysis.AipBodyAnalysis; /** * 加载模块对象 * @author 小帅丶 */ public class BDFactory { private static AipBodyAnalysis aipBodyAnalysis; private static String appid_body = ""; private static String apikey_body = ""; private static String secretkey_body = ""; public static AipBodyAnalysis getAipBodyAnalysis(){ if(aipBodyAnalysis==null){ synchronized (AipBodyAnalysis.class) { if(aipBodyAnalysis==null){ aipBodyAnalysis = new AipBodyAnalysis(appid_body, apikey_body, secretkey_body); } } } return aipBodyAnalysis; } }
3.创建Controller,编写上传图片接口
此功能会实现人像分割、图片底色更换 import cn.hutool.core.codec.Base64; import cn.ydxiaoshuai.tools.factory.BDFactory; import cn.ydxiaoshuai.tools.util.PngColoringUtil; import cn.ydxiaoshuai.tools.vo.AcnespotmoleBean; import cn.ydxiaoshuai.tools.vo.BodySegBean; import com.alibaba.fastjson.JSON; import com.baidu.aip.bodyanalysis.AipBodyAnalysis; import lombok.extern.slf4j.Slf4j; import org.json.JSONObject; import org.springframework.context.annotation.Scope; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.ServletRequestUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.*; import java.util.HashMap; /** * @author 小帅丶 * @className IdPhotoRestController * @Description 证件照处理 * @Date 2020/5/21-10:20 **/ @Controller @RequestMapping(value = "/idphoto") @Scope("prototype") @Slf4j public class IdPhotoRestController extends ApiRestController{ AipBodyAnalysis aipBodyAnalysis = BDFactory.getAipBodyAnalysis(); /** * @Description 照片底色替换 * @param file 图片文件 * @return void * @Author 小帅丶 * @Date 2020年6月5日 **/ @RequestMapping(value = "/replace", method = {RequestMethod.POST}, produces="application/json;charset=UTF-8") public ResponseEntity idphotoReplace(@RequestParam(value = "file") MultipartFile file, HttpServletRequest request, HttpServletResponse response) { log.info("方法路径{}", request.getRequestURI()); AcnespotmoleBean bean = new AcnespotmoleBean(); //颜色 String colorStr = ServletRequestUtils.getStringParameter(request, "color","red"); Color backgroudColor = getColor(colorStr); HashMap options = new HashMap<>(); try { startTime = System.currentTimeMillis(); options.put("type", "foreground"); JSONObject object = aipBodyAnalysis.bodySeg(file.getBytes(), options); BodySegBean bodySegBean = JSON.parseObject(object.toString(),BodySegBean.class); if(bodySegBean.getPerson_num()>=1){ //返回处理后的图片 String imagebase64 = PngColoringUtil.changePNGBackgroudColorByBase64(Base64.decode(bodySegBean.getForeground()), backgroudColor); AcnespotmoleBean.Data data = new AcnespotmoleBean.Data(); data.setImage_base64(imagebase64); bean.success("success", "成功", data); }else{ bean.fail("fail", "处理失败 未检测到人脸", 20200522); } } catch (Exception e) { errorMsg = e.getMessage(); log.info("背景图变化接口出错了" + errorMsg); bean.error("system error", "系统错误"); } //耗时 timeConsuming = String.valueOf(System.currentTimeMillis() - startTime); log.info("耗时{},接口返回内容",timeConsuming); //响应的内容 return new ResponseEntity(JSON.toJSONString(bean), httpHeaders, HttpStatus.OK); } private Color getColor(String colorStr) { Color backgroudColor = null; if(colorStr.equals("red")){ backgroudColor = Color.RED; } if(colorStr.equals("blue")){ backgroudColor = Color.BLUE; } if(colorStr.equals("black")){ backgroudColor = Color.BLACK; } if(colorStr.equals("white")){ backgroudColor = Color.WHITE; } return backgroudColor; } }
4.页面返回的对象 import com.fasterxml.jackson.annotation.JsonInclude; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * @author 小帅丶 * @className AcnespotmoleBean * @Description 接口返回页面的对象 * @Date 2020/4/10-15:11 **/ @Data @AllArgsConstructor @NoArgsConstructor @JsonInclude(JsonInclude.Include.NON_NULL) public class AcnespotmoleBean extends BaseBean{ //具体返回的内容 private Data data; @lombok.Data public static class Data{ private String image_base64; private Integer acne_count=0; private Integer speckle_count=0; private Integer mole_count=0; } public AcnespotmoleBean success(String msg,String msg_zh, Data data) { this.msg = msg; this.msg_zh = msg_zh; this.code = 200; this.data = data; return this; } public AcnespotmoleBean fail(String msg,String msg_zh, Integer code) { this.msg = msg; this.msg_zh = msg_zh; this.code = code; return this; } public AcnespotmoleBean error(String msg,String msg_zh) { this.msg = msg; this.msg_zh = msg_zh; this.code = 500; return this; } }
5.基础Bean import com.fasterxml.jackson.annotation.JsonInclude; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * @author 小帅丶 * @className BaseBean * @Description 基类 * @Date 2019/7/18-14:48 **/ @Data @AllArgsConstructor @NoArgsConstructor @JsonInclude(JsonInclude.Include.NON_NULL) public class BaseBean { public Integer code; public String msg; public String msg_zh; public String author; }
6.人像分割返回的JSON字符串转的Java对象 import lombok.Data; import lombok.NoArgsConstructor; import java.util.List; /** * @author 小帅丶 * @className BodySegBean * @Description 人像分割 * @Date 2020/5/22-15:18 **/ @NoArgsConstructor @Data public class BodySegBean { private int person_num; private String foreground; private long log_id; private List person_info; @NoArgsConstructor @Data public static class PersonInfoBean { private double height; private double width; private double top; private double score; private double left; } }
7.所需工具类。即对图片进行底色替换的方法 import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.util.Base64; /** * @Description 透明背景上色 * @author 小帅丶 * @className PngColoringUtil * @Date 2019/10/11-17:03 **/ public class PngColoringUtil { /** * @Description 给PNG图片增加背景色 * @Author 小帅丶 * @param sourceImage 原始图片 最好是PNG透明的 * @param targetImage 修改后的图片 * @param backgroudColor 背景色 **/ public static void changePNGBackgroudColor(String sourceImage, String targetImage, Color backgroudColor) { try { BufferedImage result = changePNGBackgroudColor(sourceImage, backgroudColor); File output = new File(targetImage); ImageIO.write(result, "jpg", output); } catch (IOException e) { System.out.println("有问题了" + e.getMessage()); } } /** * @Description 给PNG图片增加背景色 返回base64 * @Author 小帅丶 * @param sourceImage 原始图片 最好是PNG透明的 * @param backgroudColor 背景色 * @return java.lang.String **/ public static String changePNGBackgroudColorByBase64(byte[] sourceImage, Color backgroudColor){ try { String base64 = ""; BufferedImage result = changePNGBackgroudColor(sourceImage, backgroudColor); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(result, "jpg", baos ); baos.flush(); byte[] imageInByte = baos.toByteArray(); baos.close(); final Base64.Encoder encoder = Base64.getEncoder(); base64 = encoder.encodeToString(imageInByte); return base64; }catch (Exception e){ System.out.println("有问题了" + e.getMessage()); return null; } } /** * @Description 给PNG图片增加背景色 返回base64 * @Author 小帅丶 * @param sourceImage 原始图片 最好是PNG透明的 * @param backgroudColor 背景色 * @return java.lang.String **/ public static String changePNGBackgroudColorByBase64(String sourceImage, Color backgroudColor){ try { String base64 = ""; BufferedImage result = changePNGBackgroudColor(sourceImage, backgroudColor); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(result, "jpg", baos ); baos.flush(); byte[] imageInByte = baos.toByteArray(); baos.close(); final Base64.Encoder encoder = Base64.getEncoder(); base64 = encoder.encodeToString(imageInByte); return base64; }catch (Exception e){ System.out.println("有问题了" + e.getMessage()); return null; } } /** * @Description 给PNG图片增加背景色 返回BufferedImage * @Author 小帅丶 * @param sourceImage 原始图片 最好是PNG透明的 * @param backgroudColor 背景色 * @return BufferedImage **/ public static BufferedImage changePNGBackgroudColor(byte[] sourceImage, Color backgroudColor) { try { ByteArrayInputStream in = new ByteArrayInputStream(sourceImage); BufferedImage image = ImageIO.read(in); BufferedImage result = new BufferedImage( image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D graphic = result.createGraphics(); graphic.drawImage(image, 0, 0, backgroudColor, null); graphic.dispose(); return result; } catch (IOException e) { System.out.println("有问题了" + e.getMessage()); return null; } } /** * @Description 给PNG图片增加背景色 返回BufferedImage * @Author 小帅丶 * @param sourceImage 原始图片 最好是PNG透明的 * @param backgroudColor 背景色 * @return BufferedImage **/ public static BufferedImage changePNGBackgroudColor(String sourceImage, Color backgroudColor) { try { File input = new File(sourceImage); BufferedImage image = ImageIO.read(input); BufferedImage result = new BufferedImage( image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D graphic = result.createGraphics(); graphic.drawImage(image, 0, 0, backgroudColor, null); graphic.dispose(); return result; } catch (IOException e) { System.out.println("有问题了" + e.getMessage()); return null; } } }
-------------前端代码-------------
需要使用ColorUI 请自行下载
1.index.js代码 var app = getApp(); var api = require('../../utils/baiduai.js'); Page({ data: { motto: '照片底色修改', result: [], images: {}, img: '', color:'red', windowWidth: 0, base64img: '', access_token: '', action_type: 'TO_OLD', tempFilePath: null }, //单选修改 radiochange: function (e) { console.log('radio发生change事件,携带的value值为:', e.detail.value) var that = this; that.data.color = e.detail.value; if (that.data.img == '') { wx.showModal({ content: '未选择图片哦', showCancel: false, confirmText: '明白了' }) } else { wx.showLoading({ title: "修改中...", mask: true }), that.bgColor(); } }, onShareAppMessage: function () { return { title: '背景色修改', path: '/pages/idphoto/idphoto', imageUrl: '../../images/sharefaceeditattr.png', success: function (res) { if (res.errMsg == 'shareAppMessage:ok') { wx.showToast({ title: '分享成功', icon: 'success', duration: 500 }); } }, fail: function (res) { if (res.errMsg == 'shareAppMessage:fail cancel') { wx.showToast({ title: '分享取消', icon: 'loading', duration: 500 }) } } } }, clear: function (event) { console.info(event); wx.clearStorage(); }, //事件处理函数 bindViewTap: function () { wx.navigateTo({ url: '../logs/logs' }) }, uploads: function () { var that = this var takephonewidth var takephoneheight wx.chooseImage({ count: 1, // 默认9 sizeType: ['compressed'], // 可以指定是原图还是压缩图,默认二者都有 sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有 success: function (res) { that.setData({ tempFilePath: res.tempFilePaths[0] }) wx.getImageInfo({ src: res.tempFilePaths[0], success(res) { takephonewidth = res.width, takephoneheight = res.height } }) // 返回选定照片的本地文件路径列表,tempFilePath可以作为img标签的src属性显示图片 if (res.tempFiles[0].size > (4096 * 1024)) { wx.showToast({ title: '图片文件过大哦', icon: 'none', mask: true, duration: 1500 }) } else { wx.showLoading({ title: "修改中...", mask: true }), that.setData({ img: res.tempFilePaths[0] }) } that.bgColor();//修改图片背景色的方法 }, }) }, //照片背景色变化 bgColor: function () { var that = this; wx.uploadFile({ url: api.bgColorUrl, filePath: that.data.tempFilePath, header: { 'content-type': 'multipart/form-data' }, formData: { color: that.data.color }, name: 'file', success: function (res) { wx.hideLoading(); var data = res.data; var str = JSON.parse(data); if (str.code == 200) { that.setData({ img: 'data:image/jpg;base64,' + str.data.image_base64 }) } else { wx.showModal({ title: '温馨提示', content: str.msg_zh, showCancel: false, confirmText: '知道了' }) } }, fail: function (res) { wx.hideLoading(); wx.showToast({ title: '服务错误,稍后再试', duration: 2000 }) } }) }, onLoad: function () { }, /** * 点击查看图片,可以进行保存 */ preview(e) { var that = this; if (null == that.data.img || that.data.img == '') { wx.showModal({ title: '温馨提示', content: '未选择任何图片', showCancel: false, confirmText: '知道了' }) } else { wx.previewImage({ urls: [that.data.img], current: that.data.img }) } } });
2.baiduai.js代码 // 自己的服务器域名 线上必须HTTPS 且备案的域名 本地测试可以局域网IP const host = 'https://domain/'; //背景色修改 const bgColorUrl = host+'apiName'; //暴露出去的接口 module.exports = { bgColorUrl: bgColorUrl }
3.index.wxss代码 @import "../../ui/main.wxss"; @import "../../ui/icon.wxss"; .up { color: rgb(255, 255, 255); font-size: 20px; font-family: 微软雅黑; width: 200px; height: 50px; vertical-align: middle; text-align: center; line-height: 45px; border-radius: 25px; background-color: rgb(26, 160, 225); } .page-body-wrapper image{ background: #ececec; } image { width: 100%; height: 100%; max-height: 1 } .msg { margin: 10px 0; text-align: center; } .table { margin-top: 10rpx; border: 0px solid darkgray; width: 100%; } .tr { display: flex; width: 100%; justify-content: center; height: 80rpx; } .td { font-family: 微软雅黑; font-size: 28rpx; width:100%; display: flex; justify-content: center; text-align: center; align-items: center; } .bg-g{ background: white; } .baikeform{ font-size: 20rpx; color: #c0c0c0; border-top: 1rpx solid #eeeeee; margin:30rpx 40rpx 0rpx 40rpx; padding: 20rpx; } .th { font-size: 28rpx; width: 48%; justify-content: center; background: #3366FF; color: #fff; display: flex; height: 80rpx; align-items: center; } .preview-tips { margin: 50rpx 0 30rpx; } .video { margin: 20rpx auto; width: 100%; height: 300px; } switch{ zoom: 0.8; } page { background-color: #F8F8F8; height: 100%; font-size: 32rpx; line-height: 1.6; } .weui-cell_ft{ font-size: 32rpx; } .page-body-wrapper { display: flex; flex-direction: column; align-items: center; width: 100%; } .btn-area { margin-top: 40rpx; box-sizing: border-box; width: 100%; padding: 0 30rpx; } .footer{ font-size: 30rpx; text-align: center; color: #7367F0; } .reason_txt{ font-size: 32rpx; color: #1AA0E1; display: table; width: auto; white-space: nowrap; border-spacing: 0.5rem 0; margin-left: 28rpx; margin-right: 28rpx; margin-top: 28rpx; } .reason_txt::before,.reason_txt::after{ display: table-cell; content: ""; width: 50%; background: linear-gradient(#1AA0E1, #1AA0E1) repeat-x center; background-size: 0.1rem 0.1rem; } .reminder-content{ width: 89%; margin: 0 auto; font-size: 24rpx; color:#bfbfbf; }
4.index.wxml代码 由于社区显示html代码会被解析,因此页面代码放在gitee https://gitee.com/xshuai/codes/c5kn1yeudfw7aqrt4903m14
5.index.json代码 { "navigationBarTitleText": "图片背景色修改" }
查看演示效果
人工智能
2020-06-09 11:21:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
原作 :Mohammed M Jubapu
译者 :机器学习算法与Python实战(公众号ID:tjxj666)
英文 : https://www.linkedin.com/pulse/skills-build-data-engineering-mohammed-m-jubapu/
数据工程师是当今市场上最受欢迎的工作之一。数据无处不在,被认为是新时代的能源。公司从不同来源生成大量数据,数据工程师的任务是组织数据信息的收集,处理和存储。但是,要成为一名数据工程师,您需要具备一些出色的技能,例如数据库,大数据,ETL和数据仓库,云计算以及编程语言。但是问题来了,您是否想拥有所有这些技能,或者您想使用所有工具?为简化此操作,让我们抓住机会,直接深入研究数据工程人才市场中的最新技能,这肯定会增加您现有的职业生涯或协助您开始数据工程之旅。
1-精通一种编程语言
是的,编程语言是数据工程的必备技能。多数职位概况要求精通至少一种编程语言。这些语言是ETL或数据管道框架所必需的。通用编程语言是总体上掌握数据工程和管道所需的核心编程技能。比如, Java和Scala 用于在Hadoop上编写MapReduce作业。 Python 是数据分析和管道的流行选择,而 Ruby 也是广泛流行的应用程序粘合剂。
2- Python是最受关注的技能
Python!Python!Python!是的,大约70%的工作简介中具有Python作为必备技能,其次是 SQL,Java,Scala 和其他编程技能,例如 R,.Net,Perl,Shell 脚本等。
3- Apache Spark在数据处理层的顶部
数据处理是将数据收集和处理为可用的所需形式。Apache Spark排在数据处理层的首位,其次是 AWS Lambda,Elasticsearch,MapReduce,Oozie,Pig,AWS EMR 等。ApacheSpark是一个功能强大的开源框架,可提供交互式处理,实时流处理,批处理,并以非常快的速度,标准接口和易用性进行内存处理。
4- Rest API通常用于数据收集
对于需要分析或处理的任何数据,首先需要将其收集或吸收到数据管道中。REST API是用于此目的的常用工具,其次是 Sqoop,Nifi,Azure Data Factory,Flume,Hue 等。
5-数据缓冲最常见的是Apache Kafka
数据缓冲是数据工程框架中的关键部分,在将数据从一个地方移到另一个地方以适应大量数据时,需要临时存储数据。Apache Kafka是常用的分布式数据存储,经过优化可实时摄取和处理流数据。流数据是由数千个数据源连续生成的数据,这些数据源通常同时发送数据记录。流平台需要处理这种不断涌入的数据,并按顺序和增量地处理数据。此类别中的其他工具是 Kinesis,Redis Cache, GCP Pub/Sub 等。
6-存储数据– SQL或NoSQL
数据需要存储以进行处理,分析或可视化,以生成有价值的结果。数据存储可以采用 数据仓库,Hadoop,数据库(RDBMS和NoSQL),数据集市 的形式。紧随其后的是 Hive,AWS Redshift,MongoDB,AWS S3,Cassandra,GCP BigQuery 等SQL技能。
7-使用Tableau或PowerBI进行数据可视化
数据可视化是以图形,图表或其他可视格式表示数据或信息。它传达数据与图像的关系。 Tableau 和 PowerBI 领先于竞争对手,其次是 SAP Business Objects,Qlik,SPSS,QuickSight,MicroStrategy 等。
8-数据工程云平台
有不同的基于云或内部部署的平台,可用于不同的数据工程工具集。列出的典型代表是 Hadoop,Google Cloud Platform,AWS,Azure 和 Apprenda 。
好吧,绝非必须精通所有技能和工具,但是通常需要在每个数据管道框架类别中 至少掌握其中一个 ,例如针对云平台的 GCP ,针对开发的 Python ,针对数据处理的 Apache Spark ,针对数据收集的 Rest API ,针对数据缓冲的 Apache Kafka ,针对数据存储的 Hive ,用于数据可视化的 PowerBI 。
人工智能
2020-06-09 00:07:03
「深度学习福利」大神带你进阶工程师,立即查看>>>
> 论文提出了Circle loss,不仅能够对类内优化和类间优化进行单独地处理,还能根据不同的相似度值调整对应的梯度。总体而言,Circle loss更灵活,而且优化目标更明确,在多个实验上都有较好的表现,个人认为是一个很好的工作

来源:晓飞的算法工程笔记 公众号
论文: Circle Loss: A Unified Perspective of Pair Similarity Optimization
论文地址: https://arxiv.org/abs/2002.10857
Introduction
  论文认为两类基础的深度特征学习方法classification learning(比如softmax)和pair-wise learning(比如triplet loss)均是为了最小化类内相似度$s_n$和类间相似度$s_p$,理想是$(s_n=0, s_p = 1)$。而大部分常用的损失函数都是将$s_n$和$s_p$embed成相似度对,然后用各自研究的策略最小化$(s_n-s_p)$的值。这种策略提升$s_p$等同于下降$s_n$,但其实这种对称的优化方法很容易存在以下问题: 缺乏优化的灵活性。由于基于损失函数同时优化$s_n$和$s_p$,导致$s_n$和$s_p$的梯度的幅值是一样的。当$s_n$和$s_p$均很小时,依然会使用较大的梯度惩罚$s_n$,这是不高效且不合理的。 收敛目标不明确。优化$s_n-s_p$通常会遇到决策边界问题$s_p-s_n=m$。而这个边界目前是不够明确的,首先图1a中的ABC点均到决策边界的距离相等,但其收敛点却不太一样(梯度正交于$s_p=s_n$?)。其次,不同收敛点间的类内和类间相似度差异可能较小,比如样本${s_n, s_p}={0.2, 0.5}$和${{s^{'}}_n, {s^{'}}_p}={0.4, 0.7}$,虽然边际(margin)均为0.3,但${s^{'}}_n$和$s_p$的差距仅为0.1,这样的收敛状态会影响整体样本的区分性。
  基于上面的发现,论文认为不同的相似分数应该有不同的惩罚力度,首先将$(s_n - s_p)$转换为$(\alpha_n s_n - \alpha_p s_p)$,$\alpha_n$和$\alpha_p$是独立的权重因子,分别与$s_n$和$s_p$线性相关,这样不仅使得$s_n$和$s_p$能以不同的步伐进行学习,还可以更具相似分数调整幅值。这样的优化策略使得$\alpha_n s_n - \alpha_p s_p=m$在$(s_n, s_p)$空间内呈现圆形,故称为Circle loss。
  Circle loss主要从以下3个方面入手改变深度特征学习的内在特性: 统一损失函数来表示两类基础的深度特征学习方法classification learning(比如softmax)和pair-wise learning(比如triplet loss)。 灵活地优化,由于$\alpha_n$和$\alpha_p$会随着对应的相似度分数来改变对应的梯度,如图1b的点ABC的梯度是各不一样的。 明确的收敛目标,在圆形的决策边界,circle loss有更倾向的决策状态,如图2b的ABC点,均偏向于更新到点T,原因后面会讲到。
  论文的主要贡献如下: 提出Circle loss,通过有监督地加权不同相似度分数来进行深度特征学习,能够更灵活地优化,并且有明确的收敛目标。 Circle loss能够兼容class-level标签和pair-wise标签,通过简单的修改就能变化为triplet loss或softmax loss。 在不同的任务(人脸识别,ReID,细粒度图片检索等)上进行实验证明Cirle loss的优势。
A Unified Perspective
  给予特征空间的单样本$x$,假设有$K$个类内相似分数和$L$个类间相似分数关联$x$,定义相似度分数为${s^i_p}(i=1,2,\cdots,K)$和${s^i_n}(i=1,2,\cdots,L)$。
  为了最小化每个$s^j_n$以及最大化每个$s^i_p$,统一的损失函数如公式1,其中$\gamma$为缩放因子,$m$为边际(margin)。公式1迭代每个相似度对来减小$(s^j_n-s^i_p)$,通过简单的修改就能变为triplet loss和classification loss。
Given class-level labels
  在分类层计算样本$x$与各类的相似度以及权重向量$w_i (i=1,2,\cdots,N)$,得到$(N-1)$个类间相似度$s^j_n=w^T_j x/(||w_j||\ ||x||)$以及单个类内相似度$s_p = w^T_y x/(||w_y||\ ||x||)$。
  结合公式1,得到公式2的softmax变种AM-Softmax,当$m=0$时,公式2能够进一步变化为Normface,当将cosine相似度替换为内积以及设置$\gamma=1$时,则为softmax loss。
Given pair-wise labels
  计算mini-batch中样本$x$与其它样本的相似性,得到类间相似度$s^j_n=w^T_j x/(||x_j||\ ||x||)$以及单个类内相似度$s^i_p = w^T_y x/(||x_i||\ ||x||)$。
  结合公式1,$K=|\mathcal{P}|$,$L=|\mathcal{N}|$,得到带hard mining的triplet loss,$\sum exp(\cdot)$用于调节mining的程度,当$\gamma \to + \infty$时,就是绝对的hard mining。
Gradient analysis
  公式2和公式3展示了公式1的通用性,目标均是优化$(s_n-s_p)$。论文假设仅存在单个$s_p$和$s_n$,各种损失函数的梯度进行了可视化,如图2所示,观察到了主流损失函数的几点梯度表现: 在达到决策边界前,$s_p$和$s_n$的梯度是相同的,这缺乏优化的灵活性。 梯度在收敛前几乎是不变,而在收敛时则突然下降。比如图2的B点相对于A点是更优的,但是两点的梯度几乎一样,这也表明了优化的不灵活。 决策边界平行于$s_n - s_p=m$(图2的白线),不同的点$A$ $B$会可能以边界上的不同点$T$或$T^{'}$为目标,导致收敛目标不明确,如之前所述的。
A New Loss Function
Self-paced Weighting
  为了让每个相似度分数能够根据当前优化状态调整学习的幅度,先忽略公式1的$m$并调整为Circle loss,如公式4所示,$\alpha^j_n$和$\alpha^i_p$为非负权重因子。
  假定$s^i_p$的最优值为$O_p$,$s^j_n$的最优值为$O_n(O_n < O_p)$,则$\alpha^j_n$和$\alpha^i_p$的计算如公式5,称为self-paced manner,$[\cdot]_+$为cut-off at zero操作来保证$\alpha^j_n$和$\alpha^i_p$非负。
  加权是分类loss中的常见操作,所有的相似度分数共享同一个缩放因子$\gamma$,而Circle loss则根据每个相似度分类的值再进行一次独立的加权,允许不同的学习幅度,能够更加地灵活。
Within-class and Between-class Margin
  在之前的讨论中,主流损失函数的$(s_n-s_p)$的优化是对称的(减少$s_n$等同于增大$s_p$),仅需一个边际(margin)即可。而在Circle loss中,$(s_n-s_p)$的优化是非对称的,因此需要设置独立的边际,如公式6,其中$\Delta_n$和$\Delta_p$为类间边际和类内边际,目标是$s^i_p>\Delta_p$以及$s^j_n<\Delta_n$,下面探讨边际的设置问题。
  考虑简单的二分类问题,决策边界为$\alpha_n(s_n - \Delta_n)-\alpha_p(s_p-\Delta_p)=0$,结合公式5和6,决策边界可转换为公式7,其中$C=((O_n-\Delta_n)^2+(O_p-\Delta_p)^2)/4$,即为Circle loss决策边界为圆的弧,如图1b所示,中心点为$(s_n=(O_n+\Delta_n)/2, s_p=(O_p+\Delta_p)/2)$,半径为$\sqrt{C}$。
  Circle loss包含5个参数$(O_p, O_n, \gamma, \Delta_p, \Delta_n)$,论文通过设置$O_p=1+m$,$O_n=-m$,$\Delta_p=1-m$,$\Delta_n=m$来减少参数,最终将公式7转换为公式8。基于公式8的决策边界,可以看到其目标为$s_n \to 0$和$s_p \to 1$,参数$m$控制决策边界的半径可以看作是松弛因子,即可将Circle loss目标改为$s^i_p>1-m$和$s^i_n 如果本文对你有帮助,麻烦点个赞或在看呗~
更多内容请关注 微信公众号【晓飞的算法工程笔记】
人工智能
2020-06-08 20:38:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
作者|facebookresearch 编译|Flin 来源|Github
detectron2.checkpoint软件包 class detectron2.checkpoint.Checkpointer(model: torch.nn.modules.module.Module, save_dir: str = '', *, save_to_disk: bool = True, **checkpointables) 源代码: https://detectron2.readthedocs.io/_modules/fvcore/common/checkpoint.html#Checkpointer 基类: object 可以保存/加载模型以及其他可检查点对象的检查点。 __init__(model:torch.nn.modules.module.Module,save_dir:str ='',*,save_to_disk:bool = True,** checkpointables ) 参数: model(nn.Module):模型。 save_dir(str):保存和查找检查点的目录。 save_to_disk(bool):如果为True,则将检查点保存到磁盘,否则禁用此检查点的保存。 checkpointables(object):任何可检查点的对象,即具有state_dict()和load_state_dict()方法的对象。例如,它可以像 Checkpointer(model,"dir",optimizer = optimizer)一样使用。 save(name:str,** kwargs ) 将模型和检查点转储到文件中。 参数: name(str):文件名。 kwargs(dict):要保存的额外任意数据。 load(path:str ) 从给定的检查点加载。当路径指向网络文件时,必须在所有级别上调用此函数。 参数: path(str):检查点的路径或url。如果为空,将不会加载任何内容。 返回值: dict ,从检查点加载的尚未处理的额外数据。例如,用 save(**extra_data)() 保存的内容 。 has_checkpoint() 返回值: bool ,目标目录中是否存在检查点。 get_checkpoint_file() 返回值: str, 目标目录中的最新检查点文件。 get_all_checkpoint_files() 返回值: list,目标中所有可用的检查点文件(.pth文件)目录。 resume_or_load(path:str,*,resume:bool = True ) 如果resume为True,则此方法尝试从最后一个检查点(如果存在)恢复。否则,从给定路径加载检查点。重新开始中断的训练作业时,这很有用。 参数: path(str)–检查点的路径。 resume(bool)–如果为True,则从最后一个检查点恢复(如果存在)。 返回值:和load()一样。 tag_last_checkpoint(last_filename_basename: str) 标记最后一个检查点。 参数: last_filename_basename(str),最后一个文件名的基本名称。 class detectron2.checkpoint.PeriodicCheckpointer(checkpointer: Any, period: int, max_iter: int = None, max_to_keep: int = None) 源代码: https://detectron2.readthedocs.io/_modules/fvcore/common/checkpoint.html#PeriodicCheckpointer 基类: object 定期保存检查点。当 .step(iteration) 被调用时,如果迭代是周期的倍数或达到最大值,,它将在给定的checkpointer上执行 checkpointer.save 。 __init__(checkpointer: Any, period: int, max_iter: int = None, max_to_keep: int = None) 参数: checkpointer(Any):用于保存的checkpointer对象 checkpoints period(int):保存检查点的时间段。 max_iter(int):最大迭代次数。到达后,将保存一个名为"model_final"的检查点。 max_to_keep(int):保留的最新当前检查点的最大数量,以前的检查点将被删除 step(iteration: int, **kwargs) 在给定的迭代中执行适当的操作。 参数: iteration (int)–当前迭代,范围为[0,max_iter-1]。 kwargs(Any)–要保存的额外数据,与 Checkpointer.save() 中的相同 。 save(name: str, **kwargs) 与相同的论点Checkpointer.save()。使用此方法可以在计划之外手动保存检查点。 参数: name(str):文件名。 kwargs(Any):要保存的额外数据,与 Checkpointer.save() 中的相同. classdetectron2.checkpoint.DetectionCheckpointer(model, save_dir='', *, save_to_disk=None, **checkpointables) 源代码: https://detectron2.readthedocs.io/_modules/detectron2/checkpoint/detection_checkpoint.html#DetectionCheckpointer 基类: fvcore.common.checkpoint.Checkpointer
与 Checkpointer 相同,但能够处理Detectron和Detectron2模型库中的模型,并将转换应用于旧模型。
原文链接: https://detectron2.readthedocs.io/modules/checkpoint.html
欢迎关注磐创AI博客站: http://panchuang.net/
sklearn机器学习中文官方文档: http://sklearn123.com/
欢迎关注磐创博客资源汇总站: http://docs.panchuang.net/
人工智能
2020-06-08 20:03:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
> 论文提出DRConv,很好地结合了局部共享的思想并且保持平移不变性,包含两个关键结构,从实验结果来看,DRConv符合设计的预期,在多个任务上都有不错的性能提升  
来源:晓飞的算法工程笔记 公众号
论文: Dynamic Region-Aware Convolution
论文地址: https://arxiv.org/pdf/2003.12243.pdf
Introduction
  目前主流的卷积操作都在空间域进行权值共享,而如果想得到更丰富的信息,只能通过增加卷积的数量来实现,这样不仅计算低效,也会带来网络优化困难。与主流卷积不同,local conv在不同的像素位置使用不同的权值,这样能够高效地提取丰富的信息,主要应用在人脸识别领域,但local conv不仅会带来与特征图大小相关的参数量,还会破坏平移不变性。
  考虑到以上两种卷积的优劣,论文提出了DRConv(Dynamic Region-Aware Convolution),DRConv的结构如图1,首先通过标准卷积来生成guided feature,根据guided feature将空间维度分成多个区域,卷积核生成模块$G(\cdot)$根据输入图片动态生成每个区域对应的卷积核。DRConv能够可学习地为不同的像素位置匹配不同的卷积核,不仅具有强大的特征表达能力,还可以保持平移不变性。由于卷积核是动态生成的,能比local conv减少大量的参数,而整体计算量几乎和标准卷积一致。
  论文的主要贡献如下: 提出DRConv,不仅具有强大的语义表达能力,还能很好地维持平移不变性。 巧妙的设计了可学习guided mask的反向传播,明确区域共享的规则(region-sharing-pattern),并根据损失函数回传的梯度进行更新。 只需简单地替换,DRConv就能在图片分类,人脸识别,目标检测和语义分割等多个任务上达到很好的性能。
Our Apporach
Dynamic Region-Aware Convolution
  对于标准卷积,定义输入$X\in \mathbb{R}^{U\times V\times C}$,空间维度$S\in \mathbb{R}^{U\times V}$,输出$Y\in \mathbb{R}^{U\times V\times O}$,权重$W\in \mathbb{R}^C$,输出的每个channel的计算如公式1,$*$为二维卷积操作。
  对于基础的local conv,定义非共享权重$W\in \mathbb{R}^{U\times V\times C}$,输出的每个channel计算如公式2,其中$W_{u,v,c}^{(o)}$表示位置$(u,v)$上的独立非共享卷积核,即卷积在特征图上移动时,每次更换不同的卷积核。
  结合以上公式,定义guided mask$M={S_0, \cdots,S_{m-1}}$用来表示空间维度划分的$m$个区域,$M$根据输入图片的特征进行提取,每个区域$S_t(t\in [0, m-1])$仅使用一个共享的卷积核。定义卷积核集$W=[W_0,\cdots,W_{m-1}]$,卷积核$W_t \in \mathbb{R}^C$对应于区域$S_t$。输出的每个channel的计算如公式3,即卷积在特征图上移动时,每次根据guided mask更换对应的卷积核。
  从上面的描述可以看到,DRConv包含两个主要部分: 使用可学习的guided mask来将空间维度划分为多个区域,如图1所示,guided mask中相同颜色的像素归为同一区域,从语义的角度来看,即将语义相似的特征归为统一区域。 对于每个共享区域,使用卷积核生成模块来生成定制的卷积核来进行常规的2D卷积操作,定制的卷积核能够根据输入图片的重要特征自动地进行调节。
Learnable guided mask
  作为DRConv的重要部分,guided mask决定了卷积核在空间维度上的分布,该模块由损失函数指导优化,从而能够适应输入的空间信息变化,从而改变卷积核的分布。
  对于包含$m$个channel的$k\times k$DRConv,定义$F$为guided feature,$M$为guided mask,$M$上的每个位置$(u,v)$的值计算如公式4,函数$argmax(\cdot)$输出最大值的下标,$F_{u,v}$为位置$(u,v)$上的guided feature向量,所以$M$的值为$[0, m-1]$,用来指示该位置对应的卷积下标。
  为了让guided mask可学习,必须得到用来生成guided feature的权值的梯度,但由于$argmax(\cdot)$的使用导致guided feature的梯度无法计算,所以论文设计了类似的梯度。 Forward propagation
  根据公式4获得guided mask,根据公式5得到每个位置$(u,v)$得到卷积核$\tilde{W} {u,v}$,其中$W {M_{u,v}}$是$G(\cdot)$生成的卷积核集$[W_0, \cdots, W_{m-1}]$中的一个,$M_{u,v}$是guided feature在位置$(u,v)$上值最大的channel下标,通过这种方式来$m$个卷积核与所有位置的关系,将空间像素分为$m$个组。使用相同卷积核的像素包含相似的上下文信息,主要由于具有平移不变性标准卷积将这些信息传递给了guided feature。 Backward propagation
  为了使梯度得到回传,首先用$\hat{F}$来代替guided mask的one-hot表示,计算如公式6所示,在channel维度上进行$softmax(\cdot)$,期望$\hat{F} {u,v}^j$能尽可能地接近0和1,这样$\hat{F} {u,v}^j$与guided mask的one-hot表示将非常相似。公式5可以看作是卷积核集$[W_0,\cdots,W_{m-1}]$乘以$M_{u,v}$的one-hot表示,这里替换为$\hat{F}_{u,v}^j$。
  $\hat{F} {u,v}^j$的梯度计算如公式7,$\langle, \rangle $为点积,$\bigtriangledown {\cdot} \mathcal{L}$表示guided mask对应loss函数的梯度,如图a,公式7近似于公式5的反向传播。
  公式8为公式6的反向传播,$\odot$为逐元素相乘,如果不设计特殊的反向传播,SGD将不能对相关的参数进行优化,因为函数$argmax(\cdot)$是不可导的。因此,$softmax(\cdot)$是用来接近$argmax(\cdot)$,通过替换函数将梯度回传到guided feature,是的guided mask可学习。
Dynamic Filter: Filter generator module
  在DRConv中,使用卷积核生成模块来生成不同区域的卷积核,由于不同图片的特征不同,在图片间共享的卷积核不能高效地提取其独有的特征,需要定制化的特征来专注不同图片的特性。
  定义输入$X\in \mathbb{R}^{U\times V\times C}$,包含两层卷积的卷积核生成模块$G(\cdot)$,$m$个卷积$W=[W_0,\cdots,W_{m-1}]$,每个卷积仅用于区域$R_t$。如图b所示,为了获得$m$个$k\times k$卷积,先使用自适应平均池化将$X$下采样为$k\times k$,然后使用两个连续的$1\times 1$卷积,第一个使用$sigmoid(\cdot)$进行激活,第二个设定$group=m$,不使用激活。卷积核生成模块能够增强网络获取不同图片特性的能力,由于根据输入的特征生成卷积核,每个卷积核的关注点能够根据输入的特性进行自动地调整。
Experiments
Classification
Face Recognition
COCO Object Detection and Segmentation
Ablation Study
Visualization of dynamic guided mask
Different model size
Different region number
Different spatial size
CONCLUSION
  论文提出DRConv,很好地结合了局部共享的思想并且保持平移不变性,包含两个关键结构,首先使用guided mask对特征图中的像素划分到不同的区域,其次使用卷积核生成模块动态生成区域对应的卷积核。从实验结果来看,DRConv符合设计的预期,特别是图3的guided mask的可视化结果,在多个任务上都有不错的性能提升。



> 如果本文对你有帮助,麻烦点个赞或在看呗~
更多内容请关注 微信公众号【晓飞的算法工程笔记】
人工智能
2020-06-05 13:47:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
作者|facebookresearch 编译|Flin 来源|Github
与其他库的兼容性
与Detectron的兼容性(和maskrcnn-benchmark)
Detectron2解决了Detectron中遗留的一些遗留问题。结果,它们的模型不兼容:在两个代码库中以相同的模型权重运行推理将产生不同的结果。
关于推断的主要区别是: 现在, 当 width = x2-x1 和 height = y2-y1 时,更自然地计算带有角(x1,y1)和(x2,y2)的box的高度和宽度。在Detectron中,高度和宽度都添加了"+1"。 请注意,Caffe2中的相关操作已采用了这种约定的更改 ( https://github.com/pytorch/pytorch/pull/20550 ) , 并带有额外的选项。因此,仍然有可能在Caffe2中使用Detectron2训练的模型进行推理。 高度/宽度计算的变化最明显的变化是: 边界框回归中的编码/解码。 非最大抑制。但是,这里的影响可以忽略不计。 RPN现在使用具有较少量化伪像的更简单的锚点。 在Detectron中,锚点已量化并且 没有准确的面积( https://github.com/facebookresearch/Detectron/issues/227 )。在Detectron2中,锚点在中心对齐以与特征网格点对齐,并且未量化。 分类层具有不同的分类标签顺序。 这涉及形状为(...,num_categories + 1,...)的任何可训练参数。在Detectron2中,整数标签[0,K-1]对应于K = num_categories个对象类别,标签"K"对应于特殊的"背景"类别。在Detectron中,标签"0"表示背景,标签[1,K]对应于K个类别。 ROIAlign的实现方式有所不同。新的实现在Caffe2中可用。 Caffe2:( https://github.com/pytorch/pytorch/pull/23706 ). 与Detectron相比,所有ROI都移动了半个像素,以创建更好的图像特征图对齐方式。有关详细信息,请参见 layers/roi_align.py 。要启用旧的行为,请使用 ROIAlign(aligned=False) 或 POOLER_TYPE=ROIAlign 代替 ROIAlignV2 (默认值)。 OI的最小大小不需要为1。这将导致输出的微小差异,但应忽略不计。 掩码推断功能不同。
在Detectron2中,"paste_mask"函数是不同的,应该比Detectron中的准确性更高。此更改可以使COCO上的遮罩AP绝对值提高约0.5%。
训练上也有一些其他差异,但它们不会影响模型级别的兼容性。主要的是: 我们通过 RPN.POST_NMS_TOPK_TRAIN 按图像而不是按批处理修复了Detectron中的错误。该修复程序可能会导致某些型号的精度下降(例如,关键点检测),并且需要进行一些参数调整才能匹配Detectron结果。 bug:( https://github.com/facebookresearch/Detectron/issues/459 ) 简单起见,我们将边界框回归中的默认损失更改为L1损失,而不是平滑的L1损失。我们已经观察到,这往往会略微降低box AP50,同时针对较高的重叠阈值提高box AP(并导致box AP的总体改善)。 我们将COCO边界框和分段注释中的坐标解释为 [0, width] 或 [0, height] 中的坐标。COCO关键点注释中的坐标被解释为范围为 [0, width - 1] 或 [0, width - 1] 的像素索引。请注意,这会影响翻转增强的实现方式。
稍后,我们将在上述有关像素,坐标和"+1"的问题背后分享更多细节和原理。
与Caffe2的兼容性
如上所述,尽管与Detectron不兼容,但相关操作已在Caffe2中实现。因此,可以在Caffe2中转换使用detectron2训练的模型。请参阅本教程的部署。 部署:( https://detectron2.readthedocs.io/tutorials/deployment.html )
与TensorFlow的兼容性
TensorFlow中提供了大多数操作,尽管需要解决在调整大小/ ROIAlign /填充方面的一些微小差异。tensorpack FasterRCNN提供了一个有效的转换脚本, 以在TensorFlow中运行标准的detectron2模型。 tensorpack FasterRCNN:( https://github.com/tensorpack/tensorpack/tree/master/examples/FasterRCNN/convert_d2 )
原文链接: https://detectron2.readthedocs.io/notes/compatibility.html
欢迎关注磐创AI博客站: http://panchuang.net/
sklearn机器学习中文官方文档: http://sklearn123.com/
欢迎关注磐创博客资源汇总站: http://docs.panchuang.net/
人工智能
2020-06-05 12:41:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
绪论
1.1 引言
机器学习 machine learning 是一种“学习算法”(learning algorithm)
1.2 基本术语 数据集(data set):记录的集合 示例(instance)= 样本(sample)= 特征向量(feature vector):记录,关于一个事件或对象的描述 属性(attribute)= 特征(feature):反映事件在某方面的表现或性质的事项 属性值(attribute space):属性的取值 属性空间(attribute space)= 样本空间(sample space)= 输入空间:属性张成的空间 样本维数(dimensionality):样本属性/特征的个数 学习(learning)= 训练(training)过程:从数据中学得模型的过程,通过执行某个学习算法来完成 训练数据(training data):训练过程中使用的数据 训练样本(training sample)= 训练示例/训练例(training instance):训练数据中的样本 训练集(training set):训练样本组成的集合 假设(hypothesis):学得模型对应的关于数据的潜在的规律 真相/真实(ground-truth):潜在规律本身,学习过程就是在找出或逼近真相 学习器(learner):学习算法在给定数据和参数空间上的实例化 标记(label):示例结果的预测信息 样例(example):拥有标记信息的示例 标记空间(label space)= 输出空间:标记的集合 分类(classification):预测结果为离散值 回归(regression):预测结果为连续值 二分类(binary classification):只涉及两个类别的分类任务 正类(positive class) 反类(negative class) 多分类(multi-class classification):涉及多个类别的分类 测试(testing):使用学得模型进行预测的过程 测试样本(testing sample)= 预测示例(testing instance):被预测的样本 聚类(clustering):将训练集中的样本分为若个组,每组被成为一个簇(cluster) 根据训练数据是否拥有标记信息 监督学习(supervised learning):分类和回归 非监督学习(unsupervised learning):聚类 泛化能力(generalization):学得模型适用于新样本的能力 分布(distribution):样本空间中全体样本服从一个分布 独立同分布(independent and identically distributed, i.i.d )每个样本都是独立地从分布上采样获得的 训练样本越多,得到关于分布的信息越多,就越有可能通过学习获取具有强泛化能力的模型
1.3 假设空间 归纳(induction):从具体事实归结出一般性规律,从特殊到一般的泛化(generalization)过程 演绎(deduction):总基础原理推演出具体状况,从一般到特殊的特化(specialization)过程 从样例中学习,实际就是归纳学习(inductive learning) 布尔概念学习 学习过程就是一个在所有假设组成的 假设空间 中进行搜索的过程,搜索目标就是找到与训练集匹配(fit)的假设 版本空间(version space):由于可能会有多个假设与训练集结果一致,这些假设构成了一个假设集合,就被称为版本空间
1.4 归纳偏好
由于版本空间中具有许多假设,都能产生与训练集一致的结果,所以问题就在于 如何从中选出最合适的假设(模型) 归纳偏好(inductive bias):机器学习算法在学习过程中对某种类型假设的偏好 任何一种算法都具有自己的偏好,否则无法产生确定的学习结果 奥卡姆剃刀原则(Occam's razor):若有多个假设与观察一致,则选择 最简单 的那个,但随之而来的问题是,如何对“简单“进行评估 机器学习中,什么是”更简单的“这个问题一直困扰着研究者 没有免费的午餐定理(No Free Lunch Theorem,NFL):无论学习算法的聪明或笨拙程度,它们的期望性能/总体误差是相同的 NFL前提是所有”问题“出现的机会相同、所有问题同等重要 但在实际中,有的假设条件可能很罕见甚至不存在 脱离具体问题谈论算法的好坏是没有意义的
1.5 发展历程 二十世纪五十年代到七十年代初,推理期 二十世纪八十年代,符号主义学习,归纳逻辑程序设计(Inductive Logic Programming,ILP) 二十世纪九十年代中期,统计学习(statistical learning),支持向量机 二十一世纪初,深度学习(deep learning)
1.6 应用现状

参考资料:周志华. 机器学习 : Machine learning[M]. 清华大学出版社, 2016.
人工智能
2020-06-08 18:23:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
6月6日,由百度与深度学习技术及应用国家工程实验室共同打造的“黄埔学院”在京迎来第三期开学礼。百度集团副总裁、深度学习技术及应用国家工程实验室副主任、黄埔学院院长吴甜现场致辞并参与授旗仪式。BV百度风投CEO刘维、百度 飞桨 总架构师于佃海、百度深度学习技术平台部高级总监马艳军、百度AI技术生态部总监刘倩、百度深度学习技术平台部主任架构师毕然,与来自一汽大众、联想、TCL、中国工商银行、国家卫星气象中心、中国石油规划总院、太平洋保险等企业的81位学员以 线上+线下 的方式参与了开学典礼。
开学礼现场,吴甜在致辞中分享到: “新基建” 今年被首次写入了政府工作报告,‘加速产业智能化转型’站上了时代背景中越来越重要的位置,而人才培养是产业智能化当中非常重要的话题。百度黄埔学院旨在培养 “首席AI架构师” ,他们是产业化过程当中,既懂应用场景、又懂AI技术、能够把AI技术应用起来,解决场景当中实际问题的复合型人才。这也是每一位黄埔学院学员的成长目标。”
百度集团副总裁、深度学习技术及应用国家工程实验室副主任、黄埔学院院长吴甜致辞
BV百度风投CEO刘维从专业角度为学员分享了国内外宏观趋势的洞察。他说到,AI深入实体经济构建大变革商业时代刚刚开始,各行各业都面临着效率模型的挑战,AI是重塑业务模式、推动产业变革的机遇,黄埔学院的AI一线从业者通过 模式创新 ,将能够构建高效低成本精细化的业务系统,把握时代契机。
BV百度风投CEO刘维在黄埔学院第三期开学典礼演讲
据悉,今年年初黄埔三期课程率先以 “线上预科班” 形式进行,在经综合评估预科班学习进展、AI 项目开题报告等情况后,最终选出来自中国联通、中国电信、中国移动、上汽通用、一汽大众、联想、英特尔、TCL、中国工商银行、国家卫星气象中心、中国石油规划总院、太平洋保险、东软等77家企业、覆盖电力、航天、医疗、能源、通信等数十个行业,共计81位学员进入到线下正式课程,正式开启“首席AI架构师”的学习之旅。
马艳军整体介绍了本期黄埔学院的课程安排,包含 24节核心课程 ,内容由浅入深,覆盖从理论到实践的各个环节。于佃海现场开启了开学第一课《深度学习的再认识》。接下来还有三个月的课程,所有学员将基于国内最领先、服务开发者规模最大、功能最完备的开源开放深度学习平台 飞桨 ,结合自身实际业务需求,完成各自的深度学习技术应用解决方案。
值得一提的是,在此次的师资配置方面,不仅延续了此前的 “超强阵容” ,由多位百度重量级科学家、AI架构师授课,还特别配置了专家小组全程指导,分别在学员项目搭建、流程跑通、调整优化、答辩展示等的课程前中后各期,以“切实落地”为目的进行全面辅导。
百度黄埔学院第三期开学典礼合影
随着国家大力推进“新基建”战略,5G基建、大数据中心、AI、工业互联网等各个领域正在加快发力,而 AI作为新基建中的重要一项 ,为其他多项提供着基础技术支撑,在稳投资、促消费、助升级、培植经济发展新动能、创建智能经济新形态等多方面潜力巨大。而在促进人工智能与传统行业的融合应用中,企业的“首席AI架构师”不可或缺。百度黄埔学院正是面向企业CTO等高端技术人员,为中国产业界源源不断培养输送集理论、技术、应用三位一体的“首席AI架构师”的专项计划。
经过一年两期的集中培训与研修,已有70位学员毕业,覆盖通信、能源、交通、金融、互联网等领域大中型企业,助力相关产业智能化升级。除此之外,作为人工智能领域的“头雁”企业,百度一直致力于AI人才培养与生态打造,业内首个推出 “学习-实践-比赛-认证-就业” 开发者成长全周期服务体系,帮助开发者快速学习和成长。

百度黄埔学院第三期开学典礼现场
在新基建的背景下,人工智能与传统产业的融合应用备受瞩目,AI人才即是时代,特别是深度学习领域的高端人才,为各行业、企业的智能化转型升级直接提供着强劲的推动力。而当下,这些人正在一批批地通过黄埔学院聚集成一股源源不断的巨大动能,共同推动着新基建奔涌向前! 下载安装命令 ## CPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu
>> 访问 PaddlePaddle 官网 , 了解更多相关内容 。
人工智能
2020-06-08 18:06:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
Vol.1 技术青年创业梦碎?
年轻人碎上两轮才叫创业



Up主: 来自2008年的创业者杨歌
创业项目:红外自动热像分析系统

弹幕君: 来自2020年的投资人杨歌,星瀚资本创始合伙人。




创业者杨歌
这个项目是我第二次创业,2005年启动,2006年成立公司,2007年拿了两笔投资。我对自己这几年的努力非常满意,都说技术人在创业时会有自己和自己技术谈恋爱的感觉,我就特别喜欢自己的技术。这款产品有热力学模型、数据比对模型以及大量图像分析,我甚至一边写论文一边自学动画,动画并不是产品刚需,但它能直观展示这款产品的技术含量,让大家知道我的技术有多牛。几年努力下来,我拿到了国家改革开放30周年企业奖,获得了国家发明专利,还以第一作者身份刊登学术论文于国家学术期刊。

投资人杨歌
这位朋友身上有一种宝贵的天真,我敬他是位好汉,但说句心里话:哥们,你的自信心至少还得被摔碎两次咱才能走到一起去。
投资人之间有一个说法,叫 “秒毙”项目 ,如果创业者一开场就以一种近乎狂热的状态在滔滔不绝于自己的产品尤其是技术细节,这个项目大概率是不成熟的。

创业者杨歌
天使投资来自长辈,完全以情怀支持,确定合作那天大家坐在一起畅想未来,想到了10年之后。
拿到投资我先做了三件事:租办公室,注册商标,招技术团队。我画了一个巨大的企业架构图,自己是股东兼技术总监,成立硬件部、软件部、数据部、算法部。最早的时候只有6个人,后来招到20人,整个团队都在埋头苦干写技术。我22岁,目标理想是做一个全栈工程师,所有技术方向全hold住。你问这个产品到底什么样?我跟你说,软件是这样,这个图像放在这个位置,它有这样那样的功能,数据走势是如此这般,图线和最后生成的报告……反正所有东西都是在我脑海里,正在一一实现,出来了保准叫好,我这是跟医院沟通过的,符合他们要求。

投资人杨歌
分享两个创业者、尤其是技术创业者的常见心态:
第一个是 理想国思维 ,在 脑海中构想一个未来的模样,拿到钱第一时间不是投入在核心价值上,而是去实现脑海中的那个画面 ,找个办公室、把Logo华丽丽的挂在前台、招一堆人……其实这些都不是早期创业需要的。
第二个是 乔布斯幻觉 ,技术创业者中这个现象更加普遍, 认为自己的产品能制造需求,不去研究市场上已经存在的需求 。恕我直言,近代商业史上乔布斯这样的人是百年一遇,尤其要考虑到他的成长环境、吸收的养分、思维所处的高度,是整个人类的金字塔尖,中国会出现乔布斯级的创业者,但创业者尽量不要以他的商业逻辑做事。

创业者杨歌
产品出来之后,给院方试用,有的说不错,有的说不好,说不好的时候我觉得是销售不给力,或者医疗市场有些我所不知道的猫腻。我很用心地研究过市场,看了很多国外文献,研究过医患互动并基于此设计的UI,也根据反馈进行过迭代,怎么可能不好用呢?不仅我自己在技术人里算是有市场感觉的,我的合伙人也都懂商业,还搭建了专业的销售团队——尽管我总觉得销售团队不给力,那也没关系,只要我产品好,卖出去是分分钟的事。

投资人杨歌
分享第三个常见的技术创业者特征: 好学生心态 ,“只要我考了100分,其他问题都不是问题”“只要我考了100分,那么我的一切行为都是对的”,问题是,考100分对于整件事情而言只是一个方面。这位朋友就是一个典型,他其实有自我迭代的能力,但都在很浅的层面,并没有深入到底层逻辑里进行全方位的反省,需求到底有没有?是否有人愿意为此买单?有没有自己不知道但确实存在的低成本可替代方案?医疗行业的销售规则是什么?…… 好学生心态会将一切与技术无关的统统归类为其他 ,财务、销售、品牌、市场、管理,都是其他,哪怕技术只占1%、其他占99%。

创业者杨歌
我觉得我自己很谦虚、懂自省、能迭代产品,公司现在资金有些状况,但我依然相信只要有资金进来,一两年后我们就能上市……

投资人杨歌
今天就到这吧,其实看着这位朋友英俊潇洒才多听了几句,大部分创业者都过不了投资人的前5分钟对话,甚至有些会产生激烈的冲突,就是因为他在自己的思维层面建立了牢不可破的自我认知,却是在一个偏低的层次上。这位朋友是发自内心地相信自己很谦虚,可他需要体验过项目败得彻底、自我摔得粉碎、甚至产生过轻生念头……那时候他会知道什么是真正的谦虚和内省,才会从自我否定开始一轮轮重建——我怎么知道的?下位朋友可能会告诉你。

Vol.2 技术创业人脉是地基
微信有3000人是及格线

Up主: 来自2013年的创业者杨歌
创业项目:凯业网(青年精英商业联合汇)等
弹幕君: 来自2020年的投资者杨歌,星瀚资本创始合伙人

创业者杨歌
凯业网是我的第四次创业,也算是以技术起步,但核心价值已经完全脱离了技术。之前几次技术创业让我彻底颠覆了自我,自我否定最严重的时候也曾数次几近崩溃。我下定决心远离技术,工作我选择加入毕马威,每一天都忍受被轻视甚至无视的痛苦,只为了学到技术出身的自己没有接触过的知识体系;在职创业,我选择做凯业网,一个社交圈子。之所以选择这个项目,是因为一位朋友跟我说: 杨歌,你有一个很强的内核,但是缺一套盔甲,这套盔甲就是人脉。 我思考之后决定接受这个说法,于是开始全力以赴的拓展人脉,手机通讯录从160人逐渐增长突破万人。

投资人杨歌
到今天已经是4万人了。这位朋友展现出了一种过度调节,彻底否定了自我的价值,其实我觉得这没什么不好。推荐一本书, 《引爆趋势》 ,一件完整的事情要由三种人共同完成, 专家,推销员,连接者 ,三者的思维方式和行事风格完全不同。不建立足够优质的人脉圈,你就无法找到优质又互补的合伙人,在遇到困难的时候也会叫天不应、叫地不灵。
当然人脉也要有广度、高度、深度的筛选,但 对技术创业者来说,首先要有广度,有效的3000人是及格线。

创业者杨歌
凯业网线上积累了15000位成员,参与线下活动的超过4000人,与不同的人——演员、歌手、主持人、咨询师、证券机构从业者、律师、企业家等等各行各业的精英频繁沟通,让我快速打开了视野,我的世界更加立体,之前束缚住自己的理想国被彻底颠覆。但我也很快意识到,凯业网并不是一个可以无限发展的项目,盈利能力有限,于是将它转成非盈利性组织。这么多年下来,我创办、参与了很多机构,我发现 圈层组织天生带有短期属性,很少有组织能够实现“铁打的营盘流水的兵” ,大部分都是核心创办者逐渐淡出后就失去了引力。
创业项目无法实现突破性发展,工作方面以旁人的标准来看,成长得其实不错,我熬过了毕马威的朋友、麦肯锡的朋友跟我说什么我都听不懂的那个阶段,之后又进入投资行业。经历过从巅峰体验一摔到底的硬着陆,有意识避免重蹈覆辙,但走着走着发现自己又进入了软着陆的误区:练功成佛,不,练功成石了,杨歌你只是得到了这份工作,但没学到精髓,你把自己的人生锁死了,在低风险的模式下越走越窄……这些日积月累的负面情绪曾经险些让我一蹶不振,那时候我以为自己做什么都做不好。

投资人杨歌
我对这位朋友的建议可能会出乎大多数人意料,下面这句话是当年Michael Hong(韩国著名投资人、KaKao投资者之一)对我说过的:You`re on the right way,你走在正确的路上。
彻底颠覆自我,不断结交人脉,补全自己没有掌握的商业知识,在自己并不擅长的领域大胆尝试、学习,这个过程完全在舒适区之外,但对于成长而言,这都是正确的举措。


番外:创业PTSD(创伤后应激障碍)?
企业家是风雨中把酒言欢的老船长
我曾经历过两次抑郁至崩溃,对抗严重的情绪问题,首先要搞清楚 人遭遇挫折的情绪周期:
第一阶段,否认,这不是我。
第二阶段,愤怒,这怎么可能是我!
第三阶段,发懵,这居然真的是我?
第四阶段,抑郁。
第五、第六阶段,恢复,康复。
其中第四阶段的时间长度因人而异,大部分人需要一年左右恢复期,少数人很快能康复,也有一小部分人会一直难以康复。选择了创业,就要反复经历这样的过程, 康复周期过长的朋友尽量不要创业。
以我自己而言,我是硬磕型选手,遇到困难死磕到把自己撞碎了为止,因此很容易遇到彻底自我否定的时候,次数多了也找到了疗伤的方法:
1. 看大量电影
2. 与朋友高频率沟通 ,讲话是舒缓情绪的有效方法,不妨外向起来。
3. 跟心态好的人走到一起 ,“你居然这样了那你完了”这样朋友赶紧远离。走到B轮、C轮的企业家吃饭画风普遍是这样的:“我昨天又Close一个Deal,差点弄死我,不过老子挺过来了,还挺有趣,来咱走一个!”
4. 准确认知创业的困难 ,很多人都觉得成功的企业家是:制服笔挺华丽的舰队司令,站在高科技航母的剑桥上,一尘不染,高高在上。可实际上,企业家都是站在四面漏风的驾驶室里,帆和船体各种补丁,迎面是狂风暴雨,老船长叼着烟斗喝着酒,游刃有余掌控一切。
人工智能
2020-06-08 17:12:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
  当今,数字营销人员面临的挑战是,想要讲述富有创意、引人入胜的品牌故事,却不知如何对所有平台进行传播或优化,无法确保故事能够引起共鸣。
  营销人员一直担心,机器人、人工智能和机器学习,未来将取代所有人的工作,正如市场营销AI研究所所言,一些市场营销工作将因为AI而消失、一些市场营销工作将被AI增强,还有一些新的工作机会由AI创造。
  其实不必过于忧心,因为创造力仍然掌握在人类手中,仅有重复性任务或数据分析的营销工作将受到威胁。例如,告别A/B测试,营销人员可能已经完成了数千次A/B或多元测试,了解哪个标题或图片效果最好。
  不幸的是,从一开始就存在缺陷,因为市场营销人员会透过内定的方式进行测试,凭着个人观点或希望看到的结果,证明其中的变化,而忽略了离群值或微妙的模式。AI会发现这些异常值和模式,比人类更具有客观性。
  机器学习在A/B测试方面的优势是,它可以无需运行A/B测试,精准预测最佳选择。不用花费时间、预算和精力来运行测试,直接找出结果并召开会议讨论结果!过去,营销人员被告知一定要掌握分析数据,使其变得更像机器;现在,成功的数字营销者应该变得更加人性化。多达36%的企业高管表示,将AI整合到企业中的主要目标是,使任务自动化并释放创造力。
  营销人员被告知,除非有数据支持,否则观点将不重要。许多营销人员已经成为数据专家,掌握了数据透视表,甚至学习了一些SQL,更像一台机器尝试来思考。随着“大数据”演变成机器生成的见解和行动,薄弱的营销模式将无法竞争,机器学习飞速发展,超越了曾经拥有的任何竞争优势。
  除了一个关键领域:创造力,人类是唯一的创造者,机器可以优化,但是只有人类才能创造出引人注目的故事。 郑州人流医院哪家好:http://yyk.39.net/zz3/zonghe/1d426.html/郑州妇科医院:http://yyk.39.net/zz3/zonghe/1d426.html/郑州做无痛人流多少钱:http://yyk.39.net/zz3/zonghe/1d426.html/
  阅读后有许多感想吗?以下提供两个问题让大家思考:
  一些市场营销工作将因AI而消失、或被增强,你认为AI的出现是好是坏? 人类的创造力是机器和AI无法取代的,你认同吗?
人工智能
2020-06-08 15:02:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
概述
MobileNetsV2是基于一个流线型的架构,它使用深度可分离的卷积来构建轻量级的深层神经网,此模型基于 MobileNetV2: Inverted Residuals and Linear Bottlenecks 中提出的模型结构实现。可以用图像分类任务,比如猫狗分类、花卉分类等等。用户提供一系列带有标注的数据集,该算法会载入在ImageNet-1000上的预训练模型,在用户数据集上做迁移学习。训练后生成的模型可直接在ModelArts平台部署为在线服务或批量服务,同时支持使用CPU、GPU或Ascend 310进行推理。(以上介绍来自ModelArts AI 市场算法介绍)
注意:需要用到ModelArts和OBS桶,建议提前购买相应资源或代金券,或使用免费规格,但OBS是要花钱的。
准备数据集
这里使用的是花卉数据集,共3669张花卉图片,5个种类,数据集下载地址 http:// download.tensorflow.org /example_images/flower_photos.tgz (数据集来自自博主张震宇的博客中所提供的数据集,在这里感谢大佬,附上大佬博客链接 https:// bbs.huaweicloud.com/blo gs/158092 ,里面描述的很详细,建议可以看一下,学习学习,以下的上传数据集方法也来自该博客)
下载解压后,进入flower_photos目录,里面有5个子目录
这里要把flower_photos这个文件夹,也就是上面五个文件的上一级文件夹上传到OBS(华为云对象存储服务),建议使用OBS Browser工具上传。OBS Browser下载: https:// support.huaweicloud.com /browsertg-obs/obs_03_1003.html
上传好了之后,回到ModelArts首页,点击左侧“数据管理”->“数据集”,然后点击“创建数据集”
然后先在“数据集输入位置”和“数据集输出位置”选择2个OBS上的文件夹(文件夹要自己创建,必须是空文件夹),剩下的部分默认就行,之后点击右下角创建即可。
回到“数据管理”->“数据集”界面,点击刚才创建的数据集
点击数据集,进入数据集界面,选择右上角的导入
点击导入后,选择最开始上传数据集的路径,就是选择flowers_photos文件夹。
选择之后需要等待一会,可能你会看到导入仍然是0,不要着急,等一下。当看到如下情况,表示导入完成了,接下来就可以发布数据集了。
同样,点击数据集,进入刚才导入的界面,选择右上角的发布
这里选择8:2的比例划分训练集和测试集。点击确定即可。等待数据集创建完成。
下面开始训练,这里首先要到AI市场,订阅算法,放心,是免费的,点击链接进入算法订阅 https:// console.huaweicloud.com /modelarts/?region=cn-north-4#/aiMarket/aiMarketModelDetail/overview?modelId=0470e6b1-923b-47a8-ba3e-fe93de5ae2a0&type=algo
点击订阅,按照弹出的界面确认即可。
订阅之后,还要配置同步算法,点击应用控制台

好了,算法和数据已经有了,下面开始执行训练吧,选择创建训练作业。
这里选择我们刚才创建的数据集和对应版本号就行,这里我用的是以前创建的数据集,所以数据集名称和版本号和前面创建的不一样,你选择自己刚才创建的就好,同时,还要创建一个空文件夹存放训练输出,至于训练日志,可以不选择存放路径。
还要选训练规格,如果没有代金券的话,选择免费版本
最后,选择下一步即可。
可能有几个确认选择,最后可得到
接下来等训练完成就行了,至于训练中更加详细的介绍,可以参考算法订阅界面的介绍,自己设定参数。
这个训练大概17min完成,还是挺快的。接下来,导入模型。

前面的训练作业名称是随机的,选择就好,应该选择导入后,自动选择的就是刚才训练的了。点击右下角的立即创建,等待导入。
显示正常,表示成功了,下面开始线上部署。
默认是使用CPU部署推理的,当然选择GPU和Ascend也可以,可参考算法页面的介绍。
这里以CPU为例。单击部署,选择在线部署。
选择免费的CPU体验规格就行了
选择下一步,确认,得到
下面选择预测——>上传——>预测即可。
最后,看看效果,还不错。
以上就是基于ModelArts AI市场算法MobileNet_v2实现花卉分类的实践内容。是不是很简单,赶快来试一下吧。
点击关注,第一时间了解华为云新鲜技术~
人工智能
2020-06-08 11:06:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
很多同学跟我说,学前端学的很迷茫,
就这样,问他为啥迷茫吧,说也说不出来啥具体的。就是也学了一堆东西,也确实都是前端开发工作当中要用的。但依然不知道前路如何。

这里就有一个“前端入门的标准”的问题。什么才是真正的前端入门?
1、是你学了一堆的前端开发技术吗?
2、是你做了几个前端的大小不一的例子吗?
3、是你已经做了一二年的前端开发工作了吗?
不要奇怪我把第三条也列上,确实有人已经工作了二三年了,但其实依然没有入门前端开发。
我个人主观认为,判断一个人是否已经入门前端开发,有二个标准,
1、学了一堆的前端开发技术,现在的大大小小的培训机构基本都是这么做的;
2、掌握并理解“编程思路与逻辑思维”;
我个人更喜欢第二个,就是掌握“编程思想与开发逻辑”的人。

什么叫编程思想呢?

很简单,其实就是提炼特征。例如,一筐苹果吧,把它的特征提炼出来,就这样,
苹果
_颜色:红
_形状:圆
_大小:200mm
_重量:100克
_品质:100%
_数量:100
那么,用JavaScript来表示,就是这样,
var _appleObj = {
color:'#f00',
shape:circular,
size:200,
weight:100,
quality:100%,
number:100
}
这个过程是什么呢?
对具体事物的抽象,在这个过程中只提取出目标对象中我们所需要的特征。然后在代码中表达出来。这里面的关键是,理解苹果的【颜色】和_appleObj中的【color】,它们二者之间的对应关系。
再,
例如下面这个京东的购物车,我随便添加了几个商品进去,就是下面的截图,
从哪开始入手做呢?很多新入门的同学可能就没有思路了。如果用刚才抽象苹果的思路,就是这样,
购物车
_增加、减少商品按钮
_输入商品数量
_删除按钮
_单选按钮
_全选按钮
_结算按钮
_其它的相关调用、回调等
用JavaScript来表示就是这样,
var _cartObj = {
addFn : addfn,
minsFn : minsfn,
singleBtn : singlefn,
allselect : allselectfn,
payBtn : paybtn
}
然后再继续定义addfn、minsfn、singlefn、allselectfn、paybtn等函数,这就是从UI设计图中抽象出功能点,然后在编程范式里表达出来。这时,我们已经拥有了一个购物车模块的JavaScript模型。
这种抽象的编程思想的思维方式,是超越于任何编程语言之上的,它是对现实世界的提炼和抽象。无论你是用原生JavaScript,还是vue,或react,都是这样,无非是写法不同罢了。
我拥有这种思维方式,所以我可以用一天学会php,写一个带登录、注册的简单留言板出来,然后再在第二、三天,彻底忘记php。不是显摆我有多么牛,而是说这种思维方式是超越具体语言的。
如果不能理解这个实物和抽象之间的对应关系,那么无论你学习多少的css、html、js、jq、vue、h5、小程序...等,对你来讲这些都是【死物】。因为你不知道该怎么用它解决问题与需求。说的有点啰嗦,但真心的希望同学们能明白它们的这个关系。

接下来再说说开发中的逻辑思维。
逻辑思维要严密且清晰,讲究的是环环相扣。它不同于日常交流中的口头描述,“你今天上午去那帮我拿个东西。去哪?就你家那边一拐角”,这种基于生活经验的直观的描述就是混沌不清晰的。
一个经典的例子,口头描述,“让程序员,去买6个苹果回来,路上如果看见西瓜就买一个”。问,如果这个程序员在路上看到一个西瓜,他会买几个苹果回来?
答案是,一个苹果。为什么呢?
因为,
if( 看见西瓜 ){
苹果 = 1
} else {
苹果 = 6
}
看到了吗?这就是使用日常生活思维来写代码的结果。所以,编程开发中不能使用生活思维方式,你必须环环相扣,形成一个逻辑链条。其中任何一环的不清晰,都会造成整个逻辑链条的崩溃。
编程因为需要抽象具体事物,所以它是以不同的视角来看待现实世界。你看到一匹白马,说“好大好白的一匹马”,我看到的是,
var 白马 = {
腿:4,
颜色:#fff,
性别:公,
体重:200KG,
..
}
这算是另一种形式的白马非马吗?
在实际工作中,PM会提出产品需求,肯定是口语化的描述。说这个产品,有abcd等功能。然后前端开发等程序员再把它抽象出特点,设计出模型。
然后根据它的交互流程、前置后置的条件等,一步一步的实现。这个一步一步的实现,就是开发逻辑的链条,差了其中任何一环,都不能完成开发任务。
就例如你回家吃饭,如果用程序的逻辑思维方式来思考,是这样的,
1、你回家;
2、家里要有米,如果没有,买米,如果买不到米,做不了饭;
3、家里要有电,如果没有,做不了饭;
4、家里要有水,如果没有,做不了饭;
这里面要把所有的条件、情况都考虑到。而很多情况其实在你写代码的时候并没有发生。所以有人说,编程是给未来的人使用的。未来的人会怎么使用你开发出来的应用?你并不知道,所以你必须尽全力去无限穷尽所有可能。

编程思想是抽象特征,逻辑思维是环环相扣,这二个东西合在一起,就是解决问题的方法和步骤。
而前端开发只不过是使用html、css、js,来实现编程思想和逻辑思维所提供的解决问题的方法和步骤的一种工作而已。
所以,学习前端开发,其实是学习如何用编程思想和逻辑思维来解决问题,而不是学习html、css、js语言本身。
这也就是很多同学,学完了,学会了html、css、js,却依然不知道怎么干活的根本原因。所以说回本文的标题,《零基础前端入门,真正难在哪里?》就难在如何建立自己的编程思维和开发逻辑。
如果大家对编程,web前端感兴趣,想要学习,打算深入了解这个行业的朋友,可以加下我们的前端学习扣qun : 784783012 ,不论你是学生还是想转行的朋友,我都欢迎,每晚分享干货,整理的一份最全最新的web前端学习资料和0基础入门教程分享给大家: 学习前端我们是认真的
人工智能
2020-06-07 18:53:03
「深度学习福利」大神带你进阶工程师,立即查看>>>
作者|Renu Khandelwal 编译|VK 来源|Towards Data Science
在本文中,你将了解: 为什么我们需要seq2seq模型的注意力机制? Bahdanua的注意力机制是如何运作的? Luong的注意力机制是如何运作的? 什么是局部和全局注意力? Bahdanua和Luong注意力机制的关键区别
什么是注意力,为什么我们需要seq2seq模型的注意力机制
让我们考虑两个场景,场景一,你正在阅读与当前新闻相关的文章。第二个场景是你正在阅读准备考试。两种情况下的注意力水平是相同还是不同?
与新闻文章相比,你在准备考试时会相当注意阅读。在准备测试的时候,你会更加关注关键词来帮助你记住一个简单或复杂的概念。这也意味着我们要专注于某一特定领域的任何深度学习任务。
序列到序列(Seq2Seq)模型使用编码器-解码器架构 。
seq2seq的几个场景 神经机器翻译(NMT) 图像字幕 聊天机器人 文本摘要等
Seq2Seq模型将源序列映射到目标序列。在神经机器翻译的情况下,源序列可以是英语,目标序列可以是印地语。
我们将英语源语句传递给编码器;编码器将源序列的完整信息编码为单个实值向量,也称为上下文向量。然后,这个上下文向量被传递到解码器上,以生成目标语言(如印地语)中的输出序列。上下文向量负责将整个输入序列汇总为单个向量。
如果输入的句子很长,那么编码器中的一个向量可以保存所有要提供给解码器的相关信息吗 ?
在预测目标词时,是否可以将注意力集中在句子中的几个相关词上,而不是集中在包含整个句子信息的单个向量上 ?
注意力机制有助于解决问题。
注意力机制的基本思想是避免试图为每个句子学习单一的向量表示,而是根据注意力权值来关注输入序列的特定输入向量。
在每一解码步骤中,解码器将被告知需要使用一组注意力权重对每个输入单词给予多少“注意”。这些注意力权重为解码器翻译提供上下文信息
Bahdanau的注意力机制
Bahdanau等人。提出了一种学习结合对齐和翻译的注意力机制,它会执行编码器状态和解码器状态的线性组合。
让我们学习Bahdanau提出的注意力机制 编码器和解码器的所有隐状态(向前和向后)都用于生成上下文向量,这与seq2seq中仅使用最后一个编码器的隐状态不同。 注意力机制将输入和输出序列与前馈网络参数化的对齐。它有助于关注源序列中最相关的信息。 该模型根据与源位置相关联的上下文向量和先前生成的目标词来预测目标词。
带有注意力机制的Seq2Seq模型由编码器、解码器和注意力层组成。
注意力层包括 对齐层 注意力权重 上下文向量
对齐分数(Alignment score)
对齐分数映射位置“j”周围的输入与位置“i”处的输出匹配的程度。分数是基于前一个解码器的隐状态$s_{(i-1)}$,就在预测目标单词和输入句子的隐状态hⱼ之前
解码器决定它需要关注源语句的哪个部分,而不是让编码器将源语句的所有信息编码成一个固定长度的向量 。
对齐向量与源序列具有相同长度并在解码器的每个时间步被计算
注意力权重
我们将softmax激活函数应用于对齐分数,以获得注意力权重。
Softmax激活函数将得到和等于1的概率,这将有助于表示每个输入序列的影响权重。输入序列的注意力权重越高,对目标词预测的影响越大。
在我们的例子中,我们看到一个更高的输入词的注意力权重值可以快速地预测目标词,तेज़ी
上下文向量
上下文向量用于计算解码器的最终输出。上下文向量$c_i$是注意力权重和编码器隐状态($h_1$,$h_2$,…,$h_{tx}$)的加权和,它映射到输入语句。
预测目标词
为了预测目标词,解码器使用 上下文向量($c_i$), 上一时间步的解码器输出($y_{i-1}$)和 前一解码器的隐状态($s_{i-1}$)
Luong注意力机制
Luong的注意力模型也被称为乘法注意力。它通过简单的矩阵乘法将编码状态和解码状态降为注意力得分。简单的矩阵乘法使它更快,更节省空间。
根据注意力在源序列中的位置,Luong提出了两种类型的注意力机制 全局注意力,关注所有来源位置 局部注意力,注意力只放在每个目标词的源位置的一小部分上
全局注意力与地方关注的共性 在每个时间步t,在解码阶段,全局和局部注意的两种方法都首先以堆叠的LSTM顶层的隐状态$h_t$作为输入。 这两种方法的目标都是导出上下文向量,以获取相关的源端信息,帮助预测当前的目标词y 注意力向量被输入到下一个时间步中,以告知模型过去的决策。
全局和局部注意模型的不同之处在于上下文向量是如何导出的
在讨论全局和局部注意之前,让我们先了解一下在给定的时间t内,Luong的注意力机制所使用的约定 $c_t$:上下文向量 $a_t$:对齐向量 $h_t$:当前目标隐状态 $h_t$:当前源隐状态 $y_t$:预测当前目标字 $h˜_t$ₜ:注意向量
全局注意力
全局注意模型在计算上下文向量时考虑了编码器的所有隐状态。 通过比较当前目标隐状态h与每个源隐状态h的大小,导出了与源序列中的时间步数大小相等的可变长度对齐向量A 对齐分数被称为基于内容的函数,我们考虑三种不同的选择
全局上下文向量$c_t$是根据所有源隐状态$h_t$上的对齐向量$a_t$计算的加权平均值
当源序列是一个大段落或一个大文档时会发生什么 ?
由于全局注意模型考虑了源序列中的所有单词来预测目标单词,因此在计算上变得非常昂贵,并且很难翻译出较长的句子
利用局部注意力可以解决全局注意模型的缺点
局部注意力
局部注意力只关注每个目标词的源位置的一小部分,不像全局注意力那样关注整个源序列 计算成本低于全局注意力 局部注意力模型首先在时间t为每个目标词生成对齐位置$p_t$。 上下文向量$c_t$是在选定窗口内源隐状态集上作为加权平均值导出的 对齐的位置可以单调地或预先地选择
Bahdanau和Luong注意力机制的关键区别
Bahdanau和long注意力机制中的注意力计算
Bahdanau等人,在双向编码器中使用前向和后向隐状态的串联,在其非堆叠单向解码器中使用前一个目标的隐状态
Loung等人,注意力使用编码器和解码器的顶层LSTM层的隐状态
Luong注意力机制使用当前解码器的隐状态来计算对齐向量,而Bahdanau使用上一个时间步的输出
对齐函数
Bahdanau只使用concat分数对齐模型,而Luong使用dot、general和concat对齐分数模型
有了注意力机制的知识,你现在可以构建强大的深层NLP算法。
原文链接: https://towardsdatascience.com/sequence-2-sequence-model-with-attention-mechanism-9e9ca2a613a
欢迎关注磐创AI博客站: http://panchuang.net/
sklearn机器学习中文官方文档: http://sklearn123.com/
欢迎关注磐创博客资源汇总站: http://docs.panchuang.net/
人工智能
2020-06-07 15:22:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
最新版本的驱动对应关系如下
人工智能
2020-06-06 10:11:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
2020年5月28日下午,十三届全国人大三次会议表决通过了中华人民共和国民法典,民法典将在2021年1月1日正式施行。6月1日晚,两会已授权民法典正式文本发布。
这是中国1949年后首部以“法典”命名的法律,财新评价它:“象征生命、自由、财产的私权立法迎来高光时刻。”值得注意的是,民法典人格权编中明确规定了不得用技术手段伪造等方式侵害他人肖像权, 矛头直接指向 AI 换脸、变声 。
“ 民法典正式施行后,即便用户利用 AI 技术换脸只是单纯的娱乐,没有营利目的,也有可能被认定为是侵犯肖像权 。”广东合邦律师事务所律师肖锦阳对开源中国表示,《民法典》第1019条明确规定了肖像权的消极权能,这对 AI 换脸等滥用信息技术手段侵犯肖像权的行为进行禁止和预防具有积极意义。 我国新颁布的民法典中第1019条就规定:
任何组合或者个人 不得以丑化、污损,或者利用信息技术手段伪造等方式侵害他人的肖像权 。未经肖像权人同意,不得制作、使用、公开肖像权人的肖像,但是法律另有规定的除外。
未经肖像权人同意,肖像作品权利人不得以发表、复制、发行、出租、展览等方式使用或公开肖像权人的肖像。

而在此之前,我国的肖像权保护主要参照《民法通则》第一百条规定:
公民享有肖像权,未经本人同意,不得以营利为目的使用公民的肖像。
AI 换脸在技术层面只是做深度学习训练的一个切入点,往往兼具娱乐性。但在应用和商业方面,很多换脸软件游走在灰色地带,甚至引发法律风险。现在 ,人们通常用 deepfake(可直译为深度造假)来指代那些会造成不良影响的 AI 换脸影像成品和软件。
随着 deepfake 的泛滥,多个国家已出台政策法规监管。此外,为防止技术作恶,人们正尝试用技术制衡技术,也有人在探讨如何为从事技术开发的人员增加一门“道德伦理课”,以追求行业自律……
deepfake “游戏”泛滥
在5月28日民法典表决刚刚通过时,“AI 换脸被纳入监管”的“提示”就立刻在 IT 业传播开来。
关注度在一定程度上反映了其热度。日前,GitHub 上一个集成各类 deepfake 功能的仓库DeepFaceLab 登上热榜。DeepFaceLab 的介绍中赫然写着: DeepFaceLab 可以用来换脸,和改变政客们的言论 。 截至目前,DeepFaceLab 已有14.7K Star。
制造 deepfake 影像的门槛正在变低。 深圳大学计算机与软件学院副教授储颖告诉开源中国,无论是将人脸互换、还是直接生成虚假图片视频,技术上都属于深度学习范畴,差别无非就是数据集不同、模型不同、算法不同和参数不同。“人工智能的技术应用门槛正在变得越来越低”。
近两年,由于生成对抗网络技术 GAN 也被用在 deepfake 制作中,生成的虚假图片视频数量飞速上涨。
此外,人工智能在2012年开始火热也是由于图像分类识别研究的兴起,慢慢从图像识别、再到图像生成。而 AI 合成图像视频又是可以看得见、摸得着的应用,因此很多开发者都在尝试此类应用,这也让“造假”不可避免地增多。 加上虚假信息常和女星、政客、高热度人物捆绑,deepfake 应用和成品往往能飞快走红。
2019年8月30日,陌陌上线一款智能换脸产品 ZAO。用户只需要在软件中上传一张自己清晰、正面的照片,便能将一些经典影视作品中的人物换成自己,同时保留影视人物特征和自己的部分面部特征,生成短视频和 GIF 动图。视频和动图处理过程仅需1-10秒,之后用户可以将其分享至微信、微博、QQ 等平台。
推出后的第三天,2019年9月1日,ZAO 就登顶 Apple App Store 免费娱乐应用程序榜单。
(微博用户使用 ZAO AI 换脸鞠婧祎影视作品人物形象视频)
但由于 ZAO 的用户隐私条款存在争议,很快被微信封杀,陌陌也被网信办约谈整改,热度骤降。不过,ZAO 是用户将自己的脸套到其他人脸上,最终成果综合了两个人物的面部特征,此类换脸在肖像权和虚假信息传播方面引发的争议较小。
而通常我们在谈论 deepfake 有害时,更多指将别人(尤指公众人物)的脸换到自己、第三人、或虚拟人物的脸上,只保留该人物的面部特征,但套上了原本不属于他的面部表情, 合成以假乱真的视频图片,导致虚假信息甚至新闻扩散 。
deepfake 一词出现在2017年12月。当时 Reddit 上一个 ID 为 deepfake 的用户,上传了一个合成视频,内容是将好莱坞明星盖尔·加朵的脸换到情色电影中的女主角身上。该软件迅速流行起来,但由于很多人不满,2018年初,Reddit 开始封禁 deepfake。2019年2月,deepfake 在 GitHub 上的仓库遭 限制访问 。
但 deepfake 依然备受关注,更多的 deepfake 软件和视频在出现。现在最常见的是使用 AI 换脸,合成色情或政治人物言论视频,这可以带来黑产交易,甚至影响部分国家和地区的政治局势。
去年有人调查, AI 换脸一度形成一条完整的色情黑色产业链 。闲鱼上曾有商家售卖女星的换脸合集视频,并且提供从成品情色视频,到软件制作各环节的交易和服务。当然,曝光之后平台方做了整改,现在在闲鱼上检索“换脸”,已经没有相关商品。外媒也曾报道,有技术人员利用 GAN,开发出 deepnude 等应用程序,可快速使图像中的人物脱光衣服,以恐吓和骚扰他人。
另外,一些广为流传的 deepfake 视频,主角是知名政客。如下图中的奥巴马,均是 AI 合成。2018年,加蓬出现一条涉及总统 Ali Bongo 新年致辞的虚假合成视频,甚至引起兵变。过去政客间惯用的以性丑闻打击对手的招数也借 deepfake 重燃。如2019年,马来西亚出现一条涉及内阁大臣的性丑闻录像带,后被指控为政治阴谋。
“从长远来看,deepfake 对民主构成了严重威胁,但女性很可能首先遭受苦难” ,这是2019年,荷兰一家专为监测 deepfake 而生的网络安全公司 deeptrace 发表的调查结果总结。根据 Deeptrace 的数据,deepfake 视频从2018年12月的8,000个增长到2019年年中的14,678个。几乎所有内容都是色情内容,并且这些假视频截至调查时已被浏览1.34亿次。
一方面,deepfake 影像制作越来越简单。另一方面,虚假影像对人身财产安全、人格尊严、社会安定的影响愈发严重。于是,人们也在加紧寻找减少技术伤害的方法。
用技术、道德规范和法律减少伤害
deepfake 虚假信息造成的负面影响,正被技术人员尝试同样用 AI 来解决。 “开发者通过技术制衡技术” ,肖锦阳认为, 对于防止 AI 换脸作恶,目前最有效的方法是开发相应的检测技术 。
2019年8月,美国国防部高级研究计划局 DARPA 发布一项旨在能够自动检测、归因和表征伪造媒体资产的技术——语义取证 SemaFor。SemaFor 的目标是开发一套语义分析算法,增加伪造媒体内容生产者操控、传播虚假信息的难度。
之后,2019年9月,Facebook、微软又联合包括麻省理工、牛津大学在内的几所高校,发起一项 deepfake 的检测挑战赛。谷歌、亚马逊等企业也参与其中,提供数据和资助。
Facebook 给参赛者开放访问100000多个视频的独特数据集权限,并提供1000万美元的研究资助和奖励。谷歌母公司 Alphabet 旗下的 Jigsaw 和谷歌一起,提供了3000个付费演员的新视频数据集,以帮助改善侦查技术。亚马逊提供100万美元的云信用额度支持该挑战。
(Google 和 Jigs a w 提供的由28个演员参演的3,000个被操纵视频的数据集)
此外,Jigsaw 还曾发布一种 新事实检查工具 Assembler ,使用 AI 来帮助记者检查图像是否伪造或被篡改。Jigsaw 还建立了一个 StyleGAN 检测 deepfake 成品,使用机器学习发现真实人物和被操纵人物图像之间的差异。
AI 检测到虚假影像资料之后,就可以提醒用户。Facebook、Twitter 选择了标记 deepfake 资料和删除有严重危害的信息。
今年初,外媒报道,Facebook 在美国2020总统大选之前,正加紧审查包含 AI 换脸的假消息。Facebook 全球政策管理副总裁 Monika Bickert 表示, 不一定要删除被标记为“假”的视频,但会向用户发出警告,告知它们是假的。“如果我们仅删除事实检查人员标记为虚假的所有操纵视频,这些视频仍将在互联网或社交媒体生态系统的其他位置提供。通过将其保留并标记为虚假,我们将为人们提供重要信息。”此外对于可能造成重大社会危害的虚假信息将做删除处理。
Twitter 删帖也是有前提的。如内容可能对某团体或个人人身安全构成威胁,或可能造成暴动和内乱,那么 deepfakes 内容将会被删除。反之,可能只是打上标记。 2月,Twitter 在术语表中添加了一个新条款,涵盖了“合成和受控媒体”,表示会标注包含技术伪造内容的推文,并在人们转发推文之前向他们显示警告,并阻止推荐。
在肖锦阳看来,平台经过核验并带有标识的传播扩散,不失为一种好的方式。当然,在做技术检测的同时, 通过相关法律规范各方行为也是必不可少的一步 。
针对平台方, 肖锦阳指出,平台应 对于用户的隐私和 AI 换脸问题应当按照国家有关规定开展安全评估,进一步加强监管审核。 根据《侵权责任法》的规定,网络用户利用网络服务平台实施侵权行为的,平台负有采取删除、屏蔽、断开链接等措施,未采取必要措施的,将与该网络用户承担连带责任。且网络服务提供者知道网络用户利用其网络服务侵害他人民事权益,未采取必要措施的,也将与该网络用户承担连带责任。因此,平台方面对于用户的隐私和“AI换脸”问题应当按照国家有关规定开展安全评估,进一步加强监管审核。
同样对于用户来说,随意使用并上传 deepfake 视频也有很大法律风险。 肖锦阳介绍, 用户如果要进行 AI 换脸使用、合成、再加工,首先需要得到肖像权人的同意;并不得侵害他人人格权益、不危害社会公共利益。民法典之外,国家还相继出台了一些规定等,规范网络视频、图像传播。 去年底开始,国家相继发布《网络音视频信息服务管理规定》、《网络信息内容生态治理规定》等法规,明确不得利用深度学习、虚拟现实等新技术新应用从事法律、行政法规禁止的活动。《网络音视频信息服务管理规定》明确,任何组织和个人不得利用网络音视频信息服务以及相关信息技术从事法律法规禁止的活动,侵害他人合法权益。

网络音视频信息服务提供者和网络音视频信息服务使用者违反上述《规定》的,依照《中华人民共和国网络安全法》《互联网信息服务管理办法》《互联网新闻信息服务管理规定》《互联网文化管理暂行规定》《互联网视听节目服务管理规定》等相关法律法规规定处理;构成违反治安管理行为的,依法给予治安管理处罚;构成犯罪的,依法追究刑事责任。
这是法律层面的讨论,但很多时候,人们都希望问题可以在法庭之外就能被解决,比如提高道德规范。
此前,在 GitHub 限制 deepfake 仓库时,就有许多开发者提及应该在学校教育中加入“计算机伦理课”,在学习写代码之外,了解相关法律、以及应如何使用技术的哲学和道德规范。甚至有人发出疑问: 要不要制造可能被滥用的技术 ?这类问题也并不只是聚焦在 deepfake 上。一位科普及解密纪录片导演詹姆斯•巴拉特,2016年发表《我们最后的发明》一书,提出这样一个问题:“我怀疑的是先进人工智能的安全性,以及现代文明开发先进技术的鲁莽性。”
不过,储颖认为,技术本身无对错。从防止技术作恶的角度出发,开设计算机伦理课固然有必要,但要想守住底线, 立法才是保证 。“这涉及道德和法律的关系问题。道德是内在的,非强制性的;法律是外在的,具有明确的强制性。我们应在法律约束的基础上,尽可能地提高自己的道德标准。”
储颖现在正在教授《计算机伦理学》课程。这门课程4年前由计软学院首次在内部开设,去年开始增设了面向全校学生的“品牌通识课程”。储颖指出,目前在全国范围内开设此类伦理课程已经是一个趋势。2018年5月,国务院学位委员会颁布了《关于转发<关于制订工程类硕士专业学位研究生培养方案的指导意见>及说明的通知》,将工程伦理课纳入工程硕士专业学位研究生公共必修课范畴。近年来,全国工程专业学位研究生教育指导委员会已组织多期《工程伦理》师资培训课程。
而关于伦理课要讲什么,储颖也给出了自己的看法:
“ 目的不是告诉学生怎么做和做什么,而是提醒他,你需要思考这件事,并在将来做出正确的伦理抉择。”
人工智能
2020-06-05 18:31:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
使用: from sklearn.externals import joblib
报错:Cannot import Sklearn from sklearn.externals.joblib
解决方法:
python -m pip install sklearn --upgrade
python -m pip install joblib --upgrade
import joblib
参考: https://stackoverflow.com/questions/56113916/cannot-import-sklearn-from-sklearn-externals-joblib
人工智能
2020-06-05 14:52:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
人工智能(Artificial Intelligence),简称AI,是计算机科学的一个分支。在当下,AI技术是学界的研究热点,也是和业界的投资重点,可以想象的是,未来人工智能将会是人类智慧的“容器”,能像人那样思考,也可能超过人脑的机能。 近日,日本文部科学省开始推进各大学的工学部设置新课程,着力培养AI人才。并且从2019年6月开始,日本AI相关专业的大学院可以引进本硕连读的机制。这对于中国留学生来说,日本有望继美国之后,成为学习AI技术的理想国家,并且可以享受本硕连读的优待。 友情提示,计算机专业水很深哦,仅是从业人员就分为三六九等。年入过亿的被称为IT领袖,年入千万的被称为IT大哥,年入百万的被称为IT精英,年入50万的被称为IT人才,年入20万的被称为IT工程师,年入10万的被称为IT民工,年入6万到10万的被称为码农,年入3万到6万的被称为码奴,年入低于3万的被称为码畜。而在日本排名top5的大学就读,一定能让你远离码畜,成为大哥! 那么,如何才能擦亮眼睛,选择一个名气大、实力强的日本高校呢?根据泰晤士高等教育网站(Times Higher Education)给出的2018年日本高校排名,并且经过“计算机科学”标签筛选后,得出了以下几个计算机专业杠杠的大学。

1、京都大学 工学部,是京都大学最庞大的学部哦,由此可见计算机专业在该校庞大的体量和重要的地位。在京都大学的工学部中,与计算机相关的专业有:智能情报学,社会情报学,系统科学,通信情报系统等专业。京都大学的研究生学院中,智能情报学、社会情报学、复杂系科学、数理工学、系统科学、通信情报系统这些专业与计算机有关哦。
2、东京大学 东京大学拥有大型计算机中心,是全日本最 大的计算机中心,这个计算机网络为该校的教学和研究提供了极大地方便。本科学习阶段中,东京大学的工学部分为社会基础设施部、建筑系、城市工程系等16个系。其中与计算机专业相关的是电气电子学、机械情报学、电子情报学。而在研究生阶段,与计算机专业相关的专业在情报工学研究科之下,包括计算机科学、数理情报学、系统情报学、电子情报学、智能机械情报学、创造情报学。
3、东北大学 别看东北大学在QS世界大学综合排名前200中榜上无名,“折合”成国内水平大致处于上海交通大学与中国科学技术大学之间,但是东北大学的计算机专业是杠杠的!在本科阶段,东北大学的计算机专业处在智能情报系统综合学科之下,有通信系统学、波动通信学、电子系统学、计算机基础学、智能情报处理学、系统情报学等。而在研究生学院,则有信息基础科学、系统信息科学、人类社会信息科学、应用信息科学等诸多专业。
4、东京工业大学 东京工业大学在计算机信息处理、软件工程方面,可以说是目前日本数一数二的大学了。早在2006年,东京工业大学就研发出了亚洲最快的超级计算机 "TSUBAME" 。而这一计算机系统竟然是本科学生研发成果,不得不佩服。在本科阶段,东京工业大学的数理计算科学、计算科学、信息环境学等专业。在研究生阶段:数理科学、计算科学、信息环境学等专业与计算机有很大的联系。
5、九州大学
在日本的诸多项权威调查中,九州大学都拥有良好的评价,尤其是理工科。
九州大学本科阶段的计算机专业对应的是工学部的电气情报学。在研究生阶段,有情报理学、智能系统学、情报工学、电气电子系统工学、电子设计学等本科专业。九州大学历来重视学生的实习和实践,毕业生可是十分受用人单位欢迎。
留学是一件重要的事情,除了申请之外还需要更多的留学规划和学生的心理准备,请让我来帮助大家解决疑问,如果您想了解更多资讯,可以直接拨打电话,进行电话咨询哦!也可直接到访公司。 郑州不孕不育医院:http://jbk.39.net/yiyuanzaixian/zztjyy/郑州看不孕不育医院哪家好:http://jbk.39.net/yiyuanzaixian/zztjyy/郑州同济不孕不育医院:http://jbk.39.net/yiyuanzaixian/zztjyy/
更多留学小知识,关注金吉列,专业留学规划师为你提供专业留学服务,为你留学之路助力!
人工智能
2020-06-03 16:07:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
作者|facebookresearch 编译|Flin 来源|Github
基准测试
在这里,我们以一些其他流行的开源Mask R-CNN实现为基准,对Detectron2中Mask R-CNN的训练速度进行了基准测试。
设置 硬件:8个带有NVLink的NVIDIA V100。 软件: Python 3.7, CUDA 10.0, cuDNN 7.6.4, PyTorch 1.3.0 (链接( https://download.pytorch.org/whl/nightly/cu100/torch-1.3.0%2Bcu100-cp37-cp37m-linux_x86_64.whl )), TensorFlow 1.15.0rc2, Keras 2.2.5, MxNet 1.6.0b20190820. 模型:端到端R-50-FPN Mask-RCNN模型,使用与Detectron基线配置( https://github.com/facebookresearch/Detectron/blob/master/configs/12_2017_baselines/e2e_mask_rcnn_R-50-FPN_1x.yaml )相同的超参数 。 指标:我们使用100-500次迭代中的平均吞吐量来跳过GPU预热时间。请注意,对于R-CNN样式的模型,模型的吞吐量通常会在训练期间发生变化,因为它取决于模型的预测。因此,该指标不能直接与model zoo中的"训练速度"相比较,后者是整个训练过程的平均速度。
主要结果
工具吞吐率(img / s)
Detectron259
maskrcnn-benchmark51
tensorpack 50
mmdetection41
simpledet39
Detectron19
matterport/Mask_RCNN14
每个实现的链接: Detectron2: https://github.com/facebookresearch/detectron2/ maskrcnn-benchmark: https://github.com/facebookresearch/maskrcnn-benchmark/ tensorpack: https://github.com/tensorpack/tensorpack/tree/master/examples/FasterRCNN mmdetection: https://github.com/open-mmlab/mmdetection/ simpledet: https://github.com/TuSimple/simpledet/ Detectron: https://github.com/facebookresearch/Detectron matterport/Mask_RCNN: https://github.com/matterport/Mask_RCNN/
每个实现的详细信息: Detectron2 : python tools/train_net.py --config-file configs/Detectron1-Comparisons/mask_rcnn_R_50_FPN_noaug_1x.yaml --num-gpus 8 maskrcnn-benchmark : 通过 sed -i ‘s/torch.uint8/torch.bool/g’ **/*.py 使用commit 0ce8f6f 与使其与最新的PyTorch兼容。然后,运行 python -m torch.distributed.launch --nproc_per_node=8 tools/train_net.py --config-file configs/e2e_mask_rcnn_R_50_FPN_1x.yaml
我们观察到的速度比其model zoo快,这可能是由于软件版本不同所致。 tensorpack : 在提交 caafda , export TF_CUDNN_USE_AUTOTUNE=0 , 然后运行 mpirun -np 8 ./train.py --config DATA.BASEDIR=/data/coco TRAINER=horovod BACKBONE.STRIDE_1X1=True TRAIN.STEPS_PER_EPOCH=50 --load ImageNet-R50-AlignPadding.npz mmdetection : commit 4d9a5f ,应用以下diff,然后运行 ./tools/dist_train.sh configs/mask_rcnn_r50_fpn_1x.py 8
我们观察到的速度比其model zoo快,这可能是由于软件版本不同所致。
(diff使其使用相同的超参数-单击展开) diff --git i/configs/mask_rcnn_r50_fpn_1x.py w/configs/mask_rcnn_r50_fpn_1x.py index 04f6d22..ed721f2 100644 --- i/configs/mask_rcnn_r50_fpn_1x.py +++ w/configs/mask_rcnn_r50_fpn_1x.py @@ -1,14 +1,15 @@ # model settings model = dict( type='MaskRCNN', - pretrained='torchvision://resnet50', + pretrained='open-mmlab://resnet50_caffe', backbone=dict( type='ResNet', depth=50, num_stages=4, out_indices=(0, 1, 2, 3), frozen_stages=1, - style='pytorch'), + norm_cfg=dict(type="BN", requires_grad=False), + style='caffe'), neck=dict( type='FPN', in_channels=[256, 512, 1024, 2048], @@ -115,7 +116,7 @@ test_cfg = dict( dataset_type = 'CocoDataset' data_root = 'data/coco/' img_norm_cfg = dict( - mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + mean=[123.675, 116.28, 103.53], std=[1.0, 1.0, 1.0], to_rgb=False) train_pipeline = [ dict(type='LoadImageFromFile'), dict(type='LoadAnnotations', with_bbox=True, with_mask=True),
SimpleDet : 在commit 9187a1 时运行 python detection_train.py --config config/mask_r50v1_fpn_1x.py Detectron : 运行 python tools/train_net.py --cfg configs/12_2017_baselines/e2e_mask_rcnn_R-50-FPN_1x.yaml
请注意,它的许多操作都在CPU上运行,因此性能受到限制。 matterport/Mask_RCNN :在commit时 3deaec ,应用以下diff , export TF_CUDNN_USE_AUTOTUNE=0 , 然后运行 python coco.py train --dataset=/data/coco/ --model=imagenet
请注意,此实现中的许多小细节可能与Detectron的标准不同。
(diff使其使用相同的超参数-单击展开) diff --git i/mrcnn/model.py w/mrcnn/model.py index 62cb2b0..61d7779 100644 --- i/mrcnn/model.py +++ w/mrcnn/model.py @@ -2367,8 +2367,8 @@ class MaskRCNN(): epochs=epochs, steps_per_epoch=self.config.STEPS_PER_EPOCH, callbacks=callbacks, - validation_data=val_generator, - validation_steps=self.config.VALIDATION_STEPS, + #validation_data=val_generator, + #validation_steps=self.config.VALIDATION_STEPS, max_queue_size=100, workers=workers, use_multiprocessing=True, diff --git i/mrcnn/parallel_model.py w/mrcnn/parallel_model.py index d2bf53b..060172a 100644 --- i/mrcnn/parallel_model.py +++ w/mrcnn/parallel_model.py @@ -32,6 +32,7 @@ class ParallelModel(KM.Model): keras_model: The Keras model to parallelize gpu_count: Number of GPUs. Must be > 1 """ + super().__init__() self.inner_model = keras_model self.gpu_count = gpu_count merged_outputs = self.make_parallel() diff --git i/samples/coco/coco.py w/samples/coco/coco.py index 5d172b5..239ed75 100644 --- i/samples/coco/coco.py +++ w/samples/coco/coco.py @@ -81,7 +81,10 @@ class CocoConfig(Config): IMAGES_PER_GPU = 2 # Uncomment to train on 8 GPUs (default is 1) - # GPU_COUNT = 8 + GPU_COUNT = 8 + BACKBONE = "resnet50" + STEPS_PER_EPOCH = 50 + TRAIN_ROIS_PER_IMAGE = 512 # Number of classes (including background) NUM_CLASSES = 1 + 80 # COCO has 80 classes @@ -496,29 +499,10 @@ if __name__ == '__main__': # *** This training schedule is an example. Update to your needs *** # Training - Stage 1 - print("Training network heads") model.train(dataset_train, dataset_val, learning_rate=config.LEARNING_RATE, epochs=40, - layers='heads', - augmentation=augmentation) - - # Training - Stage 2 - # Finetune layers from ResNet stage 4 and up - print("Fine tune Resnet stage 4 and up") - model.train(dataset_train, dataset_val, - learning_rate=config.LEARNING_RATE, - epochs=120, - layers='4+', - augmentation=augmentation) - - # Training - Stage 3 - # Fine tune all layers - print("Fine tune all layers") - model.train(dataset_train, dataset_val, - learning_rate=config.LEARNING_RATE / 10, - epochs=160, - layers='all', + layers='3+', augmentation=augmentation) elif args.command == "evaluate":

原文链接: https://detectron2.readthedocs.io/notes/benchmarks.html
欢迎关注磐创AI博客站: http://panchuang.net/
sklearn机器学习中文官方文档: http://sklearn123.com/
欢迎关注磐创博客资源汇总站: http://docs.panchuang.net/
人工智能
2020-06-03 11:50:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
业务级敏捷系统生态圈,市场导向直击价值; 为什么要做这件事情呢?在市场的引导下,一步一步的去验证敏捷,去引导团队。变革就是因为在不确定的这种环境下,会面临很多不确定的事情。在团队变革的过程中,它也会新陈代谢的。在市场环境里,公司会面对很多严峻的问题。 现状问题是什么?面对这么大一个成熟团队,面对两个成熟团队的融合,看看问题到底在哪?首先我们从问题出发,方向就是解决这些问题。
首要的问题是关于市场,对于一个公司来说,产品是不是挣钱?谁来买单?客户想要什么?市场的价值和市场是否真的需要?市场和销售的团队需要更多考虑。
市场和销售的团队认为:产品研发团队开发的产品都不成熟,让我怎么卖?市场售卖的产品是产品打造的方向吗?产品研发跟得上客户的速度吗?那到底是要卖什么就去做什么?还是做什么就去卖什么呢?客户在哪里呢?一定要通过全盘拉通,跳出事情的本身往高一层看。
产品线的团队认为:他们面对的是什么?想打造成一个什么产品?我们正在打造的产品方向对吗?要建立一个稳定的产品线,但是现阶段能做的都是交付类型的项目,因为只有这样才能挣钱啊。最终我们是不是有一个成熟稳定的产品,这是团队确实考虑的问题。
对于一个研发团队来说:研发leader他们考虑的是什么呢?团队效率?团队交付的价值?打造的产品,拆分出的需求,真正能够直击市场吗?为什么要做?收益是什么?
我们会围绕三个方面去开展讨论,把它叫做业务级的敏捷生态圈。我们的很多团队都在做敏捷开发,这个理念是基于团队的,也就是中间的白色的小圈,这个范围是我们的产品研发团队(包括测试),跳出这个圈站高一级,产品线这一层级理解。考虑到产品线的稳定性,就是产品线与团队的拉通。产品线敏捷之后,当打造的产品不是市场想要的,问题就来了。产品线里有多款产品,如何选择产品?优先级如何排序呢?这时候就要考虑市场在哪儿?业务在哪儿?我们的客户在哪儿?跳出来看市场。
对于一个公司来讲它是top-down的,会有战略价值规划,一年、两年、三年的战略,基本上是不会变的,比如说阿里、腾讯,他们的战略是几年都不会变的,所以在大的战略方向上去考虑,决定了市场和业务是不是对。所以在这个点讲,应该把敏捷往整体扩张,扩张到整体业务和市场级,快速的交付市场价值,这个价值才是有意义的。不管是大公司、小公司都会面临这种方向的考虑。
就算是在小公司,也是有一个快速交付价值的理念。交付的是什么?价值!直击市场直击战略的目标,才会有真正的价值。团队是不是开站会了?团队是不是在做敏捷回顾?拿敏捷落地来说,它真正的意义在哪?快速的交付价值吗?交付的价值跟战略是要匹配的,今天我们这个圈子叫敏捷加,加什么呢?敏捷加IPD,对很多人来讲IPD其实是有一点像瀑布,有一点像我们大的规划里程碑节点,这能加到一块去吗?这件事也是围绕着我们好久,在今年团队要引入IPD的时候一直在想。后面给大家来说一说,团队级的IPD的敏捷是怎么做。
团队目标在于精细化管理,精细化管理目标需要盈利和收益,这个才是公司想要的,所以IPD从高层战略出发,自上而下。团队级的敏捷在我们公司,也不能说用到最好做到最好,但是大家的思维和观念上是接受的,也接受敏捷的变革。
对于敏捷大家都有一个包容的心态,很多团队想把它落地于实践,做的过程发现这个事做小了,团队敏捷了,团队跑快了,但收益在哪?价值点在哪?这个时候就有人提到了IPD, IPD实际也是一个变革的过程。IPD在国内是从华为过来的,华为当时引进,做到了华为自己的IPD,跟敏捷的思想同出一辙。
IPD核心关注点在于产品开发的商业结果,将产品开发作为一项投资进行管理。采用跨部门团队,汇集各功能代表及其所属领域的专业智慧和资源,共同承担项目商业成功的责任。在IPD流程中分不同阶段,通过商业决策点,实现IPMT(投资方)和PDT(承诺方)的互动,将资源分批受控投入。IPD来源于PACE(Product And Cycle-time Excellence - 产品及生命周期优化法),后经IBM的实践,IPD成为了一套重整企业产品开发模式的方法论。将企业的思维从 “做出来什么就卖什么!” 转向 “我们将能卖的东西做出来!”
文章参考 用友研究院 、 用友开发者大赛 和 YonBuider开发中心 资料
人工智能
2020-06-03 09:43:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
作者|Emrick Sinitambirivoutin 编译|VK 来源|Towards Data Science
训练学习系统的一个主要假设是在整个训练过程中输入的分布保持不变。对于简单地将输入数据映射到某些适当输出的线性模型,这种条件总是满足的,但在处理由多层叠加而成的神经网络时,情况就不一样了。
在这样的体系结构中,每一层的输入都受到前面所有层的参数的影响(随着网络变得更深,对网络参数的小变化会被放大)。因此,在一层内的反向传播步骤中所做的一个小的变化可以产生另一层的输入的一个巨大的变化,并在最后改变特征映射分布。在训练过程中,每一层都需要不断地适应前一层得到的新分布,这就减慢了收敛速度。
批标准化克服了这一问题,同时通过减少训练过程中内层的协方差移位(由于训练过程中网络参数的变化而导致的网络激活分布的变化)
本文将讨论以下内容 批标准化如何减少内部协方差移位,如何改进神经网络的训练。 如何在PyTorch中实现批标准化层。 一些简单的实验显示了使用批标准化的优点。
减少内部协方差移位
减少消除神经网络内部协方差移位的不良影响的一种方法是对层输入进行归一化。这个操作不仅使输入具有相同的分布,而且还使每个输入都白化(白化是对原始数据x实现一种变换,变换成x_Whitened,使x_Whitened的协方差矩阵的为单位阵。)。该方法是由一些研究提出的,这些研究表明,如果对网络的输入进行白化,则网络训练收敛得更快,因此,增强各层输入的白化是网络的一个理想特性。
然而,每一层输入的完全白化是昂贵的,并且不是完全可微的。批标准化通过考虑两个假设克服了这个问题: 我们将独立地对每个标量特征进行归一化(通过设置均值为0和方差为1),而不是对层的输入和输出的特征进行白化。 我们不使用整个数据集来进行标准化,而是使用mini-batch,每个mini-batch生成每个激活层的平均值和方差的估计值。
对于具有d维输入的层x = (x1, x2, ..xd)我们得到了以下公式的归一化(对batch B的期望和方差进行计算):
然而,简单地标准化一个层的每个输入可能会改变层所能表示的内容。例如,对一个sigmoid的输入进行归一化会将其约束到非线性的线性状态。这样的行为对网络来说是不可取的,因为它会降低其非线性的能力(它将成为相当于一个单层网络)。
为了解决这个问题,批标准化还确保插入到网络中的转换可以表示单位转换(模型仍然在每个层学习一些参数,这些参数在没有线性映射的情况下调整从上一层接收到的激活)。这是通过引入一对可学习参数gamma_k和beta_k来实现的,这两个参数根据模型学习的内容缩放和移动标准化值。
最后,得到的层的输入(基于前一层的输出x)为:
批标准化算法
训练时
全连接层
全连接层的实现非常简单。我们只需要得到每个批次的均值和方差,然后用之前给出的alpha和beata参数来缩放和移动。
在反向传播期间,我们将使用反向传播来更新这两个参数。 mean = torch.mean(X, axis=0) variance = torch.mean((X-mean)**2, axis=0) X_hat = (X-mean) * 1.0 /torch.sqrt(variance + eps) out = gamma * X_hat + beta
卷积层
卷积层的实现几乎与以前一样。我们只需要执行一些改造,以适应我们从上一层获得的输入结构。 N, C, H, W = X.shape mean = torch.mean(X, axis = (0, 2, 3)) variance = torch.mean((X - mean.reshape((1, C, 1, 1))) ** 2, axis=(0, 2, 3)) X_hat = (X - mean.reshape((1, C, 1, 1))) * 1.0 / torch.sqrt(variance.reshape((1, C, 1, 1)) + eps) out = gamma.reshape((1, C, 1, 1)) * X_hat + beta.reshape((1, C, 1, 1))
在PyTorch中,反向传播非常容易处理,这里的一件重要事情是指定alpha和beta是在反向传播阶段更新它们的参数。
为此,我们将在层中将它们声明为nn.Parameter(),并使用随机值初始化它们。
推理时
在推理过程中,我们希望网络的输出只依赖于输入,因此我们不能考虑之前考虑的批的统计数据(它们与批相关,因此它们根据数据而变化)。为了确保我们有一个固定的期望和方差,我们需要使用整个数据集来计算这些值,而不是只考虑批。然而,就时间和计算而言,为所有数据集计算这些统计信息是相当昂贵的。
论文中提出的方法是使用我们在训练期间计算的滑动统计。我们使用参数beta(动量)调整当前批次计算的期望的重要性:
该滑动平均线存储在一个全局变量中,该全局变量在训练阶段更新。 为了在训练期间将这个滑动平均线存储在我们的层中,我们可以使用缓冲区。当我们使用PyTorch的 register_buffer() 方法实例化我们的层时,我们将初始化这些缓冲区。
最后一个模块
然后,最后一个模块由前面描述的所有块组成。我们在输入数据的形状上添加一个条件,以了解我们处理的是全连接层还是卷积层。
这里需要注意的一件重要事情是,我们只需要实现forward()方法。因为我们的类继承自nn.Module,我们就可以自动得到backward()函数。 class CustomBatchNorm(nn.Module): def __init__(self, in_size, momentum=0.9, eps = 1e-5): super(CustomBatchNorm, self).__init__() self.momentum = momentum self.insize = in_size self.eps = eps U = uniform.Uniform(torch.tensor([0.0]), torch.tensor([1.0])) self.gamma = nn.Parameter(U.sample(torch.Size([self.insize])).view(self.insize)) self.beta = nn.Parameter(torch.zeros(self.insize)) self.register_buffer('running_mean', torch.zeros(self.insize)) self.register_buffer('running_var', torch.ones(self.insize)) self.running_mean.zero_() self.running_var.fill_(1) def forward(self, input): X = input if len(X.shape) not in (2, 4): raise ValueError("only support dense or 2dconv") #全连接层 elif len(X.shape) == 2: if self.training: mean = torch.mean(X, axis=0) variance = torch.mean((X-mean)**2, axis=0) self.running_mean = (self.momentum * self.running_mean) + (1.0-self.momentum) * mean self.running_var = (self.momentum * self.running_var) + (1.0-self.momentum) * (input.shape[0]/(input.shape[0]-1)*variance) else: mean = self.running_mean variance = self.running_var X_hat = (X-mean) * 1.0 /torch.sqrt(variance + self.eps) out = self.gamma * X_hat + self.beta # 卷积层 elif len(X.shape) == 4: if self.training: N, C, H, W = X.shape mean = torch.mean(X, axis = (0, 2, 3)) variance = torch.mean((X - mean.reshape((1, C, 1, 1))) ** 2, axis=(0, 2, 3)) self.running_mean = (self.momentum * self.running_mean) + (1.0-self.momentum) * mean self.running_var = (self.momentum * self.running_var) + (1.0-self.momentum) * (input.shape[0]/(input.shape[0]-1)*variance) else: mean = self.running_mean var = self.running_var X_hat = (X - mean.reshape((1, C, 1, 1))) * 1.0 / torch.sqrt(variance.reshape((1, C, 1, 1)) + self.eps) out = self.gamma.reshape((1, C, 1, 1)) * X_hat + self.beta.reshape((1, C, 1, 1)) return out
实验MNIST
为了观察批处理归一化对训练的影响,我们可以比较没有批处理归一化的简单神经网络和有批处理归一化的神经网络的收敛速度。
为了简单起见,我们在MNIST数据集上训练这两个简单的全连接网络,不进行预处理(只应用数据标准化)。
没有批标准化的网络架构 class SimpleNet(nn.Module): def __init__(self): super(SimpleNet, self).__init__() self.classifier = nn.Sequential( nn.Linear(28 * 28, 64), nn.ReLU(), nn.Linear(64, 128), nn.ReLU(), nn.Linear(128, 10) ) def forward(self, x): x = x.view(x.size(0), -1) x = self.classifier(x) return x
有批标准化的网络架构 class SimpleNetBN(nn.Module): def __init__(self): super(SimpleNetBN, self).__init__() self.classifier = nn.Sequential( nn.Linear(28 * 28, 64), CustomBatchNorm(64), nn.ReLU(), nn.Linear(64, 128), CustomBatchNorm(128), nn.ReLU(), nn.Linear(128, 10) ) def forward(self, x): x = x.view(x.size(0), -1) x = self.classifier(x) return x
结果
下图显示了在我们的SimpleNet的第一层之后获得的激活的分布。我们可以看到,即使经过20个epoch,分布仍然是高斯分布(在训练过程中学习到的小尺度和移位)。
我们也可以看到收敛速度方面的巨大进步。绿色曲线(带有批标准化)表明,我们可以更快地收敛到具有批标准化的最优解。
实验结果详见( https://github.com/sinitame/neuralnetworks-ents/blob/master/batch_normalization/batch_normaliz.ipynb )
结论
使用批标准化进行训练的优点 一个mini-batch处理的损失梯度是对训练集的梯度的估计,训练的质量随着批处理大小的增加而提高。 由于gpu提供的并行性,批处理大小上的计算要比单个示例的多次计算效率高得多。 在每一层使用批处理归一化来减少内部方差的移位,大大提高了网络的学习效率。
原文链接: https://towardsdatascience.com/understanding-batch-normalization-for-neural-networks-1cd269786fa6
欢迎关注磐创AI博客站: http://panchuang.net/
sklearn机器学习中文官方文档: http://sklearn123.com/
欢迎关注磐创博客资源汇总站: http://docs.panchuang.net/
人工智能
2020-06-04 13:01:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
作者|Emrick Sinitambirivoutin 编译|VK 来源|Towards Data Science
训练学习系统的一个主要假设是在整个训练过程中输入的分布保持不变。对于简单地将输入数据映射到某些适当输出的线性模型,这种条件总是满足的,但在处理由多层叠加而成的神经网络时,情况就不一样了。
在这样的体系结构中,每一层的输入都受到前面所有层的参数的影响(随着网络变得更深,对网络参数的小变化会被放大)。因此,在一层内的反向传播步骤中所做的一个小的变化可以产生另一层的输入的一个巨大的变化,并在最后改变特征映射分布。在训练过程中,每一层都需要不断地适应前一层得到的新分布,这就减慢了收敛速度。
批标准化克服了这一问题,同时通过减少训练过程中内层的协方差移位(由于训练过程中网络参数的变化而导致的网络激活分布的变化)
本文将讨论以下内容 批标准化如何减少内部协方差移位,如何改进神经网络的训练。 如何在PyTorch中实现批标准化层。 一些简单的实验显示了使用批标准化的优点。
减少内部协方差移位
减少消除神经网络内部协方差移位的不良影响的一种方法是对层输入进行归一化。这个操作不仅使输入具有相同的分布,而且还使每个输入都白化(白化是对原始数据x实现一种变换,变换成x_Whitened,使x_Whitened的协方差矩阵的为单位阵。)。该方法是由一些研究提出的,这些研究表明,如果对网络的输入进行白化,则网络训练收敛得更快,因此,增强各层输入的白化是网络的一个理想特性。
然而,每一层输入的完全白化是昂贵的,并且不是完全可微的。批标准化通过考虑两个假设克服了这个问题: 我们将独立地对每个标量特征进行归一化(通过设置均值为0和方差为1),而不是对层的输入和输出的特征进行白化。 我们不使用整个数据集来进行标准化,而是使用mini-batch,每个mini-batch生成每个激活层的平均值和方差的估计值。
对于具有d维输入的层x = (x1, x2, ..xd)我们得到了以下公式的归一化(对batch B的期望和方差进行计算):
然而,简单地标准化一个层的每个输入可能会改变层所能表示的内容。例如,对一个sigmoid的输入进行归一化会将其约束到非线性的线性状态。这样的行为对网络来说是不可取的,因为它会降低其非线性的能力(它将成为相当于一个单层网络)。
为了解决这个问题,批标准化还确保插入到网络中的转换可以表示单位转换(模型仍然在每个层学习一些参数,这些参数在没有线性映射的情况下调整从上一层接收到的激活)。这是通过引入一对可学习参数gamma_k和beta_k来实现的,这两个参数根据模型学习的内容缩放和移动标准化值。
最后,得到的层的输入(基于前一层的输出x)为:
批标准化算法
训练时
全连接层
全连接层的实现非常简单。我们只需要得到每个批次的均值和方差,然后用之前给出的alpha和beata参数来缩放和移动。
在反向传播期间,我们将使用反向传播来更新这两个参数。 mean = torch.mean(X, axis=0) variance = torch.mean((X-mean)**2, axis=0) X_hat = (X-mean) * 1.0 /torch.sqrt(variance + eps) out = gamma * X_hat + beta
卷积层
卷积层的实现几乎与以前一样。我们只需要执行一些改造,以适应我们从上一层获得的输入结构。 N, C, H, W = X.shape mean = torch.mean(X, axis = (0, 2, 3)) variance = torch.mean((X - mean.reshape((1, C, 1, 1))) ** 2, axis=(0, 2, 3)) X_hat = (X - mean.reshape((1, C, 1, 1))) * 1.0 / torch.sqrt(variance.reshape((1, C, 1, 1)) + eps) out = gamma.reshape((1, C, 1, 1)) * X_hat + beta.reshape((1, C, 1, 1))
在PyTorch中,反向传播非常容易处理,这里的一件重要事情是指定alpha和beta是在反向传播阶段更新它们的参数。
为此,我们将在层中将它们声明为nn.Parameter(),并使用随机值初始化它们。
推理时
在推理过程中,我们希望网络的输出只依赖于输入,因此我们不能考虑之前考虑的批的统计数据(它们与批相关,因此它们根据数据而变化)。为了确保我们有一个固定的期望和方差,我们需要使用整个数据集来计算这些值,而不是只考虑批。然而,就时间和计算而言,为所有数据集计算这些统计信息是相当昂贵的。
论文中提出的方法是使用我们在训练期间计算的滑动统计。我们使用参数beta(动量)调整当前批次计算的期望的重要性:
该滑动平均线存储在一个全局变量中,该全局变量在训练阶段更新。 为了在训练期间将这个滑动平均线存储在我们的层中,我们可以使用缓冲区。当我们使用PyTorch的 register_buffer() 方法实例化我们的层时,我们将初始化这些缓冲区。
最后一个模块
然后,最后一个模块由前面描述的所有块组成。我们在输入数据的形状上添加一个条件,以了解我们处理的是全连接层还是卷积层。
这里需要注意的一件重要事情是,我们只需要实现forward()方法。因为我们的类继承自nn.Module,我们就可以自动得到backward()函数。 class CustomBatchNorm(nn.Module): def __init__(self, in_size, momentum=0.9, eps = 1e-5): super(CustomBatchNorm, self).__init__() self.momentum = momentum self.insize = in_size self.eps = eps U = uniform.Uniform(torch.tensor([0.0]), torch.tensor([1.0])) self.gamma = nn.Parameter(U.sample(torch.Size([self.insize])).view(self.insize)) self.beta = nn.Parameter(torch.zeros(self.insize)) self.register_buffer('running_mean', torch.zeros(self.insize)) self.register_buffer('running_var', torch.ones(self.insize)) self.running_mean.zero_() self.running_var.fill_(1) def forward(self, input): X = input if len(X.shape) not in (2, 4): raise ValueError("only support dense or 2dconv") #全连接层 elif len(X.shape) == 2: if self.training: mean = torch.mean(X, axis=0) variance = torch.mean((X-mean)**2, axis=0) self.running_mean = (self.momentum * self.running_mean) + (1.0-self.momentum) * mean self.running_var = (self.momentum * self.running_var) + (1.0-self.momentum) * (input.shape[0]/(input.shape[0]-1)*variance) else: mean = self.running_mean variance = self.running_var X_hat = (X-mean) * 1.0 /torch.sqrt(variance + self.eps) out = self.gamma * X_hat + self.beta # 卷积层 elif len(X.shape) == 4: if self.training: N, C, H, W = X.shape mean = torch.mean(X, axis = (0, 2, 3)) variance = torch.mean((X - mean.reshape((1, C, 1, 1))) ** 2, axis=(0, 2, 3)) self.running_mean = (self.momentum * self.running_mean) + (1.0-self.momentum) * mean self.running_var = (self.momentum * self.running_var) + (1.0-self.momentum) * (input.shape[0]/(input.shape[0]-1)*variance) else: mean = self.running_mean var = self.running_var X_hat = (X - mean.reshape((1, C, 1, 1))) * 1.0 / torch.sqrt(variance.reshape((1, C, 1, 1)) + self.eps) out = self.gamma.reshape((1, C, 1, 1)) * X_hat + self.beta.reshape((1, C, 1, 1)) return out
实验MNIST
为了观察批处理归一化对训练的影响,我们可以比较没有批处理归一化的简单神经网络和有批处理归一化的神经网络的收敛速度。
为了简单起见,我们在MNIST数据集上训练这两个简单的全连接网络,不进行预处理(只应用数据标准化)。
没有批标准化的网络架构 class SimpleNet(nn.Module): def __init__(self): super(SimpleNet, self).__init__() self.classifier = nn.Sequential( nn.Linear(28 * 28, 64), nn.ReLU(), nn.Linear(64, 128), nn.ReLU(), nn.Linear(128, 10) ) def forward(self, x): x = x.view(x.size(0), -1) x = self.classifier(x) return x
有批标准化的网络架构 class SimpleNetBN(nn.Module): def __init__(self): super(SimpleNetBN, self).__init__() self.classifier = nn.Sequential( nn.Linear(28 * 28, 64), CustomBatchNorm(64), nn.ReLU(), nn.Linear(64, 128), CustomBatchNorm(128), nn.ReLU(), nn.Linear(128, 10) ) def forward(self, x): x = x.view(x.size(0), -1) x = self.classifier(x) return x
结果
下图显示了在我们的SimpleNet的第一层之后获得的激活的分布。我们可以看到,即使经过20个epoch,分布仍然是高斯分布(在训练过程中学习到的小尺度和移位)。
我们也可以看到收敛速度方面的巨大进步。绿色曲线(带有批标准化)表明,我们可以更快地收敛到具有批标准化的最优解。
实验结果详见( https://github.com/sinitame/neuralnetworks-ents/blob/master/batch_normalization/batch_normaliz.ipynb )
结论
使用批标准化进行训练的优点 一个mini-batch处理的损失梯度是对训练集的梯度的估计,训练的质量随着批处理大小的增加而提高。 由于gpu提供的并行性,批处理大小上的计算要比单个示例的多次计算效率高得多。 在每一层使用批处理归一化来减少内部方差的移位,大大提高了网络的学习效率。
原文链接: https://towardsdatascience.com/understanding-batch-normalization-for-neural-networks-1cd269786fa6
欢迎关注磐创AI博客站: http://panchuang.net/
sklearn机器学习中文官方文档: http://sklearn123.com/
欢迎关注磐创博客资源汇总站: http://docs.panchuang.net/
人工智能
2020-06-04 12:58:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
在网络科技的不断推动下,现在,内容创业实在有关注度,其与读者的交互性强、聚集的流量超乎想象、无可比拟的阅读点击等超级多的优越性,齐聚了各种有需求的人,为了能够掌握更厉害的曝光效果,人们时常会遍及全网站。然而只有真正玩过自媒体的人,才知晓:天天都必须干的一件事情:挨个平台进去再登录,而后,再分批次更新精心制作的图文或视频,显然是烦琐又枯燥,还很费时间,下面我来分享给你一个非常好的办法。
易媒助手安装完毕,点击左上角的添加账号,找到对应的自媒体平台,建议采用账密的方法来登录,这样今后易媒助手自动输入账密,不用繁琐的一遍一遍输入。
要是你们自媒体账号特别多的话,我推荐你不妨账号分组的功能,先设置一下账号分组,按照未来的使用做编组处理,把这里做完,往后一键发布的时候,就不必再一个一个找了。
搞定这些,下面来讲解如何一键上传文章,点击发文章按钮(在上面的菜单栏),如果初次用这个工具,那么我建议设置下默认分类,未来自动设置好分类,文章写好,点击一键设置标签功能,点击一键设置封面(右侧),假设某些平台需要设置某些功能,点击右侧对应平台设置想设置的就好了,只差一步分发了,点一下发布,进入发布选择界面,把要发的账号选好就一键发布完成了。
图文演示完了,下面告诉你如何推送视频/图文,跟着我点击下“发视频”(软件打开就能看到),温馨提示大家,设置默认分类,然后把本地视频上传一下,然后再逐个填写标题等元素。填好了再,将发布图标单击一下,会弹出全部账号让你勾选,选择对应的分组,就一键发布完成了,这样的方式真的省时又省力。
倘若需要提交工作报表,支持数据导出,直接导出就好了
自媒体这行绝对不能够急于求成,如果你十分认可自媒体的潜力,那么你应该做好长期耕耘的思想准备,特别是做图文创作的。
人工智能
2020-06-04 11:00:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
IIC总线上往往挂了很多设备,每个设备的频率可能都不一样。
IIC协议格式 为:
START+deviceaddr&r/w+ack+data+END
其中start为SCL高电频个,SDA由高到低。然后deviceaddr<<7&rw,总共一个字节,之后等待从设备ACK响应,收到响应之后即可以发送数据了,END 为结束SCL为高,SDA由低到高。
人工智能
2020-06-04 10:18:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
余弦相似度公式:
这里的分别代表向量A和B的各分量。
原理:多维空间两点与所设定的点形成夹角的余弦值。
范围:[-1,1],值越大,说明夹角越大,两点相距就越远,相似度就越小。
余弦相似度模型:根据用户评分数据表,生成物品的相似矩阵;

欧氏距离相似度公式:
原理:利用欧式距离d定义的相似度s,s=1 /(1+d)。
范围:[0,1],值越大,说明d越小,也就是距离越近,则相似度越大。
欧式相似度模型:根据用户评分数据表,生成物品的相似矩阵;
总结:
余弦相似度衡量的是维度间取值方向的一致性,注重维度之间的差异,不注重数值上的差异,而欧氏度量的正是数值上的差异性。
主要看数值的差异,比如个人兴趣,可能数值对他影响不大,这种情况应该采用余弦相似度
,而物品的相似度,例如价格差异数值差别影响就比较大,这种情况应该采用 欧氏度量
人工智能
2020-06-03 23:58:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
前言
当前,人工智能快速爆发,物联网技术稳步前进。我们可以看到,无论是人工智能,还是物联网的应用,都即将迎来一个新阶段,作为传统产业的农业已经成为物联网、人工智能的重点发展领域。十九大报告中鼓励新时代农业利用现代化手段,结合互联网大数据分析,建立满足农业生产整体规划要求的智慧农业人工智能基础设施。未来,智慧农业将是中国农业发展的重要方向。今天就给大家带来一个采用 Hightopo 的产品实现了智能肥水管理可视化系统。
功能描述
1、用水量控制管理
2、运行状态实时监控
3、阀门自动控制功能
4、软件平台操控
整体展示
主界面
我们可以通过移动平台或者个人电脑访问该界面,宏观统计出园区温室数量和总面积。可宏观的查看到不同类型温室的分布状况。并且由主界面可以访问各个园区分区温室。
子界面
例如展示中的水肥管理系统B区的访问界面,大体直观的统计出温室数量和种植品种,水肥流动流向和每一个储备罐中的液位高度情况,以及点触节点查看水表和电磁流量计等可查看施肥流量和用电用水量,直观查看EC/PH数值,实时监控到园区内土壤的酸碱和电导度是否适宜作物生长,及时做出调整。
每一个区域都配备4个不同方位的监视设备,有助于实时直观的了解园区内的现实状况,及时反馈到用户操作平台上。
整个系统由设施农业母液制备系统,管道增压离心泵,设施农业母液输配系统,农业工作液制备与施肥系统,多级细心增压构成。
用户可以通过点击模块节点,可了解该系统的详细信息。该系统提供肥料添加量自动计算,智能引导注肥。
点击节点查看详细参数配置了解制作母液时工作数值,母液制备时循环搅拌,增加水压将原液输送到母液桶中及时储存。了解正常工作时的稳定参数,及时调整
在工作液灌溉控制箱中,具备了EC值控制脉冲注肥算法程序,定量控制脉冲注肥算法程序和PH值控制注酸算法程序。用户可轻松的根据自己以及园区的实际情况完成合理的施肥输送。及时提醒使用者设施出现异常状况,并保护设备。统计用水量和施肥量,可供用户参考调整。

智能水肥一体化控制系统亮点:
(1) 节水节肥 ——节水节肥50%-70%;设备实时监控用水用肥量,不仅能精确保证水肥平衡还节省了大量的多余消耗。
(2) 省时省力 ——实时在线远程监测,迅速大面积灌溉和施肥。
(3) 智能控制 ——根据土壤水分等相关参数自动反馈控制灌溉。控温调湿,避免了施肥浇水过多作物造成黄叶坏死等问题。
(4) 提高产量 ——投运该系统可增产30~50%,改善作物品质,提高经济效益。
(5) 减轻病害 ——大棚内作物极容易产生土传病害,采用滴灌可以直接有效的控制土传病害的发生。
总结
我国农业现代化的进程加快。结合着中国土地面积大,但耕地面积比例并不高的实际情况下,更大力推举智能农业,以提高整体的农业产量和改善农业能源消耗量和农业生态环境是符合时代发展的举措。借用物联网的辅助,基于 Hightopo 的方案,使得数据可视化在各行各业充满了无限的可能,连接未来,为企业提速猛进。
人工智能
2020-06-03 23:33:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
  -SHL严谨的科学与Aspiring Minds人工智能的结合,增加了技术职位候选人并缩短了招聘时间
  明尼阿波利斯2020年6月2日 /美通社/ -- 鉴于目前及今后的新冠肺炎疫情局势,人才创新解决方案的市场领导者SHL近日发布了技术招聘解决方案(Technology Hiring Solution),在安全的远程环境中,帮助客户自动化及无缝扩展技术人才招聘流程。
  吸引和聘用科技行业的人才从未像现在这样具有挑战性。传统的招聘法效用不大,因为简历本身并不能有效地衡量个人技能和潜力。想要获取高素质人才,企业需要远程评估,加快录用流程,并提供良好的面试体验。
  事实上,如今90%以上的技术职位候选人通常都有多个工作机会。SHL的最新解决方案解决了这一现实问题,该方案将招聘时间减半,并且比传统方法相比,增加了45%的候选人。
  SHL的首席数字官Jora Gill表示:“我们的技术招聘解决方案提供了极为有效、相关的评估工具,来评估编码和技术技能。我们利用人工智能和数据驱动的洞见,确保企业永远不会错过优秀的科技人才,候选人也能感受到身临其境般的良好面试体验。”
  SHL的技术招聘解决方案结合了其长达40年的评估科学和最近收购的Aspiring Minds的创新人工智能,以确保较为快速、高效地招聘这些热门职位的人选。
  解决方案超出了大多数编程模拟所能提供的范围,让雇主根据四个重要参数来评估候选人,即编程能力、编程实践、运行时间复杂性和功能正确性。这让雇主能够在传统的“通过或失败”方法以外,深入了解候选人的技能水平。 郑州妇科医院:http://jbk.39.net/yiyuanfengcai/yyjs_sysdfkyy/郑州妇科医院哪家好:http://jbk.39.net/yiyuanfengcai/yyjs_sysdfkyy/郑州看妇科医院排名:http://jbk.39.net/yiyuanfengcai/yyjs_sysdfkyy/
  SHL首席增长官Himanshu Aggarwal表示:“你可能会遇到这样一位候选人,他犯了一个打字错误,但在其它各方面都很出色。在一个技术技能竞争激烈的市场上,获得每一位合格且有天赋的候选人十分重要。我们的解决方案让这成为可能。”
人工智能
2020-06-03 16:21:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
进程的创建
Linux中创建进程与其他系统有个主要区别,Linux中创建进程分2步:fork()和exec()。
fork: 通过拷贝当前进程创建一个子进程
exec: 读取可执行文件,将其载入到内存中运行
创建的流程:
调用dup_task_struct()为新进程分配内核栈,task_struct等,其中的内容与父进程相同。
check新进程(进程数目是否超出上限等)
清理新进程的信息(比如PID置0等),使之与父进程区别开。
新进程状态置为 TASK_UNINTERRUPTIBLE
更新task_struct的flags成员。
调用alloc_pid()为新进程分配一个有效的PID
根据clone()的参数标志,拷贝或共享相应的信息
做一些扫尾工作并返回新进程指针
创建进程的fork()函数实际上最终是调用clone()函数。
创建线程和进程的步骤一样,只是最终传给clone()函数的参数不同。
比如,通过一个普通的fork来创建进程,相当于:clone(SIGCHLD, 0)
创建一个和父进程共享地址空间,文件系统资源,文件描述符和信号处理程序的进程,即一个线程:clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0)
在内核中创建的内核线程与普通的进程之间还有个主要区别在于:内核线程没有独立的地址空间,它们只能在内核空间运行。
执行exec系统调用,一般都是这样,用fork()函数新建立一个进程,然后让进程去执行 exec调用 。我们知道,在fork()建立新进程之 后,父进各与子进程共享代码段,但数据空间是分开的,但父进程会把自己数据空间的内容copy到子进程中去,还有上下文也会copy到子进程中去。而为了 提高效率,采用一种写时copy的策略,即创建子进程的时候,并不copy父进程的地址空间,父子进程拥有共同的地址空间,只有当子进程需要写入数据时 (如向缓冲区写入数据),这时候会复制地址空间,复制缓冲区到子进程中去。从而父子进程拥有独立的地址空间。而对于fork()之后执行exec后,这种 策略能够很好的提高效率,如果一开始就copy,那么exec之后,子进程的数据会被放弃,被新的进程所代替。
exec如何调用程序呢?
人工智能
2020-06-02 13:28:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
作者|facebookresearch 编译|Flin 来源|Github
部署
Caffe2部署
我们目前支持通过ONNX将detectron2模型转换为Caffe2格式。转换后的Caffe2模型可以在Python或C ++中运行而无需detectron2依赖性。它具有针对CPU和移动设备推理优化的运行时,但不适用于GPU推理。
Caffe2转换需要PyTorch≥1.4和ONNX≥1.6。
覆盖范围
它支持最常见的3元结构: GeneralizedRCNN , RetinaNet , PanopticFPN ,几乎在这些3元结构的所有官方正式型号。
只要用户的自定义扩展名不包含Caffe2中不可用的控制流或运算符(例如,可变形卷积),就支持这些体系结构下的用户自定义扩展名(通过注册添加)。例如,通常开箱即用地支持自定义backbones和heads。
用法
转换API记录在API文档中。我们提供了一个工具,tools/caffe2_converter.py作为使用这些API转换标准模型的示例。
要转换经过COCO训练的官方Mask R-CNN,请先准备COCO数据集,地址是: https://github.com/facebookresearch/detectron2/tree/master/datasets
然后从Model Zoo中选择模型,然后运行: python tools/caffe2_converter.py --config-file configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml \ --output ./caffe2_model --run-eval \ MODEL.WEIGHTS detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl \ MODEL.DEVICE cpu
注意: 转换需要有效的样本输入和权重来跟踪模型。这就是脚本需要数据集的原因。你可以修改脚本以其他方式获取样本输入。 仅Pytorch的master支持GPU转换。因此我们使用 MODEL.DEVICE cpu 。 使用 --run-eval 标志,它将评估转换后的模型以验证其准确性。由于以下原因,精度通常与PyTorch略有不同(在0.1 AP内)不同实现之间的数值精度。建议始终验证准确性,以防转换不支持自定义模型。
转换后的模型位于指定的 caffe2_model/ 目录中。两个文件 model.pb 以及包含网络结构和网络参数的 model_init.pb 对于部署都是必需的。 然后可以使用Caffe2的API将这些文件加载​​到C ++或Python中。
该脚本会生成 model.svg 文件,其中包含网络的可视化内容。 你也可以将 model.pb 加载到netron( https://github.com/lutzroeder/netron )之类的工具中以对其进行可视化。
输入和输出
所有转换后的模型均采用两个输入张量:每个图像的"data"是NCHW图像,而"im_info"是Nx3张量(高度,宽度,未使用的旧参数)("data"的形状可能由于填充而大于在"im_info"中显示的内容)。
转换后的模型不包含将原始图层输出转换为格式化的预测的后处理操作。这些模型仅从未经后期处理的最终层产生原始输出,因为在实际部署中,应用程序通常需要自定义的轻量级后期处理(例如,通常无需为每个检测到的对象使用full-image masks )。
由于不同的输入和输出格式,该 Caffe2Model.__call__ 方法包括预处理/后处理代码,以匹配原始detectron2模型的格式。它们可以作为实际部署中的预处理的参考。
原文链接: https://detectron2.readthedocs.io/tutorials/deployment.html
欢迎关注磐创AI博客站: http://panchuang.net/
sklearn机器学习中文官方文档: http://sklearn123.com/
欢迎关注磐创博客资源汇总站: http://docs.panchuang.net/
人工智能
2020-06-02 09:44:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
按照DevOps理念,在kubernetes上实现CI/CD(持续集成/持续交付)能力,以及进一步实现数据和算法(如ML-机器学习)流程,是kubernetes集群的下一步目标。Tekton是一个CI/CD平台,Tecton是ML的数据平台。
集群环境下的CI/CD(持续集成/持续交付)与单机环境、持续交付有何不同?集群环境尤其是容器集群环境需要进行容器镜像服务支持、容器镜像的构建、容器镜像的多节点部署、集群的设置和版本切换、多实例集群化测试、灰度测试与金丝雀发布等更多的步骤,远远比传统的单机或中心式集群复杂。目前github.com/GitLab/hub.docker.com都提供了容器的镜像构建能力,但是缺乏生产环境的灰度测试和发布能力,因此尚无法提供完整的DevOps能力,仍然是传统的持续交付方式。
ML(机器学习)工作流程,上图来自于 https://tecton.ai/blog/devops-ml-data/ 。
JenkinsX
JenkinsX跟Jenkins类似,但是针对Kubernetes集群环境的持续集成/持续交付工具。通过将代码抓取、自动化构建、测试与分发、部署集成到一个完整的开发流程,实现软件的自动化交付流程。 基于Kubernetes的持续交付平台 Kubernetes持续交付-Jenkins X的Helm部署 配置sonar、jenkins进行持续集成和代码审查 基于Jenkins 快速搭建持续集成环境 Ubuntu快速搭建Jenkins持续集成平台 Kubernetes代码仓库-GitLab的Helm部署
Tekton
Tekton 是一个功能强大且灵活的 Kubernetes 原生框架,用于创建 CI/CD 系统。通过抽象出底层实现细节,允许开发者跨多云环境或本地系统进行构建、测试与部署。
特性包括: 工件管理:存储、管理和保护工件,同时 Tetkon 管道可以很好地与其它第三方工具相配合。 部署管道:部署管道旨在支持复杂的工作流程,包括跨多个环境的部署以及金丝雀部署和蓝/绿部署。 结果:作为内置结果存储 API 的一部分,通过日志可以深入了解测试与构建结果。
更多参考: kubernetes Tekton -CI/CD 持续集成流水线 Plumbing Kubernetes builds with Tekton - DevOps Conference 阿里云Kubernetes服务上使用 Tekton 完成应用发布初体验 使用 Tekton 创建 CI/CD 流水线(1/2)
Tecton
Tecton与Tekton虽然只有一字之差,但设计思路也有类似的地方,但Tecton是专注于ML的数据流程,而Tekton是用于CI/CD的,说白了就是用于代码/配置参数/二进制软件等的持续集成和持续交付。
为什么需要Tecton呢?因为对于ML(机器学习),传统的CI/CD工具就不太好使了。在ML流程中,涉及到训练数据集、参数集、测试数据集等多种数据及其多个版本,而且往往数据量比较大,在集群中还需要多个节点能够同时访问。换句话说,在ML工作流程中,是以数据为中心的,而且往往需要多次迭代、调优。
Tecton是专门为ML设计的DevOps系统,Tecton平台组成包括: Feature Pipelines , for transforming your raw data into features or labels Feature Store, for storing historical feature and label data Feature Server, for serving the latest feature values in production SDK , for retrieving training data and manipulating feature pipelines Web UI, for managing and tracking features, labels, and data sets Monitoring Engine, for detecting data quality or drift issues and alerting
详情查看: https://cloud.google.com/tekton Why We Need DevOps for ML Data - Tecton Blog - Tecton
KubeFlow
KubeFlow也是一个ML的流程化工具,但是侧重于数据探索和模型构建,而不是流程和运维管理。
关于KubeFlow的更多介绍参考: KubeFlow进展研究(v0.7.1,2020年02月) KubeFlow部署攻略(0.7.1) KubeFlow-在Microk8s部署与应用 Kubernetes-管理和调度GPUs资源 Kubernetes集群的NVIDIA设备支持插件
可以用于数据流程的工具还有AirFlow、NiFi、MLFlow等等。参考: AirFlow/NiFi/MLFlow/KubeFlow进展
随着ML(机器学习)的投入生产应用,将CI/CD方法和DevOps理念与ML流程结合起来,提高ML流程的效率,实现算法模型的持续学习、快速迭代、动态部署、运维监控、持续优化,以及进一步将其运用到边缘计算设备中,是机器学习实现生产力提升的关键步骤,同时也需要建立相应的数据、算法、模型库等AI基础设施来进行支持。
人工智能
2020-06-02 06:16:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
Numpy(Numerical Python的简称)是高性能科学计算和数据分析的基础包。它是所有高级工具的构建基础,Pandas就是构建在Numpy之上。
Numpy最重要的一个特点就是N维数组对象(ndarray),其是一个快速而灵活的大数据集容器。可以利用这个数组对整块数据执行一些数据运算,其语法和标量元素之间的运算类似。
ndarray是一个通用的同构数据多维容器,其中的所有元素必须是相同类型的。
1.创建ndarray
列表
In [1]: import numpy as np data1 = [ 6 , 7 , 4 , 5 , 0 , 1 , 8 ] nda = np . array ( data1 ) nda Out[1]: array([6, 7, 4, 5, 0, 1, 8])
嵌套列表
In [2]: data2 = [[ 1 , 2 , 3 ],[ 4 , 5 , 6 ]] ndb = np . array ( data2 ) ndb Out[2]: array([[1, 2, 3], [4, 5, 6]])
除非显示说明,narray会尝试为新建的这个数组推断一个较为合适的数据类型。
每个数组都有一个shape(表示各维度大小的元组)
In [6]: ndb . shape Out[6]: (2, 3)
和一个dtype(用于说明数组数据类型的对象)
In [12]: ndb . dtype Out[12]: dtype('int64')
还有一些其他函数可以创建ndarray
In [9]: np . ones ([ 2 , 3 ], dtype = 'int64' ) Out[9]: array([[1, 1, 1], [1, 1, 1]])
In [4]: np . zeros ([ 2 , 3 ]) Out[4]: array([[0., 0., 0.], [0., 0., 0.]])
1.1.数据创建函数
函数 说明 array 将输入数据(列表,元组,数组或其他序列类型)转换为ndarray。要么推断出dtype,要么显示指定dtype。默认直接复制输入数据。
asarray 将输入转换为ndarray,如果输入本身就是yigendarray就不进行复制。
arange 类似于内置的rangge,但是返回一个ndarray而不是列表
ones,ones_like 根据指定的形状和dtype创建一个全1数组。ones_like以另一个数组为参考,并根据其形状和dtype创建一个全1数组。
zeros,zeros_like 类似于ones和ones_like,只不过产生的全是0数组而已
empty,empty_like
eye,identity
创建新数组,只分配内存空间但不填充任何值。
创建一个正方的N*N单位矩阵(对角线为1,其余为0)
ndarray的数据类型
dtype(数据类型)是一个特殊的对象,它包含有ndarray将一块内存解释为特定数据类型所需的信息。
In [1]: import numpy as np arr1 = np . array ([ 1 , 2 , 3 ], dtype = np . float64 ) arr2 = np . array ([ 1 , 2 , 3 ], dtype = np . int64 ) arr1 . dtype Out[1]: dtype('float64')
In [2]: arr2 . dtype Out[2]: dtype('int64')
类型 类型代码 说明 int8,uint8 i1,u1 有符号和无符号的8位(1个字节)整型
int16,uint16 i2,u2 有符号和无符号的16位(2个字节)整型
int32,uint32 i4,u4 有符号和无符号的32位(4个字节)整型
int64,uint64 i8,u8 有符号和无符号的64位(8个字节)整型
float16 f2 半精度浮点数
float32 f4或f 标准的单精度浮点数,与C的float兼容
float64 f8或d 标准的双精度浮点数,与C的double和Python的float对象兼容
float128 f16或g 扩展精度浮点数
complex64,complex128,complex256 c8,c16,c32 分别用两个32位,64位或128位浮点数标识的复数
bool ? 存储True和False值的布尔类型
object O Python对象类型
string_
unicode_
S
U
固定长度的字符串类型(每个字符串一个字节)。例如要创建一个长度为10的字符串,应使用S10
固定长度的Unicode类型(字节数由平台决定)根字符串的定义方式一样(如U10)
In [5]: import numpy as np arr1 = np . array ([ 1 , 2 , 3 ], dtype = 'S2' ) arr2 = np . array ([ 1 , 2 , 3 ], dtype = 'i4' ) arr1 Out[5]: array([b'1', b'2', b'3'], dtype='|S2')
In [6]: arr1 [ 1 ] Out[6]: b'2'
可以通过astype显式的转换其dtype
In [7]: arr1 . astype ( 'u4' ) Out[7]: array([1, 2, 3], dtype=uint32)
3.数组和标量之间的运算
在运用数组计算,可以不必编写循环即可对数据进行匹配处理,这就是矢量化。
大小相同的数组之间的任何运算都会将运算应用到每个元素上。
In [6]: import numpy as np arr = np . array ([ 1 , 2 , 3 ]) arr1 = np . array ([ 2 , 3 , 4 ]) arr + arr1 Out[6]: array([3, 5, 7])
In [7]: arr * 0.5 Out[7]: array([0.5, 1. , 1.5])
In [8]: arr ** 0.5 Out[8]: array([1. , 1.41421356, 1.73205081])
不同大小的数组之间的运算叫广播。
4.索引和切片
注意:
这里的切片与list的切片的区别。 list 切片返回的是不原数据,对新数据的修改不会影响原数据 NumPy.ndarry 的切片返回的是原数据,对切片修改会影响原数据,若希望得到原数据的副本, 可以用 copy()
In [11]: import numpy as np arr = np . arange ( 10 ) arr Out[11]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [13]: arr [ 5 ] Out[13]: 5
In [15]: arr [ 0 : 5 ] Out[15]: array([0, 1, 2, 3, 4])
当将一个标量赋值给切片时,该值会自动传播,也就是广播。这里和列表的区别就是,数组切片时原始的视图,任何修改都会改变到源数组上。
In [17]: arr [ 0 : 5 ] = 10 arr Out[17]: array([10, 10, 10, 10, 10, 5, 6, 7, 8, 9])
这里涉及的目的是:因为Numpy是为了处理大数据量的,如果发生复制等事情,则会造成大量内存的使用。
4.1.高维数组
这里演示的是创建二维数组,高阶类似。
整数随机数组
In [18]: import numpy as np arr = np . random . randint ( 0 , 10 , size = [ 3 , 3 ]) arr Out[18]: array([[3, 1, 0], [2, 3, 4], [7, 3, 8]])
小数多维数组
In [20]: arr1 = np . random . random (( 3 , 3 )) arr1 Out[20]: array([[0.45444967, 0.55649903, 0.98066105], [0.04549819, 0.41755054, 0.39653621], [0.67820675, 0.50842123, 0.15909352]])
生成符合正态分布的随机数
In [31]: arr3 = np . random . randn ( 4 , 3 ) arr3 Out[31]: array([[ 0.12253952, 0.93764629, -1.10739373], [-0.14677255, 2.22531292, 1.25376962], [ 1.75692968, 1.06357339, -1.39978643], [-1.27281238, 2.12064567, 0.45897216]])
只使用一个维度,则可以降低维度
In [22]: arr [ 1 ] Out[22]: array([2, 3, 4])
取单个元素
In [26]: arr [ 1 ][ 2 ] Out[26]: 4
切片,只针对第一维
In [24]: arr [: 2 ] Out[24]: array([[3, 1, 0], [2, 3, 4]])
切片,针一维和二维,中间逗号分隔
In [27]: arr [: 2 ,: 2 ] Out[27]: array([[3, 1], [2, 3]])
标量复制
In [29]: arr [: 2 ] = 9 arr Out[29]: array([[9, 9, 9], [9, 9, 9], [7, 3, 8]])
4.2.布尔型索引
In [32]: import numpy as np arr = np . arange ( 10 ) arr Out[32]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
选出奇数项,0位特殊情况。 根据条件创建布尔型索引
In [37]: arr % 2 ==1 Out[37]: array([False, True, False, True, False, True, False, True, False, True])
索引与数组关联获取数据
In [38]: arr [ arr % 2 ==1] Out[38]: array([1, 3, 5, 7, 9])
多维数组
In [48]: import numpy as np arr1 = np . random . randint ( 0 , 10 , size = [ 3 , 3 ]) arr1 Out[48]: array([[2, 3, 0], [1, 2, 5], [3, 7, 3]])
In [49]: arr2 = np . array ([ 1 , 2 , 2 ])
In [50]: arr1 [ arr2 == 2 ] Out[50]: array([[1, 2, 5], [3, 7, 3]])
In [52]: arr1 [ arr2 == 2 ,: 2 ] Out[52]: array([[1, 2], [3, 7]])
布尔型数组的长度必须和被索引的轴长度一致。 除了==号,还可以使用,不等号(!=),负号(-)对条件进行否定 使用 & (和),| (或)等布尔运算
在机器学习中常用的是将部分值处理为0
In [54]: import numpy as np arr3 = np . random . randn ( 4 , 3 ) arr3 Out[54]: array([[-0.22936582, 0.22714778, -1.20923907], [ 0.00211171, 0.73835705, 0.07444639], [ 0.1406557 , -0.8766863 , 0.25614127], [-0.31704606, -0.39800804, -1.13511035]])
In [57]: arr3 [ arr3 < 0 ] = 0 arr3 Out[57]: array([[0. , 0.22714778, 0. ], [0.00211171, 0.73835705, 0.07444639], [0.1406557 , 0. , 0.25614127], [0. , 0. , 0. ]])
4.3.花式索引
花式索引是一个NumPy术语,是指利用整数数组进行索引。也可以理解为以特定的顺序选取子集。
花式索引和切片不一样,总是将数据复制到新数组中。
一维
In [3]: import numpy as np arr1 = np . array ([ 'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g' , 'h' , 'i' ]) arr1 Out[3]: array(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'], dtype='In [4]: arr1 [[ 4 , 1 , 7 , 5 ]] Out[4]: array(['e', 'b', 'h', 'f'], dtype=' 二维
In [6]: import numpy as np arr = np . random . randn ( 10 , 3 ) arr Out[6]: array([[ 0.57989704, 1.05941762, -1.236248 ], [-0.49258106, 1.34762204, -0.55370729], [-0.98801594, 0.55040551, -0.31393819], [-1.2883949 , -1.85313486, 0.2451353 ], [ 1.29845609, 0.10674859, 1.4505412 ], [-0.0586313 , 0.90021843, 1.75536925], [ 0.16780398, -0.06483459, -1.21850008], [-3.13836877, 0.02792063, -0.16427975], [ 1.3108984 , -0.0197715 , 0.98607566], [-0.04675146, -1.04485198, -0.76184571]])
In [7]: arr [[ 4 , 1 , 7 , 5 ]] Out[7]: array([[ 1.29845609, 0.10674859, 1.4505412 ], [-0.49258106, 1.34762204, -0.55370729], [-3.13836877, 0.02792063, -0.16427975], [-0.0586313 , 0.90021843, 1.75536925]])
传入多个数组
In [13]: import numpy as np arr1 = np . arange ( 32 ) . reshape (( 8 , 4 )) arr1 Out[13]: array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23], [24, 25, 26, 27], [28, 29, 30, 31]])
In [14]: arr1 [[ 4 , 1 , 7 , 5 ]] Out[14]: array([[16, 17, 18, 19], [ 4, 5, 6, 7], [28, 29, 30, 31], [20, 21, 22, 23]])
In [16]: arr1 [[ 4 , 1 , 7 , 5 ],[ 0 , 3 , 1 , 2 ]] Out[16]: array([16, 7, 29, 22])
观察以上两个输出,第二个数组是对第一个数组的索引结果在此进行索引。
In [17]: arr1 [ np . ix_ ([ 4 , 1 , 7 , 5 ],[ 0 , 3 , 1 , 2 ])] Out[17]: array([[16, 19, 17, 18], [ 4, 7, 5, 6], [28, 31, 29, 30], [20, 23, 21, 22]])
此时使用np.ix_函数,第二个数组会应用到第一个数组结果的每一项中。
4.4.数组转置
二维
In [18]: import numpy as np arr = np . arange ( 15 ) . reshape ( 3 , 5 ) arr Out[18]: array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]])
In [19]: arr . T Out[19]: array([[ 0, 5, 10], [ 1, 6, 11], [ 2, 7, 12], [ 3, 8, 13], [ 4, 9, 14]])
在后续的矩阵计算中经常使用。例如:利用np.dot计算矩阵内积 x T x xTx
In [20]: np . dot ( arr . T , arr ) Out[20]: array([[125, 140, 155, 170, 185], [140, 158, 176, 194, 212], [155, 176, 197, 218, 239], [170, 194, 218, 242, 266], [185, 212, 239, 266, 293]])
多维
In [25]: import numpy as np arr = np . arange ( 30 ) . reshape ( 2 , 5 , 3 ) arr Out[25]: array([[[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8], [ 9, 10, 11], [12, 13, 14]], [[15, 16, 17], [18, 19, 20], [21, 22, 23], [24, 25, 26], [27, 28, 29]]])
In [26]: arr . T Out[26]: array([[[ 0, 15], [ 3, 18], [ 6, 21], [ 9, 24], [12, 27]], [[ 1, 16], [ 4, 19], [ 7, 22], [10, 25], [13, 28]], [[ 2, 17], [ 5, 20], [ 8, 23], [11, 26], [14, 29]]])
更多文章,请关注:
人工智能
2020-06-01 22:18:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
唱作俱佳,腾讯AI艾灵领唱中国新儿歌
今年六一儿童节,腾讯联合北京荷风艺术基金会发起“腾讯荷风艺术行动”,给孩子们送上两份礼物,为音乐美学中国素质教育的发展做出贡献。
其中一份就是由首席儿歌守护唱作人,青年演员歌手王俊凯与雄安孩子,以及腾讯AI数字人艾灵共同演绎的新歌《点亮》。这份礼物被以特别的方式呈现:在H5互动里,每个人都可以轻松召唤AI艾灵,创作你的专属MV——给几个关键词,艾灵就能为你创作专属歌词,并和王俊凯一起唱给你听。 H5演示视频——推荐使用竖版 https://share.weiyun.com/15lbGUGn
在互动里,唱作俱佳的AI数字人艾灵已搭乘互联网来到每个人面前,她不仅能作词,还能用近乎真人的声线演唱,加上用多模态智能技术搭建的数字躯体,绝对是令你难忘的全能型虚拟歌手。
心动了吗?扫描下方二维码或点击“阅读原文”,制作一个你的新歌mv。
怎么样?是不是高音甜、中音准、低音稳?AI艾灵源自腾讯 AI Lab 的实验探索性技术项目—— AI 数字人(Digital Human) 。项目的目标是把计算机视觉、语音/歌声合成和转换、图像/视频合成和迁移、自然语言理解等多模态 AI 能力与技术深度融合,生成清晰、流畅、高质的可交互内容,打造高拟人度的智能数字人,推进 AI 在虚拟偶像、虚拟助理、在线教育、数字内容生成等领域的应用。
AI 艾灵使用了基于数据依赖型的深度学习方法,现在还只能生成基础歌词和合成歌曲,无法实现完全自由的创作。但腾讯 AI Lab 将继续技术攻坚,探索自动化音乐合成及基于全新乐曲自动生成歌词模板再自动填词的新方法。此外,基于智能数字人的交互式技术在音乐教育方面的应用也是重要的探索方向。
下面通过腾讯 AI Lab 的两项研究成果: DurIAN 个性化歌声合成 和 SongNet (相关论文被顶级会议 ACL 2020 收录) 来谈谈AI艾灵歌声背后的核心技术。
DurIAN个性化歌声合成
如果你用过早期的自动合成语音听书软件,那你就会听过最原始的机器合成语音,即直接将各个字词的发音生硬地拼接到一起,没有人类在自然说话和唱歌时自然起伏的韵律。很多电影也采用了人们对机器合成语音的这种典型印象来塑造机器人或 AI 角色,而且这类声音也是著名物理学家斯蒂芬·霍金偏爱的音色。
但是,随着近些年机器学习技术的发展,合成语音在拟真度方面已经取得了长足的进步,机器声再也不只是人类印象中那种一板一眼的刻板模样了,现在的 AI 甚至还能学会像人类一样情感充沛地歌唱!
快来听听这次在 QQ 音乐上线的公益数字专辑《儿歌新唱》里,AI艾灵与小朋友们的一起合唱的《声律启蒙》 QQ音乐链接《声律启蒙》 https://y.qq.com/n/yqq/song/002epGT73JjYUB.html?ADTAG=h5_playsong&no_redirect=1
想听更多歌曲,可以移步她的B站直播间: https://live.bilibili.com/21927742
AI艾灵的歌声即来源于这样的 AI 技术。首先,研究者以音素为基本发音单元将任意歌曲描述为一连串音素的序列;然后通过分析歌谱,从文字、旋律、节奏等多个维度分别提取和预测词曲中每个音素的发音、时长、停顿、音高、风格和演唱技巧等特征;最后使用由真人(中国网络声优龟娘)演唱的歌声训练得到的深度神经网络声学模型和声码器模型,合成出与真人声线高度相似歌声音频。
AI 歌声合成的模型架构
不同于“初音未来”等虚拟歌姬的“机器合成+人工调教”模式,使用了基于DurIAN声学模型 的AI艾灵无须经过人工调教就能得到非常自然和拟真的歌声。
DurIAN-singing synthesis的声学模型结构
我们在端到端语音合成模型DurIAN的基础上进行修改,加入基频信息、说话人信息和语言信息来进行歌声合成的声学模型建模。该模型不仅可以从人的说话数据直接训练出唱歌模型,还可以实现跨语种歌声合成,比如用英文说话人的声音合成中文歌声。声学模型的编码器采用音素序列作为输入,编码器的输出经过一个对抗训练的说话人分类器以减少输入文本与说话人的相关度,提高最终合成音频的说话人相似度。与此同时,编码器的输出根据输入的唱腔时长信息沿时间轴展开,与输入的基频、说话人向量、语言向量进行拼接,作为解码器的输入,精准控制合成歌声的韵律、音调和音色。解码器采用自回归模型预测梅尔频谱。多频段同步式 WaveRNN 模型用作声码器从生成的梅尔频谱合成音频。这项技术已经可以在适当的硬件成本下实现实时歌曲合成。在互动中,AI艾灵可以快速地为千万用户输入的歌谱合成出对应的歌声。
多频段同步式 WaveRNN:首先把语音信息分频段,每一步用同一个声码器模型同时预测多个频段的值,如果分成 4 个频段,则每一步可以计算 4个值,计算次数就是原来的四分之一。在合成过程中,声码器预测多频段的值后,通过上采样和专门的滤波器设计就能保证恢复没有失真的原始信号。
展望未来,这项技术可以用于降低歌曲制作过程中录音环节的成本,更可以用于打造虚拟偶像,成为广大专业和社区音乐人创作不可多得的制作工具。除了 AI 歌声合成技术之外,腾讯 AI Lab 还在研究数据量极小和录音质量差条件下的歌声合成。
SongNet:为你写歌
AI艾灵的歌词生成方案基于腾讯 AI Lab 最新研发的歌词创作模型SongNet。该深度学习模型最大的特点就是可以给定任意格式和模板来生成相契合的文本。在前文的H5里面,AI艾灵的"命题作词“技能就来源于此。
例如,给定《十年》这首歌词的格式,我们可以通过SongNet重新进行配词,并保证格式不变,可以根据原来的曲谱进行演唱: 原歌词 : 十年之前/我不认识你/你不属于我/我们还是一样/陪在一个陌生人左右/走过渐渐熟悉的街头 新配词 : 夜深人静/思念你模样/多少次孤单/想伴在你身旁/是什么让我如此幻想/为何会对你那般痴狂
SongNet 模型框架
该任务的挑战在于既要生成跟格式一致的文本,又要保证句子的整体性,还要有歌词的韵律以及美感。所以我们设计了SongNet模型来尝试一次性解决所提到的问题。SongNet模型的基本骨架是一个基于Transformer的自回归语言模型,我们针对格式、韵律、句子完整性设计了特殊的符号来进行标识和建模。通过局部和全局两种注意力机制达到了对上下文语义和格式同时建模的目的。SongNet模型兼有全局生成和局部精修两种功能,通过主题和类型控制全局生成整段歌词之后,由于模型的局限性,总会有差强人意的部分。这时我们就可以和模型进行交互,将质量不高的词句抹掉让模型局部重新生成补全以达到精修的目的。词粒度和句粒度的MASKing训练策略可以进一步增强模型给定上下文补全缺失内容的能力。
此外,SongNet 也采用了类似于 BERT 和 GPT 的预训练和微调范式,通过在大规模文本语料的预训练和歌词语料的微调过程,可以进一步提升模型生成歌词的质量。
SongNet 根据给定格式填词(宋词和十四行诗)
SongNet 根据给定内容局部补全精修
在“王俊凯AI唱我的歌”H5 中,用户随机输入一个或者多个关键词,AI 就可以根据这份灵感,创作出优美、恰当的歌词,比如“田野花开多芬芳,仰望满天星光”、“青草地里看花开,小花倾听着爱”。
生成的歌词然后会被提交给歌声合成模块,再融合对应的背景音乐,一首悦耳动听的歌曲就新鲜出炉了。
SongNet模型是AI Lab在AI创作方向的一次尝试,现阶段模型也存在一些局限性。歌曲作为一种艺术形式,蕴含了人类细腻的情感和深厚的智慧,在这方面目前版本的模型和人类还有很大的距离,无法感知人类丰富多变的情感。而且此次还同时设置了上下文约束和蕴含特定关键词的限制,所以会在一定程度上降低模型生成歌词的逻辑性和连贯性。未来,我们一方面会持续增强模型对歌曲主题和情感的感知度,另一方面也会设计模型策略来进一步提升生成的歌词的逻辑性、连贯性以及优美度。
顺带一提,AI艾灵还能借助腾讯 AI Lab 研发的王者荣耀游戏解说生成模型来生成游戏解说词,再通过语音合成实时生成生动活泼的解说。
一起探索数字内容生成,共创未来
腾讯 AI Lab 已经通过公开论文发布了 DurIAN 和 SongNet 的技术细节,SongNet 代码也已开源,你可基于此开发自己的虚拟歌手或使用开源代码构建自己的写歌或写诗机器人,共同探索数字内容生成与教育等现实场景的结合方式,创造更多"科技向善“的可能性。 DurIAN论文 : https://tencent-ailab.github.io/durian (投稿于INTERSPEECH 2020) SongNet论文 : https://arxiv.org/abs/2004.08022 (已被 ACL 2020 接收) SongNet代码 : http://github.com/lipiji/SongNet
人工智能
2020-06-01 20:37:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
本周我们将邀请来自极链科技的顾寅铮将针对正在举行的ECCV2020 - VIPriors Workshop比赛中的目标检测赛道进行分享。
主讲人:
顾寅铮,极链科技AI研究院负责人。
加拿大多伦多大学数学与统计学本科,加拿大皇后大学数学硕士、博士。
研究领域包括深度学习、计算机视觉、多媒体、及视频处理,拥有数项发明专利。
ACMMM等知名国际会议及期刊中发布数篇论文,CVPR等著名国际会议受邀数次行业演讲,顶级期刊TPAMI审稿人, 2018、19连续两年获得第一、第二届谷歌地标识别挑战赛冠军。
直播内容预告:
近年来,随着深度学习与计算机硬件的发展,模型训练对样本的数量要求也越来越高。以目标检测为例,目前主流训练流程通常是先在图像识别数据集(如ImageNet)上预训练后在目标检测数据集(如COCO)上进行微调。即便是最近提出的“无预训练”方法也需要使用全部的约12万张检测数据集并增加训练时长4至6倍来达到相同效果,这对于GPU资源的要求非常高。
本次直播将针对正在举行的ECCV2020 - VIPriors Workshop比赛中的目标检测赛道进行分享。该比赛采用COCO数据集的一小部分(约6000张,相当于1/20的图片)作为训练集以及验证、测试各5000张用于榜单排名。与其他比赛不同的是,该比赛禁止使用任何额外数据集以及预训练模型,即所有模型必须“train from scratch”。在接下来的数周至2020年7月3日比赛结束,我们将进行每周一次的直播分享过去一周我们的尝试及进度并与其他兴趣爱好者交流心得希望以此来推动“小数据训练”的发展。
人工智能
2020-06-01 15:29:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
作为国内人工智能领军企业,百度一直为AI产业发展和落地提供基础性支持,助力AI核心技术开源,落地AI应用和人才培养。 下载安装命令 ## CPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu
一直以来,百度坚持为全国各大高校免费提供AI教学全套工具: 包括AI教学平台AI Studio,CV和NLP不少于40课时的两套零基础入门到实战的系列课程教案以及实践案例,更有Tesla V100 GPU算力卡免费赠送, 为高校师生在学习AI的道路上保驾护航。
在高校中,也涌现出一批将百度AI技术应用到实际教学中的例子,今天我们的主人公就是这样的一位老师。
先带大家认识本次课程的重量级主讲老师——燕山大学冯建周副教授。
主讲老师
冯建周 副教授 燕山大学信息科学与工程学院副教授,硕士生导师
中国计算机学会高级会员,CCF大数据专家委员会专委
先后在国内外重要期刊和学术会议发表学术论文20余篇
主持或参与国家自然科学基金和河北省自然科学基金项目
因为疫情影响,今年冯建周老师将课程搬到了线上, 依托百度AI提供的全套课程内容,在AI Studio上进行教学和实践。
这门课程是《Python机器学习》,主要讲授机器学习基本算法,同学们需要进行大量线上实战,课程中老师精心设计了六组实验。
另一方面,为了延伸课程,锻炼学生的综合实践能力, 老师还设计了一个三级项目环节,将AI Studio平台中的竞赛题目作为课程三级项目。 包括:问答摘要与推理、人流密度检测、中文阅读理解、十二种猫分类等几个竞赛题目,让学生自由发挥,锻炼实操动手能力。
结课后,冯老师表示, “没想到教学效果出乎意料的好,AI Studio平台不仅提供了我们最需要的计算资源,还提供了丰富的实验案例,内置项目和视频功能,更是极大的减少了我们准备教案、备课的时间,不仅让学生可以自主学习,我们也能在后台看到学生的学习状态,对日常教学起到很大的帮助作用。”
老师如此盛赞,小编已经非常好奇了,一起来看看百度 飞桨 究竟为同学们带来了哪些成长和变化呢?

01 深度学习新人的 飞桨 常规赛之旅

——Halation同学
小组参加的是《常规赛:问答摘要与推理》,比赛主题为汽车大师的问答摘要与推理。作为深度学习刚刚入门不到三个月的新人,小组成员在初次看到比赛题目时,感觉无从下手。
经过老师指点,以及遍查资料后,他们决定先从文本摘要和文本推理两个方面入手,但训练后的结果不尽如人意,准确率降低。
网络结构示意
经过分析,成员们将原因锁定在网络模型不适合。如果能够人为剔除更多的对于摘要无关紧要的单词,也许可以达到更好的效果。
Halation同学说: “在机器学习入门的过程中,我们发现AI Studio平台中有着丰富的数据集资源和各种经典的实践案例,这无疑成为我们学习的宝库。另一方面,我们也从平台的众多开源项目中学习到了更多关于机器学习,尤其是深度学习方面的知识。感谢百度 飞桨 和AI Studio平台,通过学习,我们小组也对 飞桨 框架有了更多的了解,对深度学习的许多模型也有了更深的认识。我们希望在今后的学习中,更加深入了解深度学习中的模型结构,掌握模型的底层原理,最后游刃有余地运用网络模型,解决更多的实际问题。”
通过训练找到进步的地方,同学们的成长棒棒哒,少年们未来可期~
项目链接:
https://aistudio.baidu.com/aistudio/projectdetail/383197

02 飞桨 教你做人流密度估计

——隔壁老常同学
近年来,行人分析视觉技术在居家、安防、新零售等多个重要领域广泛应用。
项目要求参赛者给出一个算法或模型,对于给定的图片,统计图片中的总人数。给定图片数据,选手据此训练模型,为每张测试数据预测出最准确的人数。
最终两模型各训练90000batch后结果如下:
经过讨论,同学们总结了两点改进意见:
1、对libs.post_process后处理中的参数进行优化;
2、预测忽略区域,在测试时填充黑色。
在不断的练习中复盘,同学们努力寻求更优解,百度 飞桨 见证了同学们一点一滴的进步和成长。
项目链接:
https://aistudio.baidu.com/aistudio/projectdetail/475632

03 飞桨 帮你做中文阅读理解

—— day我不dead同学
提及阅读理解,我们的第一印象就是中学的时候英语试卷中的阅读理解,与之类似,机器阅读理解,其实就是让机器学会阅读文档,并能从中找出正确答案。
刚拿到这个题目时,团队成员的大脑几乎一片空白。脑中不断涌现出各种问题:如何将文本转换为数值型数据?RNN还是CNN?网络结构应该如何配置?用什么模型训练可以取得好的结果等等。
经过努力,他们最终利用DuReader数据集的Baseline,解决了上述的所有问题。
day我不dead同学说: “感谢 飞桨 给我们提供了一个提高自己,锻炼自己的平台,给我们提供了许多NLP领域优质的免费资源,还有许多优秀项目可供借鉴,并且免费的GPU真的很良心、很好用!祝 飞桨 越来越好!”
项目链接????:
https://aistudio.baidu.com/aistudio/projectdetail/475972

04 猫十二分类- 飞桨 图像分类帮我云撸猫

——君匡同学
工作太累,看一些猫猫的图片或者是短视频,才有继续努力的动力呢!云撸猫是现在很大一部分爱猫人士缓解压力的方法。
但是, 两只小猫好像啊,会不会是同一种猫猫呢?
本次研究使用的数据来源于百度官方提供的猫脸识别-12种猫分类数据集,包含有12种猫咪的图片,共2160张猫咪图像,每一类均有180张左右的照片。
小组成员 运用百度 飞桨 深度学习框架,构建了以ResNet101为骨架的深度神经网络的猫咪图像分类模型,对猫咪的图像进行分类和目标识别。
经过实验和分析,实现了对猫咪进行图像分类, 单目标猫咪分类准确率为94%,说明基于 飞桨 框架的图像分类具有较好的准确率。
如果以后云撸猫,这个项目就能让你更轻松的判断可爱的猫猫究竟属于哪个类别啦~
项目链接????:
https://aistudio.baidu.com/aistudio/projectdetail/474305

05 利用 飞桨 实现文本摘要总结

——舍卟得放卟下灬同学
这个项目主要是 飞桨 平台进行文本摘要生成,运用Word2Vec和TextRank算法来对文本进行摘要生成。
小组同学们需要在AI Studio中使用所提供的训练集(82943条记录)建立模型,基于汽车品牌、车系、问题内容与问答对话的文本,输出建议报告文本。
来看看同学们是如何实践的?
舍卟得放卟下灬同学说:“经过了这次实践,对NLP的了解更深入了,有些遗憾的是这次没有使用到Seq2Seq模型这个大杀器,如果使用的话,效果可能会更好。”
不用遗憾,意识到问题本身就是最大的成长,相信同学在 飞桨 平台上不断训练后,一定会有更多的收获与成长~
项目链接:
https://aistudio.baidu.com/aistudio/projectdetail/474553

06 基于 飞桨 进行中文新闻标题分类

——彩虹的男人20同学
网络新闻正在成为人们获取新闻的主要途径,如何对冗杂的新闻进行分类,无疑是一个急需解决的问题!
基于此,同学们将在 飞桨 平台上采用BiLSTM模型,对THUCNews 数据集进行中文新闻文本标题分类。
最后,同学们在七个方面对模型进行优化,将准确率提高到了93%,较其他使用同等模型的项目效果有所优化。
彩虹的男人20同学说: “首先真的特别感谢百度提供的 飞桨 平台,不仅为我们提供了易于上手操作的项目基础,而且在项目执行时提供了免费的GPU算力卡,为我们进行项目优化留出更多的时间。我们会继续使用百度 飞桨 平台来学习使用bert+fc来优化此新闻文本分类项目。”
项目链接:
https://aistudio.baidu.com/aistudio/projectdetail/399250
看完同学们的这些作业,小编不禁暗自感叹:同学们都太优秀了!
水滴石穿,非一日之功。在百度AI强有力的帮助下,同学们通过项目不断总结反思,提炼技术,能力普遍获得提升、进步,完成了从AI小白到进阶选手的蜕变。
冯老师表示, “百度 飞桨 不仅锻炼了学生的综合实践能力,也培养了很多同学对人工智能的浓郁兴趣,他们在项目结束后,并没有停止下来,而是纷纷报名参加了平台上的多个AI竞赛,走上实践创新的道路。”
种一棵树最好是在10年前,其次是现在。期待更多高校、机构分享自己的教学成果,一起创造更好的课程,持续创新,取得胜利!在 飞桨 平台的支持下,共同助力AI人才发展,期待未来能与更多优秀老师、同学在 飞桨 相遇! 下载安装命令 ## CPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu
>> 访问 PaddlePaddle 官网 , 了解更多相关内容 。
人工智能
2020-06-02 20:10:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
对抗训练介绍——尝试欺骗一个模型
作者:支广达
当我们要实际部署一个机器学习系统的时候,一件非常重要的事情就是系统的鲁棒性,我们希望系统不仅能够对大多数的例子有效,而且要真正的可靠,例如能够识别出别人的攻击(欺骗你的分类模型)。因此近几年对抗鲁棒性(Adversarial Robustness)这个话题引发了广泛的关注。要先改进模型,我们必须知道模型的问题在哪,今天我们就来感受下我们的模型是如何被欺骗的
加载模型和样例图片
深度学习的魅力之处在于你可以很容易的开始实践然后看到一些在数据上的实际结果。下面我们就来构造我们第一个欺骗模型的例子。
在开始前我们先用pytorch加载一个训练好的Resnet50的模型和一张猪的图片用来测试。
我们将图片大小改成224X224,并将其转成tensor: from PIL import Image from torchvision import transforms import numpy as np import matplotlib.pyplot as plt import matplotlib %matplotlib inline %config InlineBackend.figure_format = 'svg' # read the image, resize to 224 and convert to PyTorch Tensor pig_img = Image.open("pig.jpg") preprocess = transforms.Compose([ transforms.Resize(224), transforms.ToTensor(), ]) pig_tensor = preprocess(pig_img)[None,:,:,:] # plot image (note that numpy using HWC whereas Pytorch user CHW, so we need to convert) plt.imshow(pig_tensor[0].numpy().transpose(1,2,0))
下面加载在imagenet数据集上训练好的ResNet50模型,并将图片输入查看结果。下面图片处理成 batch_size x num_channels x height x width 的形式是pytorch统一的输入格式 import torch import torch.nn as nn from torchvision.models import resnet50 # simple Module to normalize an image class Normalize(nn.Module): def __init__(self, mean, std): super(Normalize, self).__init__() self.mean = torch.Tensor(mean) self.std = torch.Tensor(std) def forward(self, x): return (x - self.mean.type_as(x)[None,:,None,None]) / self.std.type_as(x)[None,:,None,None] # values are standard normalization for ImageNet images, # from https://github.com/pytorch/examples/blob/master/imagenet/main.py norm = Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # load pre-trained ResNet50, and put into evaluation mode (necessary to e.g. turn off batchnorm) model = resnet50(pretrained=True) model.eval(); # form predictions pred = model(norm(pig_tensor))
现在模型输出结果pred是一个1000维的向量,代表了imagenet的1000类图片。要找到这个结果预测的是哪个类别,最简单的可以找向量中最大的那个值,然后找出所对应的类别: import json with open("imagenet_class_index.json") as f: imagenet_classes = {int(i):x[1] for i,x in json.load(f).items()} print(imagenet_classes[pred.max(dim=1)[1].item()]) hog
预测是正确的!(pig在imagenet数据集中标签是hog)
一些基础概念
为了下面解释如何欺骗模型,我们需要先介绍一些基础概念。
第一步:我们将模型定义为一个函数:
$$ h_{\theta}: \mathcal{X} \rightarrow \mathbb{R}^{k} $$
代表了将输入空间映射到k维输出空间的函数,$k$就是分类的数量,$\theta$ 代表了模型中的所有训练参数,所以 $h_{\theta}$ 就代表我们的模型.
第二步:我们定义损失函数:$\ell\left(h_{\theta}(x), y\right)$ ,其中 $x$ 为输入样本 $y$ 是对应的正确的label,具体的我们用cross entropy损失函数:
$$ \ell\left(h_{\theta}(x), y\right)=\log \left(\sum_{j=1}^{k} \exp \left(h_{\theta}(x) {j}\right)\right)-h {\theta}(x)_{y} $$
这里 $h_{\theta}(x) {j}$ 代表 $h {\theta}(x)$ 中第 $j$ 个元素. # 341 is the class index corresponding to "hog" print(nn.CrossEntropyLoss()(model(norm(pig_tensor)),torch.LongTensor([341])).item()) 0.003882253309711814
0.0039的损失已经非常小了,我们的模型会以 $\exp (-0.0039) \approx 0.996$ 的概率认为这张图片是一头猪。
创建一张对抗图片
那么,我们如何处理该图像以使得能够欺骗这个模型,让它认为是其他东西呢?在回答这个问题前,我们先来看看模型是怎么训练的,训练分类器的常用方法是优化参数 $\theta$,以最大程度地减少某些训练集的平均损失 $\left{x_{i} \in \mathcal{X}, y_{i} \in \mathbb{Z}\right}, i=1, \ldots, m$ , 我们将其写为优化问题
$$ \operatorname{minimize} {\theta} \frac{1}{m} \sum {i=1}^{m} \ell\left(h_{\theta}\left(x_{i}\right), y_{i}\right) $$
我们通常通过(随机)梯度下降来解决这个优化问题,即:
$$ \theta:=\theta-\frac{\alpha}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \nabla_{\theta} \ell\left(h_{\theta}\left(x_{i}\right), y_{i}\right) $$
这里 $\alpha$ 是步长,$\mathcal{B}$ 是一个batch。对于深度神经网络,可以通过反向传播有效地计算此梯度。但是反向传播的还有一个优点在于,我们不仅可以让loss 对θ求导,我们还可以让loss 对于输入本身进行求导!!这正是我们要生成的对抗例子的方法。我们通过反向传播调整图像使得损失最大化,也就是说我们要解决下面的优化问题
$$
人工智能
2020-06-02 18:51:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
对抗训练介绍——尝试欺骗一个模型
作者:支广达
当我们要实际部署一个机器学习系统的时候,一件非常重要的事情就是系统的鲁棒性,我们希望系统不仅能够对大多数的例子有效,而且要真正的可靠,例如能够识别出别人的攻击(欺骗你的分类模型)。因此近几年对抗鲁棒性(Adversarial Robustness)这个话题引发了广泛的关注。要先改进模型,我们必须知道模型的问题在哪,今天我们就来感受下我们的模型是如何被欺骗的
加载模型和样例图片
深度学习的魅力之处在于你可以很容易的开始实践然后看到一些在数据上的实际结果。下面我们就来构造我们第一个欺骗模型的例子。
在开始前我们先用pytorch加载一个训练好的Resnet50的模型和一张猪的图片用来测试。
我们将图片大小改成224X224,并将其转成tensor: from PIL import Image from torchvision import transforms import numpy as np import matplotlib.pyplot as plt import matplotlib %matplotlib inline %config InlineBackend.figure_format = 'svg' # read the image, resize to 224 and convert to PyTorch Tensor pig_img = Image.open("pig.jpg") preprocess = transforms.Compose([ transforms.Resize(224), transforms.ToTensor(), ]) pig_tensor = preprocess(pig_img)[None,:,:,:] # plot image (note that numpy using HWC whereas Pytorch user CHW, so we need to convert) plt.imshow(pig_tensor[0].numpy().transpose(1,2,0))
下面加载在imagenet数据集上训练好的ResNet50模型,并将图片输入查看结果。下面图片处理成 batch_size x num_channels x height x width 的形式是pytorch统一的输入格式 import torch import torch.nn as nn from torchvision.models import resnet50 # simple Module to normalize an image class Normalize(nn.Module): def __init__(self, mean, std): super(Normalize, self).__init__() self.mean = torch.Tensor(mean) self.std = torch.Tensor(std) def forward(self, x): return (x - self.mean.type_as(x)[None,:,None,None]) / self.std.type_as(x)[None,:,None,None] # values are standard normalization for ImageNet images, # from https://github.com/pytorch/examples/blob/master/imagenet/main.py norm = Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # load pre-trained ResNet50, and put into evaluation mode (necessary to e.g. turn off batchnorm) model = resnet50(pretrained=True) model.eval(); # form predictions pred = model(norm(pig_tensor))
现在模型输出结果pred是一个1000维的向量,代表了imagenet的1000类图片。要找到这个结果预测的是哪个类别,最简单的可以找向量中最大的那个值,然后找出所对应的类别: import json with open("imagenet_class_index.json") as f: imagenet_classes = {int(i):x[1] for i,x in json.load(f).items()} print(imagenet_classes[pred.max(dim=1)[1].item()]) hog
预测是正确的!(pig在imagenet数据集中标签是hog)
一些基础概念
为了下面解释如何欺骗模型,我们需要先介绍一些基础概念。
第一步:我们将模型定义为一个函数:
$$ h_{\theta}: \mathcal{X} \rightarrow \mathbb{R}^{k} $$
代表了将输入空间映射到k维输出空间的函数,$k$就是分类的数量,$\theta$ 代表了模型中的所有训练参数,所以 $h_{\theta}$ 就代表我们的模型.
第二步:我们定义损失函数:$\ell\left(h_{\theta}(x), y\right)$ ,其中 $x$ 为输入样本 $y$ 是对应的正确的label,具体的我们用cross entropy损失函数:
$$ \ell\left(h_{\theta}(x), y\right)=\log \left(\sum_{j=1}^{k} \exp \left(h_{\theta}(x) {j}\right)\right)-h {\theta}(x)_{y} $$
这里 $h_{\theta}(x) {j}$ 代表 $h {\theta}(x)$ 中第 $j$ 个元素. # 341 is the class index corresponding to "hog" print(nn.CrossEntropyLoss()(model(norm(pig_tensor)),torch.LongTensor([341])).item()) 0.003882253309711814
0.0039的损失已经非常小了,我们的模型会以 $\exp (-0.0039) \approx 0.996$ 的概率认为这张图片是一头猪。
创建一张对抗图片
那么,我们如何处理该图像以使得能够欺骗这个模型,让它认为是其他东西呢?在回答这个问题前,我们先来看看模型是怎么训练的,训练分类器的常用方法是优化参数 $\theta$,以最大程度地减少某些训练集的平均损失 $\left{x_{i} \in \mathcal{X}, y_{i} \in \mathbb{Z}\right}, i=1, \ldots, m$ , 我们将其写为优化问题
$$ \operatorname{minimize} {\theta} \frac{1}{m} \sum {i=1}^{m} \ell\left(h_{\theta}\left(x_{i}\right), y_{i}\right) $$
我们通常通过(随机)梯度下降来解决这个优化问题,即:
$$ \theta:=\theta-\frac{\alpha}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \nabla_{\theta} \ell\left(h_{\theta}\left(x_{i}\right), y_{i}\right) $$
这里 $\alpha$ 是步长,$\mathcal{B}$ 是一个batch。对于深度神经网络,可以通过反向传播有效地计算此梯度。但是反向传播的还有一个优点在于,我们不仅可以让loss 对θ求导,我们还可以让loss 对于输入本身进行求导!!这正是我们要生成的对抗例子的方法。我们通过反向传播调整图像使得损失最大化,也就是说我们要解决下面的优化问题
$$
人工智能
2020-06-02 18:51:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
正是因为内容制作成本并不高,当下,自媒体相当被关注,其进入条件几乎没有限制、日活流量数量庞大、转化能力也很强的闪光点,不断汇聚了想打造个人品牌的创造者,正是为了斩获更多的展现数据,他们通常会发送到所有平台。但是当你真正运营起来,就会懂得:天天总的得挨个登陆各个平台,而后,再一个个分发做好的图文,诚然是完全可以用工具代替的环节,下面我有一套经验,免费分享给你。
下载安装好易媒助手,找到左上角添加账号,点击需要运营的自媒体平台,使用账密的方式登录,以后易媒助手自动填充好账密,这样就不用手动了。
假设你的每个平台账号较多,我推荐你可以账号分组的功能,先设置一下分组,账号按照今后的实际使用做编组,往后同时发,不用选择对应的账号了。
接下来来演示发布文章,点击图文板块,如果你是第一次使用,那么推荐你设置一下默认分类,未来写文章时自动设置好分类,文章导入到编辑框,点击一键设置标签按钮(左侧列表),点击一键设置封面,假如你某些平台需要单独设置一下,点击右边要单独设置的平台设置要设置的功能就好了,只剩最后一步发布了,点一下发布(编辑器下面),会看到发布界面,选好你要发的平台就一键发布完成了。
发布文章讲完了,再来演示视频发布,第一步,我们,点下发视频(在软件上面 ),这个时候设置好默认分类,再添加一下你想发的视频,下面结合视频本身填写标题、简介、标签。当你完成了这些填写,点击“发布”图标(最下面那一排),会将你的全部账号显示出来,选择好对应的账号,就同时完成了一个视频的发送,这样做自媒体是不是轻松多了?
倘若有员工操作,最好使用团队功能,可以实现屏蔽账号收益、隐藏自媒体账号密码、分配账号、员工工作数据统计等功能
自媒体做久了,就懂得不是一件非常简单的事,如果你觉得做子自媒体有钱可赚,那么你应当拥有持久奋战的打算,特别是写图文的。
人工智能
2020-06-02 18:41:00