直接的な回答ではありませんが、tensorflow-slimの使用を検討することができます。テンソルフローの一部として配布される多くのAPIの1つです。軽量で、すべての変数を手作業で定義することができます。あなたがリンクしているウェブページを見ると、slim.repeat
とslim.stack
は1つの行に異なる幅の複数のレイヤーを作成することができます。もっと複雑にするには:slim
の部分がテンソルフローのlayers
というモジュールになったと思います。
しかし、tf変数で直接再生して、それがどのように動作するかを理解し、後でこれまでより高いレベルのAPIを使用しないようにすることができます。
投稿したコードでは、3つのレイヤーを作成したいので、fc_layer
を3回呼び出す必要がありますが、1度だけ呼び出す必要があります。ところで、これはw
とb
が異なる内部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の出力を行うことができませんでした。
トータルありがとうございますが、私は研究にTensorflowを使用したいと思います。また、このコードではforループを使用したので、fc_layerは3回呼び出されます。私はウェブを検索しましたが、私の問題は解決していません。つまり、形状(A)=(3,4,4)のようなより高い次元のテンソルを定義し、より小さな次元のテンソル(例えば、形状(B)=(4,4))で満たすことができます。 、A(1、:、:)= B)。 –
申し訳ありませんが、私はfor-loopに気づいていませんでした。あなたの質問を編集してインデントを修正しました。インデントは、Pythonでは非常に重要です。あなたのコードはそれほど意味をなさない。あなたの質問に答えるために、より高い次元のテンソルと[スライス](https://www.tensorflow.org/api_docs/python/tf/slice)を取ることが可能です。しかし、テンソルフローで物事を行う通常の方法は、各層に異なるパラメータを定義することです。すべてのパラメータを単一のメタテンソルに入れることは非標準的で混乱し、操作のグラフを視覚化しようとすると問題を引き起こす可能性があります。 – toto2
@ H.Radmard私の答えにいくつかのコードを追加しました。 – toto2