总参数:0,在执行 model.summary() keras 时

问题描述 投票:0回答:1
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 个参数。

python tensorflow machine-learning keras lstm
1个回答
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() 会触发权重初始化过程。当输入形状是动态的或在模型定义时未知时,这特别有用。

© www.soinside.com 2019 - 2024. All rights reserved.