Racket struct error: given value instantiates a different structure type with the same name
Racket struct error: given value instantiates a different structure type with the same name
我非常熟悉 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,所以我没有提供。
我在上述函数中尝试做的提炼基础是这样的:
- 计算结构属性的新值,并使用这些新属性创建新结构。
- 谢谢!!
Racket 中的结构是生成的。这意味着每次
(struct network (num-layers sizes biases weights) #:transparent)
是运行,创建了一种新型结构。这些都是命名网络。
您看到的错误消息通常是由于对结构定义进行了两次计算(这有点令人困惑,因为这两种类型具有相同的名称)。
我在您的代码中看不到任何可能导致 (struct network ...)
被 运行 两次的地方。您使用的是 DrRacket 还是不重置命名空间的替代环境?
如果我打开 "nn.rkt" 和 运行,我会看到错误吗?
我非常熟悉 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,所以我没有提供。
我在上述函数中尝试做的提炼基础是这样的:
- 计算结构属性的新值,并使用这些新属性创建新结构。
- 谢谢!!
Racket 中的结构是生成的。这意味着每次
(struct network (num-layers sizes biases weights) #:transparent)
是运行,创建了一种新型结构。这些都是命名网络。
您看到的错误消息通常是由于对结构定义进行了两次计算(这有点令人困惑,因为这两种类型具有相同的名称)。
我在您的代码中看不到任何可能导致 (struct network ...)
被 运行 两次的地方。您使用的是 DrRacket 还是不重置命名空间的替代环境?
如果我打开 "nn.rkt" 和 运行,我会看到错误吗?