|
|

楼主 |
发表于 2008-1-16 23:13
|
显示全部楼层
原帖由 cnywj 于 2008-1-16 21:28 发表 
老和尚有没有一段最简单的 画猫的代码贴给我啃个一月两月的 :*26*:
package ann;
/**
* Copyright: Copyright (c) 2004
* @version 1.0
*/
import java.io.*;
import java.util.*;
/**
* Three-Layer Feed-Forward Neural Network
*/
public class BP
{
/**
* control parameters
*/
public static final int REGRESSION = 0;
public static final int CLASSIFY = 1;
/**
* neural network structure control parameters
*/
public int m_iInputNodes = 0;
public int m_iHiddenNodes = 0;
public int m_iOutputNodes = 0;
public int m_iTaskType = 0;
/**
* neural network data structure
*/
public double [] mdInput = null; //input layer
public double [] mdHidden = null; //hidden layer
public double [] mdOutput = null; //output layer
public double [] mdIB = null; //input layer bias
public double [] mdHB = null; //hidden layer bias
public double [][] mdIH = null; //input-hidden layer weights
public double [][] mdHO = null; //hidden-output layer weights
/**
* weights
*/
int m_iNumWeights = 0;
double [] mdWeights = null;
/**
* Constructor
*/
public BP() {}
/**
* duplicate a BP
*/
public void copy(BP bp)
{
int i;
//initialize neural network and set memory
initialize(bp.m_iInputNodes,
bp.m_iHiddenNodes,
bp.m_iOutputNodes,
bp.m_iTaskType);
//copy weights
System.arraycopy(bp.mdIB, 0, mdIB, 0, m_iHiddenNodes);
for (i=0; i<m_iHiddenNodes; i++)
System.arraycopy(bp.mdIH, 0, mdIH, 0, m_iInputNodes);
System.arraycopy(bp.mdHB, 0, mdHB, 0, m_iOutputNodes);
for (i=0; i<m_iOutputNodes; i++)
System.arraycopy(bp.mdHO, 0, mdHO, 0, m_iHiddenNodes);
}
/**
* Initialize Neural Network
*/
public void initialize(int numInputNodes,
int numHiddenNodes,
int numOutputNodes,
int taskType)
{
int i,j;
//neural network structur parameters
m_iInputNodes = numInputNodes;
m_iHiddenNodes = numHiddenNodes;
m_iOutputNodes = numOutputNodes;
m_iTaskType = taskType;
//neural network i/o vector
mdInput = new double [m_iInputNodes];
mdHidden = new double [m_iHiddenNodes];
mdOutput = new double [m_iOutputNodes];
//neural network bias and weights
mdIB = new double [m_iHiddenNodes];
mdIH = new double [m_iHiddenNodes][m_iInputNodes ];
mdHB = new double [m_iOutputNodes];
mdHO = new double [m_iOutputNodes][m_iHiddenNodes];
//todal weights
m_iNumWeights = m_iHiddenNodes*(1 + m_iInputNodes)
+ m_iOutputNodes*(1 + m_iHiddenNodes);
mdWeights = new double [m_iNumWeights]; //weight exchange
//initialize weights
for (i=0; i<m_iHiddenNodes; i++)
{
mdIB = Math.random();
for (j=0; j<m_iInputNodes; j++) mdIH[j] = Math.random();
}
for (i=0; i<m_iOutputNodes; i++)
{
mdHB = Math.random();
for (j=0; j<m_iHiddenNodes; j++) mdHO[j] = Math.random();
}
}
/**
* Output Neural Network Weights
*/
public double [] getWeights()
{
int i, iSize;
iSize = 0;
System.arraycopy(mdIB, 0, mdWeights, iSize, m_iHiddenNodes);
iSize += m_iHiddenNodes;
for (i=0; i<m_iHiddenNodes; i++)
{
System.arraycopy(mdIH, 0, mdWeights, iSize, m_iInputNodes);
iSize += m_iInputNodes;
}
System.arraycopy(mdHB, 0, mdWeights, iSize, m_iOutputNodes);
iSize += m_iOutputNodes;
for (i=0; i<m_iOutputNodes; i++)
{
System.arraycopy(mdHO, 0, mdWeights, iSize, m_iHiddenNodes);
iSize += m_iHiddenNodes;
}
return mdWeights;
}
/**
* Insert Neural Network Weights
*/
public void setWeights(double [] weights)
{
int i,k;
double d;
//input-hidden layer
int iSize = 0;
System.arraycopy(weights, iSize, mdIB, 0, m_iHiddenNodes);
iSize += m_iHiddenNodes;
for (i=0; i<m_iHiddenNodes; i++)
{
System.arraycopy(weights, iSize, mdIH, 0, m_iInputNodes);
iSize += m_iInputNodes;
}
//hidden-output layer :: bias
System.arraycopy(weights, iSize, mdHB, 0, m_iOutputNodes);
iSize += m_iOutputNodes;
//output layer weights
for (i=0; i<m_iOutputNodes; i++)
{
//scaling on output layer for classification task
if (m_iTaskType == CLASSIFY)
{
d = 0;
for (k=iSize; k<iSize+m_iHiddenNodes; k++) d += weights[k]*weights[k];
d = 1.0/Math.sqrt(d);
for (k=iSize; k<iSize+m_iHiddenNodes; k++) weights[k] *= d;
}
System.arraycopy(weights, iSize, mdHO, 0, m_iHiddenNodes);
iSize += m_iHiddenNodes;
}
}
/**
* Neural Network Ouput
*/
public double [] output(double [] instance)
{
int i,j;
double d;
//copy input variables
System.arraycopy(instance, 0, mdInput, 0, m_iInputNodes);
//input layer to hidden layer
for (i=0; i<m_iHiddenNodes; i++)
{
d = mdIB;
for (j=0; j<m_iInputNodes; j++) d += mdIH[j]*mdInput[j];
mdHidden = 1.0/(1.0+Math.exp(-d));
}
//hidden layer to output layer
for (i=0; i<m_iOutputNodes; i++)
{
d = mdHB;
for (j=0; j<m_iHiddenNodes; j++) d += mdHO[j]*mdHidden[j];
mdOutput = d;
}
//modify for classification problem
if (m_iTaskType == CLASSIFY)
for (i=0; i<m_iOutputNodes; i++)
mdOutput = 1.0/(1.0+Math.exp(-mdOutput)) ;
return mdOutput;
}
/**
* Neural Network Structure Redaundency (number of unused links)
*/
public double redundant()
{
int i,j;
/*
* redundancy in regression neural network is
* measured on the average value of output weights
*/
double dR = 0;
for (i=0; i<m_iOutputNodes; i++)
for (j=0; j<m_iHiddenNodes; j++)
dR += Math.abs(mdHO[j])/(1+Math.abs(mdHO[j]));
dR /= m_iOutputNodes*m_iHiddenNodes;
return dR;
}
/**
* Save Neural Network Structure
*/
public boolean save(String fileName)
{
int i,j;
try
{
FileOutputStream ouF = new FileOutputStream(new File(fileName));
PrintStream ouP = new PrintStream(ouF);
System.out.println("<BP::save> " + fileName);
//control parameters
ouP.println(";BP Neural Network "+ (new Date()).toString());
ouP.println(m_iInputNodes +"\t;Input Nodes");
ouP.println(m_iHiddenNodes +"\t;Hidden Nodes");
ouP.println(m_iOutputNodes +"\t;Output Nodes");
ouP.println(m_iTaskType +"\t;0: Regression, 1: Classification");
//input-hidden layer weights
ouP.println(";\n;Input-Hidden Layer Weights");
for (i=0; i<m_iHiddenNodes; i++)
{
ouP.print(i +", "+mdIB);
for (j=0; j<m_iInputNodes; j++) ouP.print(", "+ mdIH[j]);
ouP.println();
}
//hidden-output layer weights
ouP.println(";\n;Hidden-Output Layer Weights");
for (i=0; i<m_iOutputNodes; i++)
{
ouP.print(i +", "+ mdHB);
for (j=0; j<m_iHiddenNodes; j++) ouP.print(", "+ mdHO[j]);
ouP.println();
}
ouP.close();
ouF.close();
}
catch (Exception ex)
{
ex.printStackTrace();
System.out.println("<BP::save> error on saving "+ fileName);
return false;
}
return true;
}
/**
* Read Neural Network Structure
*/
public boolean read(String fileName)
{
int i;
String sItem, sLine;
StringTokenizer ST;
try
{
System.out.println("<BP::read> "+ fileName);
BufferedReader inB = new BufferedReader(new FileReader(fileName));
//read control parameters
int iNumInputNodes = 0;
int iNumHiddenNodes = 0;
int iNumOutputNodes = 0;
int iTaskType = 0;
int iCount = 0;
while ((sLine = inB.readLine()) != null && iCount < 4)
{
sLine = sLine.trim();
if (sLine.length() == 0 || sLine.charAt(0) == ';') continue;
ST = new StringTokenizer(sLine, " ,;\t");
sItem = ST.nextToken();
switch(iCount)
{
case 0: iNumInputNodes = Integer.parseInt(sItem); break;
case 1: iNumHiddenNodes = Integer.parseInt(sItem); break;
case 2: iNumOutputNodes = Integer.parseInt(sItem); break;
case 3: iTaskType = Integer.parseInt(sItem); break;
}
iCount ++;
}
//set neural network
initialize(iNumInputNodes, iNumHiddenNodes, iNumOutputNodes, iTaskType);
//read input-hidden layer weights
iCount = 0;
while (iCount < m_iHiddenNodes && (sLine = inB.readLine()) != null)
{
sLine = sLine.trim();
if (sLine.length() == 0 || sLine.charAt(0) == ';') continue;
ST = new StringTokenizer(sLine, " ,\t");
sItem = ST.nextToken(); //skip index
//parsing input-layer bias
mdIB[iCount] = Double.parseDouble(ST.nextToken());
//parsing input layer weights
for (i=0; i<m_iInputNodes; i++)
mdIH[iCount] = Double.parseDouble(ST.nextToken());
iCount ++;
}
//read hidden-output layer weights
iCount = 0;
while (iCount < m_iOutputNodes && (sLine = inB.readLine()) != null)
{
sLine = sLine.trim();
if (sLine.length() == 0 || sLine.charAt(0) == ';') continue;
ST = new StringTokenizer(sLine, " ,\t");
sItem = ST.nextToken(); //skip index
//parsing hidden layer bias
mdHB[iCount] = Double.parseDouble(ST.nextToken());
//parsing output layer weights
for (i=0; i<m_iHiddenNodes; i++)
mdHO[iCount] = Double.parseDouble(ST.nextToken());
iCount ++;
}
inB.close();
}
catch (Exception ex)
{
ex.printStackTrace();
System.out.println("<BP::read> error on reading "+ fileName);
return false;
}
return true;
}
/**
* TEST PROGRAM
*/
public static void main(String [] argv)
{
BP bp = new BP();
bp.initialize(8, 5, 2, 0);
bp.save("bp.bp");
bp.read("bp.bp");
bp.save("bp.bp.bak");
}
/** End of BP Class */
} |
|
|