Tensorflow KERAS:如何使用与权重要求形状相同的张量显式设置Conv2D层的权重?

Tensorflow KERAS:如何使用与权重要求形状相同的张量显式设置Conv2D层的权重?,tensorflow,machine-learning,keras,conv-neural-network,convolution,Tensorflow,Machine Learning,Keras,Conv Neural Network,Convolution,我想通过显式定义层的权重矩阵(conv2d的use_bias参数设置为False)来创建一个conv2d层。我一直在尝试使用layer.set_weights([K]),其中K是(?,7,7,512,512)张量 在简单的Tensorflow API中,可以通过将tensor传递给tf.nn.conv2d(输入,过滤器,…)中的过滤器参数来实现 此外,我还有更多的问题,我应该在K张量中处理批处理维度,因为它是由网络生成的 基本上,我想实现一个超网络,在这个超网络中,我从张量K中的另一个网络生成了

我想通过显式定义层的权重矩阵(conv2d的use_bias参数设置为False)来创建一个conv2d层。我一直在尝试使用layer.set_weights([K]),其中K是(?,7,7,512,512)张量

在简单的Tensorflow API中,可以通过将tensor传递给tf.nn.conv2d(输入,过滤器,…)中的过滤器参数来实现

此外,我还有更多的问题,我应该在K张量中处理批处理维度,因为它是由网络生成的

基本上,我想实现一个超网络,在这个超网络中,我从张量K中的另一个网络生成了上面指定的Conv2D层的权重。权重张量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, ...

ValueError:您使用长度为1的权重列表在层“conv2d_4”上调用了“set_weights(weights)”,但该层预期的权重为0。提供的权重:[我不知道如何直接从张量进行设置,但您可以使用numpy数组在Keras中设置权重。因此,您可以将张量转换为numpy数组,然后进行设置:

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

显然,tensor/numpy数组和keras层的尺寸必须相同。

在Tensorflow 2.0中,您可以执行以下操作之一:

1) 在使用
set_weights
方法之前,您可以在
Oconv1
上调用
build
方法。由于层中的权重变量尚未初始化,因此层在构建之前无法通过
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])

什么是K中的
。它应该是
4
dims。?表示批次维度,因为K张量是网络的输出,在定义权重时不需要批次大小。它具有以下dims
(内核、内核、输入通道、输出通道)
。是的。这就是我试图处理批处理维度的原因。这样,通过执行您所说的操作,可以将单独网络(具有批处理维度)生成的权重更改为(内核、内核、输入\ u通道、输出\通道),它要求tf.placeholder对象运行eval()。我无法提供占位符张量,因为它是输入到我的模型中的,该模型将作为培训数据。这是错误:InvalidArgumentError:您必须为占位符张量“Input_1”输入一个值,其中包含dtype float和shape[?,448684,3]所以你不想基于张量初始化权重,你想在线更新它们吗?基于一些外部模型?我认为你需要添加更多的代码来澄清…嘿,马克,首先我想感谢你。我添加了更多的代码。其次是的,我想通过另一个模型生成权重,然后将输出重塑为t的权重he Oconv1层