All Projects → milosgajdos → gopfield

milosgajdos / gopfield

Licence: Apache-2.0 license
Hopfield neural networks in Go

Programming Languages

go
31211 projects - #10 most used programming language
Makefile
30231 projects

Projects that are alternatives of or similar to gopfield

RMN
Relation Memory Network
Stars: ✭ 17 (-66.67%)
Mutual labels:  memory-network
dmn-plus
A Pytorch tutorial for implementation of Dynamic memory Network Plus
Stars: ✭ 61 (+19.61%)
Mutual labels:  memory-network
MemoPainter-PyTorch
An unofficial implementation of MemoPainter(Coloring With Limited Data: Few-shot Colorization via Memory Augmented Networks) using PyTorch framework.
Stars: ✭ 63 (+23.53%)
Mutual labels:  memory-network
MemNet ABSA
No description or website provided.
Stars: ✭ 20 (-60.78%)
Mutual labels:  memory-network
WMPoetry
The source codes of Working Memory model for Chinese poetry generation (IJCAI 2018).
Stars: ✭ 49 (-3.92%)
Mutual labels:  memory-network
sorn
PyPi Package of Self-Organizing Recurrent Neural Networks (SORN) and Neuro-robotics using OpenAI Gym
Stars: ✭ 16 (-68.63%)
Mutual labels:  hopfield-network

gopfield: Hopfield neural networks in Go

Build Status go.dev reference GoDoc License Go Report Card

This project provides an implementation of Hopfield network in Go. It implements both Hebbian and Storkey training algorithms. The goal is to provide a simple API to build Hopfield networks in Go.

Get started

Get the source code:

$ go get -u github.com/milosgajdos/gopfield

Get dependencies:

$ make dep

Run the tests:

$ make test

Example

You can see an example program below. It first creates a Hopfield network pattern based on arbitrary data. The data is encoded into binary values of +1/-1 (see the documentation) using Encode function. It is then stored in the network and then restored.

package main

import (
	"fmt"
	"os"

	"github.com/milosgajdos/gopfield/hopfield"
)

func main() {
	pattern := hopfield.Encode([]float64{0.2, -12.4, 0.0, 3.4})
	// Create new Hopfield Network and set its size to the length of pattern
	n, err := hopfield.NewNetwork(pattern.Len(), "hebbian")
	if err != nil {
		fmt.Fprintf(os.Stderr, "\nERROR: %s\n", err)
		os.Exit(1)
	}
	fmt.Printf("Storing: \n%v\n\n", pattern)
	// store patterns in Hopfield network
	if err := n.Store([]*hopfield.Pattern{pattern}); err != nil {
		fmt.Fprintf(os.Stderr, "\nERROR: %s\n", err)
		os.Exit(1)
	}

	// restore image from Hopfield network
	res, err := n.Restore(pattern, "async", 10)
	if err != nil {
		fmt.Fprintf(os.Stderr, "\nERROR: %s\n", err)
		os.Exit(1)
	}
	fmt.Printf("Restored: \n%v\n", res)
}

If you run this program, you will see the pattern being reconstructed correctly:

$ go run main.go
Storing:
⎡ 1⎤
⎢-1⎥
⎢-1⎥
⎣ 1⎦

Restored:
⎡ 1⎤
⎢-1⎥
⎢-1⎥
⎣ 1⎦

You can find a more elaborate example in the examples directory of the project. There is a mnist example which tries to reconstruct a corrupted image loaded from the patterns subdirectory which contains two MNIST images: 0 and 4. These are stored in the Hopfield neural network. The mnist program then picks image 4 and adds some random noise to it. Finallys, it tries to reconstruct the original image from the network. See below how to use the example program:

First you need to build it:

$ make examples

If the build succeeds, you will find the built binary in _build directory of the project root. You can find out the cli options it provides:

$  _build/mnist -h

Example run:

$ _build/mnist -mode "async" -iters 1 -datadir ./examples/mnist/patterns/ -output out.png -training "storkey"

This will generate two files in directory: noisy.png and out.png.

noisy.png image displays the file that was attempted to be reconstructed from the network:

Corrupted image 4

out.png image shows the reconstucted image:

Reconstructed image 4

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].