NameSilo Web hosting 云主机建站服务购买与使用体验

namesilo的域名在众多服务商里价格是比较实惠的,.com域名只要$8.99,近年新推出了web hosting服务,价格也比较实惠,最便宜的一个网站20G存储空间的套餐每月只要$2.39元(年套餐)。最近有一个做网站的需求,腾讯的学生优惠已经用过了,又不想备案,正好找到这个便宜的尝试一下。 购买 namesilo的hosting购买服务在namesilo新版网站,进入 namesilo.com 首页就能看见 总共有3个套餐,可以按年或者按月购买,按年购买会更便宜。购买过程非常简单,选择对应套餐点击Get Started。 然后会让你选择域名,这一步也提供3种选择: 1.如果你没有域名的话,可以直接搜索选择一个可注册的,然后和云主机套餐打包在namesilo购买; 2.如果你在其他注册商处(比如腾讯云等)已经购买了域名,输入你购买的域名进行绑定即可,注意要输入你希望是主网站的域名比如www.test.com,namesilo会自动增加域名解析; 3.你也可以选择将其他注册商处购买的域名转移至namesilo(不过注意如果你是新购买的域名通常有一个期限限制域名转出)。 我选择了绑定我在腾讯云购买的域名,选择好域名后点击continue即跳转到确认订单页面(注意:确认订单页面在旧版网站,新旧网站功能混在一起确实比较容易让人迷惑),不用犹豫点击确认订单,然后在付款页面选择Alipay,输入你的支付宝账号然后扫二维码付款即可。 域名解析 !!!购买完成以后,在新版网站是找不到你购买的host的,这点很让人迷惑,在新版网站,你可以选择点击自己的账户信息来跳转到旧版网站,然后在侧边栏选择hosting manager,即可进入主机管理页面,在这里你会看到自己购买的主机,名称就是你之前绑定的域名。 点击链接图标,就进入了你的主机的cpanel管理面板。第一次登陆要设置账号密码邮箱配置等,cpanel支持中文(在偏好-更改语言处选择语言),可视化界面简单易懂,网上已经有很多介绍。 购买完成后就可以前往控制面板进行相关设置了,namesilo根据你在购买时绑定的域名已经自动为该域名添加了域名解析,包括test.com,www.test.com,ftp.test.com以及mail解析等,如果购买套餐时你选择在namesilo购买一个新域名,那么一切已经就绪,在cpanel面板选择安装wordpress即可开始建站。如果像我一样绑定了其他注册商处的域名,虽然namesilo已经添加了相关解析,但这些解析是基于namesilo自家DNS服务器才会生效的,这里有两种选择: 1.到购买域名的域名注册商处将域名的DNS解析服务器地址改为namesilo的DNS服务器地址使解析生效: NS1.DNSOWL.COM NS2.DNSOWL.COM NS3.DNSOWL.COM 2.如果不希望更换DNS服务商,在cpanel面板的域名Zone找到自动添加的所有域名解析,然后将他们全部复制添加到自己的域名注册商处的域名解析中,同样可以让解析生效。 做完这些,在cpanel面板安装好wordpress,在浏览器输入你的域名就可以看到wordpress主页了! SSL证书实现HTTPS 购买的主机已经添加了自签名的SSL证书,但是自签名证书在用浏览器访问时会报不安全,一个第三方签名还是有必要的,namesilo自家在已购主机管理页面就有SSL证书购买服务,不过要花钱,有很多免费提供签名的第三方机构,我直接申请了腾讯云提供的TrustAsia 1年期免费证书(在云产品-SSL证书处申请即可)。 申请下来后下载证书得到.key及.crt证书文件(host使用的是apache服务器,要选对版本),找到cpanel面板的:安全-SSL/TLS选项,删除已有自签名证书文件,上传自己的证书文件,然后选择[管理SSL主机],选择证书对应的域名,点击按域自动填充,上传的证书会被自动选中填充,点击安装证书即可。 在cpanel面板的:域-域选项找到自己的域名,选择启用Force HTTPS Redirect,至此,网站即可安全的用HTTPS进行访问了。 CloudFlare CDN加速 在cpanel安装好wordpress后,就是进入wordpress后台搭建网站,但是实测在中国境内网页的访问速度很慢,并且容易丢包。为了提高访问速度,需要将网页进行静态缓存以及CDN加速。 类似七牛云等国内免费CDN服务要求你的主域名是备案了的,没有备案要选择海外CDN, CloudFlare 提供个人免费版CDN加速服务,推荐这个 教程,注意登录cloudflare的外国官网,中国网站注册是企业版的,注册完就有客服打电话给你谈业务了…CloudFlare的CDN需要将DNS服务器地址转成他们家的,生效时间大概十分钟不到。 在wordpress安装一个静态缓存插件,比如wp fast cache,在CDN选项选择cloudflare,需要输入API码,然后在cloudflare的Overview的侧边栏点击get your API token,选择global API,点击view,复制API代码到wordpress中即可,一路点击确认,cdn配置就完成了。 配置CDN及静态缓存后,网站的访问速度得到很明显的改善,访问变的更稳定,虽然相较国内的网站速度稍慢,但是对于像个人博客之类的小网站完全可以接受了。 邮箱 namesilo的host已经配置好了邮箱服务,发送邮件没问题,但是我用163发的邮件它却收不到,在wordpress设置中更换邮件地址,发现验证邮件也发不到我的邮箱上。因此使用了第三方的SMTP服务,下载了wp SMTP mail插件,SMTP服务用的是腾讯云的企业邮。 将原本的地址解析中的邮件地址解析删掉,添加腾讯企业邮的地址进去,就可以使用腾讯企业邮箱的服务了,方法很简单,注册一个腾讯企业邮箱账号(免费的),然后按指导设置完成即可。增加一个业务邮箱账号,比如mail@designaxt.com,然后得到对应的邮箱密匙,在wp SMTP mail选择其他SMTP,输入密匙,腾讯企业邮的服务器地址及端口号,保存更改就可以用腾讯的服务发邮件了,其他家应该类似。

May 25, 2020 · Xiangtao XIAO

Gensim训练词向量与Embedding相关知识

在进行文本分类的时候,预处理我们可以自己做一个词向量模型,也可以采用预训练的模型。采用预训练的模型比如谷歌基于goole news训练的Word2vec模型,由于在大量文本数据中训练过,所以词的概率分布会比较准确,当自己的数据集比较小的时候,用预训练数据有利于提升模型的准确度。 以下内容使用了tensorflow。 训练文本生成word2vec模型 自己训练模型一般有以下几步: 处理数据集,首先gensim的Word2Vec()方法需要的输入是句子顺序的单词,比如 我 爱 你 而不是我爱你,所以要将文本数据分词处理,在这个过程中,我们可以去除停用词,英文全部小写,语法统一等处理,可能对词向量的训练比较有帮助。 完成文本的处理以后,我们得到一个分词后的文本数据集,比如一个列表[‘she’, ‘is’, ‘beautiful’],在gensim模块中可以简单的使用model=gensim.models.word2vec.Word2Vec()得到训练的模型。 该方法有一些参数: sentences-即数据集;sg-设置训练算法,0代表CBOW,1代表skip-gram算法; size-指特征向量的维度,默认为100,大的size需要更多数据,效果更好,但是过大则浪费资源,效果提升不明显; window-当前词与预测词在一个句子中的最大距离,默认是5,比如 我 今天 成功 完成 工作,对于 成功,如果设置窗口为2,可能去预测的词就是我 今天 完成 和 工作,注意是最大值而不是一定选取四个词。最后模型输出的是一个概率分布,即一个词出现在其他词边的概率是多少,我们也就可以据此去发现相似的词。 min_count-去除词频小于min_count的词; hs-1采用hierarchy softmax,0采用negative sample; iter-迭代次数 workers-参数控制训练的并行数¨C9C 更多参考: //www.cnblogs.com/kjkj/p/9825418.html 其他训练词向量有相似的方法和思路,网上有很多资料。 使用预训练词向量 首先加载获取到准备好的模型,然后我们的目标是得到一个embedding_metrics即词向量矩阵,词向量矩阵的shape为(vocab_size, embedding_dim),它是我们要用于训练的数据的每个词(更具体的说是词表中的词)在训练好的模型中的词向量组成的矩阵。 接下来处理训练数据,即用tokenizer处理训练后的数据得到词表,然后将每条文本数据转变为用词表索引数字代替各单词表示的列表,这里给词编码的顺序是词频由高到低,再进行padding使句子输入变为定长,最后我们利用word_index和模型生成embedding_metrics,数据的准备就基本完成了。这些步骤使用tensorflow提供的api可以很简单的实现。 生成代码及相关解释如下: embedding_matrix = np.zeros((len(word_index) + 1, word2vec.vector_size)) # len(word_index) + 1,加1是因为word_index的标记是从1开始而非0,这样词索引与词向量刚好对应,并且对于padding后为 # 0的填充位置可以有对应的映射。 for word, index in word_index.items(): try: embedding_vector = word2vec.wv.getitem(str(word)) embedding_matrix[int(index)] = embedding_vector except KeyError: print("vector not found for word - %s" % word) Embedding层做了什么? Embedding层就是以one hot为输入、中间层节点为词向量维数的全连接层!而这个全连接层的参数,就是一个“词向量表”即我们的embedding_metrics,也就是说,其实onehot的作用就是查表,选择onehot表示的词对应的词向量,然后输出到下一层去。如果我们不用预处理的词向量,就是放一个空矩阵在embedding层(或者说是随机初始化参数),然后在训练网络过程中更新参数。 Embedding(len(vocab) + 1, embedding_dim, input_length=50, weights=[embedding_matrix], trainable=False) # (len(vocab) + 1, embedding_dim)与embedding_matrix的shape是一致的。 参考: ...

May 22, 2020 · Xiangtao XIAO

NLP分类效果衡量指标(F1/p/r)

概念 为什么要计算F1:避免样本分布带来的偏差,综合考量分类效果,假如有100个样本,其中1个正样本,99个负样本,如果模型的预测只输出0,那么正确率是99%,这时候用正确率来衡量模型的好坏显然是不对的。 真实 1真实 0预测 1True Positive(TP)False Positive(FP)预测 0False Negative(FN)True Negative(TN) 查准率(precision),预测正确的样本在所有预测为1的样本中的比例,该值反映有多少其他类被错误的归为该类。 召回率(recall),预测正确的样本在所有真实为1的样本中的比例,该值反映有多少该类被预测为其他类了。 F1(F1-Score), 精准率和召回率的调和平均数。 Micro-F1与Macro-F1 针对多标签分类而言衡量分类效果 Micro-F1:直接计算所有类别的Precision和Recall,然后计算F1。(类别有权重,分到样本数多的类别有更大的影响力) Macro-F1:计算出每一个类的Precision和Recall并分别计算F1,最后将F1平均。(各类别的F1权重相同) 代码实现 二分类 def f1(y_hat, y_true): ''' 输入张量y_hat是输出层经过sigmoid激活的张量 y_true是label{0,1}的集和 model指的是如果是多任务分类,single会返回每个分类的f1分数,multi会返回所有类的平均f1分数(Marco-F1) 如果只是单个二分类任务,则可以忽略model ''' epsilon = 1e-7 y_hat = tf.round(y_hat)#将经过sigmoid激活的张量四舍五入变为0,1输出 # 输入的数据是矩阵,标签为单行矩阵,预测值为单列矩阵,如果不是需要转换 tp = tf.cast(tf.matmul(y_true,y_hat), 'float') #tn = tf.sum(tf.cast((1-y_hat)<em>(1-y_true), 'float'), axis=0) fp = tf.cast(tf.matmul(1-y_true,y_hat), 'float') fn = tf.cast(tf.matmul(y_true,1-y_hat), 'float') print('tp: ', tp[0][0].numpy(),'fp: ', fp[0][0].numpy(),'fn: ', fn[0][0].numpy()) p = tp/(tp+fp+epsilon)#epsilon的意义在于防止分母为0,否则当分母为0时python会报错 r = tp/(tp+fn+epsilon) f1 = 2</em>p<em>r/(p+r+epsilon) result = [f1[0][0].numpy(), p[0][0].numpy(), r[0][0].numpy()] return result 多标签 import tensorflow as tf def f1(y_hat, y_true, model='multi'): ''' 输入张量y_hat是输出层经过sigmoid激活的张量 y_true是label{0,1}的集和 model指的是如果是多任务分类,single会返回每个分类的f1分数,multi会返回所有类的平均f1分数(Marco-F1) 如果只是单个二分类任务,则可以忽略model ''' epsilon = 1e-7 y_hat = tf.round(y_hat)#将经过sigmoid激活的张量四舍五入变为0,1输出 #tf.cast()转换张量数据类型 tp = tf.reduce_sum(tf.cast(y_hat</em>y_true, 'float'), axis=0) #取axis维数据求和 #tn = tf.sum(tf.cast((1-y_hat)<em>(1-y_true), 'float'), axis=0) fp = tf.reduce_sum(tf.cast((1-y_hat)</em>y_true, 'float'), axis=0) fn = tf.reduce_sum(tf.cast(y_hat<em>(1-y_true), 'float'), axis=0) p = tp/(tp+fp+epsilon)#epsilon的意义在于防止分母为0,否则当分母为0时python会报错 r = tp/(tp+fn+epsilon) f1 = 2</em>p*r/(p+r+epsilon) f1 = tf.where(tf.is_nan(f1), tf.zeros_like(f1), f1) if model == 'single': return f1 if model == 'multi': return tf.reduce_mean(f1) 参考 //blog.csdn.net/zjn295771349/article/details/84961596 ...

May 22, 2020 · Xiangtao XIAO

多标签分类(multi-label)分类方法笔记

概述 multi-label是相较multi-class的概念,有关研究相对较少,multi-label指一个数据可以被分为多个类,一个输入对应多个输出,例如一篇新闻可以被同时打上娱乐、体育等多个类,类的数目也不确定; 对于multi-label问题的处理,主要看到三种思路: 当类别之间没有较强的联系时,将multi-label转化为多个二分类问题,对于每个类专门训练一个分类器,然后将多个分类器对同个样本进行分类输出结果达到多标签的效果。 当类别之间有一定联系的时候,将multi-label转化为multi-class问题,比如用二进制编码表示三个类:[‘人’, ‘猫’, ‘狗’],0表示不是该类,1表示是,则对于多标签分类可能有[0, 1, 1]的情况比如一张图片上既有猫又有狗,那么我们可以将每一个向量作为一个类别,比如[0, 1, 1]作为一个类,将[1, 0, 1]作为一个类,这样一来我们得到一个23个类,对单一样本输出的结果一定在这个类别空间中,这样就是一个多分类问题了,总共8个类,可以用长度为8的独热编码表示。 当然对于类别特别多(n个类)的数据集,这时候类别空间就是2n,显然类别太多了运算压力大,可以选择将类别输出的种类限制在训练集数据中存在的类别中,比如[1, 0, 0]在训练集中没有这个输出,就把他从类别中去除,当然这会影响模型的准确程度,因为它不再识别那些被踢出的可能性。 最后一种就是改进算法使其能够直接处理多标签问题,输出多个类。 多标签分类算法 对于神经网络,简单的做法是在最后输出层使用sigmoid激活函数,输出数目为类别数,每个输出都是一个概率,注意输出的多个类别的概率总和不再是1,因为是多标签问题,然后损失函数用binary_crossentrophy,相当于对每个输出分别判断属不属于该类,从而使每一个可能属于的类的概率都趋近1。 在简单的单层CNN算法的实验上效果并不是很好,确实得到了多输出的结果,但是出现了某个类概率接近1,另一个所属类概率虽然也比较突出但数值偏小,比如0.5左右的样子,同时属于3个或4个类效果就更差些,可以通过修改阈值比如threshold=0.3,大于0.3就算做该类,但改善不明显。应该和数据集不同类对应存在的样本不同有关。

May 22, 2020 · Xiangtao XIAO

Natural Language Processing相关概念理解

NLP一般流程 文本预处理->词向量与文本表示->特征选择与特征抽取->分类算法 词向量与文本表示 词袋模型(BOW) 将所有词汇放进一个袋子里,假设有n个词,则每个句子表示为一个长度为n的词频向量,词频即对应词在句子里出现的次数,如果没有出现就是0。这种方法句子里的语义信息被完全遗失了。 word based encodings 另一种思路是表示句子,这样就可以把词在句子中的位置关系考虑进去,例如 “我 喜欢 猫”和 “我 喜欢 狗”分别表示为(0 1 2)和(0 1 3),这里的数字不再是词频,而是对应单词被分配的编码,如果词重复了,显然在数组中对应的数字也会重复。 padding 句子长度不同时,需要将他们转化为统一长度的向量输入到神经网络中训练,这时就要padding,设置一个长度n,如果句子长度小于n,就在数组左侧或右侧填充0,如果句子长了,就把左侧或右侧多余的部分忽略,具体方位由自己选择。 词向量模型(word embedding) 考虑词与词之间的位置关系。原本用随机分配的数字代表每一个词,词与词之间是完全独立的,而embedding使得每一个词成为了一个n维空间中的向量,如果两个词的含义相近,那么相应的向量距离也就进,这样就考虑到了词的含义。 word2Vec : 底层采用基于CBOW和Skip-Gram算法的神经网络模型。 CBOW模型: CBOW模型的训练输入是某一个特征词的上下文相关的词对应的词向量,而输出就是这特定的一个词的词向量。由于CBOW使用的是词袋模型,因此上下文的几个词都是平等的,也就是不考虑他们和我们关注的词之间的距离大小,只要在我们上下文之内即可。 这样我们这个CBOW的例子里,我们的输入是上下文选定的词向量,输出是所有词的softmax概率(训练的目标是期望训练样本特定词对应的softmax概率最大),对应的CBOW神经网络模型输入层有4个神经元,输出层有词汇表大小个神经元。隐藏层的神经元个数我们可以自己指定。通过DNN的反向传播算法,我们可以求出DNN模型的参数,同时得到所有的词对应的词向量。这样当我们有新的需求,要求出某4个词对应的最可能的输出中心词时,我们可以通过一次DNN前向传播算法并通过softmax激活函数找到概率最大的词对应的神经元即可。 Skip-Gram模型: Skip-Gram模型和CBOW的思路是反着来的,即输入是特定的一个词的词向量,而输出是特定词对应的上下文词向量。 这样我们这个Skip-Gram的例子里,我们的输入是特定词, 输出是softmax概率排前几的词,对应的Skip-Gram神经网络模型输入层有1个神经元,输出层有词汇表大小个神经元。隐藏层的神经元个数我们可以自己指定。通过DNN的反向传播算法,我们可以求出DNN模型的参数,同时得到所有的词对应的词向量。这样当我们有新的需求,要求出某1个词对应的最可能的4个上下文词时,我们可以通过一次DNN前向传播算法得到概率大小排前4的softmax概率对应的神经元所对应的词即可。 词向量模型突出特点: 在词向量模型中,词向量与词向量之间有这非常特殊的特性。例如现在存在国王、男生、女人、皇后四个词向量,那么一个完善的词向量模型,就存在“国王-男人+女人=皇后”这样的关系。 参考: 词袋模型(BOW,bag of words)和词向量模型(Word Embedding)概念介绍

May 21, 2020 · Xiangtao XIAO

NLP数据准备相关代码记录

csv文件 什么是csv文件 csv既逗号分隔符文件,行数据用’,‘分隔,列数据用换行符’\n’分隔 读取与写入csv文件 with open(filename, 'r', encoding='gbk') as rf: reader = csv.reader(rf, dialect=csv.excel) # 按行读取,读取的是存储为excel可读格式的csv文件,这个文件可以用excel打开查看 with open(r'clean_data\clean_data_0.5_no_repeat.csv', 'w', encoding='gbk', newline='') as f: writer = csv.writer(f, dialect=csv.excel, delimiter=',') for data in final_dataset: writer.writerow(data) # 按行写入,写入格式也是csv.excel,会把一个二维列表自动存储为表格,行列对应,存储的内容是原封不动的 csv文件存储格式与换行问题 用以上方法读取的csv文件每一行每一列取出的都是字符串’str’格式,对于字典要用eval()函数自动转回原本对应的格式,而int等也要用对应函数转换 newline=’’“设置存储的行与行之间没有空行,否则会隔行存储。 json格式 json格式文件特点 json格式文本对{对象:值},例如: {“name”: “John Doe”, “age”: 18, “address”: {“country” : “china”, “zip-code”: “10000”}},和字典有些相似,存储的值可以是字符串,数组,字典等,这个格式好处在于可以存储结构相对复杂的数据并且易于存取。 json与str,json的读取 在实际操作中似乎直接把json放在列表里就可以和其他数据一样存储到csv文件中,在使用csv.writer方法时,双引号的问题被自动解决了,取出以后和其他数据一样都是str,使用json.loads()方法即可转换为json格式数据,写入的时候可以用同样的方法转换。 转换后的json格式数据按对象取值的方法与字典相似,即data[‘对象名’]->值 python集合、列表、字典 在处理重复数据时(这里指字符串或数值的数据),可以采用集合进行存储,因为集合中元素不能重复,可以很简单的使用set()或list()方法将集合和列表相互转换,因此可以利用集合去重后在转换为list存储。 要注意的是,创建空的集合要使用a = set()方法,如果是a={}则是一个空的字典。 当存储集合时如果集合为空会存储一个空集,内容为set()。 集合增加元素要用add()方法,集合没有列表的append()方法。 在处理数据时,字典一个很大的用处在于给出的key是有语义的,这提高了代码的可读性,list[1]中的数据是什么我们是不知道的,而dict[‘key’]则很好懂。 tensorflow输入数据格式转化 constant方法生成张量,tensorflow搭建的算法输入数据都是相应格式的张量,而不是列表,因此如果采用csv.reader读取csv文件而不是tensorflow自带的方法读取csv文件的话,要用对应的tensorflow或者numpy方法将数据转化为张量,通常为[None,*]None为数据量比如有2000条训练文本,None就是2000,后面的就是处理后的数据格式,比如设置的padding,maxlen=500的embedding size=12后的文本数据,格式就是[None,500,12],label数据格式也要与之相对应。 tensorflow自带的读取csv文件的方法可以直接得到tensor格式的数据,但是由于我要处理的csv文件是文本文件并且包含json,这个时候还是先用csv的方法处理完比较好。

May 21, 2020 · Xiangtao XIAO

TensorFlow基础API

看网课视频老师讲的一些,实际上官方文档有非常详细的介绍 import numpy as np import tensorflow as tf # tf基础api:常量 t = tf.constant([[1., 2., 3.], [4., 5., 6.]]) # index索引操作 print(t) print(t[:, 1:]) print(t[..., 1]) #%% # ops算数操作 print(t+10) print(tf.square(t)) print(t @ tf.transpose(t)) # 乘转置 #%% # numpy conversion print(t.numpy()) print(np.square(t)) np_t = np.array([[1., 2., 3.], [4., 5., 6.]]) print(tf.constant(np_t)) #%% # Scalars tensor可以使0维、1维... t = tf.constant(2.718) print(t.numpy()) print(t.shape) #%% # strings t = tf.constant('cafe') print(t) print(tf.strings.length(t)) print(tf.strings.length(t, unit='UTF8_CHAR')) print(tf.strings.unicode_decode(t, 'UTF8')) #%% # string array t = tf.constant(['cafe', 'coffee', '咖啡']) print(tf.strings.length(t, unit='UTF8_CHAR')) r = tf.strings.unicode_decode(t, 'UTF8') print(r) #%% # ragged tensor r = tf.ragged.constant([[11, 12], [21, 22, 23], [], [41]]) # index op print(r) print(r[1]) print(r[1:2]) #%% # ops on ragged tensor r2 = tf.ragged.constant([[51, 52], [], [71]]) print(tf.concat([r, r2], axis=0)) r3 = tf.ragged.constant([[13, 14], [15], [], [41, 42, 43]]) print(tf.concat([r, r3], axis=1)) # ragged tensor 变成 普通tensor 空位用0补齐,注意0永远在正常值的后面 print(r.to_tensor()) #%% # sparse tensor 0可以在正常值前面 s = tf.SparseTensor(indices=[[0, 1], [1, 0], [2, 3]], values=[1., 2., 3.], dense_shape=[3, 4]) print(s) print(tf.sparse.to_dense(s)) # 稀疏矩阵转密集矩阵,这样的稀疏矩阵不能用ragged tensor来表示 #%% # ops on sparse tensors s2 = s * 2.0 print(s2) try: s3 = s + 1 except TypeError as ex: print(ex) s4 = tf.constant([[10., 20.], [30., 40.], [50., 60.], [70., 80.]]) print(tf.sparse.sparse_dense_matmul(s, s4)) #%% s5 = tf.SparseTensor(indices=[[0, 2], [0, 1], [2, 3]], # 没有排好序的稀疏矩阵无法被转换为密集矩阵 values=[1., 2., 3.], dense_shape=[3, 4]) print(s5) s6 = tf.sparse.reorder(s5) # 对s5进行排序 print(tf.sparse.to_dense(s6)) #%% # Variable 变量 v = tf.Variable([[1., 2., 3.], [4., 5., 6.]]) print(v) print(v.value()) print(v.numpy()) #%% # assign value 变量重新赋值 v.assign(2*v) print(v.numpy()) v[0, 1].assign(42) print(v.numpy()) v[1].assign([7., 8., 9.]) print(v.numpy()) #%% # 不能用=号,只能用assign()重新赋值 try: v[1] = [7., 8., 9.] except TypeError as ex: print(ex) # 'ResourceVariable' object does not support item assignment

May 21, 2020 · Xiangtao XIAO

卷积神经网络(CNN)理论与实现

一、理论 卷积神经网络结构:(卷积层+(可选)池化层)*N+全连接层*M(M>=0),卷积层的输入输出是矩阵,全连接层输入输出是向量,在卷积层的最后一层做一个展平。 主要用于分类任务 全卷积神经网络:(卷积层+(可选)池化层)*N+反卷积层*K,可以做物体分割类任务 卷积操作 解决参数过多导致的计算资源不足,容易过拟合的问题。解决方法:局部连接(基于图像的区域性)、参数共享(基于图像特征与位置无关) 卷积核是反向传播计算出的参数,卷积:卷积核与输入做点积乘法。步长:卷积核每次在输入上滑动的距离。padding:使输出size不变。 池化操作 类似卷积,计算方式不同,最大值池化:池化核滑动覆盖区域的最大值作为结果输出。 特点:常使用不重叠(kernal-size=步长)、不补零的操作。参数即为步长和池化核大小。用于减少图像尺寸,从而减少计算量。一定程度平移鲁棒。损失了空间精度。 二、实现 embedding_dim = 16 batch_size = 128 cnn_model = keras.models.Sequential([ keras.layers.Embedding(vocab_size, embedding_dim, input_length=max_length), keras.layers.Conv1D(filters=256,kernel_size=2,kernel_initializer='he_normal', strides=1,padding='SAME',activation='relu'), keras.layers.GlobalMaxPooling1D(), keras.layers.Dropout(rate=0.5), keras.layers.Dense(12, activation='sigmoid') ]) cnn_model.summary() cnn_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) Conv1D 在文本中,卷积的某一维大小往往为embedding长度,即在宽度上不需要窗口移动,宽度就是整个窗口,所以conv1d默认卷积的宽度就为embedding维度,长度通过kernel_size来指定的,此处为2,即卷积核的大小为2*embedding_size。strides为步长,此处为1,即卷积核每隔一个单词移动一次。filters是卷积核的个数,即输出的维度。padding有valid和same两种选择,valid在长度方向(宽度方向不padding)不进行padding,而same则在长度方向进行padding,保证输入句子长度和卷积后输出的句子长度一致。 //blog.csdn.net/bobobe/article/details/87923618 tensorflow fit()方法:参考 //blog.csdn.net/crazyman2010/article/details/103705318 TextCNN //blog.csdn.net/u014732537/article/details/79573174

May 21, 2020 · Xiangtao XIAO

MNIST手写数字识别实践

from __future__ import absolute_import, division, print_function, unicode_literals import tensorflow as tf mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() # 加载数据 x_train, x_test = x_train / 255.0, x_test / 255.0 # /255:将RGB数值归一化 #%% print(y_train.shape) #%% model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), # 张量扁平化,将28*28的图片矩阵转化为784的向量 tf.keras.layers.Dense(128, activation='relu'), # 全连接层,128个神经元,激活函数为relu(The Rectified Linear Unit) # y=max(0,x) tf.keras.layers.Dropout(0.2), # 防止过拟合,drop out 80% of inputs,使用0.2*cell_size个神经元进行训练 tf.keras.layers.Dense(10, activation='softmax') # 全连接层输出 softmax激活函数 ]) model.compile(optimizer='adam', # 梯度下降策略 adam loss='sparse_categorical_crossentropy', # 损失函数 sparse:y独热化编码 交叉熵 metrics=['accuracy']) # metrics 列表,包含评估模型在训练和测试时的性能的指标,典型用法是metrics=[‘accuracy’]。 # 如果要在多输出模型中为不同的输出指定不同的指标,可向该参数传递一个字典,例如metrics={‘output_a’: ‘accuracy’} model.fit(x_train, y_train, epochs=5) # 训练5轮 model.evaluate(x_test, y_test, verbose=1) # Verbosity mode. 0 = silent, 1 = progress bar. # fit()用于使用给定输入训练模型. # evaluate()用于评估已经训练过的模型.返回损失值&模型的度量值.

May 20, 2020 · Xiangtao XIAO

TensorFlow2.0安装

清华镜像源安装 pip install tensorflow-gpu==1.12.0 -i //pypi.tuna.tsinghua.edu.cn/simple #可改成任意版本 CPU版本安装 pip install tensorflow -i //pypi.tuna.tsinghua.edu.cn/simple Pycharm环境配置 (一)导入TensorFlow模块测试 import tensorflow as tf hello = tf.constant() sess = tf.Session() sess.run(hello) 结果如下:ModuleNotFoundError: No module named ’tensorflow' (二)加入运行路径 设置项目的编译器为python安装位置的python.exe,勾选导入所有的模块,显示如上图所示。再次运行出现同样的错误,查了一些资料应该是电脑的CPU太老了,我下载的tensorflow2.1.0版本不支持。 (三)安装2.0.0版本并测试 运行代码: pip unintall tensorflow 重新运行安装代码:pip install tensorflow==2.0.0 -i //pypi.tuna.tsinghua.edu.cn/simple 再次测试成功! 由于笔记本没有英伟达显卡,配置较低,只安装了CPU版本,后续使用有较好配置的电脑尝试安装GPU版本。确实CPU版本速度比较慢。

May 19, 2020 · Xiangtao XIAO