相当于 pytorch 中的 tf.keras.layers.Input

问题描述 投票:0回答:1

相当于什么

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]
行给出了一个作为输出的对象,该对象是一个层,而不是像这样的张量火炬的输出。我不确定我是否走对了路

python tensorflow torch
1个回答
0
投票

您对 TensorFlow 和 PyTorch 之间差异的观察是正确的,更具体地说:

  1. TensorFlow 的

    Input
    与 PyTorch 的
    tensor

    • 在 TensorFlow 中,
      tf.keras.layers.Input
      定义输入占位符的形状,但本身不保存任何数据。它更像是定义模型期望的输入的形状和类型。它返回一个
      KerasTensor
      对象,这是一种符号表示,您可以将其视为实际数据的占位符。
    • 在 PyTorch 中,张量是可以保存实际数据的多维数组。因此,当您定义像
      torch.empty((1, 1296), requires_grad=True)
      这样的张量时,您正在使用形状为
      [1, 1296]
      的未初始化数据创建实际张量。
  2. 批量维度差异

    • TensorFlow 的
      Input
      使用
      None
      作为批量维度,表示批量大小是动态的并且可以改变。
    • 在 PyTorch 中,如果定义形状为
      [1, 1296]
      的张量,则意味着批量大小固定为 1。在大多数情况下,在实际训练或推理过程中,您将传递具有可变批量大小的数据。
  3. 在 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
    这样的未初始化张量可能会导致不可预测的结果。

© www.soinside.com 2019 - 2024. All rights reserved.