2017-08-18 10 views
2

隠れたレイヤ番号とそのサイズを試してみたいとします。 Tensorflowでどうすればいいですか?Tensorflowでさまざまな数の隠れたレイヤーを持つ方法は?

はそれを明確にするために例を次の点を考慮

# Create a Neural Network Layer 

def fc_layer(input, size_in, size_out): 
     w = tf.Variable(tf.truncated_normal([None, size_in, size_out]), name="W") 
     b = tf.Variable(tf.constant(0.1, shape=[size_out])) 
     act = tf.matmul(input, w) + b 
     return act 
n_hiddenlayers=3 #number of hidden layers 
hidden_layer=tf.placeholder(tf.float32,[n_hiddenlayers, None, None]) 
#considering 4 as size of inputs and outputs of all layers 
sizeInpOut=4 
for i in range(n_hiddenlayers): 
    hidden_layer(i,:,:)= tf.nn.sigmoid(fc_layer(X, sizeInpOut, sizeInpOut)) 

hidden_​​layer(I、:、:)に関するエラーになり、他の言葉で= ... 、私はテンソルのテンソルを必要とします。

答えて

0

直接的な回答ではありませんが、tensorflow-slimの使用を検討することができます。テンソルフローの一部として配布される多くのAPIの1つです。軽量で、すべての変数を手作業で定義することができます。あなたがリンクしているウェブページを見ると、slim.repeatslim.stackは1つの行に異なる幅の複数のレイヤーを作成することができます。もっと複雑にするには:slimの部分がテンソルフローのlayersというモジュールになったと思います。

しかし、tf変数で直接再生して、それがどのように動作するかを理解し、後でこれまでより高いレベルのAPIを使用しないようにすることができます。

投稿したコードでは、3つのレイヤーを作成したいので、fc_layerを3回呼び出す必要がありますが、1度だけ呼び出す必要があります。ところで、これはwbが異なる内部tf名を持つ異なる変数として3回作成されることを意味します。そしてそれはあなたが望むものです。

for -loopまたはwhile -loopが3回繰り返される必要があります。ループの最後の出力テンソルは次の反復で入力テンソルになることに注意してください。最初の入力は真の入力であり、最後の出力は真の出力です。

コードのもう1つの問題は、非直線性(シグモイド)がfc_layerの末尾にあることです。すべてのレイヤー間で非線形演算が必要です。


EDIT:通常行われるであろうもののいくつかのコード:出力付き

import tensorflow as tf 

input_size = 10 
output_size = 4 
layer_sizes = [7, 6, 5] 

def fc_layer(input, size, layer_name): 
    in_size = input.shape.as_list()[1] 
    w = tf.Variable(tf.truncated_normal([in_size, size]), 
        name="W" + layer_name) 
    b = tf.Variable(tf.constant(0.1, shape=[size]), 
        name="b" + layer_name) 
    act = tf.nn.sigmoid(tf.matmul(input, w) + b) 
    return act 

input = tf.placeholder(tf.float32, [None, input_size]) 
# output will be the intermediate activations successively and in the end the 
# final activations (output). 
output = input 
for i, size in enumerate(layer_sizes + [output_size]): 
    output = fc_layer(output , size, layer_name=str(i + 1)) 

print("final output var: " + str(output)) 
print("All vars in the tensorflow graph:") 
for var in tf.global_variables(): 
    print(var) 

:あなたのコードで

final output: Tensor("Sigmoid_3:0", shape=(?, 4), dtype=float32) 

<tf.Variable 'W1:0' shape=(10, 7) dtype=float32_ref> 
<tf.Variable 'b1:0' shape=(7,) dtype=float32_ref> 
<tf.Variable 'W2:0' shape=(7, 6) dtype=float32_ref> 
<tf.Variable 'b2:0' shape=(6,) dtype=float32_ref> 
<tf.Variable 'W3:0' shape=(6, 5) dtype=float32_ref> 
<tf.Variable 'b3:0' shape=(5,) dtype=float32_ref> 
<tf.Variable 'W4:0' shape=(5, 4) dtype=float32_ref> 
<tf.Variable 'b4:0' shape=(4,) dtype=float32_ref> 

あなたがwに同じ名前を使用していました、同じ名前の異なる変数が作成されるため、競合が発生します。私は自分のコードでそれを修正しましたが、同じ名前を使用したとしても、tensorflowは十分にインテリジェントであり、アンダースコアと数字を追加することで各変数の名前を一意の名前に変更します。


EDITは:

import tensorflow as tf 

hidden_size = 4 
input_size = hidden_size # equality required! 
output_size = hidden_size # equality required! 
n_hidden = 3 

meta_tensor = tf.Variable(tf.truncated_normal([n_hidden, hidden_size, hidden_size]), 
        name="meta") 

def fc_layer(input, i_layer): 
    w = meta_tensor[i_layer] 
    # more verbose: w = tf.slice(meta_tensor, begin=[i_layer, 0, 0], size=[1, hidden_size, hidden_size])[0] 

    b = tf.Variable(tf.constant(0.1, shape=[hidden_size]), 
        name="b" + str(i_layer)) 
    act = tf.nn.sigmoid(tf.matmul(input, w) + b) 
    return act 

input = tf.placeholder(tf.float32, [None, input_size]) 
# output will be the intermediate activations successively and in the end the 
# final activations (output). 
output = input 
for i_layer in range(0, n_hidden): 
    output = fc_layer(output, i_layer) 

print("final output var: " + str(output)) 
print("All vars in the tensorflow graph:") 
for var in tf.global_variables(): 
    print(var) 

出力で:

final output var: Tensor("Sigmoid_2:0", shape=(?, 4), dtype=float32) 

All vars in the tensorflow graph: 
<tf.Variable 'meta:0' shape=(3, 4, 4) dtype=float32_ref> 
<tf.Variable 'b0:0' shape=(4,) dtype=float32_ref> 
<tf.Variable 'b1:0' shape=(4,) dtype=float32_ref> 
<tf.Variable 'b2:0' shape=(4,) dtype=float32_ref> 

私は、これは標準ではありません言ったように、ここで私はあなたがやってみたかったと思うものです。それをコーディングしている間は、すべての隠れたレイヤーが同じサイズでなければならないので、かなり制限されていることに気付きました。メタテンソルは多くの行列を格納するために使用できますが、それらはすべて同じ次元を持たなければなりません。だから、上記の例で隠された最初のレイヤーがサイズ7、次のサイズが6、最後のサイズが5の前の例のように、サイズ4の出力を行うことができませんでした。

+0

トータルありがとうございますが、私は研究にTensorflowを使用したいと思います。また、このコードではforループを使用したので、fc_layerは3回呼び出されます。私はウェブを検索しましたが、私の問題は解決していません。つまり、形状(A)=(3,4,4)のようなより高い次元のテンソルを定義し、より小さな次元のテンソル(例えば、形状(B)=(4,4))で満たすことができます。 、A(1、:、:)= B)。 –

+0

申し訳ありませんが、私はfor-loopに気づいていませんでした。あなたの質問を編集してインデントを修正しました。インデントは、Pythonでは非常に重要です。あなたのコードはそれほど意味をなさない。あなたの質問に答えるために、より高い次元のテンソルと[スライス](https://www.tensorflow.org/api_docs/python/tf/slice)を取ることが可能です。しかし、テンソルフローで物事を行う通常の方法は、各層に異なるパラメータを定義することです。すべてのパラメータを単一のメタテンソルに入れることは非標準的で混乱し、操作のグラフを視覚化しようとすると問題を引き起こす可能性があります。 – toto2

+0

@ H.Radmard私の答えにいくつかのコードを追加しました。 – toto2

1

これはちょうど次のように異なるレイヤーを保持するリストはうまくいくように見えました。

# inputs 
    x_size=2 # first layer nodes 
    y_size=1 # final layer nodes 
    h_size=[3,4,3] # variable length list of hidden layer nodes 

    # set up input and output 
    X = tf.placeholder(tf.float32, [None,x_size]) 
    y_true = tf.placeholder(tf.float32, [None,y_size]) 

    # set up parameters 
    W = [] 
    b = [] 
    layer = [] 

    # first layer 
    W.append(tf.Variable(tf.random_normal([x_size, h_size[0]], stddev=0.1))) 
    b.append(tf.Variable(tf.zeros([h_size[0]]))) 

    # add hidden layers (variable number) 
    for i in range(1,len(h_size)): 
     W.append(tf.Variable(tf.random_normal([h_size[i-1], h_size[i]], stddev=0.1))) 
     b.append(tf.Variable(tf.zeros([h_size[i]]))) 

    # add final layer 
    W.append(tf.Variable(tf.random_normal([h_size[-1], y_size], stddev=0.1))) 
    b.append(tf.Variable(tf.zeros([y_size]))) 

    # define model 
    layer.append(tf.nn.relu(tf.matmul(X, W[0]) + b[0])) 

    for i in range(1,len(h_size)): 
     layer.append(tf.nn.relu(tf.matmul(layer[i-1], W[i]) + b[i])) 

    if self.type_in == "classification": 
     y_pred = tf.nn.sigmoid(tf.matmul(layer[-1], W[-1]) + b[-1]) 
     loss = tf.reduce_mean(-1. * ((y_true * tf.log(y_pred)) + ((1.-y_true) * tf.log(1.-y_pred)))) 
     correct_prediction = tf.equal(tf.round(y_pred), tf.round(y_true)) 
     metric = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 
     metric_name = "accuracy" 
関連する問題