Why not all the layer weights equal
:
JavaScript
x
34
34
1
import tensorflow as tf
2
import numpy as np
3
4
model = tf.keras.Sequential([
5
tf.keras.layers.Conv2D(4, kernel_size=3, padding="same",
6
activation="selu", input_shape=(28,28,1)
7
),
8
tf.keras.layers.MaxPool2D(pool_size=2),
9
tf.keras.layers.Conv2D(8, kernel_size=3, padding="same"),
10
tf.keras.layers.Conv2D(16, kernel_size=3, padding="same"),
11
tf.keras.layers.MaxPool2D(pool_size=2),
12
tf.keras.layers.Flatten(),
13
tf.keras.layers.Dense(128, activation='relu'),
14
tf.keras.layers.Dense(10)
15
])
16
17
model.summary()
18
19
a = []
20
b = []
21
22
for layer in model.layers:
23
weights = layer.get_weights()
24
a.append(weights)
25
b.append(weights)
26
27
for index, i in enumerate(a):
28
a_weights = a[index]
29
b_weights = b[index]
30
print("index [ {} ]: a_weights == b_weights: {}".format(
31
index,
32
np.array_equal(a_weights, b_weights)
33
))
34
Here is the output:
JavaScript
1
36
36
1
Model: "sequential_10"
2
_________________________________________________________________
3
Layer (type) Output Shape Param #
4
=================================================================
5
conv2d_15 (Conv2D) (None, 28, 28, 4) 40
6
7
max_pooling2d_15 (MaxPoolin (None, 14, 14, 4) 0
8
g2D)
9
10
conv2d_16 (Conv2D) (None, 14, 14, 8) 296
11
12
conv2d_17 (Conv2D) (None, 14, 14, 16) 1168
13
14
max_pooling2d_16 (MaxPoolin (None, 7, 7, 16) 0
15
g2D)
16
17
flatten_10 (Flatten) (None, 784) 0
18
19
dense_20 (Dense) (None, 128) 100480
20
21
dense_21 (Dense) (None, 10) 1290
22
23
=================================================================
24
Total params: 103,274
25
Trainable params: 103,274
26
Non-trainable params: 0
27
_________________________________________________________________
28
index [ 0 ]: a_weights == b_weights: False
29
index [ 1 ]: a_weights == b_weights: True
30
index [ 2 ]: a_weights == b_weights: False
31
index [ 3 ]: a_weights == b_weights: False
32
index [ 4 ]: a_weights == b_weights: True
33
index [ 5 ]: a_weights == b_weights: True
34
index [ 6 ]: a_weights == b_weights: False
35
index [ 7 ]: a_weights == b_weights: False
36
The a_weights == b_weights
are not all the “True
“.
What’s the problem?
Advertisement
Answer
Notice that the only time a_weights == b_weights
is True
, is when you are referencing a layer, which does not have any weights. np.array_equal
is returning False
because you are actually comparing lists of arrays and not the arrays themselves. Each trainable layer of yours has a kernel weight tensor and bias tensor. So actually your code should look like this:
JavaScript
1
45
45
1
import tensorflow as tf
2
import numpy as np
3
4
model = tf.keras.Sequential([
5
tf.keras.layers.Conv2D(4, kernel_size=3, padding="same",
6
activation="selu", input_shape=(28,28,1)
7
),
8
tf.keras.layers.MaxPool2D(pool_size=2),
9
tf.keras.layers.Conv2D(8, kernel_size=3, padding="same"),
10
tf.keras.layers.Conv2D(16, kernel_size=3, padding="same"),
11
tf.keras.layers.MaxPool2D(pool_size=2),
12
tf.keras.layers.Flatten(),
13
tf.keras.layers.Dense(128, activation='relu'),
14
tf.keras.layers.Dense(10)
15
])
16
17
model.summary()
18
19
a = []
20
b = []
21
22
for layer in model.layers:
23
weights = layer.get_weights()
24
a.append(weights)
25
b.append(weights)
26
27
for index, i in enumerate(a):
28
a_weights = a[index]
29
b_weights = b[index]
30
if a_weights:
31
print("index [ {} ]: kernel: a_weights == b_weights: {}".format(
32
index,
33
np.array_equal(a_weights[0], b_weights[0])
34
))
35
print("index [ {} ]: bias: a_weights == b_weights: {}".format(
36
index,
37
np.array_equal(a_weights[1], b_weights[1])
38
))
39
else:
40
print("index [ {} ]: no layer weights: a_weights == b_weights: {}".format(
41
index,
42
np.array_equal(a_weights, b_weights)
43
))
44
45
JavaScript
1
15
15
1
2
index [ 0 ]: kernel: a_weights == b_weights: True
3
index [ 0 ]: bias: a_weights == b_weights: True
4
index [ 1 ]: no layer weights: a_weights == b_weights: True
5
index [ 2 ]: kernel: a_weights == b_weights: True
6
index [ 2 ]: bias: a_weights == b_weights: True
7
index [ 3 ]: kernel: a_weights == b_weights: True
8
index [ 3 ]: bias: a_weights == b_weights: True
9
index [ 4 ]: no layer weights: a_weights == b_weights: True
10
index [ 5 ]: no layer weights: a_weights == b_weights: True
11
index [ 6 ]: kernel: a_weights == b_weights: True
12
index [ 6 ]: bias: a_weights == b_weights: True
13
index [ 7 ]: kernel: a_weights == b_weights: True
14
index [ 7 ]: bias: a_weights == b_weights: True
15
You could also use a_weights == b_weights
directly.