在卷积层CNN上更改过滤器-Python/TensorFlow

在卷积层CNN上更改过滤器-Python/TensorFlow,python,python-2.7,tensorflow,convolution,Python,Python 2.7,Tensorflow,Convolution,我有以下代码块: def new_weights(shape): return tf.Variable(tf.truncated_normal(shape, stddev=0.05)) 以及: 因此,我们可以观察到过滤器的尺寸为3x3,过滤器的数量为8。滤波器是用随机值定义的 我需要做的是用固定值定义我的所有8个过滤器,即预定值,例如: weigths = [ [[0, 1, 0,],[0, -1, 0,],[0, 0, 0,],], [[0, 0, 1,],[0

我有以下代码块:

def new_weights(shape):
    return tf.Variable(tf.truncated_normal(shape, stddev=0.05))
以及:

因此,我们可以观察到过滤器的尺寸为3x3,过滤器的数量为8。滤波器是用随机值定义的

我需要做的是用固定值定义我的所有8个过滤器,即预定值,例如:

weigths = [
    [[0,  1, 0,],[0, -1, 0,],[0,  0, 0,],],
    [[0,  0, 1,],[0, -1, 0,],[0,  0, 0,],],
    [[0,  0, 0,],[0, -1, 1,],[0,  0, 0,],],
    [[0,  0, 0,],[0, -1, 0,],[0,  0, 1,],],
    [[0,  0, 0,],[0, -1, 0,],[0,  1, 0,],],
    [[0,  0, 0,],[0, -1, 0,],[1,  0, 0,],], 
    [[0,  0, 0,],[1, -1, 0,],[0,  0, 0,],],
    [[1,  0, 0,],[0, -1, 0,],[0,  0, 0,],]
]
我无法想象,我怎么能在我的代码里做这个修改,有人知道我怎么做吗


提前非常感谢

您只需将权重定义为不可训练,并将新权重定义为:

new_weights = tf.Variable( tf.reshape(weights, (3,3,1,8)),trainable=False)
# then apply on the inputs 
layer = tf.nn.conv2d(inputs, filter=new_weights, strides=[1, 1, 1, 1], padding='SAME')

如果您想通过某个预定义值初始化权重,可以使用
tf.constant\u初始值设定项
。如果不想训练此权重,可以将其定义为
tf.constant
not
tf.Variable

def new_weights(init_vaue, is_const):
    if (is_const) :
        return tf.constant(init_vaue, name='weights')
    else:
        initializer = tf.constant_initializer(init_vaue)
        return tf.get_variable('weights', shape = init_vaue.shape, initializer=initializer)

weights = np.ones([3,3,1,8], dtype=np.float)
print(weights.shape)

value = new_weights(weights, True)
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    value_ = sess.run(value) 
    print(value_)

以下是在TF2中执行此操作的方法:

model=models.Sequential()
#一个3x3过滤器
添加(layers.Conv2D(1,(3,3),input_shape=(无,无,1)))
#访问目标层
图层=模型。图层[0]
current_w,current_bias=图层。获取_权重()#查看当前权重
new_w=tf.常数([[1,2,3],
[4, 5, 6],
[7, 8, 9]])
new_w=tf.重塑(new_w,custom_w.形状)#固定形状
新偏差=tf.常数([0])
层。设置权重([new\u w,new\u bias])
model.summary()
#让我想想。。
tf.print(model.layers[0]。获取权重()

我不明白,你能解释更多吗?我这样做了,得到了以下错误:“Conv2D”Op的输入“filter”的类型float64与参数“Input”的类型float32不匹配。将权重转换为float32,tf.Variable(tf.reforme(tf.Cast(weights,tf.float32)、(3,3,1,8)),trainable=False),这样做,不再使用def新权重(形状):?我真的不知道我是否正确设置了结构…Ups,对不起。修复它。但是我在哪里设置我的8个过滤器?在new_weights()中,您应该将line
weights=np.ones([3,3,1,8],dtype=np.float)
更改为一些代码,以填充
weights
数组。
def new_weights(init_vaue, is_const):
    if (is_const) :
        return tf.constant(init_vaue, name='weights')
    else:
        initializer = tf.constant_initializer(init_vaue)
        return tf.get_variable('weights', shape = init_vaue.shape, initializer=initializer)

weights = np.ones([3,3,1,8], dtype=np.float)
print(weights.shape)

value = new_weights(weights, True)
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    value_ = sess.run(value) 
    print(value_)