如何在使用带有Kur的CSV时指定输入

时间:2017-02-11 23:45:44

标签: csv deep-learning

我尝试将CSV file提供给Kur,但我不知道如何在输入中指定多个列而不会导致程序崩溃。这是一个小例子:

model:
  - input:
      - SepalWidthCm
      - SepalLengthCm
  - dense: 10
  - activation: tanh
  - dense: 3
  - activation: tanh
    name: Species

train:
  data:
    - csv:
        path: Iris.csv
        header: yes
  epochs: 1000
  weights: best.w
  log: tutorial-log

loss:
  - target: Species
    name: mean_squared_error

错误:

File "/Users/bytter/.pyenv/versions/3.5.2/bin/kur", line 11, in <module>
    sys.exit(main())
  File "/Users/bytter/.pyenv/versions/3.5.2/lib/python3.5/site-packages/kur/__main__.py", line 269, in main
    sys.exit(args.func(args) or 0)
  File "/Users/bytter/.pyenv/versions/3.5.2/lib/python3.5/site-packages/kur/__main__.py", line 48, in train
    func = spec.get_training_function()
  File "/Users/bytter/.pyenv/versions/3.5.2/lib/python3.5/site-packages/kur/kurfile.py", line 282, in get_training_function
    model = self.get_model(provider)
  File "/Users/bytter/.pyenv/versions/3.5.2/lib/python3.5/site-packages/kur/kurfile.py", line 148, in get_model
    self.model.build()
  File "/Users/bytter/.pyenv/versions/3.5.2/lib/python3.5/site-packages/kur/model/model.py", line 282, in build
    self.build_graph(input_nodes, output_nodes, network)
  File "/Users/bytter/.pyenv/versions/3.5.2/lib/python3.5/site-packages/kur/model/model.py", line 356, in build_graph
    for layer in node.container.build(self):
  File "/Users/bytter/.pyenv/versions/3.5.2/lib/python3.5/site-packages/kur/containers/container.py", line 281, in build
    self._built = list(self._build(model))
  File "/Users/bytter/.pyenv/versions/3.5.2/lib/python3.5/site-packages/kur/containers/layers/placeholder.py", line 122, in _build
    'Placeholder "{}" requires a shape.'.format(self.name))
kur.containers.parsing_error.ParsingError: Placeholder "..input.0" requires a shape.

使用- input: SepalWidthCm按预期工作。

1 个答案:

答案 0 :(得分:2)

您的方法存在的问题是,Kur并不知道您希望如何连接输入。您的输入是否应该成为2D张量的维度(2, N )(其中 N 是CSV文件中的数据点数),像这样?

[
    [SepalWidthCm_0, SepalWidthCm_1, ...],
    [SepalLengthCm_0, SepalLengthCm_1, ...]
]

NB,该示例不是非常深入学习的友好结构。)或者应该将它组合成一个维度张量( N ,2) ,像这样?

[
    [SepalWidthCm_0, SepalLengthCm_0],
    [SepalWidthCm_1, SepalLengthCm_1],
    ...
]

或者您可能希望将相同的操作并行应用于每个列?无论如何,当您的输入数据是多维的时,这个问题会变得更难/更模糊(例如,不是像长度或宽度这样的标量,而是有矢量甚至是矩阵)。

而不是试图猜测你想要什么(并且可能弄错了),Kur希望每个输入都是一个单一的数据源,然后你可以将它们组合起来,但是你觉得合适。

以下几种方法可能需要将数据合并,以及如何在Kur中进行。

  1. 逐行组合。这是上面的第二个例子,我们想要结合&#34;行&#34;将CSV数据转换为元组,以便输入张量具有维度( batchSize ,2)。然后你的Kur模型看起来像:

    model:
    
      # Define the model inputs.
      - input: SepalWidthCm
      - input: SepalLengthCm
    
      # Concatenate the inputs.
      - merge: concat
        inputs: [SepalWidthCm, SepalLengthCm]
    
      # Do processing on these "vectorized" inputs.
      - dense: 10
      - activation: tanh
      - dense: 1
      - activation: tanh
    
      # Output
      - output: Species
    
  2. 独立处理,然后合并。这是您在每个输入列上独立执行某些操作的设置,然后将它们合并在一起(之后可能会再执行一些操作)。在ASCII艺术中,这可能看起来像:

    INPUT_1 --> dense, activation --\
                                     +---> dense, activation --> OUTPUT
    INPUT_2 --> dense, activation --/
    

    在这种情况下,你会有一个看起来像这样的Kur模型:

    model:
    
      # First "branch" of processing.
      - input: SepalWidthCm
      - dense: 10
      - activation: tanh
        name: WidthBranch
    
      # Second "branch" of processing.
      - input: SepalLengthCm
      - dense: 10
      - activation: tanh
        name: LengthBranch
    
      # Fuse things together.
      - merge:
        inputs: [WidthBranch, LengthBranch]
    
      # Continue some processing
      - dense: 1
      - activation: tanh
    
      # Output
      - output: Species
    
  3. 请注意,自Kur 0.3以来,merge图层已经存在,所以请确保使用最新版本。

    免责声明:我是Kur的核心维护者。