python - model.train_on_batch() 实际上在做什么?
问题描述
我正在使用以下命令在 Python 中训练 MobileNetV2 网络:
newmodel = tf.keras.applications.MobileNetV2(
input_shape=(224,224,3),
alpha=1.0,
include_top=True,
weights="imagenet",
input_tensor=None,
pooling=None,
classes=1000,
classifier_activation="softmax",)
newmodel.compile(loss='sparse_categorical_crossentropy',
optimizer=tf.keras.optimizers.RMSprop(
learning_rate=0.045, rho=0.9,
momentum=0.9, epsilon=1e-07,
centered=False, name='RMSprop'),
metrics=['accuracy'])
newmodel.train_on_batch(x=processed_image, y=y_true, sample_weight=None, class_weight=None)
processed_image
之前声明的位置是一个 1x224x224x3 numpy 数组。
我使用预先训练的权重作为基础,这样我就不必随机化系统中的每个权重。我感兴趣的是对权重和偏差所做的更改,因为我想在自己的实现中复制它。具体来说,目前,我只对最终的全连接层感兴趣。
但是在这个例子中,这些变化实际上是如何计算的呢?为了回答这个问题,涉及到很多微积分,我试图得到最终的方程,但分析这些方程可能更适合数学堆栈交换或其他网站。
相反,我想问是否有任何方法可以从 Python访问源代码以确切知道它在做什么,以便我可以从中提取一个方程。
作为附录,如果这里有人精通反向传播背后的微积分并想看看我得到了什么方程,这里是网络全连接部分的最终方程,它只有两层,一层有 1280 个神经元,后面是一个有 1000 个神经元。我们必须考虑交叉熵损失、softmax、学习率(有衰减)和 RMSProp(我还包括标准的权重衰减):
在哪里:
- I 是输入层中一个神经元的值
- Z 是输出层中一个神经元在softmax 之前的激活
- O是softmax之后输出层中一个神经元的激活
- L 是分类值的交叉熵损失
- W 代表权重,B 代表偏差,P(参数)代表任一
- i 是输入层中神经元的索引 (1 - 1280)
- j 是输出层中神经元的索引 (1 - 1000)
- c 是输出层中最高激活神经元的索引
- t 是表示 epoch 的索引
- Lambda 是标准重量衰减 (= 0.00004)
- Mu 是动量,Rho 是 RMSProp 的衰减超参数(均等于 0.9)
- Eta 是学习率(初始值 = 0.045),Delta 是学习率衰减(每个 epoch 0.98)
- Epsilon 是数值稳定性的常数(假设 Keras 默认 = 1e-07)
即使告诉我他们明显有问题也已经是一个很大的帮助。
解决方案
推荐阅读
- javascript - 通过道具将数据从父类传递到子类,但道具在子类中不返回任何内容
- python - ImportErrorWhenRunningHook:pyinstaller 无法导入模块所需的模块 _pyinstaller_hooks_0_pandas_io_formats_style
- python - 从 Python 列表中将值添加到字典中
- c# - UnauthorizedAccessException:将统一数据保存到文件时访问路径
- vue.js - 我对两个不同的组件使用相同的脚本。但是对于这两个组件,它显示的是最新的
- excel - 具有百分比输出的 Excel IF AND 语句
- reactjs - 我在 React JS 中的 iconButton 有什么问题?
- javascript - 图片库通过纯 JavaScript 进行分页
- sql - SQL select 随机排序,但某些行必须按“下一个”id 列分组
- python - 如何创建一个for循环来在python的字典中添加元素?