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