2017-03-08 15 views
0

CNNを構築するためのアイデアをhereからドラッグすると、完全連結レイヤー(FCL)とソフトマックスレイヤー(SL)の2つの畳み込みレイヤーからなるコンベネットを作成します。 FCLで実行してSLに接続する畳み込み演算の定義を理解できませんでした。完全に接続されたレイヤーが正しくないフィード

FCLでは、入力が平坦化されている1Dで畳み込み演算が実行されていますか? FCLの重みは2Dで生成されますが、そうであればどのようにConv演算を行うことができますか?なぜなら、行列の次元は、生成された再構成された入力と重みと一致しないからです(最後のVGGNETを詳細列で比較します)。たとえ私が1xMとMxN conv操作を行うことができたとしても、マトリックスのサイズはミスマッチです。どこでFCLで間違っていましたか?

Traceback (most recent call last): 
File "D:/Lab_Project_Files/TF/Practice Files/basictest22.py", line 108, in <module> 
    y = conv_net(x) 
File "D:/Lab_Project_Files/TF/Practice Files/basictest22.py", line 93, in conv_net 
    FClayer = tf.nn.relu(tf.add(tf.matmul(reshape,layer3_weights),layer3_biases)) 
ValueError: Shape must be rank 2 but is rank 1 for 'MatMul' (op: 'MatMul') with input shapes: [15360], [2240,64] 

FCLを定義する方法は? これらの操作がバッチのそれぞれのイメージに適用されるかどうか、混乱しますか?必要に応じて

私の入力パラメータは

INPUT_WIDTH = 16 # input image width 
INPUT_HEIGHT = 12 # input image height 
INPUT_DEPTH = 1 # input image depth = 1 for monochrome 
NUM_CLASSES = 8 # output classes 
BATCH_SIZE = 5 # grouping batch for training 
# input output placeholders 
x = tf.placeholder(tf.float32, [BATCH_SIZE, INPUT_WIDTH,INPUT_HEIGHT,INPUT_DEPTH ]) 
y_ = tf.placeholder(tf.float32, [BATCH_SIZE, NUM_CLASSES]) 

私のトレイルコード

def outputdetails(W1, H1,F, P, S): 
# W1,W2 - width of input and output 
# H1,H2 - height of input and output 
# F  - size of the filter 
# P  - padding 
# S  - Stride 
P = 0.00 
W2 = int((W1 - F + 2*P)/S + 1) 
H2 = int((H1 - F + 2*P)/S + 1) 
return W2, H2 

# CNN trail 
def conv_net(x): 
    # CONV1 layer 
    FILTER_SIZE = 3 # applying 3x3 filter 
    STRIDE = 1 
    num_hidden = 64 # used for FCL as num of outputs 
    NUM_CHANNELS = INPUT_DEPTH # input channels 
    DEPTH = 16  # Output channels Apply 16 filters 
    layer1_weights = tf.Variable(tf.random_normal([FILTER_SIZE,FILTER_SIZE,NUM_CHANNELS,DEPTH],stddev = 0.1)) 
    layer1_biases = tf.Variable(tf.zeros([DEPTH])) 

    #CONV2 layer 
    NUM_CHANNELS = 16 
    DEPTH = 16 
    layer2_weights = tf.Variable(tf.random_normal([FILTER_SIZE, FILTER_SIZE, NUM_CHANNELS, DEPTH], stddev=0.1)) 
    layer2_biases = tf.Variable(tf.zeros([DEPTH])) 

    # Fully Connected layer 
    # W1 - INPUT_WIDTH, H1 - INPUT_HEIGHT, F - FILTER_SIZE, S - STRIDE 
    finalsize_width,finalsize_height = outputdetails(INPUT_WIDTH,INPUT_HEIGHT,FILTER_SIZE,1,STRIDE) 
    layer3_weights = tf.Variable(
    tf.truncated_normal([finalsize_width * finalsize_height * DEPTH, num_hidden], stddev=0.1)) 
    layer3_biases = tf.Variable(tf.constant(1.0, shape=[num_hidden])) 
    # softmax layer 
    Outlayer_weights = tf.Variable(tf.random_normal([num_hidden, NUM_CLASSES], stddev=0.1)) 
    Outlayer_biases = tf.Variable(tf.constant(1.0,shape = [NUM_CLASSES])) 

    conv1 = tf.nn.relu(tf.add(tf.nn.conv2d(x,layer1_weights,strides = [1,1,1,1],padding='SAME'),layer1_biases)) 
    conv2 = tf.nn.relu(tf.add(tf.nn.conv2d(conv1, layer2_weights, strides=[1, 1, 1, 1], padding='SAME'), layer2_biases)) 
    shape = conv2.get_shape().as_list() 
    reshape = tf.reshape(conv2,[shape[0]*shape[1]*shape[2]*shape[3]]) 
    FClayer = tf.nn.relu(tf.add(tf.matmul(reshape,layer3_weights),layer3_biases)) 
    out = tf.add(tf.matmul(FClayer, Outlayer_weights), Outlayer_biases) 
    return out 

ファイルです source file

classes

data

答えて

1

変更この

reshape = tf.reshape(conv2,[shape[0],shape[1]*shape[2]*shape[3]]) 

MATMULにこの

reshape = tf.reshape(conv2,[shape[0]*shape[1]*shape[2]*shape[3]]) 

は、あなたが破壊しているバッチの次元で動作することができます。

関連する問題