从TensorFlow变量中提取值:训练后获取神经网络值的问题
解决TensorFlow神经网络训练后提取参数的问题
嘿,作为Python和TensorFlow新手,训练完神经网络后想提取里面的权重或其他参数确实容易摸不着头脑——我来帮你搞定这个问题!
首先得明确:在你用的TensorFlow 1.x版本里,所有变量都是计算图的一部分,只有在会话(tf.Session)的上下文环境中,才能获取到变量的实际数值(因为TF是惰性执行的,不跑会话就不会真正计算变量的值)。
先补全你的代码并添加提取逻辑
我先把你没写完的神经网络模型和训练代码补完整,同时加入参数提取的关键步骤:
import tensorflow as tf import numpy as np import input_data mnist = input_data.read_data_sets("/tmp/data/", one_hot=True) n_nodes_hl1 = 50 n_nodes_hl2 = 50 n_classes = 10 batch_size = 128 x = tf.placeholder('float', [None, 784]) y = tf.placeholder('float') def neural_network_model(data): # 定义各层的权重和偏置,第一层权重加了name方便后续获取 hidden_1_layer = {'weights': tf.Variable(tf.random_normal([784,n_nodes_hl1]), name='weights1'), 'biases': tf.Variable(tf.random_normal([n_nodes_hl1]))} hidden_2_layer = {'weights': tf.Variable(tf.random_normal([n_nodes_hl1,n_nodes_hl2])), 'biases': tf.Variable(tf.random_normal([n_nodes_hl2]))} output_layer = {'weights': tf.Variable(tf.random_normal([n_nodes_hl2,n_classes])), 'biases': tf.Variable(tf.random_normal([n_classes]))} # 计算各层输出 l1 = tf.add(tf.matmul(data, hidden_1_layer['weights']), hidden_1_layer['biases']) l1 = tf.nn.relu(l1) l2 = tf.add(tf.matmul(l1, hidden_2_layer['weights']), hidden_2_layer['biases']) l2 = tf.nn.relu(l2) output = tf.matmul(l2, output_layer['weights']) + output_layer['biases'] # 可选:把各层权重也返回,方便后续直接引用 return output, hidden_1_layer['weights'], hidden_2_layer['weights'], output_layer['weights'] def train_neural_network(x): # 获取模型输出和各层权重变量 prediction, hl1_weights_var, hl2_weights_var, output_weights_var = neural_network_model(x) cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction, labels=y)) optimizer = tf.train.AdamOptimizer().minimize(cost) hm_epochs = 10 with tf.Session() as sess: # 初始化所有变量 sess.run(tf.global_variables_initializer()) # 训练过程 for epoch in range(hm_epochs): epoch_loss = 0 for _ in range(int(mnist.train.num_examples/batch_size)): epoch_x, epoch_y = mnist.train.next_batch(batch_size) _, c = sess.run([optimizer, cost], feed_dict={x: epoch_x, y: epoch_y}) epoch_loss += c print(f'Epoch {epoch+1} completed out of {hm_epochs}, loss: {epoch_loss:.2f}') # -------------------------- 核心:提取参数的部分 -------------------------- # 方法1:直接用函数返回的变量引用提取 hl1_weights = sess.run(hl1_weights_var) print(f'第一层权重的形状:{hl1_weights.shape}') # 应该是(784, 50) # 方法2:通过变量名提取(适合你没保存变量引用的情况) hl1_weights_by_name = sess.run(tf.get_variable('weights1')) # 提取后可以保存成numpy文件,方便后续使用 np.save('hl1_weights.npy', hl1_weights) # 可选:验证模型准确率 correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1)) accuracy = tf.reduce_mean(tf.cast(correct, 'float')) print(f'Test Accuracy: {accuracy.eval({x: mnist.test.images, y: mnist.test.labels}):.4f}') # 启动训练 train_neural_network(x)
关键知识点梳理
- 必须在会话中操作:所有变量的数值只有在
tf.Session()的上下文里才能被获取,因为TensorFlow的计算图是“先定义后执行”的,会话才是执行计算的环境。 - 两种提取方式:
- 从模型函数中返回变量引用,直接用
sess.run(变量)获取值,这种方式更直观,不容易出错。 - 给变量设置
name参数,用tf.get_variable('变量名')获取引用后再运行,适合变量定义在函数内部、外部无法直接访问的场景。
- 从模型函数中返回变量引用,直接用
- 提取结果是NumPy数组:
sess.run()返回的是标准NumPy数组,你可以直接打印、保存或者做后续的分析、可视化。
内容的提问来源于stack exchange,提问作者Mario Alessandro Napoli
相关产品推荐
相关产品推荐

