tf.shape和tf.get_shape().as_list()

本文介绍如何使用TensorFlow的tf.shape()函数和Tensor对象的get_shape()方法来获取不同类型的输入数据(如NumPy数组、Python列表及TensorFlow常量)的维度大小。通过示例演示了两种方法的区别和使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

tf.shape()获取张量

import tensorflow as tf
 
import numpy as np
 
a_array=np.array([[1,2,3],[4,5,6]])
b_list=[[1,2,3],[3,4,5]]
c_tensor=tf.constant([[1,2,3],[4,5,6]])
 
with tf.Session() as sess:
    print(sess.run(tf.shape(a_array)))
    print(sess.run(tf.shape(b_list)))
    print(sess.run(tf.shape(c_tensor)))

[2 3]

[2 3]

[2 3]

x.get_shape().as_list()返回一个元组

import tensorflow as tf
 
import numpy as np
 
a_array=np.array([[1,2,3],[4,5,6]])
b_list=[[1,2,3],[3,4,5]]
c_tensor=tf.constant([[1,2,3],[4,5,6]])
 
print(c_tensor.get_shape())
print(c_tensor.get_shape().as_list())
 
with tf.Session() as sess:
    print(sess.run(tf.shape(a_array)))
    print(sess.run(tf.shape(b_list)))
    print(sess.run(tf.shape(c_tensor)))

(2,3)

[2,3]

[2 3]

[2 3]

[2 3]

int_fs = f.get_shape().as_list()返回的是tensor列表

 

尽管 `tf.contrib.layers.batch_norm` 曾经是一个广泛使用的批量标准化方法,但在 TensorFlow 2.x 版本中,`contrib` 模块已被移除。因此,在较新的版本中推荐使用其他替代方案来实现批处理规范化。 ### 使用 Keras 层中的 Batch Normalization 在 TensorFlow 2.x 中,Keras 已被完全集成到 TensorFlow 中,并提供了更简洁功能强大的 API 来构建模型。可以使用 `tensorflow.keras.layers.BatchNormalization` 实现相同的功能: ```python import tensorflow as tf model = tf.keras.Sequential([ tf.keras.layers.Dense(64, activation='relu', input_shape=(input_dim,)), tf.keras.layers.BatchNormalization(), # 添加批量归一化层 tf.keras.layers.Dense(output_dim, activation='softmax') ]) ``` 上述代码展示了如何通过 Keras Sequential 模型添加批量归一化层[^2]。 ### 手动应用 Batch Normalization 如果需要手动控制批量归一化的操作过程,则可以通过以下方式实现: ```python def batch_norm_manual(x, is_training, decay=0.99, epsilon=1e-5): shape = x.get_shape().as_list() n_out = shape[-1] beta = tf.Variable(tf.zeros([n_out])) gamma = tf.Variable(tf.ones([n_out])) moving_mean = tf.Variable(tf.zeros([n_out]), trainable=False) moving_variance = tf.Variable(tf.ones([n_out]), trainable=False) def mean_var_with_update(): axes = list(range(len(shape) - 1)) batch_mean, batch_var = tf.nn.moments(x, axes) update_moving_mean = moving_averages.assign_moving_average(moving_mean, batch_mean, decay) update_moving_variance = moving_averages.assign_moving_average( moving_variance, batch_var, decay) with tf.control_dependencies([update_moving_mean, update_moving_variance]): return tf.identity(batch_mean), tf.identity(batch_var) mean, var = tf.cond(is_training, true_fn=mean_var_with_update, false_fn=lambda: (moving_mean, moving_variance)) normalized_x = tf.nn.batch_normalization(x, mean, var, beta, gamma, epsilon) return normalized_x ``` 此函数实现了类似于原生 `batch_norm` 的行为,允许用户自定义训练阶段的行为以及参数更新逻辑[^3]。 ### 总结 对于现代 TensorFlow 开发者来说,建议优先采用内置的 Keras 层级接口 (`BatchNormalization`) 进行快速开发;而对于高级需求或者定制化场景下,可以选择编写自己的批量归一化实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值