我是机器学习的新手。我正在通过Keras锻炼自己来学习它。
Here is the video来自我最近的练习。我已经训练了卷积神经网络来识别三个不同的对象。手机将图像发送到运行Keras的台式机上的Web服务器。
花了一段时间才找到一个可行的模型。我首先在无菌背景下训练这三个对象的视频帧。我不知道这种技术是否有公认的名称,但我使用了一种“训练轮”方法。首先,我在非常简单的背景上训练了模型。然后在繁忙的背景上拍摄了更多视频。我做了6个回合,每个回合都有不同的背景。在每一轮中,我都加载了前几轮的权重,并在所有前几轮的组合数据集上训练了网络。这个想法是让神经网络从简单的事情开始,然后逐渐扩展其知识,而不是立即给它一个困难的任务。
这似乎可行,现在在不同背景下识别这些对象时,我的准确性很高。我已经将模型权重保存到文件中。
我的问题是:现在我拥有训练有素的网络,是否可以更改其结构?例如,现在我将图像裁剪并调整为64x64。如果我想将其提高到128x128,是否可以使用到目前为止训练过的权重?如果我想添加颜色(所以3个通道而不是1个)怎么办,而无需从头开始训练?
答案 0 :(得分:0)
对神经网络有一点了解。
神经网络架构的第一层学习简单的功能。
对于例如
考虑图像,第一层将学习检测水平或垂直边缘,随后将能够检测更复杂的特征。看看this和this。
现在,您拥有一个训练有素的神经网络,它具有很高的准确性,您想使用这些训练有素的权重,但同时又要更改架构。
保持模型常量的顶部并更改底层的体系结构:
如果您保持顶层不变并更改较低层的体系结构,则此方法将起作用。即。添加/删除密集层,添加/删除卷积层。
这是因为在上一层学习的功能负责下一层的功能。看一下this。如果更改第一层中的神经元数量,则特征表示将在随后的层中更改。
因此,如果在现有层上添加另一个卷积层,它将使用从训练后的模型生成的特征,并使用这些特征来学习甚至更复杂的特征。
现在,如果要使模型的顶部保持恒定,则必须使用训练模型时所用的相同输入格式。
更改部门:
更改输入时,参数数量以及可以处理该特定输入的图层类型都会发生变化。
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()
输出:
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
代码:
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()
输出:
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
如您所见,两个模型的参数都不同。因此,由于权重矩阵的尺寸不匹配,您将无法在一个模型中将权重用于第二个模型。
更改输入大小:
如果更改输入大小而不更改通道数,即。 (64,64,1)->(128,128,1)您的参数将保持不变。因此,您可以在新模型中使用以前训练过的砝码。
但是,要知道,学习到的权重取决于输入的大小。因此,对于(64,64,1)而言,效果最佳的不一定对(128,128,1)而言,但可以作为良好的初始化权重。
在经过培训的体系结构之前添加未经培训的层:
这是行不通的,因为如前所述,前一层生成的要素负责下一层的要素。如果上一层的特征发生变化,则下一层的特征应发生相应的变化。
要点:
如果要使用预先训练的模型,请将模型保留为新体系结构的顶部,并使用与训练预先训练的模型相同的输入结构。
如果要更改渠道数量,最好从头开始训练模型。
如果要更改输入大小,可以使用预先训练的模型权重作为一个很好的起点。