Ram*_*hum 5 python machine-learning neural-network keras tensorflow
我是机器学习的新手。我正在通过给自己练习来使用 Keras 学习它。
这是我最近练习的视频。我训练了一个卷积神经网络来识别三个不同的对象。手机将图像发送到我桌面上运行 Keras 的 Web 服务器。
我花了一段时间才得到一个有效的模型。我首先在无菌背景下训练这 3 个对象的视频帧。我不知道这种技术是否有公认的名称,但我使用了一种“训练轮”方法。首先,我在一个非常简单的背景下训练模型。然后在更忙的背景上拍摄更多视频。我做了 6 轮,每一轮都有不同的背景。在每一轮中,我加载前几轮的权重,并在所有前几轮的组合数据集上训练网络。这个想法是让神经网络开始做一些简单的事情,然后逐渐扩展它的知识,而不是立即给它一个艰巨的任务。
这似乎奏效了,我现在在不同背景下识别这些物体时具有很好的准确性。我已将模型权重保存到文件中。
我的问题是:现在我有很好的训练有素的网络,是否有可能改变它的结构?例如,现在我正在裁剪图像并将其调整为 64x64。如果我想将其提高到 128x128,我可以使用到目前为止我训练过的权重吗?如果我想添加颜色怎么办(所以是 3 个通道而不是 1 个),是否可以不从头开始训练?
了解一点关于神经网络的知识。神经网络架构的第一层学习简单的特征。
例如,
考虑图像,第一层将学习检测水平或垂直边缘,稍后它将能够检测更复杂的特征。看看这个和这个。
现在,您拥有一个经过训练且具有良好准确性的神经网络,并且您希望使用这些经过训练的权重,但同时更改架构。
保持模型的顶层不变并改变底层的架构:
如果您保持顶层不变并更改较低层的体系结构,则此方法将起作用。IE。添加/删除密集层,添加/删除卷积层。
这是因为前一层学习到的特征负责下一层的特征。看看这个。如果更改第一层中的神经元数量,则后续层中的特征表示会发生变化。
因此,如果您向现有层添加另一个卷积层,它将采用从训练模型生成的特征,并使用这些特征来学习更复杂的特征。
现在,如果您想保持模型的顶部不变,则必须使用与模型训练时相同的输入格式。
更改部门:
当您更改输入时,参数的数量以及可以处理特定输入更改的图层类型。
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(3, 3,input_shape=(64,64,1)),
tf.keras.layers.Dense(512, activation=tf.nn.relu),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.summary()
Run Code Online (Sandbox Code Playgroud)
输出:
Model: "sequential_5"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_5 (Conv2D) (None, 62, 62, 3) 30
_________________________________________________________________
dense_10 (Dense) (None, 62, 62, 512) 2048
_________________________________________________________________
dense_11 (Dense) (None, 62, 62, 10) 5130
=================================================================
Total params: 7,208
Trainable params: 7,208
Non-trainable params: 0
Run Code Online (Sandbox Code Playgroud)
代码:
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(3, 3,input_shape=(64,64,3)),
tf.keras.layers.Dense(512, activation=tf.nn.relu),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.summary()
Run Code Online (Sandbox Code Playgroud)
输出:
Model: "sequential_6"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_6 (Conv2D) (None, 62, 62, 3) 84
_________________________________________________________________
dense_12 (Dense) (None, 62, 62, 512) 2048
_________________________________________________________________
dense_13 (Dense) (None, 62, 62, 10) 5130
=================================================================
Total params: 7,262
Trainable params: 7,262
Non-trainable params: 0
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,两个模型的参数都不同。因此,您将无法将一个模型的权重用于第二个模型,因为权重矩阵的维度不匹配。
更改输入大小:
如果更改输入大小而不更改通道数,即。(64,64,1) --> (128, 128, 1) 您的参数将保持不变。因此,您可以将之前训练的权重与新模型一起使用。
但是,请知道学习的权重取决于输入的大小。因此,对 (64,64,1) 有效的方法不一定适用于 (128,128,1),但可以作为良好的初始化权重。
在经过训练的架构之前添加未经训练的层:
这是行不通的,因为正如我们之前所看到的,前一层生成的特征负责下一层的特征。如果前一层的特征发生变化,那么下一层的特征也应该相应改变。
关键点:
如果您想使用预训练模型,请将该模型保留为新架构的顶部部分,并使用与训练预训练模型相同的输入结构。
如果您想更改通道数量,最好从头开始训练模型。
如果您想更改输入大小,可以使用预先训练的模型权重作为一个很好的起点。