循环神经网络之embedding,padding,模型构建与训练

  本文将介绍:

  循环神经网络之embedding

  循环神经网络之padding

  循环神经网络之模型构建与训练

  一,从keras数据集imdb中加载影评数据并查看

  1,从keras数据集imdb中加载影评数据

  # 1,从keras数据集imdb中加载影评数据

  imdb = keras.datasets.imdb

  vocab_size = 10000 # 出现词频由高到低, 截取前10000个词组,其余按特殊字符处理

  index_from = 3 # 截取的单词和对应索引,向后平移3个单位

  (train_data, train_labels), (test_data, test_labels) = imdb.load_data(

  num_words = vocab_size, index_from = index_from) # 加载数据

  2,查看数据集和label标签数据

  # 2,查看数据集和label标签数据

  print(train_data[0], train_labels[0])

  print(train_data.shape, train_labels.shape)

  print(len(train_data[0]), len(train_data[1]))

  3,查看测试集数据

  # 3,查看测试集数据

  print(test_data, test_labels)

  print(test_data.shape, test_labels.shape)

  二,拿到数据集索引和文字的对应关系并做预处理

  1,拿到数据集索引和文字的对应关系

  # 1,拿到数据集索引和文字的对应关系

  word_index = imdb.get_word_index()

  print(len(word_index))

  2,将数据集索引和文字的对应关系中的索引平移3个单位

  # 2,将数据集索引和文字的对应关系中的索引平移3个单位

  word_index = {k:(v+index_from) for k, v in word_index.items()}

  3,将平移后空置出的3个位置写入数值

  # 3,将平移后空置出的3个位置写入数值

  word_index[''] = 0

  word_index[''] = 1

  word_index[''] = 2

  word_index[''] = 3

  4,翻转数据集索引和文字的对应关系

  # 4,翻转数据集索引和文字的对应关系

  reverse_word_index = dict(

  [(value, key) for key, value in word_index.items()])

  5,随意取出一条数据测试效果

  # 5,随意取出一条数据测试效果

  def decode_review(text_ids):

  return ' '.join(

  [reverse_word_index.get(word_id, "") for word_id in text_ids])

  decode_review(train_data[1])

  三,对训练集,测试集做预处理处理

  1,对训练集数据做预处理处理

  # 1,对训练集数据做预处理处理

  train_data = keras.preprocessing.sequence.pad_sequences(

  train_data, # list of list

  value = word_index[''], # 超出最大值的部分需填充的数据

  padding = 'post', # post:在后填充; pre:在前填充

  maxlen = max_length) # 处理段落的最大值 -若超出则阶段;若不足则填充;

  2,测试集数据做预处理处理

  # 2,测试集数据做预处理处理

  test_data = keras.preprocessing.sequence.pad_sequences(

  test_data, # list of list

  value = word_index[''],# 超出最大值的部分需填充的数据

  padding = 'post', # post:在后填充; pre:在前填充

  maxlen = max_length)

  四,定义模型

  embedding_dim = 16 # 每个word都embedding为一个长度为16的向量

  batch_size = 128

  model = keras.models.Sequential([

  # 1. 定义一个矩阵:define matrix: [vocab_size, embedding_dim]

  # 2. [1,2,3,4..], max_length * embedding_dim

  # 3. batch_size * max_length * embedding_dim

  keras.layers.Embedding(vocab_size, embedding_dim,trainable=True,# 此处如果是已训练好的,trainable=False

  input_length = max_length),

  # batch_size * max_length * embedding_dim

  # -> batch_size * embedding_dim

  keras.layers.GlobalAveragePooling1D(),

  # keras.layers.Flatten(), # 可以使用展平,后接入全连接层

  keras.layers.Dense(64, activation = 'relu',kernel_regularizer=regularizers.l2(0.01)),

  keras.layers.Dense(1, activation = 'sigmoid'),

  ])

  model.summary()

  model.compile(optimizer = 'adam', loss = 'binary_crossentropy',

  metrics = ['accuracy'])

  注意:

  使用已经预训练好的的embedding层,可以致参trainable = False

  五,训练模型

  history = model.fit(train_data, train_labels,

  epochs = 30,

  batch_size = batch_size,

  validation_split = 0.2)

  六,打印模型训练曲线

  def plot_learning_curves(history, label, epochs, min_value, max_value):

  data = {}

  data[label] = history.history[label]

  data['val_'+label] = history.history['val_'+label]

  pd.DataFrame(data).plot(figsize=(8, 5))

  plt.grid(True)

  plt.axis([0, epochs, min_value, max_value])

  plt.show()

  plot_learning_curves(history, 'accuracy', 10, 0, 1)

  plot_learning_curves(history, 'loss', 10, 0, 1)

  七,估计器预测测试数据集准确率

  # 七,估计器预测测试数据集准确率

  model.evaluate(

  test_data, test_labels,

  batch_size = batch_size,

  verbose = 0)

  八,总结代码

  #!/usr/bin/env python3

  # -*- coding: utf-8 -*-

  import matplotlib as mpl

  import matplotlib.pyplot as plt

  import numpy as np

  import sklearn

  import pandas as pd

  import os

  import sys

  import time

  import tensorflow as tf

  from tensorflow import keras

  from tensorflow.keras import regularizers

  print(tf.__version__)

  print(sys.version_info)

  for module in mpl, np, pd, sklearn, tf, keras:

  print(module.__name__, module.__version__)

  # 一,从keras数据集imdb中加载影评数据并查看

  # 1,从keras数据集imdb中加载影评数据

  imdb = keras.datasets.imdb

  vocab_size = 10000 # 出现词频由高到低, 截取前10000个词组,其余按特殊字符处理

  index_from = 3 # 截取的单词和对应索引,向后平移3个单位

  (train_data, train_labels), (test_data, test_labels) = imdb.load_data(

  num_words = vocab_size, index_from = index_from) # 加载数据

  # 2,查看数据集和label标签数据

  print(train_data[0], train_labels[0])

  print(train_data.shape, train_labels.shape)

  print(len(train_data[0]), len(train_data[1]))

  # 3,查看测试集数据

  print(test_data, test_labels)

  print(test_data.shape, test_labels.shape)

  # 二,拿到数据集索引和文字的对应关系并做预处理

  # 1,拿到数据集索引和文字的对应关系

  word_index = imdb.get_word_index()

  print(len(word_index))

  # 2,将数据集索引和文字的对应关系中的索引平移3个单位

  word_index = {k:(v+index_from) for k, v in word_index.items()}

  # 3,将平移后空置出的3个位置写入数值

  word_index[''] = 0 大连做人流多少钱 http://mobile.bhbyby.net/

  word_index[''] = 1

  word_index[''] = 2

  word_index[''] = 3

  # 4,翻转数据集索引和文字的对应关系

  reverse_word_index = dict(

  [(value, key) for key, value in word_index.items()])

  # 5,随意取出一条数据测试效果

  def decode_review(text_ids):

  return ' '.join(

  [reverse_word_index.get(word_id, "") for word_id in text_ids])

  decode_review(train_data[1])

  # 三,对训练集,测试集做预处理处理

  max_length = 500 # 处理段落的最大值

  # 1,对训练集数据做预处理处理

  train_data = keras.preprocessing.sequence.pad_sequences(

  train_data, # list of list

  value = word_index[''], # 超出最大值的部分需填充的数据

  padding = 'post', # post:在后填充; pre:在前填充

  maxlen = max_length) # 处理段落的最大值 -若超出则阶段;若不足则填充;

  # 2,测试集数据做预处理处理

  test_data = keras.preprocessing.sequence.pad_sequences(

  test_data, # list of list

  value = word_index[''],# 超出最大值的部分需填充的数据

  padding = 'post', # post:在后填充; pre:在前填充

  maxlen = max_length)

  # 3,打印处理后的数据

  print(train_data[0])

  # 四,定义模型

  embedding_dim = 16 # 每个word都embedding为一个长度为16的向量

  batch_size = 128

  model = keras.models.Sequential([

  # 1. 定义一个矩阵:define matrix: [vocab_size, embedding_dim]

  # 2. [1,2,3,4..], max_length * embedding_dim

  # 3. batch_size * max_length * embedding_dim

  keras.layers.Embedding(vocab_size, embedding_dim,

  input_length = max_length),

  # batch_size * max_length * embedding_dim

  # -> batch_size * embedding_dim

  keras.layers.GlobalAveragePooling1D(),

  # keras.layers.Flatten(), # 可以使用展平,后接入全连接层

  keras.layers.Dense(64, activation = 'relu',kernel_regularizer=regularizers.l2(0.01)),

  keras.layers.Dense(1, activation = 'sigmoid'),

  ])

  model.summary()

  model.compile(optimizer = 'adam', loss = 'binary_crossentropy',

  metrics = ['accuracy'])

  # 五,训练模型

  history = model.fit(train_data, train_labels,

  epochs = 30,

  batch_size = batch_size,

  validation_split = 0.2)

  # 六,打印模型训练曲线

  def plot_learning_curves(history, label, epochs, min_value, max_value):

  data = {}

  data[label] = history.history[label]

  data['val_'+label] = history.history['val_'+label]

  pd.DataFrame(data).plot(figsize=(8, 5))

  plt.grid(True)

  plt.axis([0, epochs, min_value, max_value])

  plt.show()

  plot_learning_curves(history, 'accuracy', 10, 0, 1)

  plot_learning_curves(history, 'loss', 10, 0, 1)

  # 七,估计器预测测试数据集准确率

  model.evaluate(

  test_data, test_labels,

  batch_size = batch_size,

  verbose = 0)

请使用浏览器的分享功能分享到微信等