我对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,所以我没有人给予。
我在上述功能中尝试做的精炼基础是:
- 谢谢!
答案 0 :(得分:1)
Racket中的结构是生成性的。这意味着每次
(struct network (num-layers sizes biases weights) #:transparent)
运行,创建一种新类型的结构。这些都被命名为网络。
您看到的错误消息通常是由于对结构定义进行了两次评估(由于这两种类型具有相同的名称,因此有点令人困惑)。
我无法在代码中看到可能导致(struct network ...)
运行两次的任何地方。您使用的是DrRacket还是没有重置名称空间的替代环境?
如果我打开&#34; nn.rkt&#34;并运行它,我会看到错误吗?