miad711为什么这么火 PyTorch 这么火

PyTorch快速入门教程一
接下来我们将进入Pytorch快速入门系列教程,本系列主要参考深度炼丹的知乎专栏,并且已经获得了作者的许可转载,同时文章会有较多改动,我将会以一个新手的视角带大家学习PyTorch,同时如果有不对的地方,欢迎大家到给我留言,大家也可以一觉分享交流!如果你还不知道pytorch是啥,可以去看一看以前的文章&
要学习pytorch,首先当然是需要安装pytorch了,目前pytorch只支持mac和linux,如果你的电脑是windows,装虚拟机或者双系统。如果想要愉快地学习,那么强烈推荐使用linux系统,因为所有的深度学习框架在linux上都有很好的支持,远远好于windows系统,而且linux也没有大家想象中的那么难学,目前linux系统的图形界面让大家上手的时候更加容易。
Linux或者Mac默认安装了python2.7系统,大家安装玩Linux系统以后接下来就是安装Pytorch了,其实安装很简单,大家可以参考:
pytorch基础
装好了pytorch之后,正式进入我们的教程,pytorch基础部分,这个部分主要是介绍一下pytorch处理的对象以及操作。
tensor就是张量的英文,表示多维的矩阵,比如一维就是向量,二维就是一般的矩阵等等,pytorch里面处理的单位就是一个一个的tensor
size可以显示的得到其大小
这个和numpy很相似,同时tensor和numpy.array之间也可以相互转换
tensor的运算也很简单,一般的四则运算都是支持的
pytorch和numpy不一样的地方就来了,就是其提供了自动求导功能,也就是可以自动给你你要的参数的梯度,这个操作又另外一个基本元素提供,Variable
本质上Variable和Tensor没有区别,不过Variabel会放入一个计算图,然后进行前向传播,反向传播以及自动求导
一个Variable里面包含着三个属性,data,grad和creator,其中creator表示得到这个Variabel的操作,比如乘法或者加法等等,grad表示方向传播的梯度,data表示取出这个Variabel里面的数据
这就是一个简单的计算图的例子
前面讲了两个操作对象,最后讲一下pytorch里面的模型建立,模型的建立主要依赖于torch.nn,torch.nn包含这个所有神经网络的层的结构
这就是构建所有神经网络的模板,不管你想构建卷积神经网络还是循环神经网络或者是生成对抗网络都依赖于这个结构
原文出处:/news/5.html
更多文章关注:
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。您正在使用IE低版浏览器,为了您的雷锋网账号安全和更好的产品体验,强烈建议使用更快更安全的浏览器
发私信给三川
导语:动态计算图加持,PyTorch 相比 TensorFlow 是否有优势?
同步到新浪微博
用爱救世界
当月热门文章
为了您的账户安全,请
您的邮箱还未验证,完成可获20积分哟!
您的账号已经绑定,现在您可以以方便用邮箱登录
请填写申请人资料简单有趣的 NLP 教程:手把手教你用 PyTorch 辨别自然语言(附代码)_凤凰资讯
简单有趣的 NLP 教程:手把手教你用 PyTorch 辨别自然语言(附代码)
用微信扫描二维码分享至好友和朋友圈
最近在学pyTorch的实际应用例子。这次说个简单的例子:给定一句话,判断是什么语言。这个例子是比如给定一句话:
Give it to me
判断是 ENGLISH
me gusta comer en la cafeteria
判断是 SPANISH
就是这么简单的例子。
来看怎么实现:
准备数据 格式 [(语句,类型),...]
data是train的时候用的语句,test_data是test的时候用的语句
data = [ (&me gusta comer en la cafeteria&.split(), &SPANISH&),
(&Give it to me&.split(), &ENGLISH&),
(&No creo que sea una buena idea&.split(), &SPANISH&),
(&No it is not a good idea to get lost at sea&.split(), &ENGLISH&) ]
test_data = [(&Yo creo que si&.split(), &SPANISH&),
(&it is lost on me&.split(), &ENGLISH&)]
因为文本计算机室识别不出来的,他们只认识01串,也就是数字。所以我们得把文本映射到数字上。
word_to_ix = {}
for sent, _ in data + test_data:
for word in sent:
if word not in word_to_ix:
word_to_ix[word] = len(word_to_ix)
print(word_to_ix)
输出word_to_ix (意思是word to index)是:
{'me': 0, 'gusta': 1, 'comer': 2, 'en': 3, 'la': 4, 'cafeteria': 5, 'Give': 6, 'it': 7, 'to': 8, 'No': 9, 'creo': 10, 'que': 11, 'sea': 12, 'una': 13, 'buena': 14, 'idea': 15, 'is': 16, 'not': 17, 'a': 18, 'good': 19, 'get': 20, 'lost': 21, 'at': 22, 'Yo': 23, 'si': 24, 'on': 25}
这里先提前设置下接下来要用到的参数
VOCAB_SIZE = len(word_to_ix)
NUM_LABELS = 2#只有两类 ENGLISH SPANISH
def init(self, num_labels, vocab_size):初始化,就是输入和输出的大小。这里我们要输入是一个句子,句子最大就是拥有所有字典的词,这里也就是vocab_size(下面再说怎么将一句话根据字典转换成一个数字序列的),输出就是分类,这里分为2类,即num_labels。这里我们用的是线性分类 ,即nn.Linear()。
def forward(self, bow_vec):bow_vec是一个句子的数字化序列,经过self.linear()得到一个线性结果(也就是预测结果),之后对这个结果进行softmax(这里用log_softmax是因为下面的损失函数用的是NLLLoss() 即负对数似然损失,需要log以下)
class BoWClassifier(nn.Module):#nn.Module 这是继承torch的神经网络模板
def __init__(self, num_labels, vocab_size):
super(BoWClassifier, self).__init__()
self.linear = nn.Linear(vocab_size, num_labels)
def forward(self, bow_vec):
return F.log_softmax(self.linear(bow_vec))
def make_bow_vector(sentence, word_to_ix)
大概能看懂什么意思吧。就是把一个句子sentence通过word_to_ix转换成数字化序列.比如 sentence=我 是 一只 小 小 鸟 word_to_id={你:0,我:1,他:2,不:3,是:4,大:5,小:6,猪:7,鸟:8,,} make_bow_vector之后的结果是[0,1,0,0,1,0,2,0,1]。view()就是改变下向量维数。
这里是讲len(word_to_ix)1-&1len(word_to_ix)
def make_bow_vector(sentence, word_to_ix):
vec = torch.zeros(len(word_to_ix))
for word in sentence:
vec[word_to_ix[word]] += 1
return vec.view(1, -1)
这个就不用说了吧 一样。(如果想知道torch.LongTensor啥意思的话。可以看看。Torch中,Tensor主要有ByteTensor(无符号char),CharTensor(有符号),ShortTensor(shorts), IntTensor(ints), LongTensor(longs), FloatTensor(floats), DoubleTensor(doubles),默认存放为double类型,如果需要特别指出,通过torch.setdefaulttensortype()方法进行设定。例如torch.setdefaulttensortype(‘torch.FloatTensor’)。 )
def make_target(label, label_to_ix):
return torch.LongTensor([label_to_ix[label]])
这里再介绍下model.parameters()这个函数。他的返回结果是model里的所有参数。这里我们用的是线性函数,所以就是f(x)=Ax+b中的A和b(x即输入的数据),这些参数在之后的反馈和更新参数需要的。
model = BoWClassifier(NUM_LABELS, VOCAB_SIZE)
for param in model.parameters():
print(&param:&, param)
可以看出A是2len(vocab_size),b是21
param: Parameter containing:
Columns 0 to 9
0.6 0.4 0.1 -0.6 -0.6
-0.6 -0.7 -0.9 0.0 0.8
Columns 10 to 19
0.6 0.5 0.0 -0.2 -0.2
-0.9 0.9 0.2 0.4 -0.4
Columns 20 to 25
0.1 0.2 0.0
0.4 -0.9 0.7
[torch.FloatTensor of size 2x26]
param: Parameter containing:
[torch.FloatTensor of size 2]
我们再看看model的def forward(self, bow_vec):怎么用。这里就想下面的代码一样,直接在mode()填一个参数即可,就调用forward函数。
sample = data[0]
bow_vector = make_bow_vector(sample[0], word_to_ix)
log_probs = model(autograd.Variable(bow_vector))
print(&log_probs&, log_probs)
输出是:(就是log_softmax后的值)
log_probs Variable containing:
[torch.FloatTensor of size 1x2]
我们这里看看在test上的预测
label_to_ix = { &SPANISH&: 0, &ENGLISH&: 1 }
for instance, label in test_data:
bow_vec = autograd.Variable(make_bow_vector(instance, word_to_ix))
log_probs = model(bow_vec)
print log_probs
print next(model.parameters())[:,word_to_ix[&creo&]]
Variable containing:
[torch.FloatTensor of size 1x2]
Variable containing:
[torch.FloatTensor of size 1x2]
Variable containing:
[torch.FloatTensor of size 2]
下面就该进行重要的部分了。
循环训练和更新参数
这里我们用的损失函数是nn.NLLLoss()负对数似然损失,优化依然用的最常见的optim.SGD() 梯度下降法,一般训练5-30次最终优化基本不再变化。
每一步过程:
a. 首先都要model.zero_grad(),因为接下来要极端梯度,得清零,以防问题
b. 将数据向量化(也可以说是数字序列化,转成计算机能看懂的形式)
c. 得到预测值
d. 求损失loss_function
e. 求梯度loss.backward()
f. 更新参数optimizer.step()
loss_function = nn.NLLLoss()
optimizer = optim.SGD(model.parameters(), lr=0.1)
for epoch in range(100):
for instance, label in data:
model.zero_grad()
bow_vec = autograd.Variable(make_bow_vector(instance, word_to_ix))
target = autograd.Variable(make_target(label, label_to_ix))
log_probs = model(bow_vec)
loss = loss_function(log_probs, target)
loss.backward()
optimizer.step()
在测试集上测试
for instance, label in test_data:
bow_vec = autograd.Variable(make_bow_vector(instance, word_to_ix))
log_probs = model(bow_vec)
print log_probs
我们在结果上很容易看到第一个例子预测是SPANISH最大,第二个是ENGLISH最大。成功了。
Variable containing:
[torch.FloatTensor of size 1x2]
Variable containing:
[torch.FloatTensor of size 1x2]
用微信扫描二维码分享至好友和朋友圈
凤凰资讯官方微信
播放数:2023570
播放数:491532
播放数:1550401
播放数:5808920Keras,Theano,pytorch,caffe2 哪个更好一些,应该怎么尝试学习? - 知乎1325被浏览134211分享邀请回答58057 条评论分享收藏感谢收起15415 条评论分享收藏感谢收起查看更多回答}

我要回帖

更多关于 miad 635为什么这么火 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信