Я пытаюсь извлечь вес из модели после тренировки. Вот игрушечный пример

import tensorflow as tf
import numpy as np

X_ = tf.placeholder(tf.float64, [None, 5], name="Input")
Y_ = tf.placeholder(tf.float64, [None, 1], name="Output")

X = ...
Y = ...
with tf.name_scope("LogReg"):
    pred = fully_connected(X_, 1, activation_fn=tf.nn.sigmoid)
    loss = tf.losses.mean_squared_error(labels=Y_, predictions=pred)
    training_ops = tf.train.GradientDescentOptimizer(0.01).minimize(loss)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(200):
        sess.run(training_ops, feed_dict={
            X_: X,
            Y_: Y
        })
        if (i + 1) % 100 == 0:
            print("Accuracy: ", sess.run(accuracy, feed_dict={
                X_: X,
                Y_: Y
            }))

# Get weights of *pred* here

Я посмотрел на Получить весовые коэффициенты из модели тензорного потока и в документации, но не можете найти способ чтобы получить значение весов.

Итак, в примере с игрушкой, предположим, что X_ имеет форму (1000, 5), как я могу получить 5 значений в весах 1 слоя после

8
dbokers 1 Апр 2017 в 18:23

2 ответа

Лучший ответ

В вашем коде есть некоторые проблемы, которые необходимо исправить:

1- Вам необходимо использовать variable_scope вместо name_scope в следующей строке (пожалуйста, обратитесь к документации TensorFlow для различия между ними):

with tf.name_scope("LogReg"):

2. Чтобы потом получить переменную в коде, вам нужно знать ее имя. Итак, вам нужно присвоить имя переменной, представляющей интерес (если вы не поддерживаете ее, будет назначено имя по умолчанию, но тогда вам нужно выяснить, что это такое!):

pred = tf.contrib.layers.fully_connected(X_, 1, activation_fn=tf.nn.sigmoid, scope = 'fc1')

Теперь давайте посмотрим, как вышеуказанные исправления могут помочь нам получить значение переменной. Каждый слой имеет два типа переменных: веса и смещения. В следующем фрагменте кода (ваша модифицированная версия) я покажу только, как получить веса для полностью связанного слоя:

X_ = tf.placeholder(tf.float64, [None, 5], name="Input")
Y_ = tf.placeholder(tf.float64, [None, 1], name="Output")

X = np.random.randint(1,10,[10,5])
Y = np.random.randint(0,2,[10,1])

with tf.variable_scope("LogReg"):
    pred = tf.fully_connected(X_, 1, activation_fn=tf.nn.sigmoid, scope = 'fc1')
    loss = tf.losses.mean_squared_error(labels=Y_, predictions=pred)
    training_ops = tf.train.GradientDescentOptimizer(0.01).minimize(loss)

with tf.Session() as sess:

    all_vars= tf.global_variables()
    def get_var(name):
        for i in range(len(all_vars)):
            if all_vars[i].name.startswith(name):
                return all_vars[i]
        return None
    fc1_var = get_var('LogReg/fc1/weights')

    sess.run(tf.global_variables_initializer())    
    for i in range(200):
        _,fc1_var_np = sess.run([training_ops,fc1_var], feed_dict={
        X_: X,
        Y_: Y 
        })
        print fc1_var_np
12
Ali 2 Фев 2018 в 11:24

Попробуйте с этим:

with tf.Session() as sess:
    last_check = tf.train.latest_checkpoint(tf_data)
    saver = tf.train.import_meta_graph(last_check+'.meta')
    saver.restore(sess,last_check)
    ######
    Model_variables = tf.GraphKeys.MODEL_VARIABLES
    Global_Variables = tf.GraphKeys.GLOBAL_VARIABLES
    ######
    all_vars = tf.get_collection(Model_variables)
    # print (all_vars)
    for i in all_vars:
        print (str(i) + '  -->  '+ str(i.eval()))

Я получил это:

<tf.Variable 'linear/linear_model/DOLocationID/weights/part_0:0' shape=(1, 1) dtype=float32_ref>  -->  [[-0.00912262]]
<tf.Variable 'linear/linear_model/PULocationID/weights/part_0:0' shape=(1, 1) dtype=float32_ref>  -->  [[ 0.00573495]]
<tf.Variable 'linear/linear_model/passenger_count/weights/part_0:0' shape=(1, 1) dtype=float32_ref>  -->  [[-0.07072949]]
<tf.Variable 'linear/linear_model/trip_distance/weights/part_0:0' shape=(1, 1) dtype=float32_ref>  -->  [[ 2.59973669]]
<tf.Variable 'linear/linear_model/bias_weights/part_0:0' shape=(1,) dtype=float32_ref>  -->  [ 4.27982235]
0
Julio CamPlaz 13 Мар 2018 в 16:46