1.将文本数据预处理为有用的数据表示

  • 将文本分割成单词(token),并将每一个单词转换为一个向量
  • 将文本分割成单字符(token),并将每一个字符转换为一个向量
  • 提取单词或字符的n-gram(token),并将每个n-gram转换为一个向量。n-gram是多个连续单词或字符的集合

将向量与标记相关联的方法有:one-hot编码与标记嵌入(token embedding)

具体见https://www.cnblogs.com/nxf-rabbit75/p/9970320.html

2.使用循环神经网络

(1)simpleRNN

simpleRNN可以在两种不同的模式下运行,这两种模式由return_sequences这个构造函数参数来控制

一种是返回每个时间步连续输出的完整序列,
其形状为(batch_size,timesteps,output_features);
另一种是只返回每个输入序列的最终输出,其形状为(batch_size,output_features)
  1. # 例子1
  2. from keras.models import Sequential
  3. from keras.layers import Embedding,SimpleRNN
  4. model = Sequential()
  5. model.add(Embedding(10000,32)) #(batch_size,output_features)
  6. model.add(SimpleRNN(32))
  7. model.summary()

  1. #例子2:RNN返回完整的状态序列
  2. model = Sequential()
  3. model.add(Embedding(10000,32))
  4. model.add(SimpleRNN(32,return_sequences = True)) #(batch_size,timesteps,output_features)
  5. model.summary()

  

 

 我们将这个模型应用IMDB电影评论分类问题

  1. #准备imdb数据
  2. from keras.datasets import imdb
  3. from keras.preprocessing import sequence
  4.  
  5. max_features = 10000# 作为特征的单词个数最多10000,多了不算
  6. max_len = 500 # 在这么多单词之后截断文本
  7. batch_size = 32
  8.  
  9. (input_train,y_train),(input_test,y_test) = imdb.load_data(num_words = max_features)
  10. print(len(input_train),'train sequences')
  11. print(len(input_test),'test sequences')
  12.  
  13. input_train = sequence.pad_sequences(input_train,maxlen=max_len)
  14. input_test = sequence.pad_sequences(input_test,maxlen=max_len)
  15. print(input_train.shape)
  16. print(input_test.shape)

首先对数据进行预处理

  1. 25000 train sequences
  2. 25000 test sequences
  3. (25000, 500)
  4. (25000, 500)

  1. #定义模型
  2. from keras.models import Sequential
  3. from keras.layers import Embedding,Flatten,Dense
  4.  
  5. model = Sequential()
  6.  
  7. model.add(Embedding(max_features,32))
  8. model.add(SimpleRNN(32))
  9. model.add(Dense(1,activation='sigmoid'))
  10.  
  11. model.summary()
  12.  
  13. model.compile(loss='binary_crossentropy',optimizer='rmsprop',metrics=['acc'])
  14. history = model.fit(input_train,y_train,
  15. epochs = 10,
  16. batch_size = 128,
  17. validation_split = 0.2)
 

  1. import matplotlib.pyplot as plt
  2.  
  3. acc = history.history['acc']
  4. loss = history.history['loss']
  5. val_acc = history.history['val_acc']
  6. val_loss = history.history['val_loss']
  7.  
  8. epochs = range(1,len(acc)+1)
  9.  
  10. plt.plot(epochs,acc,'bo',label='Training acc')
  11. plt.plot(epochs,val_acc,'b',label='Validation acc')
  12. plt.title('Traning and validation acc')
  13. plt.legend()
  14.  
  15. plt.figure()
  16.  
  17. plt.plot(epochs,loss,'bo',label='Training loss')
  18. plt.plot(epochs,val_loss,'b',label='Validation loss')
  19. plt.title('Traning and validation loss')
  20. plt.legend()
  21.  
  22. plt.show()
 

总结:

这个小型循环网络的表现并不好,问题的部分原因在于: 输入只考虑了前500个单词,而不是整个序列,因此RNN获得的信息比前面的基准模型更少。

另一部分原因在于,simpleRNN不擅长处理长序列,比如文本。 其他类型的循环层的表现要好得多,比如说LSTM层和GRU层

理论上来说,SimpleRNN应该能够记住许多时间步之前见过的信息,但实际上他是不可能学到这种长期以来的,原因在于梯度消失问题,

这一效应类似于在层数较多的非循环网络(即前馈网络),随着层数的增加,网络最终变得无法训练。 LSTM和GRU都是为了解决这个问题而设计的

 (2)LSTM

  1. # keras实现LSTM的一个例子
  2. from keras.layers import LSTM
  3.  
  4. model = Sequential()
  5. model.add(Embedding(max_features,32))
  6. model.add(LSTM(32))
  7. model.add(Dense(1,activation='sigmoid'))
  8.  
  9. model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['acc'])
  10. history = model.fit(input_train,y_train,
  11. epochs = 10,
  12. batch_size = 128,
  13. validation_split = 0.2)

这次,验证精度达到了,比simpleRNN好多了,主要是因为LSTM受梯度消失问题的影响要小得多,这个结果也比第三章的全连接网络略好,

虽然使用的数据量比第三章少。此处在500个时间步之后将序列截断,而在第三章是读取整个序列

 循环神经网络的高级用法

  • 循环dropout (降低过拟合)
  • 堆叠循环层 (提高网络的表示能力(代价是更高的计算负荷))
  • 双向循环层 (将相同的信息以不同的方式呈现给循环网络,可以提高精度并缓解遗忘问题)

我们将使用一个天气时间序列数据集-->德国耶拿的马克思-普朗克生物地球化学研究所的气象站记录

温度预测问题

数据集:每十分钟记录14个不同的量(比如气温、气压、湿度、风向等),原始数据可追溯到2003年。本例仅适用2009-2016年的数据,

这个数据集非常适合用来学习处理数值型时间序列我们将会用这个数据集来构建模型,

输入最近的一些数据(几天的数据点),可以预测24小时之后的气温。

  1. import os
  2. data_dir = 'jena_climate'
  3. fname = os.path.join(data_dir,'jena_climate_2009_2016.csv')
  4.  
  5. f = open(fname)
  6. data = f.read()#所有行组成一个字符串,每行由\n隔开
  7. f.close()
  8.  
  9. lines = data.split('\n')
  10. header = lines[0].split(',')
  11. lines = lines[1:]
  12.  
  13. print(header) #时间步+14个与天气有关的值
  14. print(lines[0])
  15. print(len(lines))#有420551行数据

日期+14个特征名称

一行的数据为:

  1. import numpy as np
  2.  
  3. float_data = np.zeros((len(lines),len(header)-1))
  4. for i,line in enumerate(lines):
  5. values = [float(x) for x in line.split(',') [1:]]
  6. float_data[i,:] = values
  7.  
  8. float_data[1,:]
 

  1. #绘制所有天的温度变化
  2. import matplotlib.pyplot as plt
  3. plt.plot(range(len(lines)),float_data[:,1])
  4. plt.show()

  

 

  1. #绘制前十天的温度时间序列
    plt.plot(range(1440),float_data[:,1][:1440])
  2. plt.show()

  

 

上面这张图,可以看到每天的周期性变化,尤其是最后4天特别明显。 如果想根据过去几个月的数据来预测下个月的平均温度,那么问题很简单,

因为数据具有可靠的年度周期性。 从这几天的数据来看,温度看起来更混乱一些。以天作为观察尺度,这个时间序列是可以预测的吗?

 准备数据
lookback = 720:给定过去5天内的观测数据
steps = 6:每6个时间步采样一次数据
delay = 144:目标是未来24小时之后的数据

float_data

  1. #数据标准化
  2. float_data -= float_data[:20000].mean(axis=0)
  3. float_data /= float_data[:20000].std(axis=0)
 

  1. #生成时间序列样本及其目标的生成器
  2. def generator(data,lookback,delay,min_index,max_index,shuffle=False,batch_size=128,step=6):
  3. '''输入:data是浮点数组成的原始数据
  4. lookback是输入数据应该包括多少个时间步
  5. delay是目标应该在未来多少个时间步之后
  6. min_index,max_index是data数组中的索引,用于界定需要抽取哪些时间步(有助于保存一部分数据用于验证,
  7. 另一部分用于测试)
  8. step=6 一个小时抽取一个数据点
  9. 输出:samples:输入数据的一个批量,
  10. targets:对应的目标温度数组'''
  11. if max_index is None:
  12. max_index = len(data) - delay + 1
  13. i = min_index + lookback
  14. while 1:
  15. if shuffle:
  16. rows = np.random.randint(min_index+lookback,max_index,size=batch_size)
  17. else:
  18. if i + batch_size >= max_index:
  19. i = min_index + lookback
  20. rows = (i,min(i+batch_size,max_index))
  21. i += len(rows)
  22.  
  23. samples = np.zeros((len(rows),lookback // step,data.shape[-1]))
  24. targets = np.zeros((len(rows),))
  25. for j,row in enumerate(rows):
  26. indices = range(rows[j]-lookback,rows[j],step)
  27. samples[j] = data[indices]
  28. targets[j] = data[rows[j] + delay][1]
  29.  
  30. yield samples,targets
 

  1. #准备训练生成器,验证生成器,测试生成器
  2. lookback =1440
  3. step = 6
  4. delay = 144
  5. batch_size = 128
  6.  
  7. train_gen = generator(float_data,lookback=lookback,delay=delay,
  8. min_index=0,max_index=200000,shuffle=True,batch_size=batch_size,step=step)
  9. val_gen = generator(float_data,lookback=lookback,delay=delay,
  10. min_index=200001,max_index=300000,shuffle=True,batch_size=batch_size,step=step)
  11. test_gen = generator(float_data,lookback=lookback,delay=delay,
  12. min_index=300001,max_index=None,shuffle=True,batch_size=batch_size,step=step)
 
  1. #为了查看整个训练集,需要从train_gen中抽取多少次
  2. train_steps = (200000-0-lookback) // batch_size
  3. #为了查看整个验证集,需要从val_gen中抽取多少次
  4. val_steps = (300000-200001-lookback) // batch_size
  5. #为了查看整个测试集,需要从val_gen中抽取多少次
  6. test_steps = (len(float_data)-300001-lookback) // batch_size
  7. print(train_steps)
  8. print(val_steps)
  9. print(test_steps)

1551

769

930

  1. # 一种基于常识的、非机器学习的基准方法-->始终预测24小时后的温度等于现在的温度
  2. def evaluate_naive_method():
  3. batch_maes = []
  4. for step in range (val_steps):
  5. samples, targets = next (val_gen)
  6. preds = samples[:, -1, 1]
  7. mae = np.mean (np.abs (preds - targets))
  8. batch_maes.append (mae)
  9.  
  10. evaluate_naive_method ()
  11.  
  12. # 将MAE转换成摄氏温度误差
  13. std = float_data[:200000].std (axis=0)
  14. celsius_mae = 0.29 * std[1]
  15. # celsius_mae
 
  1. from keras.models import Sequential
  2. from keras import layers
  3.  
  4. #对比1.全连接网络
  5. model = Sequential()
  6. model.add(layers.Flatten(input_shape=(lookback//step,float_data.shape[-1])))
  7. model.add(layers.Dense(32,activation='relu'))
  8. model.add(layers.Dense(1))
  9.  
  10. model.compile(optimizer='RMSprop',loss='mae')
  11.  
  12. history = model.fit_generator(
  13. train_gen,
  14. steps_per_epoch=50,
  15. epochs=10,
  16. validation_data=val_gen,
  17. validation_steps=val_steps
  18. )

总结

第一个全连接方法的效果并不好,但这并不意味机器学习不适用于这个问题,该方法首先将时间序列展平,

这从输入数据中删除了时间的概念。 数据本身是个序列,其中因果关系和顺序都很重要。

  1. #对比2.循环网络GRU
  2. #训练并评估一个基于GRU的模型
  3. from keras.models import Sequential
  4. from keras.layers import Dense,GRU
  5.  
  6. model = Sequential()
  7. model.add(GRU(32,input_shape=(None,float_data.shape[-1])))
  8. model.add(Dense(1))
  9.  
  10. model.compile(optimizer='rmsprop',loss='mae')
  11. history = model.fit_generator(train_gen,
  12. steps_per_epoch=50,
  13. epochs=5,
  14. validation_data = val_gen,
  15. validation_steps = val_steps)
  16.  
  17. # loss: 0.3403 - val_loss: 0.3160
 

  1. #使用dropout来降低过拟合
  2. from keras.models import Sequential
  3. from keras.layers import Dense,GRU
  4.  
  5. model = Sequential()
  6. model.add(GRU(32,dropout=0.2,recurrent_dropout=0.2,input_shape=(None,float_data.shape[-1])))
  7. model.add(Dense(1))
  8.  
  9. model.compile(optimizer='RMSprop',loss='mae')
  10. history = model.fit_generator(train_gen,
  11. steps_per_epoch=50,
  12. epochs=5,
  13. validation_data = val_gen,
  14. validation_steps = val_steps)
  • dropout:0~1之间的浮点数,控制输入线性变换的神经元断开比例

  • recurrent_dropout:0~1之间的浮点数,控制循环状态的线性变换的神经元断开比例

 

模型不再过拟合,但似乎遇到了性能瓶颈,所以我们应该考虑增加网络容量。

增加网络容量直到过拟合变成主要的障碍。

只要过拟合不是太严重,那么很可能是容量不足的问题

  1. #对比3.循环层堆叠
  2. #训练并评估一个使用dropout正则化的堆叠GRU模型
  3. #数据集:温度
  4. from keras.models import Sequential
  5. from keras.layers import Dense,GRU
  6.  
  7. model = Sequential()
  8. model.add(GRU(32,dropout=0.1,recurrent_dropout=0.5,input_shape=(None,float_data.shape[-1]),return_sequences=True))
  9. # return_sequences=True,在keras中逐个堆叠循环层,所有中间层都应该返回完整的输出序列,
  10. # 而不是只返回最后一个时间步的输出
  11. model.add(GRU(64,activation='relu',dropout=0.1,recurrent_dropout=0.5))
  12. # 但是最后一个LSTM层return_sequences通常为false
  13. model.add(Dense(1))
  14.  
  15. model.summary()
  16. model.compile(optimizer='rmsprop',loss='mae')
  17. history = model.fit_generator(train_gen,
  18. steps_per_epoch=50,
  19. epochs=5,
  20. validation_data = val_gen,
  21. validation_steps = val_steps)
 

 

结果如上图所示,可以看出,添加一层的确对结果有所改进,但并不显著,

我们可以得到两个结论:

1.因为过拟合仍然不是很严重,所以可以放心的增大每层的大小,

以进一步改进验证损失,但这么做的计算成本很高

2.添加一层厚模型并没有显著改进,所以你可能发现,提高网络能力

的回报在逐渐减小

  1. #对比4:逆序序列评估LSTM
    #数据集 imdb
  2. from keras.datasets import imdb
  3. from keras.preprocessing import sequence
  4. from keras import layers
  5. from keras.models import Sequential
  6.  
  7. max_features = 10000
  8. max_len = 500
  9.  
  10. (x_train,y_train),(x_test,y_test) = imdb.load_data(num_words = max_features)
  11. x_train = [x[::-1] for x in x_train]
  12. x_test = [x[::-1] for x in x_test]
  13.  
  14. x_train = sequence.pad_sequences(x_train,maxlen = max_len)
  15. x_test = sequence.pad_sequences(x_test,maxlen = max_len)
  16.  
  17. model = Sequential()
  18. model.add(layers.Embedding(max_features,128))
  19. model.add(layers.LSTM(32)) #return_sequences=True
  20. model.add(Dense(1,activation='sigmoid'))
  21. model.summary()
  22.  
  23. model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics = ['acc'])
  24. history = model.fit(x_train,y_train,
  25. epochs=2,
  26. batch_size=128,
  27. validation_split=0.2) #没有分val出来,直接写0.2就表示从train数据集中分0.2出来当做验证集
 

总结:模型性能与正序LSTM几乎相同,这证实了一个假设,虽然单词顺序对理解语言很重要,但使用哪种顺序不重要。

双向RNN正是利用这个想法来提高正序RNN的性能,他从两个方向查看数据,从而得到更加丰富的表示,并捕捉到仅使用正序RNN时可能忽略的一些模式

(3)Bidirectional RNN

  1. #训练并评估一个双向LSTM
  2. #数据集imdb
  3. model = Sequential()
  4. model.add(layers.Embedding(max_features,32))
  5. model.add(layers.Bidirectional(layers.LSTM(32)))
  6. model.add(layers.Dense(1,activation='sigmoid'))
  7.  
  8. model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['acc'])
  9. history = model.fit(x_train,y_train,
  10. epochs = 5,
  11. batch_size = 128,
  12. validation_split = 0.2)
 
  1. #训练一个双向GRU
  2. #数据集 温度
  3. model = Sequential()
  4. model.add(layers.Bidirectional(layers.GRU(32),input_shape=(None,float_data.shape[-1])))
  5. model.add(layers.Dense(1))
  6.  
  7. model.compile(optimizer='rmsprop',loss='mae')
  8. history = model.fit_generator(train_gen,
  9. epochs = 5,
  10. steps_per_epoch = 50,
  11. validation_data = val_gen,
  12. validation_steps = val_steps)
 
 更多尝试

  • 在堆叠循环层中调节每层的单元个数,当前取值在很大程度上是任意选择的,因此可能不是最优的。
  • 调节rmsprop优化器的学习率
  • 尝试使用LSTM层代替GRU
  • 在循环层上面尝试使用更大的密集连接回归器,即更大的Dense层或Dense层的堆叠
  • 在测试集上运行性能最佳的模型,否则,开发的网络架构将会对验证集过拟合


3.使用一维卷积神经网络处理序列

  1. ## 用卷积神经网络处理序列
  2.  
  3. ## 实现一维卷积神经网络
  4. #准备imdb数据
  5. from keras.datasets import imdb
  6. from keras.preprocessing import sequence
  7. from keras import layers
  8. from keras.models import Sequential
  9.  
  10. max_features = 10000
  11. max_len = 500
  12.  
  13. (x_train,y_train),(x_test,y_test) = imdb.load_data(num_words = max_features)
  14. print('x_train序列长度',len(x_train))
  15. print('x_test序列长度',len(x_test))
  16.  
  17. x_train = sequence.pad_sequences(x_train,maxlen = max_len)
  18. x_test = sequence.pad_sequences(x_test,maxlen = max_len)
  19. print('x_train shape',x_train.shape)
  20. print('x_test shape',x_test.shape)

  1. x_train序列长度 25000
  2. x_test序列长度 25000
  3. x_train shape (25000, 500)
  4. x_test shape (25000, 500)
  1. #在imdb数据上训练并评估一个简单的一维卷积神经网络
  2. from keras.models import Sequential
  3. from keras import layers
  4. from keras.optimizers import RMSprop
  5.  
  6. model = Sequential()
  7. model.add(layers.Embedding(max_features,128,input_length=max_len))
  8. model.add(layers.Conv1D(32,7,activation='relu'))
  9. model.add(layers.MaxPooling1D(5))
  10. model.add(layers.Conv1D(32,7,activation='relu'))
  11. model.add(layers.GlobalMaxPooling1D()) #GlobalMaxPooling1D和GlobalMaxPool1D有啥关系?
  12. model.add(layers.Dense(1))
  13.  
  14. model.summary()
  15.  
  16. model.compile(optimizer=RMSprop(lr=1e-4),
  17. loss = 'binary_crossentropy',
  18. metrics = ['acc'])
  19. history = model.fit(x_train,y_train,
  20. epochs = 2,
  21. batch_size = 128,
  22. validation_split = 0.2)

 

总结: 用一维卷积神经网络验证精度略低于LSTM,但在CPU和GPU上的运行速度都要更快

在单词级的情感分类任务上,一维卷积神经网络可以替代循环网络,并且速度更快、计算代价更低。

 

  1. #在耶拿数据上训练并评估一个简单的一维卷积神经网络
  2. from keras.models import Sequential
  3. from keras import layers
  4. from keras.optimizers import RMSprop
  5.  
  6. model = Sequential()
  7. model.add(layers.Conv1D(32,5,activation='relu',input_shape=(None,float_data.shape[-1])))
  8. model.add(layers.MaxPooling1D(3))
  9. model.add(layers.Conv1D(32,5,activation='relu'))
  10. model.add(layers.MaxPooling1D(3))
  11. model.add(layers.Conv1D(32,5,activation='relu'))
  12. model.add(layers.GlobalMaxPooling1D()) #GlobalMaxPooling1D和GlobalMaxPool1D有啥关系?
  13. model.add(layers.Dense(1))
  14.  
  15. model.summary()
  16.  
  17. model.compile(optimizer=RMSprop(),loss = 'mae')
  18.  
  19. history = model.fit_generator(train_gen,
  20. epochs = 5,
  21. steps_per_epoch = 50,
  22. validation_data = val_gen,
  23. validation_steps = val_steps)

验证MAE停留在0.4-0.5,使用小型卷积神经网络甚至无法击败基于尝试的基准方法。同样,这是因为卷积神经网络在输入时间序列的所有位置寻找模式,它并不知道所看到某个模式的时间位置(距开始多长时间,距结束多长时间等)。对于这个具体的预测问题,对最新数据点的解释与对较早数据点的解释应该并不相同,所以卷积神经网络无法得到有意义的结果。

卷积神经网络对IMDB数据来说并不是问题,因为对于正面情绪或负面情绪相关联的关键词模式,无论出现在输入句子中的什么位置,它所包含的信息量是一样的

要想结合卷积神经网络的速度与轻量 与 RNN的顺序敏感性,一种方法是在RNN前面使用一维神经网络作为预处理步骤。

对于那些非常长,以至于RNN无法处理的序列,这种方法尤其有用。卷积神经网络可以将长的输入序列转换为高级特征组成的更短序列(下采样)

然后,提取的特征组成的这些序列成为网络中RNN的输入。

在RNN前面使用一维卷积神经网络作为预处理步骤

长序列-->通过一维CNN-->更短的序列(CNN特征)->通过RNN-->输出

这里将step减半,得到时间序列的长度变为之前的两倍,温度数据的采样频率为每30分钟一个数据点

 

  1. #准备训练生成器,验证生成器,测试生成器
  2. lookback =720
  3. step = 3
  4. delay = 144
  5. batch_size = 128
  6.  
  7. train_gen = generator(float_data,lookback=lookback,delay=delay,
  8. min_index=0,max_index=200000,shuffle=True,batch_size=batch_size,step=step)
  9. val_gen = generator(float_data,lookback=lookback,delay=delay,
  10. min_index=200001,max_index=300000,shuffle=True,batch_size=batch_size,step=step)
  11. test_gen = generator(float_data,lookback=lookback,delay=delay,
  12. min_index=300001,max_index=None,shuffle=True,batch_size=batch_size,step=step)
  13.  
  14. #为了查看整个训练集,需要从train_gen中抽取多少次
  15. train_steps = (200000-0-lookback) // batch_size
  16. #为了查看整个验证集,需要从val_gen中抽取多少次
  17. val_steps = (300000-200001-lookback) // batch_size
  18. #为了查看整个测试集,需要从val_gen中抽取多少次
  19. test_steps = (len(float_data)-300001-lookback) // batch_size
  20. print(train_steps)
  21. print(val_steps)
  22. print(test_steps)

1556

775

936

  1. #结合一维CNN和GRU来处理长序列
  2. from keras.models import Sequential
  3. from keras import layers
  4. from keras.optimizers import RMSprop
  5.  
  6. model = Sequential()
  7. model.add(layers.Conv1D(32,5,activation='relu',input_shape=(None,float_data.shape[-1])))
  8. model.add(layers.MaxPooling1D(3))
  9. model.add(layers.Conv1D(32,5,activation='relu'))
  10. model.add(layers.GRU(32,dropout=0.1,recurrent_dropout=0.5))
  11. model.add(layers.Dense(1))
  12.  
  13. model.summary()
  14.  
  15. model.compile(optimizer=RMSprop(),loss = 'mae')
  16.  
  17. history = model.fit_generator(train_gen,
  18. epochs = 5,
  19. steps_per_epoch = 50,
  20. validation_data = val_gen,
  21. validation_steps = val_steps)
 

从验证损失来看,这种架构的效果不如只用正则化GPU,但速度要快很多,它查看了两倍的数据量,在本例中可能不是非常有用,但对于其他数据集可能非常重要

2.keras实现-->深度学习用于文本和序列的更多相关文章

  1. AI:深度学习用于文本处理

    同本文一起发布的另外一篇文章中,提到了 BlueDot 公司,这个公司致力于利用人工智能保护全球人民免受传染病的侵害,在本次疫情还没有引起强烈关注时,就提前一周发出预警,一周的时间,多么宝贵! 他们的 ...

  2. TensorFlow深度学习笔记 文本与序列的深度模型

    Deep Models for Text and Sequence 转载请注明作者:梦里风林 Github工程地址:https://github.com/ahangchen/GDLnotes 欢迎st ...

  3. 万字总结Keras深度学习中文文本分类

    摘要:文章将详细讲解Keras实现经典的深度学习文本分类算法,包括LSTM.BiLSTM.BiLSTM+Attention和CNN.TextCNN. 本文分享自华为云社区<Keras深度学习中文 ...

  4. 基于 Keras 用深度学习预测时间序列

    目录 基于 Keras 用深度学习预测时间序列 问题描述 多层感知机回归 多层感知机回归结合"窗口法" 改进方向 扩展阅读 本文主要参考了 Jason Brownlee 的博文 T ...

  5. 【AI in 美团】深度学习在文本领域的应用

    背景 近几年以深度学习技术为核心的人工智能得到广泛的关注,无论是学术界还是工业界,它们都把深度学习作为研究应用的焦点.而深度学习技术突飞猛进的发展离不开海量数据的积累.计算能力的提升和算法模型的改进. ...

  6. 将迁移学习用于文本分类 《 Universal Language Model Fine-tuning for Text Classification》

    将迁移学习用于文本分类 < Universal Language Model Fine-tuning for Text Classification> 2018-07-27 20:07:4 ...

  7. 使用Keras进行深度学习:(七)GRU讲解及实践

    ####欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 介绍 GRU(Gated Recurrent Unit) ...

  8. 使用Keras进行深度学习:(一)Keras 入门

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! Keras是Python中以CNTK.Tensorflow或者Th ...

  9. [AI开发]centOS7.5上基于keras/tensorflow深度学习环境搭建

    这篇文章详细介绍在centOS7.5上搭建基于keras/tensorflow的深度学习环境,该环境可用于实际生产.本人现在非常熟练linux(Ubuntu/centOS/openSUSE).wind ...

随机推荐

  1. 【大数据系列】Hadoop DataNode读写流程

    DataNode的写操作流程 DataNode的写操作流程可以分为两部分,第一部分是写操作之前的准备工作,包括与NameNode的通信等:第二部分是真正的写操作. 一.准备工作 1.首先,HDFS c ...

  2. jQuery事件处理(七)

    1.自定义事件(用户手动trigger的一般都是自定义事件) trigger: function( event, data, elem, onlyHandlers ) { var i, cur, tm ...

  3. 如何快速打开.iso文件(不借助专门的工具)

    如何快速打开.iso文件(不借助专门的工具) 把.iso文件重命名为.rar文件,然后解压即可

  4. Sencha Touch 实战开发培训 视频教程 第二期 第三节

    2014.4.11晚上8:10分开课. 本节课耗时一小时以上. 本期培训一共八节,前两节免费,后面的课程需要付费才可以观看. 本节内容:             本地储存.扩展按钮控件.微博分享 实现 ...

  5. dirname的用法:获取文件的父级目录路径

    命令:dirname 获取文件的路径(到父级目录)用法:dirname file_name [root@bogon opt]# a=$(dirname /mnt/a/b/c/d/a.sh) [root ...

  6. 去掉VS2010代码中文注释的红色下划线

    VS2010代码中文注释出现红色下划线,代码看上去很不美观,发现是由于安装Visual Assist X插件造成的. 解决办法:打开VAX的Options对话框,取消Advanced --> U ...

  7. C程序设计语言习题(1-12)

    统计行数.单词数,字符数的程序: #include<stdio.h> #define IN 1 /*在单词内*/ #define OUT 0 /*在单词外*/ int main() { i ...

  8. 【转】C内存管理

    在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要介绍内存管理基本概念,重 ...

  9. 【笔记】javascript权威指南-第六章-对象

    对象 //本书是指:javascript权威指南    //以下内容摘记时间为:2013.7.28 对象的定义: 1.对象是一种复合值:将很多值(原始值或者对象)聚合在一起,可以通过名字访问这些值. ...

  10. failed to register esriAddin

    ArcGIS AddIN开发遇到此种异常,目前有两种错误的可能:(1)项目名称好像不能为中文名,如果为中文名,请改正 (2)在Config.esriAddinx配置文件中,存在如下代码 <Tar ...