0

最近、深層学習と強化学習について学び始めました。10 行 3 列の 0 と 1 の行列に対して Keras を使用して畳み込みニューラル ネットワークをコーディングする方法を理解しようとしています。

入力行列は、たとえば次のようになります

[
 [1, 0, 0], 
 [0, 1, 0], 
 [0, 0, 0], 
 ...
]

出力は、前述の入力行列とは異なり、行と列の数が異なる、0 と 1 の別の行列である必要があります。

出力行列の 0 と 1 の位置は、入力行列の 0 と 1 の位置に依存します。

2 番目の出力もあり、値は入力行列の 1 の位置に依存する配列です。

インターネットでコード例を検索しましたが、役に立つものは見つかりませんでした。

編集:

ニューラル ネットワークへの入力は、10 行の 2D 配列で、各行には 3 列があります。出力 (少なくとも今のところ) は 12 行の 2D 配列で、各行には 10 列 (入力 2D 配列の行数と同じ) があります。

これは私がこれまでに思いついたことであり、それが正しいかどうかはわかりません。

nbre_users = 10 # number of rows in the input 2D matrix
nbre_subchannels = 12 # number of rows in the output 2D matrix

model = Sequential()
model.add(Dense(50, input_shape=(nbre_users, 3), kernel_initializer="he_normal" ,activation="relu"))
model.add(Dense(20, kernel_initializer="he_normal", activation="relu"))
model.add(Dense(5, kernel_initializer="he_normal", activation="relu"))
model.add(Flatten())
model.add(Dense(nbre_subchannels))
model.add(Dense(nbre_users, activation = 'softmax'))
model.compile(optimizer=Adam(learning_rate=1e-4), loss='mean_squared_error')

モデルの概要は次のとおりです。

モデルの概要

4

2 に答える 2

2

明確化した後、これが私の答えです。

あなたが解決しようとしている問題は、サイズ (10,3,1) の 2D グレースケール画像をサイズ (12,10,1) の 2D グレースケール画像に変換するニューラル ネットワークのようです。

2D グレースケール イメージは、余分な軸が 1 に設定された 2D マトリックスに他なりません。

a = np.array([[0,1,0],
              [1,0,1],
              [0,1,0]])

a.shape

#OUTPUT = (3,3)

a.reshape((3,3,1)) #reshape to 3,3,1

#OUTPUT - 
#array([[[0],
#        [1],
#        [0]],
#
#       [[1],
#        [0],
#        [1]],
#
#       [[0],
#        [1],
#        [0]]])

したがって、(10,3) の 2D 行列は、単一チャネル (10,3,1) の 3D 画像と呼ぶことができます。これにより、畳み込みを入力に適切に適用できます。

この部分が明確であれば、ネットワークの順方向計算では、1 と 0 の空間位置を確実に捉えたいので、畳み込み層を使用します。ここで高密度レイヤーを使用することは正しい手順ではありません。

ただし、一連の畳み込み操作はDownsampleイメージに役立ちます。出力 2D マトリックス (グレー スケール イメージ) が必要なので、それも必要ですUpsample。このようなネットワークは Deconv ネットワークと呼ばれます。

最初の一連のレイヤーは、入力を畳み込み、それらをチャネルのベクトルに「平坦化」します。次のレイヤー セットでは、2D Conv Transpose 操作を使用して、チャネルを 2D マトリックスに戻します (グレー スケール イメージ)。

この画像を参照してください -ここに画像の説明を入力

deconv ネットを使用して (10,3,1) 画像を (12,10,1) 画像にする方法を示すサンプル コードを次に示します。

from tensorflow.keras import layers, Model

inp = layers.Input((10,3,1))     ##
x = layers.Conv2D(2, (2,2))(inp) ##  Convolution part
x = layers.Conv2D(4, (2,2))(x)   ##

x = layers.Conv2DTranspose(4, (3,4))(x)   ##
x = layers.Conv2DTranspose(2, (2,4))(x)   ##  Deconvolution part
out = layers.Conv2DTranspose(1, (2,4))(x) ##

model = Model(inp, out)
model.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_33 (InputLayer)        [(None, 10, 3, 1)]        0         
_________________________________________________________________
conv2d_49 (Conv2D)           (None, 9, 2, 2)           10        
_________________________________________________________________
conv2d_50 (Conv2D)           (None, 8, 1, 4)           36        
_________________________________________________________________
conv2d_transpose_46 (Conv2DT (None, 10, 4, 4)          196       
_________________________________________________________________
conv2d_transpose_47 (Conv2DT (None, 11, 7, 2)          66        
_________________________________________________________________
conv2d_transpose_48 (Conv2DT (None, 12, 10, 1)         17        
=================================================================
Total params: 325
Trainable params: 325
Non-trainable params: 0
_________________________________________________________________

明らかに、アクティベーション、ドロップアウト、プーリング レイヤーなどを自由に追加してください。上記のコードは、ダウンサンプリングとアップサンプリングを使用して、特定のシングル チャネル イメージから別のシングル チャネル イメージを取得する方法を示しています。


余談ですが、CNN がどのように機能するかを理解するために、少し時間を費やすことをお勧めします。Deconv ネットは複雑であり、2D CNN がどのように機能するかを正しく理解する前に、それらに関連する問題を解決している場合、特にこのドメインを学び始めている場合は、いくつかの基本的な問題が発生する可能性があります。


于 2020-11-17T13:00:06.703 に答える