org.apache.tika.detect.NNTrainedModel Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of tika-core Show documentation
Show all versions of tika-core Show documentation
This is the core Apache Tika™ toolkit library from which all other modules inherit functionality. It also
includes the core facades for the Tika API.
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.tika.detect;
public class NNTrainedModel extends TrainedModel {
private int numOfInputs;
private int numOfHidden;
private int numOfOutputs;
private float[][] Theta1, Theta2;
public NNTrainedModel(final int nInput, final int nHidden,
final int nOutput, final float[] nn_params) {
this.numOfInputs = nInput;
this.numOfHidden = nHidden;
this.numOfOutputs = nOutput;
this.Theta1 = new float[numOfHidden][numOfInputs + 1];
this.Theta2 = new float[numOfOutputs][numOfHidden + 1];
populateThetas(nn_params);
}
// convert the vector params to the 2 thetas.
private void populateThetas(final float[] nn_params) {
int m = this.Theta1.length;
int n = this.Theta1[0].length;
int i, j, k = 0;
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
this.Theta1[j][i] = nn_params[k];
k++;
}
}
m = this.Theta2.length;
n = this.Theta2[0].length;
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
this.Theta2[j][i] = nn_params[k];
k++;
}
}
}
@Override
public double predict(double[] unseen) {
// TODO Auto-generated method stub
return 0;
}
/**
* The given input vector of unseen is m=(256 + 1) * n= 1 this returns a
* prediction probability
*/
@Override
public float predict(float[] unseen) {
// please ensure the unseen in size consistent with theta1
int i, j;
int m = this.Theta1.length;
int n = this.Theta1[0].length;
float[] hh = new float[m + 1];// hidden unit summation
hh[0] = 1;
for (i = 0; i < m; i++) {
double h = 0;
for (j = 0; j < n; j++) {
h += this.Theta1[i][j] * unseen[j];
}
// apply sigmoid
h = 1.0 / (1.0 + Math.exp(-h));
hh[i+1] = (float)h;
}
m = this.Theta2.length;
n = this.Theta2[0].length;
float[] oo = new float[m];
for (i = 0; i < m; i++) {
double o = 0;
for (j = 0; j < n; j++) {
o += this.Theta2[i][j] * hh[j];
}
// apply sigmoid
o = 1.0 / (1.0 + Math.exp(-o));
oo[i] = (float)o;
}
return oo[0];
}
}