我正在 Keras 中构建带有嵌入层的 SimpleRNN 模型,并在使用 Sequential API 时遇到问题。模型摘要显示输出形状为?可训练参数的数量为 0。但是,当我使用功能 API 构建相同的模型时,一切都按预期工作。
from keras.models import Sequential
from keras.layers import Embedding, SimpleRNN, Dense
model = Sequential([
Embedding(input_dim=10000, output_dim=50, input_length=100),
SimpleRNN(32),
Dense(1, activation='sigmoid')
])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.summary()
我得到以下输出:
Output shape: ?
Trainable parameters: 0(unbuilt)
但是,当我使用Functional API时,像这样:
from keras.models import Model
from keras.layers import Input, Embedding, SimpleRNN, Dense
inputs = Input(shape=(100,))
x = Embedding(input_dim=10000, output_dim=50)(inputs)
x = SimpleRNN(32)(x)
outputs = Dense(1, activation='sigmoid')(x)
model = Model(inputs, outputs)
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.summary()
该模型在正确的输出形状和可训练参数的情况下运行良好。
任何人都可以解释为什么 Sequential API 会发生这种情况以及如何解决这个问题吗?我是否在顺序配置中遗漏了某些内容?
这个问题是因为模型还没有建立起来。要获得所需的输出形状,您需要首先通过调用
build()
或向其提供一些输入数据来构建模型,然后重新编译模型。
请检查以下代码行以获得所需的输出:
model.build(input_shape=(None, 10))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.summary()
输出:
Model: ""sequential_1""
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓
┃ Layer (type) ┃ Output Shape ┃ Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩
│ embedding_2 (Embedding) │ (None, 10, 50) │ 500,000 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ simple_rnn_2 (SimpleRNN) │ (None, 32) │ 2,656 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dense_2 (Dense) │ (None, 1) │ 33 │
└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘
Total params: 502,689 (1.92 MB)
Trainable params: 502,689 (1.92 MB)
Non-trainable params: 0 (0.00 B)"