КЕРАС: Как явно установить вес слоя Conv2D, используя тензор той же формы, что и вес? - PullRequest
0 голосов
/ 24 января 2019

Я хочу создать слой conv2d, явно указав весовую матрицу слоя (для Conv2D для параметра use_bias установлено значение False). Я пытался сделать это, используя layer.set_weights ([K]), где K является (?, 7, 7, 512, 512) Тензор.

В простом API Tensorflow это, вероятно, можно сделать, передав тензор параметру фильтра в tf.nn.conv2d (input, filter, ..)

Более того, у меня больше проблем, и я должен показать размер пакета в K Tensor, потому что он был создан сетью

По сути, я хочу реализовать гиперсеть, в которой я сгенерировал весовые коэффициенты для указанного выше слоя Conv2D из другой сети в Tensor K. Весовой коэффициент Tensor K имеет форму [высота, ширина, фильтры, каналы]

template= Input(shape=(448,684,3))
hyper_net= VGG16(weights='imagenet', include_top=False, 
input_tensor=None, input_shape=(448,684, 3))

k1= hyper_net(template)

kconv1= hyper_net.get_layer(name='block5_conv1')
config_conv1= kconv1.get_config()
k1conv1 = Conv2D.from_config(config_conv1)(k1)

kconv2= hyper_net.get_layer(name='block5_conv2')
config_conv2= kconv2.get_config()
k1conv2 = Conv2D.from_config(config_conv2)(k1conv1)

k1pool1= MaxPooling2D(pool_size=(2,3))(k1conv2)

k1pool1= Reshape((7,7,512,1))(k1pool1)
print(k1pool1.shape)

K= Conv3D(512, (1,1,1), strides=(1, 1, 1), padding='valid', 
activation=None, use_bias=True, kernel_initializer='he_normal', bias_initializer='zeros', kernel_regularizer=l2(0.01), bias_regularizer=l2(0.01))(k1pool1)


ortho= Input(tensor=tf.convert_to_tensor(O))
base_model = VGG16(weights='imagenet', include_top=False, 
input_tensor=None, input_shape=(1760, 1760, 3))

o1= base_model(ortho)

Oconv1= Conv2D(512, (7, 7), activation='relu', padding='valid',use_bias=False)
Oconv1.set_weights([K])

выдает ошибку как:

ValueError: You called `set_weights(weights)` on layer "conv2d_4" with a  weight list of length 1, but the layer was expecting 0 weights. Provided weights: [<tf.Tensor 'conv3d_9/add:0' shape=(?, 7, 7, 512, ...

1 Ответ

0 голосов
/ 24 января 2019

Я не знаю, как сделать это напрямую из тензора, но вы можете установить веса в Керасе с помощью массива numpy. Таким образом, вы можете преобразовать тензор в массив NumPy и установить его:

sess = tf.InteractiveSession()
weights = K.eval() # Convert tensor to numpy
Oconv1.set_weights(weights) # Set weights of layer

Очевидно, что размеры тензора / numpy-массива и слоя керас должны быть идентичны.

...