KERAS:如何使用与权重所需形状相同的Tensor显式设置Conv2D层的权重?

iaqfqrcu  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(202)

我想通过显式定义层的权重矩阵来创建conv2D层(Conv2D将use_bias参数设置为False)。我一直在尝试使用layer.set_weights([K])来实现此目的,其中K是(?,7,7,512,512)Tensor。
在简单的Tensorflow API中,可以通过将Tensor传递给tf.nn.conv2d(input,filter,...)中的过滤器参数来完成此操作。
此外,我有更多的问题,我表明我应该解决在KTensor的批维,因为它已由网络生成
基本上,我想要实现一个超网络,其中我已经从TensorK中的另一个网络生成了上面指定的Conv2D层的权重。权重TensorK具有形状[高度、宽度、过滤器、通道]

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, ...
eni9jsuy

eni9jsuy1#

在具有即时执行功能的Tensorflow 2.0中,您可以执行以下操作之一:
1)在使用set_weights方法之前,您可以在Oconv1上调用build方法。您将获得ValueError,因为层中的权重变量尚未初始化,因此在构建之前,层无法通过set_weights接受任何权重。

Oconv1= Conv2D(512, (7, 7), activation='relu', padding='valid',use_bias=False)
input_shape = tf.TensorShape([None, h, w, c])  # to define h, w, c based on shape of layer input
Oconv1.build(input_shape)
Oconv1.set_weights([K])

2)您也可以将weights kwarg传入Conv2D建构函式。

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

ncecgwcz2#

我不知道如何直接从Tensor中进行计算,但你可以用一个numpy数组来设置Keras中的权重,所以你可以将Tensor转换成一个numpy数组,然后设置它:

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

显然,Tensor/数值阵列和keras层的维数必须相同。

相关问题