经典语义分割网络:FCN
从分类任务说起语义分割是一个像素级的分类任务。
在图像分类任务中,输入一张图片,输出这张图片的类别。
在语义分割任务中,输入一张图片,输出这张图片中每一个像素所属类别,因此,语义分割中输入的图像(通道数为3,一般的图片通常含有RGB这3个通道)尺寸和输出结果(也是一张图,通道数为1,每个像素点的取值代表该像素点所属类别对应的取值)的尺寸是一样的。
在之前,我们已经实现过许多的分类网络,这些网络最后都在卷积层后面接上全连接层,以输出分类结果。
但是语义分割的输出是一张单通道的图片,所以直接将以上网络拿过来用是行不通的。
FCN的网络结构FCN( Fully Convolutional Networks, 全卷积网络)开创性的将分类网络中的全连接层改成了卷积层,从而使得整个网络只含有卷积层,这也是FCN名字的由来。
输入的图像经过分类网络的最后一层卷积层之后,往往的得到的是通道数较大,而尺寸较小的特征图,比如6000*7*7。
在这个卷积层后面接一个1*1卷积,可以将输出特征图的通道数设置成总的类别数,而特征图尺寸不变。
之后,对1*1卷积得到的特征图进行上采样操作(插值or转置卷积)就 ...
经典推荐模型:NFM
NFM将FM中的二阶交叉项替换成了一个神经网络,使得NFM能够进行二阶以及二阶之上的特征交叉,增强了模型的表达能力。
NFM模型如下:
其中的f(x)便是上面提及的用于替换FM中二阶交叉项的神经网络。
NFM的结构如下,注意,这里并没有画出来一阶部分,只展示了f(x):
自下往上看。
将输入的稀疏特征向量经过Embedding层,得到对应的稠密编码向量。注意图中的$v_i,i=2,4,7,…$是一个n*k的矩阵,n是第i个特征域所含不同特征取值总数,k是Embedding的维度。
接下来进入BiInteraction Pooling层进行特征交叉,该层所执行的操作如下:
$x_iv_i$是一个长度为k的向量(k是Embedding的维度,其实这个向量就是第i个类别特征取值对应的Embedding向量),$x_jv_j$同样也是一个长度为k的向量,两者做element-wise product,即使对应位置相乘,此时得到的还是一个长度为k的向量。在进行完所有特征交叉(即element-wise product操作)后,将得到的所有长度为k的向量进行相加,得到一个新的长度为k的向量,这就是 ...
用Python实现协同过滤算法
本文分享两种经典协同过滤算法的Python实现:
基于物品的协同过滤算法
基于用户的协同过滤算法
代码来自Github开源项目:fun-rec.
在开始之前,先导入用到的库:
1234567import pandas as pdimport numpy as npimport warningsimport random, math, osfrom tqdm import tqdmfrom sklearn.model_selection import train_test_splitwarnings.filterwarnings('ignore')
数据准备本次使用的数据是一份电影评分数据:
::将数据集划分成4列,从左到右分别代表:用户id,电影id,评分值,时间戳。
首先将原始数据转换成pandas的数据框表示:
然后提取每个用户评价过的电影,格式如下:
稍后的ItemCF和UserCF都将使用这个表。
数据处理完整代码如下:
12345678910111213141516171819202122232425262728def get_data(root_p ...
经典推荐模型:FNN,DeepFM
之前我们已经介绍了FM模型,在进入深度学习时代后,通过将FM模型与深度学习模型进行结合,产生了许多有用的新模型,本文将介绍其中的两种:FNN和DeepFM.
FNNFNN的结构如下:
结构很简单,在底层将多个特征域中的稀疏向量进行了Embedding,然后将Embedding的结果输入到全连接层进行特征交叉,最后输出预测结果。
FM模型为每一个特征学习了一个隐向量,两个特征交叉得到的新特征的系数等于这两个特征对应隐向量的内积。
而FNN直接将训练好的FM的权重(一阶特征权重+隐向量)拿了过来,作为自己的Embedding层的初始化权重。
只考虑隐向量,假设某特征域的总类别数为n,隐向量(Embedding的维度)是k,那么在 FM中,每一个类别特征对应一个长度为k的隐向量,因此总的隐向量可以用一个n*k的矩阵来表示;在FNN的Embedding层中,某特征域的总类别数为n,Embedding层的神经元个数为k,于是Embedding层的参数也可以用一个n*k的矩阵来表示。
具体对应关系如下图:
注意,虽然箭头指向了神经元,但表示的是被指向的神经元与输入神经元之间的权重。
自底向上,用数 ...
基于NeuralCF的图书推荐系统
本文将对CCF《图书推荐系统竞赛》官方baseline进行详细解读,并修正一些错误,修正后的jupyter notebook文件可以在公众号”南极Python”后台回复图书推荐自行获取。
赛题地址:https://www.datafountain.cn/competitions/542
题目介绍背景随着新型互联网的发展,人类逐渐进入了信息爆炸时代。新型电商网络面临的问题也逐渐转为如何让用户从海量的商品中挑选到自己想要的目标。推荐系统正是在互联网快速发展之后的产物。为帮助电商系统识别用户需求,为用户提供其更加感兴趣的信息,从而为用户提供更好的服务,需要依据真实的图书阅读数据集,利用机器学习的相关技术,建立一个图书推荐系统。用于为用户推荐其可能进行阅读的数据,从而在产生商业价值的同时,提升用户的阅读体验,帮助创建全民读书的良好社会风气。
任务依据真实世界中的用户-图书交互记录,利用机器学习相关技术,建立一个精确稳定的图书推荐系统,预测用户可能会进行阅读的10本书籍。
数据包含训练集和测试集,以及提交示例文件。
训练集中存储了用户与图书之间的交互信息,比如第一行: (user_id=0, i ...
跨考小白学刷题(下)
第八章:回溯8-3排列问题
我自己(在看了答案后默)写的AC代码:
12345678910111213141516171819class Solution: def permute(self, nums: List[int]) -> List[List[int]]: if not nums: return [] def back_track(nums,index): if index==len(nums): res.append(p[:])#必须加这个:,因为path之后还会变 return for num in nums: if num not in p: p.append(num) back_track(nums,index+1) p.pop() ...
跨考小白学刷题(上)
第一章1-1
对一组数据进行排序时,要考虑这组数据有什么样的特征。
包含大量重复元素->三路快排
近乎有序->插入排序
取值范围有限->计数排序
要求稳定排序->归并排序
使用链表存储-> 归并排序
数据量很大->外部排序
1-4
当没有思路时
尝试简单测试用例
暴力法
第二章2-1O(f(n))表示算法执行的上界
最后一项,nlog(n)是数组全部元素比较的次数,s指的是确定两个字符串的字典序需要O(s).
因此,最终的时间复杂度是:O(nslog(s)+snlog(n))
2-2
第一个,只需要ret和i
第二个,递归深度为n
2-3
reverse函数的时间复杂度是O(m/2)=O(m),其中m指的是s的长度,又由于s的长度和while中执行次数是一样的(每执行一次,s多一位),因此也是s的长度也是logn,从而整体的时间复杂度是O(2logn)=O(logn).
可见,log的底并不重要。
第一重循环log(n)次,因此整体时间复杂度是O(nlogn).
2-4
2-6动态数组
添加/删除一个元素的均摊复杂度是O(1 ...
Spark编程基础-Python版本
第一章、基础概念目前的主流大数据技术:Hadoop、Spark、Flink、Beam.
Hadoop
MapReduce像写单机任务一样.
使用前提:任务必须满足可以分而治之.
YARNHadoop2.0出现.
统一调配资源,实现底层数据无缝共享.
Spark全能选手.
Hadoop的缺点
有些不能转成Map和Reduce的业务无法使用Hadoop.
需要反复迭代,磁盘IO开销大.
磁盘IO,任务之间的衔接延迟高.
衔接延迟:3个Map任务全部结束才能执行REduce任务.因此难以胜任多阶段的复杂任务.
Spark的优势Spark本质上也属于MapReduce,但是不再局限于Map和Reduce这两个操作,还可以执行其它操作,比如groupby,filter,join等等,因此具有更强大的表达能力.
Spark可以将数据读到内存中进行操作,提升了迭代时的运行效率.
Spark使用了有向无环图的调度机制,使得相关的操作可以优化,从而很多操作可以进行流水线化处理.
对比Hadoop和Spark的读取和查询:Hadoop每次都要读写磁盘,而Spark可以直接在内存中完成,所以性能更好.
S ...
经典推荐模型:Deep&Cross
本文介绍Deep&Cross模型,它沿用了Wide&Deep模型的设计思路,并且将Wide&Deep的Wide部分使用Cross Network进行了替换,解决了Wide&Deep需要人工选取交叉特征的麻烦。
Deep&Cross模型结构如下:
从下往上看。
将稀疏特征进行Embedding,将得到的结果与稠密特征(一般指的是数值型特征)进行拼接,这就是网络的输入$x_0$.
$x_0$再往上兵分两路,左路是Cross Network部分,右路是Deep部分。
先看左路。它是由多个Cross Layer构成的,Cross Layer执行的前向运算如下:
该运算可视化如下:
可以看到 ,$x_0$在每一层中都有参与。
事实上,随着Cross Layer的层数增加,原始输入$x_0$各个位置元素交叉的阶数也在增加,具体参见如下推导:
正因如此,Cross Network相比于Wide&Deep中的Wide部分拥有更强的特征交叉能力,而且,每一个Cross Layer的参数只有$w$和$b$,它们的维度和$x_0$的维度一致,因此参数量是线 ...
经典推荐模型:Wide&Deep
本文介绍谷歌于2016年提出的Wide&Deep模型,它兼具记忆能力与泛化能力,在谷歌商店的app推荐中效果显著。
Wide&Deep由记忆能力较强的Wide部分和泛化能力较强的Deep部分组成,接下来我们分别介绍这两部分,然后将它们组合起来,得到Wide&Deep.
WideWide部分是一个(广义)线性模型,比如逻辑回归,具有较强的记忆能力。
输入这种模型的特征可以通过交互产生新的有用特征,然后将这些新的特征与原始特征共同输入模型进行预测。
举个栗子,假设输入逻辑回归模型的特征中含有”已安装应用,在应用商店看到的应用”这俩特征,那么我们可以根据这俩特征得到一个新的交互特征:”已安装应用=xxx 并且 在应用商店看到的应用=yyy”.
使用上述方法构造特征,训练模型。当待预测的样本特征中也含有类似上述交互特征时,由于在训练集中存在相同特征,那么模型就能很快定位到训练集中出现相同模式时的标签。
假设训练集中出现”已安装应用=Youtube 并且 在应用商店看到的应用=facebook”这一交互特征,也就是说,用户安装了Youtube,并且在应用商店中看到了Fac ...