迴圈神經網路之embedding,padding,模型構建與訓練

ckxllf發表於2021-03-02

  本文將介紹:

  迴圈神經網路之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 大連做人流多少錢

  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)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2760617/,如需轉載,請註明出處,否則將追究法律責任。

相關文章