KerasGRU詳解

一、GRU簡介

循環神經網絡(Recurrent Neural Network, RNN)一般用於處理序列數據。長短期記憶(Long Short-Term Memory, LSTM)是用於解決傳統RNN無法處理長序列數據的問題。然而,LSTM參數過多,訓練起來非常耗時。出於對參數數量和訓練時間的考慮,Gated Recurrent Unit(GRU)誕生了。相對於LSTM,GRU擁有更少的參數以及更快的訓練速度,而且在許多任務上的表現也相當不錯。

GRU通過引入重置門(reset gate)和更新門(update gate)來控制序列和隱藏狀態的信息流,以實現記憶單元和長短期記憶單元的功能。如果前一個時間步的輸出不重要,則更新門將其設置為值為零。重置門有利於減少圖像化貢獻和自我注重性,以增強RNN對局部特徵的表達能力。

二、KerasGRU模型結構

Keras是一種高級神經網絡API,支持幾乎所有類型的神經網絡模型。在Keras中,使用GRU是非常簡單的,理解模型的結構將使您更容易使用GRU及其他類型的神經網絡。

GRU層可以通過keras.layers.GRU類來創建。以下是一個具有一個GRU層的簡單Keras模型:

from keras.models import Sequential
from keras.layers import GRU, Dense

model = Sequential()
model.add(GRU(64, input_shape=(10, 32)))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

上面的代碼片段是一個簡單的Keras分類模型,其中包含一個具有64個節點的GRU層和一個sigmoid激活函數的密集層。維度(10,32)指的是輸入序列的長度為10,每個時間步的維數為32。優化器使用Adam,損失函數為二元交叉熵。

三、KerasGRU參數詳解

1. activation

GRU輸出和隱藏狀態的激活函數。默認為超bolic正切(tanh),但是也可以使用其他激活函數,例如ReLU或Sigmoid。

2. recurrent_activation

GRU重置門和更新門的激活函數。默認為超bolic正切(tanh),但是也可以使用其他激活函數,例如ReLU或Sigmoid。

3. use_bias

表示GRU是否使用偏置。默認為True。當設置為False時,初始狀態必須提供。

4. kernel_initializer、recurrent_initializer、bias_initializer

初始化GRU層內權重和偏置的方法。默認為’glorot_uniform’,即Xavier(高斯)初始化用於權重和偏置,但其他初始化方法也可以使用,例如’zeros’或’ones’等。

5. kernel_regularizer、recurrent_regularizer、bias_regularizer

正則化GRU權重和偏差的方法。例如,可以使用L1或L2正則化(通過設置’keras.regularizers.l1’或’keras.regularizers.l2’)。使用正則化可以減少過擬合。

6. dropout、recurrent_dropout

Dropout是一種廣泛用於神經網絡的正則化方法,用於減少過擬合。dropout是一個小小的概率,在每個時間步應用於GRU輸出,以丟棄一些節點,以提高網絡的泛化能力和魯棒性。recurrent_dropout是類似的機制,但是在重置門和更新門上應用。

7. implementation

GRU的內部計算可以使用高效的基於GPU的方法或者更慢但更精確的基於CPU的方法。默認情況下,’CuDNN’高效GPU實現被選擇,但在某些情況下(例如,使用GPU下降器)它可能無法使用。因此,’cpu’可能更好。

四、KerasGRU應用

1.文本分類

GRU常用於處理文本數據的序列生成和分類問題。可以使用預訓練的詞嵌入器初始化GRU層,並使用softmax激活函數對輸出進行分類。以下是一個示例,使用IMDB數據集對情感分析進行文本分類。

from keras.datasets import imdb
from keras.preprocessing import sequence
from keras.models import Sequential
from keras.layers import Embedding, GRU, Dense

max_features = 10000
max_len = 500
batch_size = 32

print('Loading data...')
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)

print(len(x_train), 'train sequences')
print(len(x_test), 'test sequences')

print('Pad sequences (samples x time)...')
x_train = sequence.pad_sequences(x_train, maxlen=max_len)
x_test = sequence.pad_sequences(x_test, maxlen=max_len)
print('x_train shape:', x_train.shape)
print('x_test shape:', x_test.shape)

model = Sequential()
model.add(Embedding(max_features, 32))
model.add(GRU(64, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())

model.fit(x_train, y_train, batch_size=batch_size, epochs=5, validation_data=(x_test, y_test))

score, acc = model.evaluate(x_test, y_test, batch_size=batch_size)
print('Test score:', score)
print('Test accuracy:', acc)

2.序列生成

通過預訓練的GRU層,您可以將序列生成的問題看作是序列到序列(sequence-to-sequence)的問題。這裡是一個實現元音字母的語音序列生成的示例。注意,這是一個基於字符的序列生成,GRU的輸出維度為5(元音字母a,e,i,o,u)。

import numpy as np
from keras.models import Sequential
from keras.layers import GRU, Dense
from keras.optimizers import RMSprop

# Vocabulary
vowels = ['a', 'e', 'i', 'o', 'u']
vowels_idx = dict((c, i) for i, c in enumerate(vowels))
n_vowels = len(vowels)

# Dataset: Generate n dataset samples of length m
n, m = 32000, 10
x = np.random.choice(vowels, (n, m))
y = (x == 'a') | (x == 'e') | (x == 'i') | (x == 'o') | (x == 'u')

# One-hot encoding
x_ohe = np.zeros((n, m, n_vowels), dtype=np.bool)
for i in range(n):
    for j in range(m):
        x_ohe[i, j, vowels_idx[x[i, j]]] = 1
y_ohe = y.astype(np.float32)

# Split into train and test
split = int(0.8 * len(x))
x_train, y_train = x_ohe[:split], y_ohe[:split]
x_test, y_test = x_ohe[split:], y_ohe[split:]

# Build model
model = Sequential()
model.add(GRU(32, input_shape=(None, n_vowels)))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer=RMSprop(lr=0.01))

# Train the model
model.fit(x_train, y_train, batch_size=32, epochs=10, validation_data=(x_test, y_test))

# Predict vowel based on previous 3 characters
x_test = np.array([['u', 'o', 'u'], ['i', 'o', 'i']]) # 'ouu' and 'ioi'
x_test_ohe = np.zeros((2, 3, n_vowels), dtype=np.bool)
for i in range(2):
    for j in range(3):
        x_test_ohe[i, j, vowels_idx[x_test[i, j]]] = 1
y_test_pred = model.predict(x_test_ohe, verbose=0)
print(y_test_pred)

3.時間序列

GRU可用於時間序列問題,例如用於預測未來的股票價格。這裡是一個小樣本模擬,它說明如何使用KerasGRU建立和訓練模型,以預測時間序列中的下一個步驟。

import numpy as np
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import GRU, Dense
from keras.optimizers import RMSprop

# Generate noisy time series data
t = np.arange(0, 30, 0.1)
noise = np.random.randn(len(t))
x = np.sin(0.3 * t) + 0.1 * noise
plt.plot(t, x)

# Dataset
lookback = 10
delay = 3
n_train = 1500
n_test = 1000

def create_dataset(data, lookback, delay, min_index, max_index):
    data = data.astype(np.float32)
    samples = []
    targets = []
    for start in range(min_index, max_index - lookback - delay):
        samples.append(data[start:start+lookback])
        targets.append(data[start+lookback+delay])
    return np.array(samples), np.array(targets)

x_train, y_train = create_dataset(x, lookback, delay, 0, n_train)
x_test, y_test = create_dataset(x, lookback, delay, n_train, n_train + n_test)

print(x_train.shape, y_train.shape)

# Build model
model = Sequential()
model.add(GRU(32, input_shape=(None, 1)))
model.add(Dense(1))
model.compile(loss='mse', optimizer=RMSprop(lr=0.01))

# Train the model
model.fit(np.expand_dims(x_train, axis=-1), y_train, batch_size=128, epochs=10, validation_data=(np.expand_dims(x_test, axis=-1), y_test))

# Predict future values
predictions = model.predict(np.expand_dims(x_test, axis=-1))
plt.plot(t[:len(x_test)], predictions)
plt.show()

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/242524.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:49
下一篇 2024-12-12 12:50

相關推薦

  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • C語言貪吃蛇詳解

    一、數據結構和算法 C語言貪吃蛇主要運用了以下數據結構和算法: 1. 鏈表 typedef struct body { int x; int y; struct body *nex…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性傳感器,能夠同時測量加速度和角速度。它由三個傳感器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分佈式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變量讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web服務器。nginx是一個高性能的反向代理web服務器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • Java BigDecimal 精度詳解

    一、基礎概念 Java BigDecimal 是一個用於高精度計算的類。普通的 double 或 float 類型只能精確表示有限的數字,而對於需要高精度計算的場景,BigDeci…

    編程 2025-04-25

發表回復

登錄後才能評論