-
Notifications
You must be signed in to change notification settings - Fork 11
Fix keyword spotting example #103
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
See https://gitter.im/nengo/loihi-103 for some discussion points |
Rebased to #112 and reverted #85. I pushed the old branch to https://github.com/nengo/nengo-loihi/tree/fix-ks-saved. @tbekolay wrote a test and did some work there related to chip/host communication, but not directly related to the keyword demo, which we might want in the future. |
This LGTM but since I made the original PR I can't submit a review. Will find a scapegoat then merge. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This looks good to me as well. I will note that @pblouw seems to have fixed the keyword spotting demo when the connections are on-chip, so this PR might not be needed, but in the long run we're going to want a more robust way of controlling where the connection weights reside anyway.
No longer transforms neuron connections into decoded connections. Raises an explicit NotImplementedError for learning rules on non-decoded connections.
@pblouw reported that his keyword spotting demo is broken in v0.3.0, and indeed our keyword spotting example is broken also. He tracked it down to this commit, which seems like it shouldn't even affect the keyword spotting network, but in fact it does.
The reason why that commit affects the keyword spotting network is that it translates all neuron->* connections in which
pre
is onchip andpost
is offchip withtransform=weights
to asolver=NoSolver(weight.T)
connection. This would be fine if those two connections made no difference to how the network behaves, but that is unfortunately not the case, as evidenced by the keyword spotting example failing.Investigating this issue is made more complicated by the fact that it is impossible to compare the two connection types because
transform=weights
connections are translated toNoSolver
connections by the splitter. Commenting out this behavior in the splitter results in obvious differences between the two.One way we can still investigate this is in looking at neuron->* connections in which
pre
is offchip andpost
is onchip, as this case was not handled in the same way as the reverse of that, sotransform=weights
connections still act differently fromsolver=NoSolver
connections. This is definitely an oversight, but in this case a convenient one as it allowed me to write thetest_n2n_transform_solver
test in this PR.Running that test with the commit it's introduced in (9042d86) reveals some hard to debug issues. Thanks to the new
allclose
changes, here's the first bunch of failures when comparing a connections with a transform and a NoSolver:I attempted to fix this in splitter in f2ae792. I was not able to fix it (I find the
ChipReceiveNeurons
andHostSendNode
stuff quite confusing), but looking at how it fails now gives me some hope:It looks like the
NoSolver
case might be operating the same as thetransform
case, only 6 timesteps delayed. We should make them the same, but seeing as I tried to do that here, I think I will need help to do that.Also, even if we fix this case, it doesn't fix the keyword spotting example. However, it might give us a bit of insight into why the switch from the
transform
connection to theNoSolver
connection made a difference. Does the way we did the connection splitting in 0811e2a have the same weird issue as in 9042d86, or is it simply delayed by some timesteps? My guess is that having several timesteps delay would not cause the keyword spotting example to change in the way that it changed, so I think we need to revisit the change in 0811e2a and ensure that switching the type of connection doesn't change behavior.