很容易找出问题所在。如果你显示来自model.layers 的结果,你会看到每一层都是一个对象类型
[<tensorflow.python.keras.engine.input_layer.InputLayer object at 0x7f550fc09510>, <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f550f0c8ed0>, <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f550ed32fd0>, <tensorflow.python.keras.layers.pooling.MaxPooling2D object at 0x7f550eca3b10>, <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f550ecb5c10>, <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f550ecc3ad0>, <tensorflow.python.keras.layers.pooling.MaxPooling2D object at 0x7f550ecd6910>, <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f550ec5d190>, <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f550ec69850>, <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f550ec7a6d0>, <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f550ec7a850>, <tensorflow.python.keras.layers.pooling.MaxPooling2D object at 0x7f550ec1aed0>, <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f550ec220d0>, <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f550ec2cbd0>, <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f550ed5b110>, <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f5516559210>, <tensorflow.python.keras.layers.pooling.MaxPooling2D object at 0x7f5516558810>, <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f550ec54b90>, <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f550ebdbe10>, <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f550ebedf90>, <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f550ebfe7d0>, <tensorflow.python.keras.layers.pooling.MaxPooling2D object at 0x7f550ec11790>]
当您通过 VGG19_layers[n_layer][0]0[0][0] 对它们进行索引时,您无法获得它。您应该将 VGG19_layers[n_layer].weights() 替换为权重,而将 VGG19_layers[n_layer].bias() 替换为。
详情VGG19_layers[1].weights[0][0] 是权重的索引。您可以自己动手解决您的问题。
<tf.Variable 'block1_conv1/kernel:0' shape=(3, 3, 3, 64) dtype=float32>
此外,VGG19_layers[0] 将是没有权重和偏差的输入层。因此,你应该从[1]开始你的层,而不是[0]
VGG19_layers[0].weights "results": []
当我检查您的代码时,看起来您正试图保持卷积层的权重并将其传递给 relu。然后,不要像您所做的那样对权重进行切片,您应该将整个权重复制到您创建的新卷积的过滤器中。为此,我建议您使用 tf2.x。当您检查 tf2.x 中权重层的值时,它们会为您提供该过滤器的矩阵,您可以通过以下方式调用它
weights = tf.constant(VGG19_layers[1].weights[0].numpy())
根据their requirement 的过滤器是一个 4d 张量
那么你只需要传递给卷积
conv2d = tf.nn.conv2d(x, filters=weights, strides=[1, 1, 1, 1], padding='SAME')
The output is ok: `<tf.Tensor: shape=(1, 5, 5, 64), dtype=float32, numpy=
array([[[[-4.9203668e+00, 3.2815304e-01, 1.2678468e-01, ...,
-1.8555930e+00, 1.6412614e-01, -7.1041006e-01],
[-5.3053970e+00, 6.5529823e-01, 8.3891630e-01, ...,
-3.1440034e+00, 2.6984088e+00, 1.3087101e+00],
[-3.3932714e+00, 8.7002671e-01, 1.2363169e+00, ...,
-2.6702189e+00, 4.4932485e+00, 2.9435217e+00],
[-5.1859131e+00, 3.8122973e-01, 2.3676270e-01, ...,
....`
与tf.nn.bias_add 相同的操作