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

标签 tensorflow machine-learning keras conv-neural-network convolution

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

在简单的 Tensorflow API 中,可能可以通过将张量传递给 tf.nn.conv2d(input, filter,..) 中的过滤器参数来完成

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

基本上,我想实现一个超网络,其中我从张量 K 中的另一个网络生成了上面指定的 Conv2D 层的权重。权重张量 K 的形状为 [高度、宽度、过滤器、 channel ]

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

最佳答案

在具有急切执行功能的 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])

关于tensorflow - KERAS:如何使用与权重所需形状相同的张量显式设置 Conv2D 层的权重?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54346599/

相关文章:

python - 使用 numpy 数组的 Keras 内核初始化无法使用 load_model

machine-learning - 解释随机森林模型结果

python - "max_q_size"中使用的参数 "model.fit_generator"是什么?

python - 简单线性回归在 tensorflow 中未能收敛

python - 如何使用由 "tensorflow.keras"构建的两层基本 CNN 算法来编码残差 block ?

python - Keras ImageDataGenerator 中的增强

python - 如何使用 AdaBoost 提升基于 Keras 的神经网络?

machine-learning - 使用神经网络近似 Q 函数的奖励函数

python - 为什么我在 Keras 中得到负的 false_negative 计数(例如 -10)?

python - 为什么我的损失趋于下降,而我的准确度却趋于零?