Получите доступ к матрице весов в Tensorflow, чтобы внести изменения в нее в Numpy - PullRequest
0 голосов
/ 08 октября 2018

Мне нужен способ иметь доступ к матрице весов в 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})

У меня есть фильтр 5 * 5 с именем my_filter, и яЯ хочу, чтобы все его элементы были обучены, за исключением одного из них, например, для элемента (1,1), и мне нужно, чтобы последний элемент определялся остальными элементами.Это должно быть сделано в каждой итерации.Это именно то, где моя проблема.Я знаю, как получить доступ к матрице весов после окончания обучения, но я не знаю, как это сделать в каждой итерации.

В своем коде я сначала вычислил градиенты, затем внес изменения изатем применили градиенты.Но проблема в том, что градиенты - это кортежи типов, например тензор, с которыми нелегко работать в Numpy.Мне нужен какой-то метод для преобразования этих данных в более привычные типы Numpy.

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Слои Keras и слои tf.keras.layers поддерживают методы get_weights / set_weights, которые возвращают множество массивов для весов.Таким образом, вы можете вызвать get_weights, изменить результат в numpy и вызвать set_weights обратно, чтобы поместить новые значения numpy в тензор потока.

Примерно так:

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)
0 голосов
/ 08 октября 2018

Для этого вам нужно будет иметь доступ к весам.Вместо определения слоя с помощью 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...