我一直在嘗試根據本教程在 tensorflow 中實作字符級語言模型。
我想通過允許堆疊多個 RNN 層來擴展模型。到目前為止,我想出了這個:
class MyModel(tf.keras.Model):
def __init__(self, vocab_size, embedding_dim, rnn_type, rnn_units, num_layers, dropout):
super().__init__(self)
self.rnn_type = rnn_type.lower()
self.num_layers = num_layers
self.embedding = tf.keras.layers.Embedding(vocab_size, embedding_dim)
if self.rnn_type == 'gru':
rnn_layer = tf.keras.layers.GRU
elif self.rnn_type == 'lstm':
rnn_layer = tf.keras.layers.LSTM
elif self.rnn_type == 'rnn':
rnn_layer = tf.keras.layers.SimpleRNN
else:
raise ValueError(f'Unsupported RNN layer: {rnn_type}')
setattr(self, self.rnn_type, rnn_layer(rnn_units, return_sequences=True, return_state=True, dropout=dropout))
for i in range(1, num_layers):
setattr(self, f'{self.rnn_type}_{i}', rnn_layer(rnn_units, return_sequences=True, return_state=True, dropout=dropout))
self.dense = tf.keras.layers.Dense(vocab_size)
def call(self, inputs, states=None, return_state=False, training=False):
x = inputs
x = self.embedding(x, training=training)
rnn = self.get_layer(self.rnn_type)
if states is None:
states = rnn.get_initial_state(x)
x, states = rnn(x, initial_state=states, training=training)
for i in range(1, self.num_layers):
layer = self.get_layer(f'{self.rnn_type}_{i}')
x, states = layer(x, initial_state=states, training=training)
x = self.dense(x, training=training)
if return_state:
return x, states
else:
return x
model = MyModel(
vocab_size=vocab_size,
embedding_dim=embedding_dim,
rnn_type='gru',
rnn_units=512,
num_layers=3,
dropout=dropout)
在教程中的資料集上訓練 30 個 epoch 時,該模型會產生一些隨機亂碼。現在我不知道我是否做錯了堆疊或者資料集是否太小。
uj5u.com熱心網友回復:
有多種因素會導致模型的錯誤預測:
- 資料集很小
- 您使用的模型本身非常簡單
- 訓練時間很短
即使訓練正確,預測莎士比亞十四行詩也會產生隨機的亂碼
嘗試訓練它更長的時間。這最終將帶來更好的結果,盡管基于文本預測協同語音可能是機器學習中最難的任務之一。例如,幾乎完美地解決了這個問題的模型之一 GPT3 由數十億個引陣列成(參見此處)。
編輯:盡管您有更多堆疊的 RNN 層,但您的模型性能比教程中的模型更差的原因可能是,更多的層需要更多的訓練時間。簡單地增加層數不一定會提高您的預測質量。正如我所說,嘗試增加訓練時間或使用超引數(學習率、標準化層等)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/473131.html
標籤:张量流
