我有一个简单的神经网络,我需要从模型中获得权重和偏差。我已经尝试了一些之前讨论过的方法,但是我不断遇到超出范围的值错误。不知道如何解决这个问题,或者我所缺少的。
网络-
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation=tf.nn.relu),
keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.layers[0].get_weights()[1]
错误-
IndexError: list index out of range
这是在几个问题中提到的内容,但是最终我得到了超出范围的错误。
我还有一个问题,model.layers[]
之后的索引,它对应于图层吗?
例如model.layers[1]
给出对应于第二层的权重,像这样吗?
答案 0 :(得分:1)
模型中的第一层(索引0)是[-] Android toolchain - develop for Android devices
• Android SDK at D:\Android\sdk
✗ Android SDK is missing command line tools; download from https://developer.android.com/studio/index.html#downloads
• Try re-installing or updating your Android SDK,
visit https://flutter.dev/setup/#android-setup for detailed instructions.
层,它没有任何权重,这就是为什么会出错的原因。
要获得第二层Flatten
层,必须使用索引1:
Dense
答案 1 :(得分:0)
我去过那里,我一直在查看我的旧代码,看是否能记得我是如何解决该问题的。
我要做的是打印model.layer[index].get_weights()[X]
的长度,以找出keras在节省我所需的重量。
在我的旧代码中,model.layers[0].get_weights()[1]
将返回偏差,而model.layers[0].get_weights()[0]
将返回实际权重。
无论如何,请考虑到某些图层没有保存权重(因为它们没有权重),因此如果请求model.layers[0].get_weights()[0]
不起作用,请尝试使用model.layers[1].get_weights()[1]
,因为我不确定平坦的图层,但是我知道密集的图层可以减轻重量。
答案 2 :(得分:0)
仅examples
,您将获得模型的所有权重和偏差
答案 3 :(得分:0)
要获得 Keras 序列和每次迭代的权重和偏差,您可以按照下一个示例进行操作:
# create model
model = Sequential()
model.add(Dense(numHiddenNeurons, activation="tanh", input_dim=4, kernel_initializer="uniform"))
model.add(Dense(1, activation="linear", kernel_initializer="uniform"))
# Compile model
model.compile(loss='mse', optimizer='adam', metrics=['accuracy', 'mse', 'mae', 'mape'])
weightsBiasDict = {}
weightAndBiasCallback = tf.keras.callbacks.LambdaCallback \
(on_epoch_end=lambda epoch, logs: weightsBiasDict.update({epoch:model.get_weights()}))
# Fit the model
history= model.fit(X1, Y1, epochs=numIterations, batch_size=batch_size, verbose=0, callbacks=weightAndBiasCallback)
对于字典 weightsBiasDict
如果您在训练结束时只需要权重和偏差值,您可以使用
model.layer[index].get_weights()[0]
用于权重
和
model.layer[index].get_weights()[1]
表示偏见
其中 index
是网络上的层编号,输入层从零开始。