簡體   English   中英

KERAS:如何使用權重所需的形狀相同的張量顯式設置 Conv2D 層的權重?

[英]KERAS: How to set weights of Conv2D Layer explicitly using a tensor of same shape as required by weights?

我想通過顯式定義層的權重矩陣來創建 conv2d 層(Conv2D 的 use_bias 參數設置為 False)。 我一直在嘗試使用 layer.set_weights([K]) 來做到這一點,其中 K 是 (?, 7, 7, 512, 512) 張量。

在簡單的 Tensorflow API 中,它可能可以通過在 tf.nn.conv2d(input, filter,..)

此外,我還有更多問題,我應該展示我是否應該解決 K 張量中的批量維度,因為它是由網絡生成的

基本上我想實現一個超網絡,其中我已經從 Tensor 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, ...

在具有急切執行的 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 kwarg 傳入Conv2D構造函數。

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

我不知道如何直接從張量中做到這一點,但是您可以使用 numpy 數組在 Keras 中設置權重。 所以你可以將張量轉換為一個 numpy 數組,然后設置它:

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

顯然,張量/numpy-array 和 keras 層的維度必須相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM