Used by ScruchiPu.
You can download it from https://www.dcs.napier.ac.uk/~denaro/
No. NRLIBJ uses values between 0 and 1. But you can create new node class and use a function between -1 and 1. -- Albert
Just some code to save the network with DataStream? put it in the NNet and the Layer class : (use the same method name)
Saving
IN NNet
/** * Description of the Method * *@param dos Description of the Parameter *@exception IOException Description of the Exception */ public void save(DataOutputStream? dos) throws IOException { dos.writeInt(this.lyr.length); for (int i = 0; i < lyr.length; i++) { this.lyr[i].saveLayer(dos); } for (int i = 0; i < lyr.length; i++) { this.lyr[i].saveLink(dos); } dos.flush(); }
Class Layer /** * Description of the Method * *@param dos Description of the Parameter *@exception IOException Description of the Exception */ void saveLayer(DataOutputStream? dos) throws IOException { int i; int x; int y; int n; int mbuff = -1; String SClass; if (this.mbuff != null) { mbuff = this.mbuff.nlyr; } if (this.node.length > 0) { SClass = this.node[0].getClass().getName(); } else { SClass = "unknown"; } dos.writeInt(this.nlyr); dos.writeInt(this.nx); dos.writeInt(this.ny); dos.writeUTF(SClass); dos.writeInt(mbuff); }
/** * Description of the Method * *@param dos Description of the Parameter *@exception IOException Description of the Exception */ void saveLink(DataOutputStream? dos) throws IOException { int i; int n; for (n = 0; n < this.node.length; n++) { dos.writeInt(n); dos.writeInt(this.node[n].lnk.length - 1); dos.writeFloat(this.node[n].lnk[0].wgt); for (i = 1; i < this.node[n].lnk.length; i++) { dos.writeInt(this.node[n].lnk[i].nfrom.nlyr); dos.writeInt(this.node[n].lnk[i].nfrom.nn); dos.writeFloat(this.node[n].lnk[i].wgt); } } }
LOADING
In NNet
public NNet(DataInputStream? dis) throws IOException { this.loadNNet(dis); }
/** * Description of the Method * *@param dis Description of the Parameter *@exception IOException Description of the Exception */ void loadNNet(DataInputStream? dis) throws IOException { int i; int nlayer; nlayer = dis.readInt(); this.lyr = new Layer[nlayer]; for (i = 0; i < this.lyr.length; i++) { this.lyr[i] = loadLayer(dis, this.lyr); } for (i = 0; i < this.lyr.length; i++) { this.lyr[i].loadLink(dis, this.lyr); } }
/** * Description of the Method * *@param dis Description of the Parameter *@param layer Description of the Parameter *@return Description of the Return Value *@exception IOException Description of the Exception */ Layer loadLayer(DataInputStream? dis, Layer layer[]) throws IOException { int nlyr; int nx; int ny; int lbuff; String Cnode; Layer lay; nlyr = dis.readInt(); nx = dis.readInt(); ny = dis.readInt(); Cnode = dis.readUTF(); lbuff = dis.readInt(); if (ny > 0) { lay = new Layer(nlyr, nx, ny, Cnode); } else { lay = new Layer(nlyr, nx, Cnode); } if (lbuff >= 0) { lay.mbuff = layer[lbuff]; } return lay; }
In Layer
/** * Description of the Method * *@param dis Description of the Parameter *@param layer Description of the Parameter *@exception IOException Description of the Exception */ void loadLink(DataInputStream? dis, Layer layer[]) throws IOException { int i; int l; int nn; int nlink; int lfrom; int nnfrom; float wgt; for (i = 0; i < this.node.length; i++) { nn = dis.readInt(); nlink = dis.readInt(); this.node[i].lnk = new Link[nlink + 1]; this.node[i].lnk[0] = new Link(dis.readFloat(), null); for (l = 1; l < this.node[i].lnk.length; l++) { lfrom = dis.readInt(); nnfrom = dis.readInt(); wgt = dis.readFloat(); this.node[i].lnk[l] = new Link(wgt, layer[lfrom].node[nnfrom]); } } } Synnalagma
Some other Node class Tanh is for output between -1 and 1 and Gaussian output 0 1:
public class NodeGaussian? extends NodeLin? {
float x=1f;
public NodeGaussian?(int nn,int nly,float b) { super(nn,nly,b); }
protected float afn(float x) { this.x=x; return (float) Math.exp(-x*x); } protected float df(float y) { return -2f*x*y; }
}
public class NodeTanh? extends NodeLin? {
public NodeTanh?(int nn,int nly,float b) { super(nn,nly,b); }
protected float afn(float x) { return (float) 2f / (1f + (float)Math.exp(-2 * x)) - 1f; } protected float df(float y) { return 1-y*y; }}