《python+深度学习》中的代码【2】二分类问题代码

二分类问题是应用广泛的机器学习问题,本例子将影评分为正面和负面
本例子运行结果:精度:[0.7237535303735733, 0.8508800268173218] --2019-10-15

下一步:尝试新的loss函数:MSE
尝试新的激活:tanh

#二分类问题是应用广泛的机器学习问题,本例子将影评分为正面和负面
from keras.datasets import imdb
(train_data,train_labels),(test_data,test_labels) = imdb.load_data(num_words = 10000)

#print(train_data[0])
print(train_labels.shape)
print(train_labels[0])

#把某条评论解码为英文单词
word_index = imdb.get_word_index()          #word_index是一个单词映射整数的索引字典
#颠倒字典顺序,把整数映射为单词
reverse_word_index = dict([(value,key) for (key,value) in word_index.items()])
#索引前三位分别为padding(填充)、start of sequence(索引开始)、unknown(未知词)
decoded_review = ' '.join([reverse_word_index.get(i - 3, '?') for i in train_data[0]])
print(decoded_review)
##########
#将整数序列编码为二进制矩阵,one-hot(独热编码)
###########
import numpy as np
def vectorize_sequences(sequences, dimension=10000):
    results = np.zeros((len(sequences), dimension))
    for i, sequence in enumerate(sequences):
        results[i, sequence] = 1.
    return results
#将训练数据向量化
x_train = vectorize_sequences(train_data)
x_test = vectorize_sequences(test_data)
#print(x_train[0])
#把标签向量化
y_train = np.asarray(train_labels).astype('float32')
y_test = np.asarray(test_labels).astype('float32')

#########
#构建网络
##########
#relu整流线性单元
#建立了三层的网络,两层有relu函数激活,输出都是16维,第三层是sigmoid函数,输出1正面评价、0负面评价
#激活函数relu的存在意义是打破固有的线性运算(点乘和加法),利用非线性函数relu得到更丰富的空间,从而发挥多层表示的优势
from keras import models
from keras import layers
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'))
##############
#编译模型
###############
from keras import losses
from keras import metrics
from keras import optimizers
model.compile(
optimizer=optimizers.RMSprop(lr=0.001),
loss=losses.binary_crossentropy,
metrics=[metrics.binary_accuracy]
)
##################
#验证模型
###############
#留出10000组数据,用作验证数据
x_val = x_train[:10000]
partial_x_train = x_train[10000:]

y_val = y_train[:10000]
partial_y_train = y_train[10000:]
#训练模型
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['acc'])
#返回一个History对象,其中包含一个字典成员history,字典中包含了训练过程中的所有数据
history = model.fit(partial_x_train,
partial_y_train,
epochs=20,                  #训练20轮次(对x_train和y_train中所有样本进行20次迭代)
batch_size=512,             #使用512个样本组成的小批量
validation_data=(x_val, y_val))     #验证留出的验证数据
history_dict = history.history
print(history_dict.keys())

############
#利用matplot绘制训练loss和验证loss
#############
import matplotlib.pyplot as plt
history_dict = history.history
loss_values = history_dict['loss']
val_loss_values = history_dict['val_loss']
epochs = range(1, len(loss_values) + 1)
plt.plot(epochs, loss_values, 'bo', label='Training loss')              #bo,蓝色圆点
plt.plot(epochs, val_loss_values, 'b', label='Validation loss')         #b,蓝色实线
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()      #可以看到,本例子中出现了过拟合现象(训练数据拟合变好,测试数据却变差了)
#绘制训练精度和验证精度
plt.clf()       #清空图像
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.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.show()

results = model.evaluate(x_test, y_test)
print(results)


#可以用predict方法来得到评论为正面的可能性
print(model.predict(x_test))

你可能感兴趣的:(《python+深度学习》中的代码【2】二分类问题代码)