import tflearn
from tflearn.data_utils import to_categorical, pad_sequences
from tflearn.datasets import imdb
from tflearn.layers.core import input_data, dropout, fully_connected
from tflearn.layers.embedding_ops import embedding
from tflearn.layers.recurrent import bidirectional_rnn, BasicLSTMCell
from tflearn.layers.estimator import regression
数据集的处理包括数据集的加载、标签转化
数据集的加载:
# IMDB Dataset loading
train, test, _ = imdb.load_data(path='imdb.pkl', n_words=10000,
valid_portion=0.1)
"""
valid_portion用于验证集占整个数据集的比例。
load_data返回数据train, valid, test
"""
trainX, trainY = train
testX, testY = test
数据集处理:对于不等长的序列的处理(填充和截断)调用pad_sequences方法
# Sequence padding
trainX = pad_sequences(trainX, maxlen=200, value=0.)
testX = pad_sequences(testX, maxlen=200, value=0.)
"""
pad_sequences
将每个序列填充到相同的长度:最长序列的长度。如果提供了maxlen,
则长度超过maxlen的任何序列都将被截断为maxlen。
截断发生在序列的开始处或结束处(缺省值)。
支持预填充和后填充(默认)。
"""
数据集转化,使用util包中的to_categorical方法
# Converting labels to binary vectors
trainY = to_categorical(trainY)
testY = to_categorical(testY)
传说中的one-hot编码
def to_categorical(y, nb_classes):
""" to_categorical.
Convert class vector (integers from 0 to nb_classes)
to binary class matrix, for use with categorical_crossentropy.
Arguments:
y: `array`. Class vector to convert.
nb_classes: `int`. Total number of classes.
"""
y = np.asarray(y, dtype='int32')
if not nb_classes:
nb_classes = np.max(y)+1
Y = np.zeros((len(y), nb_classes))
Y[np.arange(len(y)),y] = 1.
return Y
# Network building
net = input_data(shape=[None, 200])
net = embedding(net, input_dim=20000, output_dim=128)#为整数id或浮点数序列嵌入层。
net = bidirectional_rnn(net, BasicLSTMCell(128), BasicLSTMCell(128))
"""
建立一个双向递归神经网络,需要2个RNN细胞对序列进行正向和逆向处理。
任何RNN单元都可以使用,如SimpleRNN、LSTM、GRU等。
有自己的参数。但是两个单元格的单位数必须匹配。
"""
net = dropout(net, 0.5)
net = fully_connected(net, 2, activation='softmax')
net = regression(net, optimizer='adam', loss='categorical_crossentropy')
"""
TFLearn中使用回归层来对提供的输入应用回归(linear or logistic)。
它需要指定一个TensorFlow梯度下降优化器“优化器”,该优化器将最小化提供的损失函数“损失”(计算错误)。
还可以提供一个度量标准来评估模型性能。
"""
# Training
model = tflearn.DNN(net, clip_gradients=0., tensorboard_verbose=2)
model.fit(trainX, trainY, validation_set=0.1, show_metric=True, batch_size=64)