1.词袋模型编码
2.构造一个分类器
这个神经网络有输入层有7139个单元(分别接受语料编码中的每个维度的信息)
有十个隐含层单元(处理高级信息)
输出层两个单元(区分评论是正面的还是负面的)二分类问题
此神经网络会最终输出两个实数,取最大的一个进行判断
model=nn.Sequential(
nn.Linear(7139,10),#实现从输入层到隐含层的线性映射
nn.Relu(), #在隐含层的非线性部分,是非线性激活函数
nn.Linear(10,2),#实现从隐含层到输出层的线性映射
nn.logSoftmax(dim=1),#用于输出分类的softmax函数,输出值是概率值,取最大的值
}
3.数据处理和训练
为了防止过拟合,我们将数据分成了训练集(training)、验证集(validation)、测试集(test)
训练集训练数据
验证机集调整超参数,以判断是否要停止训练
测试集对模型进行测试,评判模型的好坏
cost=torch.nn.NLLLoss()#损失函数为交叉熵
#优化算法是Adam,可以自动调节学习率
optimizer=torch.optim.Adam(model.parameter(),lr=0.01)
#定义循环训练 循环10个epoch
records=[]
losses=[]
for epoch in range(10):
for i,data in enumerate(zip(train_data, train_label)): #在每一个epoch中对数据进行分批次循环
x,y=data#读入一个batch的数据
#调整为标准的数据格式
x=Variable(torch.FloatTensor(x),view(1,-1))
y=Variable(torch.LongTensor(np.array([y])))
optimizer.zero_grad()#清空优化器的梯度
predict=model(x)#模型预测
loss=cost(predict,y)#计算损失函数
losses.append(loss.data.numpy()[0])#将损失函数的数值加入到列表中
loss.backward()#开始进行梯度反向传播
optimizer.step()#开始对参数进行进一步优化
if i%3000==0:
val_losses=[]
rights=[]#在验证集上实验
for j, val in enumerate(zip(valid_data,valid_label)):
x,y=val
x=Variable(torch.FloatTensor(x),view(1,-1))
y=Variable(torch.LongTensor(np.array([y])))
predict=model(x)
#调用rightness函数计算准确度
right=rightness(predict,y)
rights.append(right)
loss=cost(predict,y)
val_losses.append(loss.data.numpy()[0])
#将验证集上的平均准确度计算出来
right_radio=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),np.
records.append([np.mean(),np.mean(val_losses),right_ratio])