Problem using a trained network with Encog in a JSP environment
Hi Jeff,
Thanks for your previous reply: I finally got a neural network that works perfectly and I saved it in a file to be used in a server with JSP.
The code I use in the webpage is:
<%@ page import="java.util.List"%>
<%@ page import="java.util.Iterator"%>
<%@ page import="java.io.*"%>
<%@ page import="org.encog.neural.data.*"%>
<%@ page import="org.encog.neural.data.basic.BasicNeuralDataSet"%>
<%@ page import="org.encog.neural.data.csv.CSVNeuralDataSet"%>
<%@ page import="org.encog.neural.networks.*"%>
<%@ page import="org.encog.neural.networks.layers.*"%>
<%@ page import="org.encog.neural.networks.training.backpropagation.Backpropagation"%>
<%!
BasicNetwork restoreNeuralNet(String fileName) {
FileInputStream inn;
BasicNetwork network = null;
try {
inn = new FileInputStream(fileName);
ObjectInputStream s = new ObjectInputStream(inn);
network = (BasicNetwork)s.readObject();
return network;
} catch (FileNotFoundException e) { e.printStackTrace();
} catch (IOException e) { e.printStackTrace();
} catch (ClassNotFoundException e) { e.printStackTrace(); }
return network;
}
%>
...
<%
// Set path variable at '/uploads'
String serverUploadPath = application.getRealPath("/") + "uploads/";
BasicNetwork network = this.restoreNeuralNet(serverUploadPath + "nnet.snet");
if (network != null) {
NeuralDataSet trainingSet = new CSVNeuralDataSet(serverUploadPath + "input.txt",2500,1,false,';');
// test the neural network
out.println("Neural Network Results:");
for(NeuralDataPair pair: trainingSet ) {
final NeuralData output = network.compute(pair.getInput());
out.println(pair.getInput().getData(0) + "," + pair.getInput().getData(1)
+ ", actual=" + output.getData(0) + ",ideal=" + pair.getIdeal().getData(0));
}
}
%>
I've used that exact code in a desktop application I've developed and it works perfectly, but for some reason, when I try to execute it in the server with Tomcat 6.0 I get this exception:
Jun 25, 2009 11:09:53 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.ClassCastException: cannot assign instance of org.encog.neural.networks.layers.FeedforwardLayer to field org.encog.neural.networks.layers.BasicLayer.next of type java.util.List in instance of org.encog.neural.networks.layers.FeedforwardLayer
at java.io.ObjectStreamClass$FieldReflector.setObjFieldValues(ObjectStreamClass.java:2004)
at java.io.ObjectStreamClass.setObjFieldValues(ObjectStreamClass.java:1184)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1916)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1834)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1719)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1910)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1834)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1719)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1910)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1834)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1719)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
at org.apache.jsp.neural_jsp.restoreNeuralNet(neural_jsp.java:26)
at org.apache.jsp.neural_jsp._jspService(neural_jsp.java:111)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.valves.RequestFilterValve.process(RequestFilterValve.java:269)
at org.apache.catalina.valves.RemoteAddrValve.invoke(RemoteAddrValve.java:81)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:857)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:565)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1509)
at java.lang.Thread.run(Thread.java:613)
I would appreciate if you could help me or orientate me on this.
Thank you very much in advance.
Liboh




I've never used Encog in JSP, but really see no reason that it would have any issue.
Looking at the error message it almsot looks to me like you might be using Encog 2.0 in the JSP, but 1.1 when you created your serialize file. Because in Encog 1.1 the next field on the BasicLayer is just another basic layer. In Encog 2.0, this was changed to a list, because on layer can have multiple "next layers". The error above is
ava.lang.ClassCastException: cannot assign instance of org.encog.neural.networks.layers.FeedforwardLayer to field org.encog.neural.networks.layers.BasicLayer.next of type java.util.List in instance of org.encog.neural.networks.layers.FeedforwardLayer
Which says that you cannot assign a FeedforwardLayer to the field next, because next is of type List. Which is exactly how it would be in 2.0. Are you sure you are using the same version of the JAR file in both places. Java serialization is just making a binary image of the classes, so it is very dependent on the classes being laid out exactly as it expects.
Thanks Jeff, I'm gonna use the recently released Encog 2.0 to avoid this problem and I want to replicate the same behavior that in Encog 1.1. After copying the Encog 1.1 code, there are just two changes to be made in order to fix the problems:
1. The training function. I just had to change the import to be able to use Backpropagation in the same way:
train = new Backpropagation(network, trainingSet, 0.01, 0.9);2. The layer definition. In the original code I wrote
network.addLayer(new FeedforwardLayer(100));and I don't know what to do in order to create the same kind of layers with Encog 2.0. I tried withnetwork.addLayer(new BasicLayer(100));but when I train the NN, it always gets the same error without variation, during all the epochs: 0.7071067811865476, while Encog 1.1 starts with 0.5920683188673277 and has a constant reduction of the error.I think the problem using Encog 2.0 is the layer definition since I have changed Backpropagation to ResilientPropagation and the error is still the same 0.7071067811865476, and there aren't more changes between the Encog 1.1 code and the new one. What can I do?
Thanks for your help, I really appreciate all your work on these issues.
Thanks, glad I was able to help. And thanks for bringing potential errors to my attention.
Jeff