目前我正在学习神经网络,我正在尝试创建一个可以训练识别手写字符的应用程序.对于这个问题,我使用前馈神经网络,当我训练它识别1,2或3个不同的字符时,它似乎有效.但是当我尝试使网络学习超过3个字符时,它将停留在40 - 60%左右的错误百分比.
我尝试了多层和更少/更多的神经元,但我似乎无法正确,现在我想知道前馈神经网络是否能够识别那么多信息.
一些统计:
网络类型:前馈神经网络
输入神经元: 100(10*10)网格用于绘制字符
输出神经元:重新定位的字符数量
有谁知道我的架构中可能存在的缺陷是什么?输入神经元太多了吗?前馈神经网络不具备角色定位能力吗?
ocr artificial-intelligence backpropagation neural-network feed-forward
我想知道:在多层前馈神经网络中,输入层是否应包含偏置神经元,或者这在隐藏层中是否有用?如果是这样,为什么?
谢谢你,
Tunnuz
我试图用反向传播在Java中实现FFNN,并且不知道我做错了什么.当我在网络中只有一个神经元时,它工作,但我写了另一个类来处理更大的网络,没有任何收敛.这似乎是数学中的问题 - 或者更确切地说是我对数学的实现 - 但我已经多次检查它并且我找不到任何错误.这应该有效.
节点类:
package arr;
import util.ActivationFunction;
import util.Functions;
public class Node {
public ActivationFunction f;
public double output;
public double error;
private double sumInputs;
private double sumErrors;
public Node(){
sumInputs = 0;
sumErrors = 0;
f = Functions.SIG;
output = 0;
error = 0;
}
public Node(ActivationFunction func){
this();
this.f = func;
}
public void addIW(double iw){
sumInputs += iw;
}
public void addIW(double input, double weight){
sumInputs += (input*weight);
}
public double calculateOut(){
output = …Run Code Online (Sandbox Code Playgroud) 在Keras的LSTM实现中的默认模式(状态= False)下,一批中的所有样本都是独立的,并且状态不会从一个样本传播到下一个样本。根据我的理解,输入序列长度(L)是使LSTM保持状态的唯一方法。但是,这限制了状态传播到一个固定数目的时间步长,即大号。从理论上讲,与具有固定大小的滑动输入窗口的前馈NN相比,此操作模式将具有什么优势。这样,到NN的每个输入都是L个连续输入值的向量。
从理论上讲,LSTM应该能够学习跨越1000个时间步长的长期依赖关系。但这是否不要求我有L = 1000,因为没有办法捕获比输入序列长的依赖项?我知道可以通过格式化输入数据来使用有状态模式,这样每批的第i个样本都是相关的。我很难理解默认的LSTM模式相对于带有滑动窗口的前馈NN优于输入数据有什么优势?
这是我使用keras和tensorflow作为后端运行的确切代码.对于具有相同程序的每次运行,训练结果是不同的.有时它在第400次迭代中获得100%的准确度,有时在第200次中获得100%的准确度.
training_data = np.array([[0,0],[0,1],[1,0],[1,1]], "float32")
target_data = np.array([[0],[1],[1],[0]], "float32")
model = Sequential()
model.add(Dense(4, input_dim=2, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='mean_squared_error',
optimizer='adam',
metrics=['binary_accuracy'])
model.fit(training_data, target_data, epochs=500, verbose=2)
Epoch 403/500
0s - loss: 0.2256 - binary_accuracy: 0.7500
Run Code Online (Sandbox Code Playgroud)
那么为什么在列车数据修复后每次执行结果都会发生变化?非常感谢一些解释.
我正在尝试用Java实现前馈神经网络.我创建了三个类NNeuron,NLayer和NNetwork."简单"计算似乎很好(我得到正确的总和/激活/输出),但是当涉及到培训过程时,我似乎没有得到正确的结果.谁能告诉我我做错了什么?NNetwork类的整个代码很长,所以我发布导致问题的部分:[编辑]:这实际上几乎都是NNetwork类
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class NNetwork
{
public static final double defaultLearningRate = 0.4;
public static final double defaultMomentum = 0.8;
private NLayer inputLayer;
private ArrayList<NLayer> hiddenLayers;
private NLayer outputLayer;
private ArrayList<NLayer> layers;
private double momentum = NNetwork1.defaultMomentum; // alpha: momentum, default! 0.3
private ArrayList<Double> learningRates;
public NNetwork (int nInputs, int nOutputs, Integer... neuronsPerHiddenLayer)
{
this(nInputs, nOutputs, Arrays.asList(neuronsPerHiddenLayer));
}
public NNetwork (int nInputs, int nOutputs, List<Integer> neuronsPerHiddenLayer)
{
// the number of neurons on the last …Run Code Online (Sandbox Code Playgroud) 我是神经网络的新手,我正在设计一个前馈神经网络,以学习玩游戏检查器。作为输入,必须提供董事会,而输出则应该有输赢的机会。但是,如何将跳棋盘理想地转换为一行数字以进行输入呢?每个方块上有32个可能的方块和5种不同的可能性(国王或白人或黑人玩家和自由位置)。如果我为每个正方形的每个可能值提供一个输入单位,则为32 *5。另一种选择是:
Free Position: 0 0
Piece of white: 0 0.5 && King Piece of white: 0 1
Piece of black: 0.5 1 && King Piece of black: 1 0
Run Code Online (Sandbox Code Playgroud)
在这种情况下,输入长度将仅为64,但是我不确定哪个会带来更好的结果?
artificial-intelligence machine-learning neural-network feed-forward
我是 pytorch 的新手,即使是最简单的网络,我也无法在不生成错误的情况下运行backward()。例如:
(Linear(6, 6)(Variable(torch.zeros([10, 6]))) - Variable(torch.zeros([10, 6]))).backward()
Run Code Online (Sandbox Code Playgroud)
抛出以下错误
{RuntimeError}element 0 of variables does not require grad and does not have a grad_fn
Run Code Online (Sandbox Code Playgroud)
我在代码中做错了什么导致了这个问题?