电影评论分类:二分类问题

IMDB数据集

IMDB数据集由keras库自带,它包含来自互联网数据库的50000条严重两极分化的评论。数据集用于训练和测试各25000条,其中每个数据集都各包含50%的正面(1)评论和负面(0)评论。

  1. 具体实现步骤:
    划分数据集:等比例划分
    数据集处理:训练数据/测试数据向量化以及标签向量化,处理完并排序,最终可形成一个二维的张量(正面负面,单词有无)

构建训练网络结构:需要设定输入层,隐藏层已经输出层。每一层还需设置神经元个数,假入输入层设置神经元个数为10,则有10个input,输出层为5(多分类,5个类加起来的概率为1),则有5个output,若输出成为2(二分类,两个类加起来的概率为),若输出层为1,并且该层的分类函数为sigmoid,则此端口只输出0或1,输出为百分百。在数据集小的时候,使用多层多元网络可能会使模型过拟合(overfit),不易泛化(在用新数据集测试时取得的效果与训练集差很远)。在多分类问题上,如果输出神经元个数为15,而隐藏层的最大神经元个数才10个时,模型可能会欠拟合,换句话说,该隐藏层无法记录更多的信息。

训练模型:compile要设置的函数包含了优化函数,损失函数,迭代精度。fit(训练数据集,标签,将2维张量拆成epochs次训练,每次训练数据大小为batch_size(一般选2的整数次幂),两者相乘,差不多就是整个数据集的大小,相差部分系统函数自动已全0行填充。还有测试集。history函数返回精度与训练次数。

数据可视化:利用history函数返回的字典序列数据绘制精度函数或者损失函数。

from keras.datasets import imdb
import numpy as np
from keras import models
from keras import layers
from keras import optimizers,losses,metrics
import matplotlib.pyplot as plt

#格子为1,有单词,0,无单词,i为单词索引的行号
def vectorize_sequences(sequences,dimension=10000): #[行 列]
    results = np.zeros((len(sequences),dimension))  #创建一个sequences(评论个数)行,10000(词库数量)行零矩阵
    for i, sequences in enumerate(sequences):       #返回下标和相应元素
        results [i, sequences] = 1                  #将给第i行,第sequences的格子赋值为1
    return results

#利用词库将评论解码
(train_data,train_labels),(test_data,test_labels) = imdb.load_data(num_words=10000)#加载数据集:1万个高频单词
word_index = imdb.get_word_index()                                                 #字典:存储键与键值。为什么返回只有88584个键值?
reverse_word_index = [(value,key) for (key,value) in word_index.items()]           #键值癫倒,将整数索引映射为单词
reverse_word_index = dict(reverse_word_index)
decoded_review = ' '.join([reverse_word_index.get(i - 3,'?') for i in train_data[0]]) #join用于将序列中的元素以指定的字符连接生成一个新的字符串,主要上引号之间的空格,空格也做连接
#将训练数据向量化
x_train = vectorize_sequences(train_data)
x_test = vectorize_sequences(test_data)
#标签向量化
y_trian = np.asarray(train_labels).astype('float32')
y_test = np.asarray(test_labels).astype('float32')
#定义模型结构,包括3个dense层,16个隐藏单元,最后一层dense层为1,选用sigmoid激活函数,实现二分类,只输出0或1
model = models.Sequential()
model.add(layers.Dense(16,activation='relu',input_shape=(10000,)))
model.add(layers.Dense(16,activation='relu'))
model.add(layers.Dense(1,activation='sigmoid'))
# pdb.set_trace()

#编译模型
#model.compile(optimizer='rmsprop',loss= 'binary_crossentropy',metrics = ['accuracy'])
#[优化器函数,损失函数,指标函数]

#使用自定义损失和指标,优化器  RMSpro:加速梯度下降法;损失函数:交叉熵损失函数,一般用于二分类
model.compile(optimizer=optimizers.RMSprop(lr=0.001),loss= losses.binary_crossentropy,metrics = [metrics.binary_accuracy])
#留出验证集
x_val = x_train[:10000]
partial_x_train = x_train[10000:]
y_val = y_trian[:10000]
partial_y_trian = y_trian[10000:]
# pdb.set_trace()
#训练模型
model.compile(optimizer='rmsprop',loss= 'binary_crossentropy',metrics = ['accuracy'])
#Epoch:样本中的所有样本数据被计算一次就叫做一个Epoch,Batch Size:批尺寸   Epoc*Batch Size约等于10000,将10000分成20批。每批512维的数据进入网络训练
history = model.fit(partial_x_train,partial_y_trian,epochs=20,batch_size=512,validation_data=(x_val,y_val))
history_dict = history.history


losses_values = history_dict['loss']
val_loss_value = history_dict['val_loss']
epochs = range (1,len(losses_values)+1)
plt.plot(epochs,losses_values,'bo',label = 'Training loss')
plt.plot(epochs,val_loss_value,'b',label = 'Vakidation loss')
plt.title('Training and validation loss')
plt.ylabel('Loss')
plt.xlabel('Epochs')
plt.legend()
plt.show()

acc = history_dict['acc']
val_acc = history_dict['val_acc']

plt.plot(epochs,acc,'bo',label = 'Training acc')
plt.plot(epochs,val_acc,'b',label = 'Validation acc')
plt.title('Training and validation accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epochs')
plt.legend()
plt.show()

问题

前文所描述的 【将2维张量拆成epochs次训练,每次训练数据大小为batch_size(一般选2的整数次幂),两者相乘,差不多就是整个数据集的大小,相差部分系统函数自动已全0行填充】存在一个疑问:在其他模型训练时训练3个来回刚合适,第四个来回开始过拟合,那么如何只训练三个来回,是不是意味着只取了一小部分数据做训练?暂时还没想明白…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值