我正在嘗試獲取給定網路的初始權重。
該執行緒建議需要指定輸入維度:如何查看初始化權重(即在訓練之前)?
此執行緒建議在編譯后權重應該可用:重置 Keras 層中的權重
在編譯模型之后但在訓練之前立即保存初始權重。
雖然我在第一篇文章中復制了結果,但我無法將其應用于我的案例:
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
import tensorflow as tf
# Reproducing https://stackoverflow.com/questions/46798708/how-to-view-initialized-weights-i-e-before-training
# First model without input_dim prints an empty list
model = Sequential()
model.add(Dense(5, weights=[np.ones((3, 5)), np.zeros(5)],
activation='relu'))
print(model.get_weights())
# Second model with input_dim prints the assigned weights
model1 = Sequential()
model1.add(Dense(5, weights=[np.ones((3, 5)), np.zeros(5)],
input_dim=3,
activation='relu'))
model1.add(Dense(1, activation='sigmoid'))
print(model1.get_weights())
class Test(tf.keras.Model):
def __init__(self, n_inputs: int, neurons=10):
super(Test, self).__init__(name="Test")
self.neurons = neurons
# Initilializers
mean, std = 0., 0.0005
bias_normalization = None
kernel_initializer = tf.keras.initializers.RandomNormal(mean=mean,
stddev=std)
self.h1 = Dense(n_inputs, activation="linear", name="h1",
kernel_initializer=kernel_initializer,
bias_initializer=bias_normalization,
input_dim=n_inputs)
def call(self, inputs):
x = self.h1(inputs)
return x
# Model Test
test = Test(n_inputs=1, neurons=100)
test.get_weights() # empty, expected
test.compile()
test.get_weights() # empty, unexpected
uj5u.com熱心網友回復:
不知道你為什么在這里選擇包袱來定義一個具體的類,但是你的Test類并沒有定義模型,只有一個Dense層;因此,您最終沒有得到任何權重并不奇怪。更改self.h1為:
self.h1 = Sequential(Dense(n_inputs, activation="linear", name="h1",
kernel_initializer=kernel_initializer,
bias_initializer=bias_normalization,
input_dim=n_inputs))
在這兩種情況下都可以解決問題:
test = Test(n_inputs=1, neurons=100)
test.get_weights()
# [array([[-0.00030265]], dtype=float32), array([-1.6327941], dtype=float32)]
test.compile()
test.get_weights() # same weights as above
# [array([[-0.00030265]], dtype=float32), array([-1.6327941], dtype=float32)]
請注意,隨著框架的發展,不同版本似乎有所變化,因此舊執行緒中的一些細節今天可能會有所不同。例如,在當前在 Google Colab (2.6.0) 中使用的 Keras 版本中,model.get_weights()如果input_dim未定義將拋出錯誤- 它不會回傳空串列:
from keras.models import Sequential
from keras.layers import Dense
import numpy as np
import keras
keras.__version__
# '2.6.0'
model = Sequential()
model.add(Dense(5, weights=[np.ones((3, 5)), np.zeros(5)],
activation='relu'))
print(model.get_weights())
這給出:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-4-1f22e9c3ce78> in <module>()
2 model.add(Dense(5, weights=[np.ones((3, 5)), np.zeros(5)],
3 activation='relu'))
----> 4 print(model.get_weights())
5 frames
/usr/local/lib/python3.7/dist-packages/keras/engine/training.py in get_weights(self)
2090 """
2091 with self.distribute_strategy.scope():
-> 2092 return super(Model, self).get_weights()
2093
2094 def save(self,
/usr/local/lib/python3.7/dist-packages/keras/engine/base_layer.py in get_weights(self)
1844 Weights values as a list of NumPy arrays.
1845 """
-> 1846 weights = self.weights
1847 output_weights = []
1848 for weight in weights:
/usr/local/lib/python3.7/dist-packages/keras/engine/training.py in weights(self)
2488 A list of variables.
2489 """
-> 2490 return self._dedup_weights(self._undeduplicated_weights)
2491
2492 @property
/usr/local/lib/python3.7/dist-packages/keras/engine/training.py in _undeduplicated_weights(self)
2493 def _undeduplicated_weights(self):
2494 """Returns the undeduplicated list of all layer variables/weights."""
-> 2495 self._assert_weights_created()
2496 weights = []
2497 for layer in self._self_tracked_trackables:
/usr/local/lib/python3.7/dist-packages/keras/engine/sequential.py in _assert_weights_created(self)
465 # When the graph has not been initialized, use the Model's implementation to
466 # to check if the weights has been created.
--> 467 super(functional.Functional, self)._assert_weights_created() # pylint: disable=bad-super-call
468
469
/usr/local/lib/python3.7/dist-packages/keras/engine/training.py in _assert_weights_created(self)
2672 'Weights are created when the Model is first called on '
2673 'inputs or `build()` is called with an `input_shape`.' %
-> 2674 self.name)
2675
2676 def _check_call_args(self, method_name):
ValueError: Weights for model sequential_1 have not yet been created. Weights are created when the Model is first called on inputs or `build()` is called with an `input_shape`.
最后,作為一般性評論,您應該注意不要混合來自keras和 的功能tf.keras;這些是不同的庫,因此請選擇一個并在整個代碼中始終如一地堅持使用。
uj5u.com熱心網友回復:
在您的情況下,我認為這一切都取決于實際呼叫call方法的tf.keras.Model時間。此外,Keras 序列模型和子類模型的行為不同。
例如,如果您嘗試以下操作,您將獲得一些權重的輸出:
test_model = Test(n_inputs=1, neurons=100)
test_model(np.random.random((32, 1)))
print(test_model.get_weights())
# [array([[0.00057544]]), array([0.3752869])]
或者
test_model.build(input_shape=(32, 1))
print(test_model.get_weights())
# [array([[8.942684e-05]], dtype=float32), array([-1.6799461], dtype=float32)]
基本上,該call方法在內部呼叫該__call__方法。如果您查看官方 Tensorflow網站,您可以閱讀有關此行為的資訊:
要在輸入上呼叫模型,請始終使用呼叫方法,即 model(inputs),它依賴于底層呼叫方法。
順便說一下,您還可以Test按如下方式定義您的類:
class Test(tf.keras.Model):
def __init__(self, n_inputs: int, neurons=10):
super(Test, self).__init__(name="Test")
self.neurons = neurons
# Initilializers
mean, std = 0., 0.0005
bias_normalization = None
kernel_initializer = tf.keras.initializers.RandomNormal(mean=mean,
stddev=std)
model_input = tf.keras.layers.Input(shape=(n_inputs,))
x= tf.keras.layers.Dense(n_inputs, activation="linear", name="h1",
kernel_initializer=kernel_initializer,
bias_initializer=bias_normalization)(model_input)
self.model = tf.keras.Model(model_input, x)
test_model = Test(n_inputs=1, neurons=100)
print(test_model.get_weights())
# [array([[0.00045629]], dtype=float32), array([0.9945322], dtype=float32)]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/311546.html
下一篇:年齡和體重的K均值
