机器学习算法5:RNN循环神经网络

【【使用keras自带的路透社新闻数据集运行RNN的实例】】

import numpy as np from sklearn.metrics import accuracy_score from keras.datasets import reuters from keras.preprocessing.sequence import pad_sequences from keras.utils import to_categorical (X_train, y_train), (X_test, y_test) = reuters.load_data(num_words = 30000, maxlen = 50, test_split = 0.3) //数据集来源于路透社的 11,228 条新闻文本,总共分为 46 个主题。 num_words:整数或None,训练集中我们指保留词频最高的前30000个单词 maxlen: 整数。最大序列长度。 任何更长的序列都将被截断。 test_split: 浮点型。用作测试集的数据比例。 X_train = pad_sequences(X_train, padding = 'post') X_test = pad_sequences(X_test, padding = 'post') //在长度不足50的序列的后面填补0 X_train = np.array(X_train).reshape((X_train.shape[0], X_train.shape[1], 1)) X_test = np.array(X_test).reshape((X_test.shape[0], X_test.shape[1], 1)) //更改数组形状 y_data = np.concatenate((y_train, y_test)) //训练集和测试集纵向拼接 y_data = to_categorical(y_data) y_train = y_data[:1395] y_test = y_data[1395:] 1. Vanilla RNN from keras.models import Sequential from keras.layers import Dense, SimpleRNN, Activation from keras import optimizers from keras.wrappers.scikit_learn import KerasClassifier def vanilla_rnn(): //定义vanilla rnn模型 model = Sequential() //序贯模型 model.add(SimpleRNN(50, input_shape = (49,1), return_sequences = False)) //input_shape:即张量的shape。从前往后对应由外向内的维度。 //units: 正整数,输出空间的维度为50。 //return_sequences为布尔值,默认False,控制返回类型。若为True则返回整个序列,否则仅返回输出序列的最后一个输出 model.add(Dense(46))//46为神经元个数(节点数)
model.add(Activation('softmax')) //激活函数为softmax adam = optimizers.Adam(lr = 0.001) //学习率为0.001 
model.compile(loss = 'categorical_crossentropy', optimizer = adam, metrics = ['accuracy']) //categorical_crossentropy:亦称作多类的对数损失,注意使用该目标函数时,需要将标签转化为形如(nb_samples, nb_classes)的二值序列
 return model

model = KerasClassifier(build_fn = vanilla_rnn, epochs = 20, batch_size = 50, verbose = 1)
  //KerasClassifier类使用参数build_fn指定用来创建模型的函数的名称
  • batch_size:整数,指定进行梯度下降时每个batch包含的样本数。训练时一个batch的样本会被计算一次梯度下降,使目标函数优化一步。
  • epochs:整数,训练终止时的epoch值,训练将在达到该epoch值时停止,训练的总轮数为epochs - inital_epoch(该值默认为0)
  • verbose:日志显示,0为不在标准输出流输出日志信息,1为输出进度条记录,2为每个epoch输出一行记录

model.fit(X_train, y_train)  // 进行训练
y_pred = model.predict(X_test)  // 进行预测
y_test_ = np.argmax(y_test, axis = 1) //返回每行最大值的索引
print(accuracy_score(y_pred, y_test_))  //报告模型得分

//报告结果//
模型的准确度为74.96%

 

2.Stacked Vanilla RNN

def stacked_vanilla_rnn():
    model = Sequential()
    model.add(SimpleRNN(50, input_shape = (49,1), return_sequences = True)) # return_sequences parameter has to be set True to stack
   model.add(SimpleRNN(50, return_sequences = False))
    model.add(Dense(46))
    model.add(Activation('softmax'))
    adam = optimizers.Adam(lr = 0.001)
    model.compile(loss = 'categorical_crossentropy', optimizer = adam, metrics = ['accuracy'])

    return model

model = KerasClassifier(build_fn = stacked_vanilla_rnn, epochs = 200, batch_size = 50, verbose = 1)
model.fit(X_train, y_train)
y_pred = model.predict(X_test) // 进行预测
print(accuracy_score(y_pred, y_test_)) //报告模型得分

//报告结果//
模型的准确度为75.63%
 
3. LSTM

from keras.layers import LSTM
def lstm():
    model = Sequential()
    model.add(LSTM(50, input_shape = (49,1), return_sequences = False))
    model.add(Dense(46))
    model.add(Activation('softmax'))
    
    adam = optimizers.Adam(lr = 0.001)
    model.compile(loss = 'categorical_crossentropy', optimizer = adam, metrics = ['accuracy'])
    
    return model

model = KerasClassifier(build_fn = lstm, epochs = 200, batch_size = 50, verbose = 1)
model.fit(X_train, y_train)
y_pred = model.predict(X_test) // 进行预测
print(accuracy_score(y_pred, y_test_)) //报告模型得分
//报告结果//
模型的准确度为84.47%
4. Stacked LSTM

def stacked_lstm():
    model = Sequential()
    model.add(LSTM(50, input_shape = (49,1), return_sequences = True))
    model.add(LSTM(50, return_sequences = False))
    model.add(Dense(46))
    model.add(Activation('softmax'))
    
    adam = optimizers.Adam(lr = 0.001)
    model.compile(loss = 'categorical_crossentropy', optimizer = adam, metrics = ['accuracy'])
    
    return model

model = KerasClassifier(build_fn = stacked_lstm, epochs = 200, batch_size = 50, verbose = 1)
model.fit(X_train, y_train)
y_pred = model.predict(X_test) // 进行预测
print(accuracy_score(y_pred, y_test_)) //报告模型得分
//报告结果//
模型的准确度为85.48%

 

 

 

posted @ 2021-01-19 13:37  venko  阅读(350)  评论(0)    收藏  举报