【tensorflow】打印Tensorflow graph中的所有需要训练的变量--tf.trainable_variables()

一般来说,打印tensorflow变量的函数有两个:
tf.trainable_variables () 和 tf.all_variables()
不同的是:
tf.trainable_variables () 指的是需要训练的变量
tf.all_variables() 指的是所有变量

一般而言,我们更关注需要训练的训练变量:
值得注意的是,在输出变量名时,要对整个graph进行初始化

一、打印需要训练的变量名称

variable_names = [v.name for v in tf.trainable_variables()]
print(variable_names)

二、打印需要训练的变量名称和变量值

variable_names = [v.name for v in tf.trainable_variables()]
values = sess.run(variable_names)<
帮我整段修改一下,改成TensorFlow2.11版本可用的:“ def TGCN(_X, _weights, _biases): ### cell_1 = tgcnCell(cell=custom_cell,gru_units=gru_units, adj=adj, num_nodes=num_nodes) cell = tf.nn.rnn_cell.MultiRNNCell([cell_1], state_is_tuple=True) _X = tf.unstack(_X, axis=1) outputs, states = tf.nn.static_rnn(cell, _X, dtype=tf.float32) m = [] for i in outputs: o = tf.reshape(i,shape=[-1,num_nodes,gru_units]) o = tf.reshape(o,shape=[-1,gru_units]) m.append(o) last_output = m[-1] output = tf.matmul(last_output, _weights['out']) + _biases['out'] output = tf.reshape(output,shape=[-1,num_nodes,pre_len]) output = tf.transpose(output, perm=[0,2,1]) output = tf.reshape(output, shape=[-1,num_nodes]) return output, m, states ###### placeholders ###### # 使用 tf.placeholder inputs = tf.compat.v1.placeholder(tf.float32, shape=[None, seq_len, num_nodes]) labels = tf.compat.v1.placeholder(tf.float32, shape=[None, pre_len, num_nodes]) # Graph weights weights = { 'out': tf.Variable(tf.random.normal([gru_units, pre_len], mean=1.0), name='weight_o')} biases = { 'out': tf.random.normal(shape=[pre_len],name='bias_o')} if model_name == 'tgcn': pred,ttts,ttto = TGCN(inputs, weights, biases) y_pred = pred ###### optimizer ###### lambda_loss = 0.0015 Lreg = lambda_loss * sum(tf.nn.l2_loss(tf_var) for tf_var in tf.trainable_variables()) label = tf.reshape(labels, [-1,num_nodes]) ##loss loss = tf.reduce_mean(tf.nn.l2_loss(y_pred-label) + Lreg) ##rmse error = tf.sqrt(tf.reduce_mean(tf.square(y_pred-label))) optimizer = tf.train.AdamOptimizer(lr).minimize(loss) ###### Initialize session ###### variables = tf.global_variables() saver = tf.train.Saver(tf.global_variables()) #sess = tf.Session() gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.333) sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) sess.run(tf.global_variables_initializer())”
最新发布
04-05
<think>嗯,用户希望将一段TensorFlow代码修改成适用于2.11版本。首先,我需要回忆一下TensorFlow 2.x的主要变化,尤其是与1.x的区别。TensorFlow 2.x默认启用了eager execution,移除了placeholder,改用tf.keras的API,还有Session等概念也被弃用了。因此,原代码中的tf.compat.v1.placeholder和tf.Session等都需要调整。 首先看TGCN函数。里面用了tf.nn.rnn_cell.MultiRNNCell和tf.nn.static_rnn,这些在TF2中已经被替换了。应该改用tf.keras.layers.RNN或者tf.keras.layers.StackedRNNCells。另外,static_rnn返回的outputs和states可能需要用新的方式处理。 接下来是自定义的tgcnCell。可能用户自定义了一个RNN cell,需要确保它符合TF2的规范,比如继承tf.keras.layers.Layer或tf.keras.layers.AbstractRNNCell。不过用户提供的代码中没有给出tgcnCell的实现,所以可能需要假设它已经适配了,或者给出相应的修改建议。 然后是placeholders部分。在TF2中,推荐使用tf.keras.Input或者直接在模型构建时处理输入,而不是用placeholder。所以需要将inputs和labels替换为Keras Input层,或者在模型函数中直接处理。 权重和偏置的定义,原来的代码使用tf.Variabletf.random.normal,这部分在TF2中仍然可用,但可能更适合放在Keras层的build方法中,或者使用add_weight方法。不过用户可能在显式地定义权重,所以可能需要保留,但要确保在正确的上下文中初始化。 优化器部分,TF2中不再使用tf.train.AdamOptimizer,而是tf.keras.optimizers.Adam。同时,loss的计算和训练循环应该使用Keras的model.compile和model.fit,或者自定义训练循环。用户原来的代码使用了sess.run,这需要重写为基于tf.function或者Keras的训练流程。 Lreg正则化项,原来的代码使用了tf.nn.l2_loss,这在TF2中仍然存在,但可能需要调整变量的收集方式,比如通过model.trainable_variables来获取所有可训练变量。 最后,Session和全局变量初始化部分。在TF2中,不再需要手动管理Session和变量初始化,所以这部分需要完全移除,改用Keras模型的自然流程。 总结下来,主要的修改点包括: 1. 替换placeholder为Keras Input。 2. 将RNN部分改写为Keras层,使用tf.keras.layers.RNN和StackedRNNCells。 3. 使用Keras的模型构建方式,定义Model类或使用函数式API。 4. 优化器改为Keras优化器,并采用compile和fit方法,或者自定义训练循环。 5. 移除Session和相关配置,如gpu_options等。 6. 调整变量初始化和saver的部分,可能使用Keras的回调或者Checkpoint API。 需要注意的是,用户提供的代码中有自定义的tgcnCell,这部分可能需要检查是否兼容TF2,比如是否继承自正确的基类,并正确实现了call和get_initial_state等方法。如果用户没有提供该cell的实现,可能需要提示用户确保其适配性。 此外,正则化项Lreg的计算可能需要通过模型的losses属性添加,或者在自定义训练步骤中处理。还有,损失函数中的tf.nn.l2_loss可能需要换成更标准的MSE计算,比如tf.keras.losses.MeanSquaredError。 在修改过程中,还需确保所有tf.compat.v1的引用被替换为TF2的原生API,例如tf.random.normal的使用是否正确,变量初始化是否在Keras层的build方法中处理。 最后,测试代码是否在TF2.11环境中运行无误,可能还需要处理其他兼容性问题,如函数参数的变化,默认行为的不同等。</think>以下是为TensorFlow 2.11版本修改后的代码(主要改动已用注释标出): ```python # 修改后的TGCN函数 def TGCN(_X, _weights, _biases): ### 将自定义cell转换为Keras RNN层格式 ### cell_1 = tgcnCell(units=gru_units) # 假设自定义cell已继承tf.keras.layers.AbstractRNNCell stacked_cells = tf.keras.layers.StackedRNNCells([cell_1]) rnn_layer = tf.keras.layers.RNN(stacked_cells, return_sequences=True, return_state=True) # 输入形状处理 [batch, timesteps, features] outputs = rnn_layer(_X) # 提取最后时间步输出 last_output = outputs[0][:, -1, :] # 取序列最后一个输出 # 全连接层 output = tf.matmul(last_output, _weights['out']) + _biases['out'] output = tf.reshape(output, [-1, num_nodes, pre_len]) output = tf.transpose(output, perm=[0, 2, 1]) output = tf.reshape(output, [-1, num_nodes]) return output, outputs[0], outputs[1] ###### 使用Keras Input代替placeholder ###### inputs = tf.keras.Input(shape=(seq_len, num_nodes), name='main_input') labels = tf.keras.Input(shape=(pre_len, num_nodes), name='label_input') # 权重初始化改为Keras方式 weights = { 'out': tf.Variable(tf.random.normal([gru_units, pre_len], mean=1.0), name='weight_o')} biases = { 'out': tf.Variable(tf.random.normal_initializer()(shape=[pre_len]), name='bias_o')} if model_name == 'tgcn': pred, ttts, ttto = TGCN(inputs, weights, biases) y_pred = pred ###### 使用Keras损失函数和优化器 ###### lambda_loss = 0.0015 # 正则项计算改用Keras变量收集方式 Lreg = lambda_loss * tf.add_n([tf.nn.l2_loss(v) for v in tf.compat.v1.trainable_variables()]) # 改用Keras的MSE计算方式 label = tf.reshape(labels, [-1, num_nodes]) loss = tf.reduce_mean(tf.keras.losses.mean_squared_error(y_pred, label)) + Lreg error = tf.sqrt(tf.reduce_mean(tf.square(y_pred - label))) # 使用Keras优化器 optimizer = tf.keras.optimizers.Adam(learning_rate=lr) ###### 模型构建 ###### model = tf.keras.Model(inputs=[inputs], outputs=y_pred) model.add_loss(loss) # 添加自定义损失 # 模型编译 model.compile(optimizer=optimizer, loss=loss, metrics=[error]) ``` 主要改动说明(分步解释): 1. **RNN架构升级**: - 使用`tf.keras.layers.StackedRNNCells`代替`MultiRNNCell` - 用`tf.keras.layers.RNN`层替代`static_rnn` - 输入直接传递,无需`unstack`操作 2. **输入系统升级**: - 使用`tf.keras.Input`替代`tf.placeholder` - 输入形状通过shape参数直接指定 3. **变量初始化改进**: - 偏置项改为使用`tf.Variable`包装 - 使用Keras默认的变量初始化方式 4. **训练流程升级**: - 采用Keras Model构建模型 - 使用`model.compile`配置优化器和损失 - 移除了显式Session管理 5. **兼容性调整**: - 正则化项改用`tf.compat.v1.trainable_variables` - 保持部分TF1兼容模式语法 使用注意事项: 1. 需要确保自定义的`tgcnCell`继承自`tf.keras.layers.AbstractRNNCell` 2. 训练时应使用`model.fit()`方法 3. 如需保存模型,使用`tf.keras.models.save_model()` 4. GPU内存管理可直接使用`tf.config`模块 建议后续操作: 1.训练循环改为Keras风格: ```python model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs) ``` 2. 自定义cell需要实现以下方法: ```python class tgcnCell(tf.keras.layers.AbstractRNNCell): def __init__(self, units, **kwargs): super().__init__(**kwargs) self.units = units @property def state_size(self): return self.units def build(self, input_shape): # 在此定义权重 self.kernel = self.add_weight(...) def call(self, inputs, states): # 实现cell逻辑 return output, new_states ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值