- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于我的 APCS 最终项目,我正在制作一个应用程序:
以下类代表神经元:
import java.awt.*;
import java.util.*;
import java.io.*;
public class Neuron
{
private double[][] weights;
public static double LEARNING_RATE = 0.01;
/**
*Initialize weights
*Assign random double values to weights
*/
public Neuron(int r, int c)
{
weights = new double[r][c];
PrintWriter printer = null;
try
{
printer = new PrintWriter("training.txt");
}
catch (FileNotFoundException e) {};
for (int i = 0; i < weights.length; i++)
{
for (int j = 0; j < weights[i].length; j++)
{
weights[i][j] = 2 * Math.random() - 1; //Generates random number between -1 and 1
if (j < weights[i].length - 1)
printer.print(weights[i][j] + " ");
else
printer.print(weights[i][j]);
}
printer.println();
}
printer.close();
}
public Neuron(String fileName)
{
File data = new File(fileName);
Scanner input = null;
try
{
input = new Scanner(data);
}
catch (FileNotFoundException e)
{
System.out.println("Error: could not open " + fileName);
System.exit(1);
}
int r = Drawing.DEF_HEIGHT, c = Drawing.DEF_WIDTH;
weights = new double[r][c];
int i = 0, j = 0;
while (input.hasNext())
{
weights[i][j] = input.nextDouble();
j++;
if (j > weights[i].length - 1)
{
i++;
j = 0;
}
}
for (double[] a : weights)
System.out.println(Arrays.toString(a));
}
/**
*1. Initialize a sum variable
*2. Multiply each index of weights by each index of bin
*3. Sum these values
*4. Return the activated sum
*/
public int feedforward(int[][] bin) //bin represents 2D array of binary values for a binary image
{
double sum = 0;
for (int i = 0; i < weights.length; i++)
{
for (int j = 0; j < weights[i].length; j++)
sum += weights[i][j] * bin[i][j];
}
return activate(sum);
}
/**
*1. Generate a sigmoid (logistic) value from a sum
*2. "Digitize" the sigmoid value
*3. Return the digitized value, which corresponds to a number
*/
public int activate(double n)
{
double sig = 1.0/(1+Math.exp(-1*n));
int digitized = 0;
if (sig < 0.1)
digitized = 0;
else if (sig >= 0.1 && sig < 0.2)
digitized = 1;
else if (sig >= 0.2 && sig < 0.3)
digitized = 2;
else if (sig >= 0.3 && sig < 0.4)
digitized = 3;
else if (sig >= 0.4 && sig < 0.5)
digitized = 4;
else if (sig >= 0.5 && sig < 0.6)
digitized = 5;
else if (sig >= 0.6 && sig < 0.7)
digitized = 6;
else if (sig >= 0.7 && sig < 0.8)
digitized = 7;
else if (sig >= 0.8 && sig < 0.9)
digitized = 8;
else if (sig >= 0.9)
digitized = 9;
System.out.println("Sigmoid value: " + sig + "\nDigitized value: " + digitized);
return digitized;
}
/**
* 1. Provide inputs and "known" answer
* 2. Guess according to the inputs using feedforward(inputs)
* 3. Compute the error
* 4. Adjust all weights according to the error and learning rate
*/
public void train(int[][] bin, int desired)
{
int guess = feedforward(bin);
int error = desired-guess;
for (int i = 0; i < weights.length; i++)
{
for (int j = 0; j < weights[i].length; j++)
weights[i][j] += LEARNING_RATE * error * bin[i][j];
}
}
}
我使用不同的类来“训练”神经元。另一个类——TrainingConsole.java——基本上采用带有随机生成组件的“training.txt”,为其提供训练示例(图像 --> 二进制二维数组),并根据误差、学习率和相应值调整权重对于垃圾箱:
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Arrays;
import java.util.Scanner;
import javax.imageio.ImageIO;
public class TrainingConsole
{
private File folder;
private File data;
public TrainingConsole(String dataFileName, String folderName)
{
data = new File(dataFileName);
folder = new File(folderName);
}
public void changeFolder(String folderName)
{
folder = new File(folderName);
}
public void feedAll(int desired)
{
System.out.println(Arrays.toString(folder.listFiles()));
for (int i = 1; i < folder.listFiles().length; i++) //To exclude folder
{
BufferedImage img = new BufferedImage(Drawing.DEF_WIDTH,Drawing.DEF_HEIGHT,BufferedImage.TYPE_INT_RGB);
try
{
String name = folder.listFiles()[i].getName();
if (name.substring(name.length()-4).equals(".png"))
img = ImageIO.read(folder.listFiles()[i]);
}
catch(IOException e)
{System.out.println("Error?");}
int[][] bin = new int[Drawing.DEF_WIDTH][Drawing.DEF_HEIGHT];
if (img != null)
{
for (int y = 0; y < img.getHeight(); y++)
{
for (int x = 0; x < img.getWidth(); x++)
{
int rgb = img.getRGB(x,y);
//System.out.println(rgb);
if (rgb == -1) //White
bin[y][x] = 0;
else
bin[y][x] = 1;
}
}
for (int[] a : bin)
System.out.println(Arrays.toString(a));
train(bin,desired);
}
}
}
public void train(int[][] bin, int desired) {
int guess = feedforward(bin);
int error = desired - guess;
Scanner input = null;
try {
input = new Scanner(data);
} catch (FileNotFoundException e) {
System.exit(1);
}
double[][] weights = new double[Drawing.DEF_HEIGHT][Drawing.DEF_WIDTH];
int i = 0, j = 0;
while (input.hasNext() && i < Drawing.DEF_HEIGHT) {
weights[i][j] = input.nextDouble();
j++;
if (j > weights[i].length - 1) {
i++;
j = 0;
}
}
for (int k = 0; k < weights.length; k++) {
for (int l = 0; l < weights[k].length; l++)
weights[k][l] += IMGNeuron.LEARNING_RATE * error * bin[k][l];
}
data = new File(data.getName());
PrintWriter output = null;
try {
output = new PrintWriter(data);
} catch (FileNotFoundException e) {
System.out.println("Cannot find data");
}
for (int m = 0; m < weights.length; m++) {
for (int n = 0; n < weights[m].length - 1; n++)
output.print(weights[m][n] + " ");
output.print(weights[m][weights[m].length - 1]);
output.println();
}
output.close();
}
public int feedforward(int[][] bin)
{
double sum = 0;
Scanner input = null;
try
{
input = new Scanner(data);
}
catch(FileNotFoundException e)
{
System.out.println("Could not locate data");
}
double[][] weights = new double[Drawing.DEF_HEIGHT][Drawing.DEF_WIDTH];
int i = 0, j = 0;
while (i < Drawing.DEF_HEIGHT && j < Drawing.DEF_WIDTH)
{
//System.out.println("( " + i + " , " + j + " )");
weights[i][j] = input.nextDouble();
j++;
if (j > weights[i].length - 1)
{
i++;
j = 0;
}
}
for (int m = 0; m < weights.length; m++)
{
for (int n = 0; n < weights[m].length; n++)
sum += weights[m][n] * bin[m][n];
}
return activate(sum);
}
public int activate(double n)
{
double sig = 1.0/(1+Math.exp(-1*n));
int digitized = 0;
if (sig < 0.1)
digitized = 0;
else if (sig >= 0.1 && sig < 0.2)
digitized = 1;
else if (sig >= 0.2 && sig < 0.3)
digitized = 2;
else if (sig >= 0.3 && sig < 0.4)
digitized = 3;
else if (sig >= 0.4 && sig < 0.5)
digitized = 4;
else if (sig >= 0.5 && sig < 0.6)
digitized = 5;
else if (sig >= 0.6 && sig < 0.7)
digitized = 6;
else if (sig >= 0.7 && sig < 0.8)
digitized = 7;
else if (sig >= 0.8 && sig < 0.9)
digitized = 8;
else if (sig >= 0.9)
digitized = 9;
return digitized;
}
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
TrainingConsole trainer = new TrainingConsole("training.txt","Training_000");
System.out.println("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------");
System.out.println("Training Console");
System.out.println("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------");
for (int i = 0; i <= 9; i++) {
//System.out.print("Folder with training data for desired = " + i + ", or enter \"skip\" to skip: ");
//String folderName = input.nextLine().trim();
String folderName = "Training_00" + i;
//System.out.println(folderName);
if (!folderName.toLowerCase().equals("skip"))
{
trainer.changeFolder(folderName);
// System.out.print("Press enter to run: ");
// String noReason = input.nextLine();
trainer.feedAll(i);
}
System.out.println("----------------------------------------------------------------------------------------------------ava----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------");
}
}
}
对于后续的神经元构建,我传递“training.txt”作为权重矩阵。然而,这显然不起作用:enter image description here
请帮忙!我对神经网络和机器学习非常陌生。此时,我不知道我做错了什么:我需要更多的训练示例吗?我是否实现了一个糟糕的激活函数?任何意见,将不胜感激。另外,如果需要,请随时请求额外的代码。
最佳答案
正如评论中指出的,有两个主要问题,我将更详细地描述它们。
您的整个模型是单个感知器,这意味着您创建从输入空间(像素)到类(数字)的线性模型。这根本行不通,它不是现代意义上的神经网络。为图像处理设计的“现代”神经网络将由数千个神经元组成,这些神经元按层连接,中间具有非线性激活,可能以卷积核的形式排列(如下所示)是最先进的图像识别架构)。
你应该解决多类问题,但你实际上是在做排名。为了使神经网络分类为 K 个类别,您应该有 K 个输出神经元,每个输出神经元都会产生一个信号,该信号被解释为属于特定类别的“概率”(不是严格的数学意义上的),因此为了进行分类 - 您将采取arg max(具有最高值的神经元数量)。
一旦解决了整个架构的这两个重要问题,您应该开始获得合理的结果,然后唯一缺少的部分是调整超参数和获取更多训练数据。
关于java - 如何训练 OCR 神经网络?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37531634/
real adaboost Logit boost discrete adaboost 和 gentle adaboost in train cascade parameter 有什么区别.. -bt
我想为 book crossing 构建训练数据矩阵和测试数据矩阵数据集。但作为 ISBN 代码的图书 ID 可能包含字符。因此,我无法应用此代码(来自 tutorial ): #Create two
我找到了 JavaANPR 库,我想对其进行自定义以读取我所在国家/地区的车牌。 似乎包含的字母表与我们使用的字母表不同 ( http://en.wikipedia.org/wiki/FE-Schri
我有一个信用卡数据集,其中 98% 的交易是非欺诈交易,2% 是欺诈交易。 我一直在尝试在训练和测试拆分之前对多数类别进行欠采样,并在测试集上获得非常好的召回率和精度。 当我仅在训练集上进行欠采样并在
我打算: 在数据集上从头开始训练 NASNet 只重新训练 NASNet 的最后一层(迁移学习) 并比较它们的相对性能。从文档中我看到: keras.applications.nasnet.NASNe
我正在训练用于分割的 uNet 模型。训练模型后,输出全为零,我不明白为什么。 我看到建议我应该使用特定的损失函数,所以我使用了 dice 损失函数。这是因为黑色区域 (0) 比白色区域 (1) 大得
我想为新角色训练我现有的 tesseract 模型。我已经尝试过 上的教程 https://github.com/tesseract-ocr/tesseract/wiki/TrainingTesser
我的机器中有两个 NVidia GPU,但我没有使用它们。 我的机器上运行了三个神经网络训练。当我尝试运行第四个时,脚本出现以下错误: my_user@my_machine:~/my_project/
我想在python的tensorflow中使用稀疏张量进行训练。我找到了很多代码如何做到这一点,但没有一个有效。 这里有一个示例代码来说明我的意思,它会抛出一个错误: import numpy as
我正在训练一个 keras 模型,它的最后一层是单个 sigmoid单元: output = Dense(units=1, activation='sigmoid') 我正在用一些训练数据训练这个模型
所以我需要使用我自己的数据集重新训练 Tiny YOLO。我正在使用的模型可以在这里找到:keras-yolo3 . 我开始训练并遇到多个优化器错误,添加了错误代码以防止混淆。 我注意到即使它应该使用
将 BERT 模型中的标记化范式更改为其他东西是否有意义?也许只是一个简单的单词标记化或字符级标记化? 最佳答案 这是论文“CharacterBERT: Reconciling ELMo and BE
假设我有一个非常简单的神经网络,比如多层感知器。对于每一层,激活函数都是 sigmoid 并且网络是全连接的。 在 TensorFlow 中,这可能是这样定义的: sess = tf.Inte
有没有办法在 PyBrain 中保存和恢复经过训练的神经网络,这样我每次运行脚本时都不必重新训练它? 最佳答案 PyBrain 的神经网络可以使用 python 内置的 pickle/cPickle
我尝试使用 Keras 训练一个对手写数字进行分类的 CNN 模型,但训练的准确度很低(低于 10%)并且误差很大。我尝试了一个简单的神经网络,但没有效果。 这是我的代码。 import tensor
我在 Windows 7 64 位上使用 tesseract 3.0.1。我用一种新语言训练图书馆。 我的示例数据间隔非常好。当我为每个角色的盒子定义坐标时,盒子紧贴角色有多重要?我使用其中一个插件,
如何对由 dropout 产生的许多变薄层进行平均?在测试阶段要使用哪些权重?我真的很困惑这个。因为每个变薄的层都会学习一组不同的权重。那么反向传播是为每个细化网络单独完成的吗?这些细化网络之间的权重
我尝试训练超正方语言。我正在使用 Tess4J 进行 OCR 处理。我使用jTessBoxEditor和SerakTesseractTrainer进行训练操作。准备好训练数据后,我将其放在 Tesse
我正在构建一个 Keras 模型,将数据分类为 3000 个不同的类别,我的训练数据由大量样本组成,因此在用一种热编码对训练输出进行编码后,数据非常大(item_count * 3000 * 的大小)
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我是一名优秀的程序员,十分优秀!