一.词袋模型
引入背景:文本的长度是不固定的,而神经网络所需要的输入个数是固定的,而磁袋模型就可以很好地解决这一问题。(与顺序无关,就像东西放入袋中)
已知条件:N句话
做法:
输入层的数目:N句话总共出现的词数(不重复)。
向量个数(训练样本数):N
每个位的值:这个词在这句话的频率(该词出现次数除以该句话总词数)。
二.构造一个分类器
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)...))