Racket struct error:给定值实例化具有相同名称的不同结构类型

时间:2015-09-25 21:47:21

标签: struct scheme lisp racket

我对Racket以及Scheme和Lisp系列中的许多人非常熟悉,但我不知道这个错误是什么,或者导致它的原因:

network-biases: contract violation;
 given value instantiates a different structure type with the same name
  expected: network?
  given: (network ...) <-- I omitted this because its useless.

继承错误所在的函数(我有其余的gist):

(define (update-mini-batch net mini-batch eta)
  (define nabla-b (map (lambda (b)
             (apply grid (shape b))) (network-biases net)))
  (define nabla-w (map (lambda (w)
             (apply grid (shape w))) (network-weights net)))

  (define-values (nabla-b-new nabla-w-new)
    (foldl (lambda (lst bw)
       (define x (first lst))
       (define y (second lst))
       (define-values (nabla-b nabla-w) bw)
       (define-values (delta-nabla-b delta-nabla-w) (backprop net x y))

       (define nabla-b-new (+/ nabla-b delta-nabla-b))
       (define nabla-w-new (+/ nabla-w delta-nabla-w))
       (values nabla-b-new nabla-w-new)) (values nabla-b nabla-w) mini-batch))

  (struct-copy network net
           [biases (map (lambda (b nb)
                  (- b (* nb (/ eta (length mini-batch)))))
                (network-biases net) nabla-b-new)]
           [weights (map (lambda (w nw)
                   (- w (* nw (/ eta (length mini-batch)))))
                 (network-weights net) nabla-w-new)]))

我无法得到一个实际上犯了错误的MCVE,所以我没有人给予。

我在上述功能中尝试做的精炼基础是:

  • 计算结构属性的新值,并使用这些新属性创建新结构。

- 谢谢!

1 个答案:

答案 0 :(得分:1)

Racket中的结构是生成性的。这意味着每次

(struct network (num-layers sizes biases weights) #:transparent)
运行

,创建一种新类型的结构。这些都被命名为网络。

您看到的错误消息通常是由于对结构定义进行了两次评估(由于这两种类型具有相同的名称,因此有点令人困惑)。

我无法在代码中看到可能导致(struct network ...)运行两次的任何地方。您使用的是DrRacket还是没有重置名称空间的替代环境?

如果我打开&#34; nn.rkt&#34;并运行它,我会看到错误吗?