如何创建具有动态输入的神经网络?
How to create a neural network that has a dynamic input?
这个问题很棘手:如何为神经网络提供动态输入?
回答这个问题肯定有助于现代 AI 将深度学习用于计算机视觉和语音识别以外的应用程序。
我将为神经网络的外行进一步解释这个问题。
我们以这个简单的例子为例:
假设您需要知道 "tic-tac-toe".
比赛中获胜、失败或平局的概率
所以我的输入可以是代表状态的[3,3]矩阵(1-你,2-敌人,0-空):
[2. 1. 0.]
[0. 1. 0.]
[2. 2. 1.]
假设我们已经有一个先前训练的隐藏层,一个[3,1]权重矩阵:
[1.5]
[0.5]
[2.5]
所以如果我们使用一个简单的激活函数,它基本上由两个 y(x)=W*x 之间的矩阵相乘组成,我们得到这个 [3,1] 矩阵在输出:
[2. 1. 0.] [1.5] [3.5]
[0. 1. 0.] * [0.5] = [0.5]
[2. 2. 1.] [2.5] [6.5]
即使没有 softmax 函数,您也可以看出平局的概率最高。
但是,如果我想让这个相同的神经网络用于 5x5 井字游戏怎么办?
它与 3x3 具有相同的逻辑,只是更大。神经网络应该能够处理它
我们会有这样的东西:
[2. 1. 0. 2. 0.]
[0. 2. 0. 1. 1.] [1.5] [?]
[2. 1. 0. 0. 1.] * [0.5] = [?] IMPOSSIBLE
[0. 0. 2. 2. 1.] [2.5] [?]
[2. 1. 0. 2. 0.]
但是这个乘法无法计算。我们将不得不 添加更多层 and/or 更改我们之前训练的层 并 RETRAIN 它,因为未经训练的权重(初始化为 0 in这种情况)会导致神经网络失败,像这样:
input 1st Layer output1
[2. 1. 0. 2. 0.] [0. 0. 0.] [6.5 0. 0.]
[0. 2. 0. 1. 1.] [1.5 0. 0.] [5.5 0. 0.]
[2. 1. 0. 0. 1.] * [0.5 0. 0.] = [1.5 0. 0.]
[0. 0. 2. 2. 1.] [2.5 0. 0.] [6. 0. 0.]
[2. 1. 0. 2. 0.] [0. 0. 0.] [6.5 0. 0.]
2nd Layer output1 final output
[6.5 0. 0.]
[5.5 0. 0.]
[0. 0. 0. 0. 0.] * [1.5 0. 0.] = [0. 0. 0.] POSSIBLE
[6. 0. 0.]
[6.5 0. 0.]
因为我们扩展了第一层并添加了一个新的零权重层,所以我们的结果显然没有定论。如果我们应用 softmax 函数,我们将意识到神经网络为每个可能的结果返回 33.3% 的机会。 我们需要再次训练它。
显然我们想要创建可以适应不同输入大小的通用神经网络,但是我还没有想到解决这个问题的方法!所以我想也许 Whosebug 可以提供帮助。成千上万的脑袋比一个脑袋想得更好。 有什么想法吗?
除了将输入调整为固定大小之外,还有针对卷积神经网络的解决方案。
Spatial Pyramid Pooling 允许您使用可变大小的图像训练和测试 CNN,它通过引入动态池化层来实现,其中输入可以是任意大小,输出是固定大小,然后可以将其馈送到完全连接的层。
池化很简单,在每个维度(比如 7x7)定义多个区域,然后层将每个特征图拆分为不重叠的 7x7 区域,并对每个区域进行最大池化,输出一个 49 元素向量。这也可以应用于多个尺度。
这个问题很棘手:如何为神经网络提供动态输入?
回答这个问题肯定有助于现代 AI 将深度学习用于计算机视觉和语音识别以外的应用程序。 我将为神经网络的外行进一步解释这个问题。
我们以这个简单的例子为例:
假设您需要知道 "tic-tac-toe".
比赛中获胜、失败或平局的概率所以我的输入可以是代表状态的[3,3]矩阵(1-你,2-敌人,0-空):
[2. 1. 0.]
[0. 1. 0.]
[2. 2. 1.]
假设我们已经有一个先前训练的隐藏层,一个[3,1]权重矩阵:
[1.5]
[0.5]
[2.5]
所以如果我们使用一个简单的激活函数,它基本上由两个 y(x)=W*x 之间的矩阵相乘组成,我们得到这个 [3,1] 矩阵在输出:
[2. 1. 0.] [1.5] [3.5]
[0. 1. 0.] * [0.5] = [0.5]
[2. 2. 1.] [2.5] [6.5]
即使没有 softmax 函数,您也可以看出平局的概率最高。
但是,如果我想让这个相同的神经网络用于 5x5 井字游戏怎么办?
它与 3x3 具有相同的逻辑,只是更大。神经网络应该能够处理它
我们会有这样的东西:
[2. 1. 0. 2. 0.]
[0. 2. 0. 1. 1.] [1.5] [?]
[2. 1. 0. 0. 1.] * [0.5] = [?] IMPOSSIBLE
[0. 0. 2. 2. 1.] [2.5] [?]
[2. 1. 0. 2. 0.]
但是这个乘法无法计算。我们将不得不 添加更多层 and/or 更改我们之前训练的层 并 RETRAIN 它,因为未经训练的权重(初始化为 0 in这种情况)会导致神经网络失败,像这样:
input 1st Layer output1
[2. 1. 0. 2. 0.] [0. 0. 0.] [6.5 0. 0.]
[0. 2. 0. 1. 1.] [1.5 0. 0.] [5.5 0. 0.]
[2. 1. 0. 0. 1.] * [0.5 0. 0.] = [1.5 0. 0.]
[0. 0. 2. 2. 1.] [2.5 0. 0.] [6. 0. 0.]
[2. 1. 0. 2. 0.] [0. 0. 0.] [6.5 0. 0.]
2nd Layer output1 final output
[6.5 0. 0.]
[5.5 0. 0.]
[0. 0. 0. 0. 0.] * [1.5 0. 0.] = [0. 0. 0.] POSSIBLE
[6. 0. 0.]
[6.5 0. 0.]
因为我们扩展了第一层并添加了一个新的零权重层,所以我们的结果显然没有定论。如果我们应用 softmax 函数,我们将意识到神经网络为每个可能的结果返回 33.3% 的机会。 我们需要再次训练它。
显然我们想要创建可以适应不同输入大小的通用神经网络,但是我还没有想到解决这个问题的方法!所以我想也许 Whosebug 可以提供帮助。成千上万的脑袋比一个脑袋想得更好。 有什么想法吗?
除了将输入调整为固定大小之外,还有针对卷积神经网络的解决方案。
Spatial Pyramid Pooling 允许您使用可变大小的图像训练和测试 CNN,它通过引入动态池化层来实现,其中输入可以是任意大小,输出是固定大小,然后可以将其馈送到完全连接的层。
池化很简单,在每个维度(比如 7x7)定义多个区域,然后层将每个特征图拆分为不重叠的 7x7 区域,并对每个区域进行最大池化,输出一个 49 元素向量。这也可以应用于多个尺度。