Let's say you have a basic convolutional neural network like this:
import tensorflow as tf
import numpy as np
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(filters=16, kernel_size=(3, 3),
strides=(1, 1), activation='relu'),
tf.keras.layers.MaxPool2D(pool_size=(2, 2)),
tf.keras.layers.Conv2D(filters=32, kernel_size=(3, 3),
strides=(1, 1), activation='relu'),
tf.keras.layers.MaxPool2D(pool_size=(2, 2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dropout(5e-1),
tf.keras.layers.Dense(10, activation='softmax')
])
All the convolutional layers will, by default, have the name 'conv2d...' something.
list(map(lambda x: x.name, model.layers))
['conv2d_19',
'max_pooling2d_19',
'conv2d_20',
'max_pooling2d_20',
'flatten_8',
'dense_16',
'dropout_8',
'dense_17']
Using that, you can iterate through all the convolutional layers.
for layer in filter(lambda x: 'conv2d' in x.name, model.layers):
print(layer)
<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x00000295BE4EB048>
<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x00000295C1617448>
For all these layers, you can obtain the weights shape, and the bias shape.
for layer in filter(lambda x: 'conv' in x.name, model.layers):
weights_shape, bias_shape = map(lambda x: x.shape, layer.get_weights())
Then you can use layer.set_weights() with the values you want, since you know the correct shape. Let's say 0.12345. Let's do that with np.full, which fills an array of the specified shape with any value you want.
for layer in filter(lambda x: 'conv2d' in x.name, model.layers):
weights_shape, bias_shape = map(lambda x: x.shape, layer.get_weights())
layer.set_weights([np.full(weights_shape, 0.12345),
np.full(bias_shape, 0.12345)])
The weights now:
[array([[[[0.12345, 0.12345, 0.12345, ..., 0.12345, 0.12345, 0.12345],
[0.12345, 0.12345, 0.12345, ..., 0.12345, 0.12345, 0.12345],
[0.12345, 0.12345, 0.12345, ..., 0.12345, 0.12345, 0.12345],
...,
[0.12345, 0.12345, 0.12345, ..., 0.12345, 0.12345, 0.12345],
[0.12345, 0.12345, 0.12345, ..., 0.12345, 0.12345, 0.12345],
[0.12345, 0.12345, 0.12345, ..., 0.12345, 0.12345, 0.12345]]]],
dtype=float32),
array([0.12345, 0.12345, 0.12345, 0.12345, 0.12345, 0.12345, 0.12345,
0.12345, 0.12345, 0.12345, 0.12345, 0.12345, 0.12345, 0.12345,
0.12345, 0.12345, 0.12345, 0.12345, 0.12345, 0.12345, 0.12345,
0.12345, 0.12345, 0.12345, 0.12345, 0.12345, 0.12345, 0.12345,
0.12345, 0.12345, 0.12345, 0.12345], dtype=float32)]
Fully copy/pastable example:
import tensorflow as tf
import numpy as np
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(filters=16, kernel_size=(3, 3),
strides=(1, 1), activation='relu'),
tf.keras.layers.MaxPool2D(pool_size=(2, 2)),
tf.keras.layers.Conv2D(filters=32, kernel_size=(3, 3),
strides=(1, 1), activation='relu'),
tf.keras.layers.MaxPool2D(pool_size=(2, 2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dropout(5e-1),
tf.keras.layers.Dense(10, activation='softmax')
])
model.build(input_shape=(None, 28, 28, 1))
for layer in filter(lambda x: 'conv2d' in x.name, model.layers):
weights_shape, bias_shape = map(lambda x: x.shape, layer.get_weights())
layer.set_weights([np.full(weights_shape, 0.12345),
np.full(bias_shape, 0.12345)])