python-3.x - 如何更新权重和偏差
问题描述
我正在尝试从头开始编写一个带有 numpy 的神经网络来识别 hand_written_digits。但是我在更新权重和偏差方面有点困惑
这是我的代码
class NeuralNetwork():
learning_rate = 0.0001
ephochs = 10000
nodes_in_input_layer = 784 # features
nodes_in_hidden_layer = 100
nodes_in_output_layer = 10 # classes
np.random.seed(3)
def __init__(self):
self.hidden_layer = {'weights': np.random.rand(self.nodes_in_input_layer, self.nodes_in_hidden_layer)*0.1,
'biases': np.random.rand(self.nodes_in_hidden_layer)*0.1 }
self.output_layer = {'weights': np.random.rand(self.nodes_in_hidden_layer, self.nodes_in_output_layer)*0.1,
'biases': np.random.rand(self.nodes_in_output_layer)*0.1 }
print('self.hidden_layer: ',self.hidden_layer['weights'].shape)
print('self.output_layer: ',self.output_layer['weights'].shape)
def fit(self, x, y, ephochs= ephochs):
for i in range(ephochs):
# feed forword
z_hidden_layer = np.dot(x[i], self.hidden_layer['weights']) + self.hidden_layer['biases']
o_hidden_layer = sigmoid(z_hidden_layer)
z_output_layer = np.dot(o_hidden_layer, self.output_layer['weights']) + self.output_layer['biases']
o_output_layer = sigmoid(z_output_layer)
# back propagation
error = o_output_layer - y[i]
'''
## at output layer
derror_dweights = derror/do * do/dz * dz/dw
derror/do = error
do/dz = derivative of sigmoid(x[i])
dz/dw = o_hidden_layer
'''
derror_do = error
do_dz = sigmoid(z_output_layer, derivative=True)
dz_dw = o_hidden_layer
nw_output_layer = derror_do * do_dz
nw_output_layer = np.dot(nw_output_layer, dz_dw.T)
nb_output_layer = error
# updating new weights and biases
self.output_layer['weights'] = self.output_layer['weights'] - (self.learning_rate * nw_output_layer)
self.output_layer['biases'] = self.output_layer['biases'] - (self.learning_rate * nb_output_layer)
## update remain weights and biases
当我跑步时,我得到了这个错误
nw_output_layer = np.dot(nw_output_layer, dz_dw.T)
ValueError: shapes (10,) and (100,) not aligned: 10 (dim 0) != 100 (dim 0)
谁能逐步解释更新这个神经网络的权重和偏差的过程?
解决方案
在神经网络中,您必须将数据预处理成相同的形状。您可以尝试在函数内预处理数据。因此,您必须简单地调用相同的函数来预处理测试数据。这将防止为不同的数据获得不同的形状。
更新权重以测量用于分离数据的超平面。例如,
在二元分类中,你用斜率填充 find 线,用线方程 Y = MX + B 分离两个类。同样的方法,你需要通过梯度下降算法用超平面分离多维数据。
W = W - 学习率 * delta
这里的 delta 是损失的偏导数。通过更新权重,您可以减少损失。在某一点上,损失将达到某个局部最小值。此时(局部最小值)停止历元(迭代次数以找到最佳精度)。
要更新权重,您可以使用一些批量大小的 for 循环。在神经网络中,您必须找到适合您数据的学习率和时期。如果您使用的学习率非常低,则会减慢您的训练速度。
推荐阅读
- html - jekyll-seo-tag:包括前面的“标签”属性
- c# - Oracle UDT 映射与 .Net 自定义类型包的类型映射问题
- c# - 如何使用 WinForms 使 MenuStrip 与关闭/最小化按钮处于同一级别?
- python - Numpy数组:如何根据列中的值提取整行
- algorithm - 创建易于记忆且不易出错的数字的算法
- python - 高斯过程回归增量学习
- javascript - d3 fitExtent 函数未映射 GeoJSON
- reactjs - 带有 react 包的 Yarn 工作区,适用于 babel,不适用于 babel+webpack(?)
- sql - 如何克服这个问题。如果经理不可用,则显示经理名称“NA”。如果电话号码不可用,则显示为“NA”
- c# - 在 Pivot selected Item 更改 UWP 上隐藏子网格