我想通过显式定义图层的权重矩阵来创建conv2d图层(Conv2D的use_bias参数设置为False)。我一直在尝试使用layer.set_weights([K])做到这一点,其中K是(?,7,7,512,512)张量。
在简单的Tensorflow API中,可能可以通过在tf.nn.conv2d(input,filter,..)中传递张量filter参数来完成
此外,我还有更多问题,我表明我应该解决K张量中的批次尺寸问题,因为它是由网络生成的
基本上我想实现一个超网络,其中我已经从张量K中的另一个网络生成了上面指定的Conv2D层的权重。权重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, ...
答案 0 :(得分:1)
在渴望执行的Tensorflow 2.0中,您可以执行以下一项操作:
1)您可以在使用build
方法之前在Oconv1
上调用set_weights
方法。您将得到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
伪指令传递到Conv2D
构造函数中。
Oconv1= Conv2D(512, (7, 7), activation='relu', padding='valid',use_bias=False,weights=[K])
答案 1 :(得分:0)
我不知道如何直接从张量执行此操作,但是您可以使用numpy数组在Keras中设置权重。因此,您可以将张量转换为numpy数组,然后进行设置:
sess = tf.InteractiveSession()
weights = K.eval() # Convert tensor to numpy
Oconv1.set_weights(weights) # Set weights of layer
显然,张量/ numpy数组和keras层的尺寸必须相同。