改变张量流中输入层的形状

数据挖掘 机器学习 神经网络 深度学习 张量流 美国有线电视新闻网
2022-03-01 07:20:47

我有一个卷积网络,它由多个 CNN 层(可以使用任何大小)和最后一个完全连接的层组成,它只能使用固定的输入大小。

我已经针对某些图像大小训练了网络,并且完全连接的层只能用于这些输入大小。

在处理不同的输入大小时,我不想重新训练整个网络。有什么方法可以只训练新添加的全连接层。

我的推理代码如下所示

def inference(images, reuse=False, trainable=True):
    coarse1_conv = conv2d('coarse1', images, [11, 11, 3, 96], [96], [1, 4, 4, 1], padding='VALID', reuse=reuse, trainable=trainable)
    coarse1 = tf.nn.max_pool(coarse1_conv, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='VALID', name='pool1')
    coarse2_conv = conv2d('coarse2', coarse1, [5, 5, 96, 256], [256], [1, 1, 1, 1], padding='VALID', reuse=reuse, trainable=trainable)
    coarse2 = tf.nn.max_pool(coarse2_conv, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='SAME', name='pool1')
    coarse3 = conv2d('coarse3', coarse2, [3, 3, 256, 384], [384], [1, 1, 1, 1], padding='VALID', reuse=reuse, trainable=trainable)
    coarse4 = conv2d('coarse4', coarse3, [3, 3, 384, 384], [384], [1, 1, 1, 1], padding='VALID', reuse=reuse, trainable=trainable)
    coarse5 = conv2d('coarse5', coarse4, [3, 3, 384, 256], [256], [1, 1, 1, 1], padding='VALID', reuse=reuse, trainable=trainable)
    coarse6 = fc('coarse6', coarse5, [6*10*256, 4096], [4096], reuse=reuse, trainable=trainable)
    coarse7 = fc('coarse7', coarse6, [4096, 4070], [4070], reuse=reuse, trainable=trainable)
    coarse7_output = tf.reshape(coarse7, [-1, 55, 74, 1])
    return coarse7_output
1个回答

实际上,如果您将输入更改为输入大小,卷积层不会出现任何问题,但这些层的输出会增加,这将导致密集层1的输入数量增加。因此,你必须有额外的重量,你必须训练它们。这就是为什么最好有一个固定大小的输入。但是还有其他解决方案可以扩展到您的任务。看看课程第三周的内容。正如您将看到的,您必须将图像的补丁输入到网络中,但是对于检测任务所做的工作,您必须将其扩展到您的任务,但也许将所有输入的大小调整为预定义的大小更简单。