Python——pytorch进行文本分类

一.词袋模型

引入背景:文本的长度是不固定的,而神经网络所需要的输入个数是固定的,而磁袋模型就可以很好地解决这一问题。(与顺序无关,就像东西放入袋中)

已知条件:N句话

做法

        输入层的数目:N句话总共出现的词数(不重复)。

        向量个数(训练样本数):N

        每个位的值:这个词在这句话的频率(该词出现次数除以该句话总词数)。     

Python——pytorch进行文本分类_第1张图片

  二.构造一个分类器

model=nn.Sequential(
    nn.Linear(7139,10),
    nn.ReLU(),
    nn.Linear(10,2),
    nn.LogSoftmax(dim=1),
)

  三.损失函数和优化器

#损失函数
cost=torch.nn.NLLLoss()

#优化器Adam优化算法,相比SGD可以自动调节学习率
optimizer=torch.optim.Adam(model.parameters,lr=0.01)

records=[]  #循环10个Epoch
losses=[]

for epoch in range(10):
    for i,data in enumerate(train_data,train_label):  #在每一个epoch中对训练数据进行分批循环
        x,y=data  #读入一批的数据
        #调整为标准的数据格式
        x=Variable(torch.FloatTensor(x).view(1,-1))
        y=Variable(torch.FloatTensor(np.array([y])))
        optimizer.zero_grad()

        #模型预测
        predict=model(x)
        loss=cost(predict,y)
        

        loss.backward()
        optimizer.step()

        if i%3000==0:  #每隔3000个batch,就在校验集上跑一遍模型
            val_losses=[]
            right=[]
            for i,val in enumerate(zip(vaild_data,vaild_label)):
                x,y=val
                x=Variable(torch.FloatTensor(x).view(-1,1))
                y=Variable(torch.LongTensor(np.array([y])))


                predict=model(x)

                right=rightness(predict,y)
                rights.append(right)
                loss=cos(predict,y)
                val_losses.append(loss.data.numpy()[0])  
                
                right_ratio=1.0*np.sum([i[0] for i in rights])/np.sum([i[1] for i in rights])  #将校验集上的平均准确度计算出来
                
                print('地{}轮,训练损失:{:2f},校验损失:{:2f},校验准确率:{:2f}'format(epoch,np.mean(losses)...))

 

你可能感兴趣的:(Python——pytorch进行文本分类)