1 import keras
 2 from keras.datasets import imdb
 3 import numpy as np
 4 from keras import models
 5 from keras import layers
 6 import matplotlib.pyplot as plt
 7 
 8 #1. 获取数据集
 9 (train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)
10 
11 # print(train_data.shape) # (25000,)
12 
13 # 将整数序列编码为二进制矩阵
14 def vectorize_sequences(sequences, dimension=10000):
15     results = np.zeros((len(sequences), dimension))
16     for i, sequence in enumerate(sequences):
17         results[i, sequence] = 1.
18     return results
19 
20 #2. 数据处理
21 x_train = vectorize_sequences(train_data)
22 x_test = vectorize_sequences(test_data)
23 
24 y_train = np.asarray(train_labels).astype('float32')
25 y_test = np.asarray(test_labels).astype('float32')
26 
27 # y_train = np.asarray(train_labels,dtype='float32')
28 # y_test = np.asarray(test_labels,dtype='float32')
29 
30 #3. 建立网络模型
31 model = models.Sequential()
32 model.add(layers.Dense(16,activation='relu',input_shape=(10000,)))
33 model.add(layers.Dense(16,activation='relu'))
34 model.add(layers.Dense(1,activation='sigmoid'))
35 
36 #4. 设置编译三参数
37 model.compile(optimizer='rmsprop',
38 loss='binary_crossentropy',metrics=['accuracy'])
39 
40 x_val = x_train[:10000]
41 partial_x_train = x_train[10000:]
42 
43 y_val = y_train[:10000]
44 partial_y_train = y_train[10000:]
45 
46 #5. 使用验证集确定epochs等超参数
47 history = model.fit(partial_x_train,partial_y_train,epochs=4,batch_size=512,validation_data=(x_val,y_val))
48 
49 history_dict = history.history
50 #print(history_dict.keys())
51 # #dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy'])
52 
53 
54 # #验证损失与迭代轮数的关系
55 # loss_values = history_dict['loss']
56 # val_loss_values = history_dict['val_loss']
57 
58 # epochs = range(1,len(loss_values) + 1)
59 
60 # plt.plot(epochs,loss_values,'bo',label='Training loss')
61 # plt.plot(epochs,val_loss_values,'b',label='Validation loss')
62 # plt.title('Training and validation loss')
63 # plt.xlabel('Epochs')
64 # plt.ylabel('Loss')
65 # plt.legend()
66 
67 # plt.show()
68 
69 
70 # #验证精度与迭代轮数的关系
71 # plt.clf()   # clear figure
72 # acc = history_dict['accuracy']
73 # val_acc = history_dict['val_accuracy']
74 
75 # plt.plot(epochs, acc, 'bo', label='Training acc')
76 # plt.plot(epochs, val_acc, 'b', label='Validation acc')
77 # plt.title('Training and validation accuracy')
78 # plt.xlabel('Epochs')
79 # plt.ylabel('Loss')
80 # plt.legend()
81 
82 # plt.show()
83 
84 #6. 评估模型
85 results = model.evaluate(x_test, y_test)
86 print(results)
87 
88 #7. 进行预测
89 model.predict(x_test)

 

小结:

(1)通常需要对原始数据进行大量预处理,以便将其转换为张量输入到神经网络中。单词序列可以编码为二进制向量,但也有其他编码方式。

(2)带有 relu 激活的 Dense 层堆叠,可以解决很多种问题(包括情感分类),你可能会经常用到这种模型。

(3)对于二分类问题(两个输出类别),网络的最后一层应该是只有一个单元并使用 sigmoid激活的 Dense 层,网络输出应该是 0~1 范围内的标量,表示概率值。

(4)对于二分类问题的 sigmoid 标量输出,你应该使用 binary_crossentropy 损失函数。

(5)无论你的问题是什么,rmsprop 优化器通常都是足够好的选择。这一点你无须担心。

(6)随着神经网络在训练数据上的表现越来越好,模型最终会过拟合,并在前所未见的数据上得到越来越差的结果。一定要一直监控模型在训练集之外的数据上的性能。

 

posted on 2021-01-22 20:01  Sempron2800+  阅读(398)  评论(0编辑  收藏  举报