首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Tensorflow 2中获取Conv2D内核值

如何在Tensorflow 2中获取Conv2D内核值
EN

Stack Overflow用户
提问于 2021-12-19 17:44:26
回答 1查看 743关注 0票数 2

问题

我有一个Conv2D层:

代码语言:javascript
运行
复制
l0 = tf.keras.layers.Conv2D(1, 3, activation=None, input_shape=(36,36,3))

我想找出所使用的过滤器/内核矩阵中的确切值(而不仅仅是它们的数目)。如何访问内核矩阵值?

解决尝试

代码语言:javascript
运行
复制
import tensorflow as tf
import numpy as np

我创建了一个numpy数组:

代码语言:javascript
运行
复制
x_core = np.array([[1,0,0,1],
                   [0,0,0,0],
                   [0,0,0,0],
                   [1,0,0,1]],dtype=float)

将其转换为形状(1,4,4,1)张量:

代码语言:javascript
运行
复制
x = tf.expand_dims(tf.expand_dims(tf.convert_to_tensor(x_core),axis=0),axis=3)

使用Conv2D对其应用strides=(2,2)层。这意味着输出将是2乘2矩阵,其中的左上角值将等于核矩阵中的左上角值,结果的右上角将等于核矩阵的右上角,等等。( x_core中的特定零和1实现了这一点。)

代码语言:javascript
运行
复制
y = tf.keras.layers.Conv2D(1, 2, strides=(2,2), activation=None, input_shape=x.shape[1:])(x)

但是,如果我重新运行代码(即过滤器不是常数),y会发生变化,这意味着内核矩阵是从一个分布中提取的。

类似问题

类似但不同的问题:How to get CNN kernel values in Tensorflow -这种方法只适用于Tensorflow 1。

  • gr = tf.get_default_graph()给出AttributeError: module 'tensorflow' has no attribute 'get_default_graph'

如果我将

  • 替换为Graph (因为我认为这是较新的等价物),那么将name="conv1"放在我的层定义中:conv_layer_1 = tf.keras.layers.Conv2D(1, 2, strides=(2,2), activation=None, input_shape=x.shape[1:],name="conv1")然后按建议运行conv1_kernel_val = tf.Graph().get_tensor_by_name('conv1/kernel:0').eval(),I get:

KeyError:“名称‘卷积1/内核:0’指不存在的张量。图中不存在‘卷积1/内核’操作。”

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-19 17:58:01

代码语言:javascript
运行
复制
import tensorflow as tf

input_shape = (4, 28, 28, 3)
x = tf.random.normal(input_shape)
model = tf.keras.layers.Conv2D(2, 3, activation='relu', input_shape=input_shape[1:])
y = model(x)
print(model.kernel)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70413900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档