1

私は CNTK を初めて使用し、そのすばらしい python API を使用しています。Recurrence() は通常のネットワーク層のみを想定しているように見えるため、Recurrent Convolutional ネットワーク層を定義する方法を理解するのに問題があります。

より具体的には、畳み込み層の間で繰り返したいと思います。

任意のポインターまたは簡単な例でさえも高く評価されます。ありがとうございました。

4

1 に答える 1

0

意味のある方法でこれを行うには 2 つの方法があります (つまり、畳み込みが依存する自然画像の構造を破壊することなく)。最も簡単なのは、最終層に LSTM を配置することです。

convnet = C.layers.Sequential([Convolution(...), MaxPooling(...), Convolution(...), ...])
z = C.layers.Sequential([convnet, C.layers.Recurrence(LSTM(100)), C.layers.Dense(10)])

10クラスの問題。

より複雑な方法は、畳み込みのみを使用して自然画像の構造を尊重する独自の反復セルを定義することです。反復セルを定義するには、前の状態と入力 (つまり、ビデオを処理している場合は単一フレーム) を受け取り、次の状態と出力を出力する関数を作成する必要があります。たとえば、CNTK レイヤー モジュールの GRU の実装をconvolution調べて、どこでも使用できるように適応させることができtimesます。これがあなたが望むものなら、私はそのような例を提供しようとすることができます. ただし、最初は簡単な方法を試すことをお勧めします。

更新: 必要最小限の畳み込み GRU を作成しました。初期状態がどのように定義されているかに特別な注意を払う必要がありますが、それ以外は問題なく動作しているようです。これがレイヤー定義です

def ConvolutionalGRU(kernel_shape, outputs, activation=C.tanh, init=C.glorot_uniform(), init_bias=0, name=''):
    conv_filter_shape = (outputs, C.InferredDimension) + kernel_shape
    bias_shape = (outputs,1,1)
    # parameters
    bz = C.Parameter(bias_shape, init=init_bias, name='bz')  # bias
    br = C.Parameter(bias_shape, init=init_bias, name='br')  # bias
    bh = C.Parameter(bias_shape, init=init_bias, name='bc')  # bias
    Wz = C.Parameter(conv_filter_shape, init=init, name='Wz') # input
    Wr = C.Parameter(conv_filter_shape, init=init, name='Wr') # input
    Uz = C.Parameter(conv_filter_shape, init=init, name='Uz') # hidden-to-hidden
    Ur = C.Parameter(conv_filter_shape, init=init, name='Hz') # hidden-to-hidden
    Wh = C.Parameter(conv_filter_shape, init=init, name='Wc') # input
    Uh = C.Parameter(conv_filter_shape, init=init, name='Hc') # hidden-to-hidden
    # Convolutional GRU model function
    def conv_gru(dh, x):
        zt = C.sigmoid (bz + C.convolution(Wz, x) + C.convolution(Uz, dh))        # update gate z(t)
        rt = C.sigmoid (br + C.convolution(Wr, x) + C.convolution(Ur, dh))        # reset gate r(t)
        rs = dh * rt                                                            # hidden state after reset
        ht = zt * dh + (1-zt) * activation(bh + C.convolution(Wh, x) + C.convolution(Uh, rs))
        return ht
    return conv_gru

ここにそれを使用する方法があります

x = C.sequence.input_variable(3,224,224))
z = C.layers.Recurrence(ConvolutionalGRU((3,3), 32), initial_state=C.constant(0, (32,224,224)))
y = z(x)
x0 = np.random.randn(16,3,224,224).astype('f') # a single seq. with 16 random "frames"
output = y.eval({x:x0}) 
output[0].shape
(16, 32, 224, 224)
于 2017-08-14T19:06:44.370 に答える