相当于什么
ops = tf.keras.layers.Input(
shape=[hilbert_size, hilbert_size, num_points * 2], name="operators"
)
inputs = tf.keras.Input(shape=(num_points), name="inputs")
来自 pytorch 中的张量流?
我正在用我在tensorflow中编写的代码在torch中编写cGAN。这是一种翻译。我在火炬中所做的是:
ops = nn.Parameter(torch.empty(1, hilbert_size, hilbert_size, num_points * 2))
inputs = torch.empty((1, 1296), requires_grad=True)
张量流中的输出是:
In [59]: ops
Out[59]: <KerasTensor: shape=(None, 16, 16, 2592) dtype=float64 (created by layer 'operators')>
In [60]: inputs
Out[60]: <KerasTensor: shape=(None, 1296) dtype=float64 (created by layer 'inputs')>
但是 torch 中的代码给出了:
In [6]: ops
Out[6]:
Parameter containing:
tensor([[[[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]],
[[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]],
[[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]],
...,
[[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]],
[[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]],
[[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]]]], requires_grad=True)
In [7]: inputs
Out[7]:
tensor([[-1.8727e+27, 4.5817e-41, 1.3275e-17, ..., 4.5817e-41,
-7.5189e+25, 4.5817e-41]], requires_grad=True)
是吗?这是在 torch 中实例化神经网络输入的正确方法吗? 对我来说,输入是形状为
torch.Size([1, 1296])
的向量是有意义的,但张量流中的相应代码给出了 TensorShape([None, 1296])
并且上面代码中的 Out[60]
行给出了一个作为输出的对象,该对象是一个层,而不是像这样的张量火炬的输出。我不确定我是否走对了路
您对 TensorFlow 和 PyTorch 之间差异的观察是正确的,更具体地说:
TensorFlow 的
Input
与 PyTorch 的 tensor
:
tf.keras.layers.Input
定义输入占位符的形状,但本身不保存任何数据。它更像是定义模型期望的输入的形状和类型。它返回一个 KerasTensor
对象,这是一种符号表示,您可以将其视为实际数据的占位符。torch.empty((1, 1296), requires_grad=True)
这样的张量时,您正在使用形状为 [1, 1296]
的未初始化数据创建实际张量。批量维度差异:
Input
使用 None
作为批量维度,表示批量大小是动态的并且可以改变。[1, 1296]
的张量,则意味着批量大小固定为 1。在大多数情况下,在实际训练或推理过程中,您将传递具有可变批量大小的数据。在 PyTorch 中实例化输入:
inputs
实例化 torch.empty
的方式是一种方法,但它会创建一个未初始化的张量。如果您希望它用零初始化(类似于 TensorFlow 的默认值),您可以使用 torch.zeros
代替。nn.Parameter
通常用于应优化的张量,例如模型中的权重和偏差。如果 ops
应在训练期间进行优化(如模型权重),那么使用 nn.Parameter
是正确的。根据您的上下文,以下是与 TensorFlow 代码更接近的匹配:
# If ops should be optimized during training
ops = nn.Parameter(torch.zeros(1, hilbert_size, hilbert_size, num_points * 2))
# If ops should NOT be optimized and just acts as an input placeholder
# ops = torch.zeros(1, hilbert_size, hilbert_size, num_points * 2)
inputs = torch.zeros(1, 1296, requires_grad=True)
请记住:
在实际训练或推理场景中,您可能会使用模型的
forward
方法来传递输入,这意味着您将根据需要创建并传递适当形状和类型的张量。
您应该确保张量在使用前已正确初始化。如果数据随后没有被有效值覆盖,那么使用像
torch.empty
这样的未初始化张量可能会导致不可预测的结果。