model = Sequential()
model.add(Embedding(283, 100, input_length=56))
model.add(LSTM(150))
model.add(LSTM(150))
model.add(Dense(283, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam',metrics=['accuracy'])
model.summary()
张量流版本:2.16.1,
Keras 版本:3.3.3,
设备 - M3 pro macbook
我尝试使用虚拟数据集(有 282 个唯一单词,用 tokenizer 检查)构建用于文本生成的 LSTM 模型,预期参数非零,但每层输出为 0 个参数。
我也面临着同样的问题。使用下面的代码来解决这个问题:
from tensorflow.keras.layers import Embedding, LSTM, Dropout, Dense
from tensorflow.keras.models import Sequential
# Ensure total_word and max_seq are defined correctly
model = Sequential()
model.add(Embedding(input_dim=total_word, output_dim=100, input_length=max_seq - 1))
model.build((None,max_seq)) # build the Embedding to inilizices the weight
model.add(LSTM(150, return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(100))
model.add(Dense(total_word, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
原因: 我们的模型在添加 model.build((None, max_seq)) 后起作用的原因是嵌入层需要先定义输入形状,然后才能初始化其权重。通过调用 model.build((None, max_seq)),您可以显式定义输入形状,从而允许嵌入层正确初始化其权重。
在 Keras 中,可以将像 Embedding 这样的层添加到模型中,而无需指定输入形状。然而,在模型的输入形状已知之前,层的权重不会被初始化。使用输入形状作为参数调用 model.build() 会触发权重初始化过程。当输入形状是动态的或在模型定义时未知时,这特别有用。