我需要一种在每次迭代中都可以访问TensorFlow或Keras中的权重矩阵的方法,以便可以将其转换为可以在Numpy中使用的格式,以对其执行某些操作,然后将其发送回TensorFlow。
例如,我想更改过滤器,以使某些神经元由过滤器的其他神经元指定。它们必须作为线性系统的解决方案而获得,而其他神经元作为其系数,而不是通过学习过程来获得。由于我在TensorFlow或Keras中找不到实现此目的的方法,因此我必须使用Numpy。
我发现许多标题相同或相似的问题,但没有一个有帮助。我将不胜感激。
编辑 让我更清楚地说明问题 考虑以下代码
import tensorflow as tf
import numpy as np
x = tf.placeholder(tf.float32, (1, 5, 5, 1))
y = tf.placeholder(tf.float32, (1))
# create variable
weights = {
"my_filter": tf.Variable(tf.truncated_normal([3, 3, 1, 1]), name="my_filter"),
"f_c": tf.Variable(tf.truncated_normal([25,1]), name="f_c") }
conv = tf.nn.conv2d(x, weights["my_filter"], [1,1,1,1], padding='SAME')
flatten= tf.reshape(conv,[1,25])
logits= tf.matmul(flatten,weights["f_c"])
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits,labels= y))
optmize = tf.train.AdamOptimizer()
grads_and_vars = optmize.compute_gradients(cost)
#In this part before applying gradient I have to apply some complicated mathematical operation
train_op=optmize.apply_gradients(grads_and_vars)
train_epochs=10
input_x = np.arange(25).reshape([1,5,5,1])
input_y = np.arange(1)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for epoch in range(train_epochs):
sess.run(train_op, feed_dict={x: input_x, y: input_y})
我有一个名为my_filter的5 * 5过滤器,并且我希望除其中一个以外的所有其他元素都得到训练,例如(1,1)元素,而我需要后者由其他元素确定元素网。这必须在每次迭代中完成。这正是我的问题所在。我知道训练结束后如何访问权重矩阵,但是我不知道如何在每次迭代中做到这一点。
在我的代码中,我首先计算了渐变,然后进行了更改,然后应用了渐变。但是问题在于,对于例如张量而言,梯度是类型的元组,在Numpy中不容易使用。我需要一些方法将这些数据转换为更熟悉的Numpy类型。
答案 0 :(得分:0)
为此,您将需要能够访问砝码。无需使用自动分配变量的tf.layers定义图层,您可以首先自己获取一个变量,然后调用tf.nn。
# input
x = tf.placeholder(tf.float32, (1, 5, 5, 1))
dummy_input = np.arange(25).reshape([1,5,5,1])
# create variable
w = tf.get_variable('weight',[3,3,1,1])
# assign the variable to layer e.g. conv
y = tf.nn.conv2d(x, w, [1,1,1,1], padding='SAME')
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
# read the weight
random_weight = sess.run(w, feed_dict={x:dummy_input})
print('random weight', random_weight)
# create some new values for weight
new_weight = np.arange(9).reshape([3,3,1,1])
# load it into the variable
w.load(new_weight,sess)
# read back and print to verify
new_weight = sess.run(w, feed_dict={x:dummy_input})
print('new weight', new_weight)
答案 1 :(得分:0)
Keras图层和tf.keras.layers图层支持get_weights / set_weights方法,这些方法返回权重的numpy数组。因此,您可以调用get_weights,在numpy中修改结果,然后再调用set_weights将新的numpy值放入tensorflow中。
类似这样的东西:
model = tf.keras.Sequential(...)
for batch in data:
model.fit(batch)
if ...:
weights_as_numpy = model.get_weights()
# modify the weights
model.set_weights(weights_as_numpy)