ネットワークの第2層を出力する方法は?


9

私のモデルは、数字の画像(MNIST dataset)でトレーニングされています。ネットワークの2番目のレイヤーの出力(128個の数値の配列)を印刷しようとしています。

多くの例を読んだ後-たとえば、これこれまたはこれ

私は自分のネットワークでこれをどうにかしてできませんでした。どちらのソリューションも自分のアルゴリズムでは機能しません。

Colabへのリンク:https ://colab.research.google.com/drive/1MLbpWJmq8JZB4_zKongaHP2o3M1FpvAv?fbclid=IwAR20xRz2i6sFS-Nm6Xwfk5hztdXOuxY4tZaDRXxAx3b98AHGaToa9

さまざまなエラーメッセージが多数表示されました。ひとつひとつ処理しようとしたのですが、自分ではわかりませんでした。

何が欠けていますか?セカンドレイヤーを出力するには? 私の形状が(28,28)-のタイプと値はinput_shape何ですか?


失敗した試行とエラーの例:

(1)

for layer in model.layers:

    get_2nd_layer_output = K.function([model.layers[0].input],[model.layers[2].output])
    layer_output = get_2nd_layer_output(layer)[0]
    print('\nlayer output: get_2nd_layer_output=, layer=', layer, '\nlayer output: get_2nd_layer_output=', get_2nd_layer_output)

TypeError:入力はリストまたはタプルである必要があります。

(2)

input_shape=(28, 28)
inp = model.input                                           # input placeholder
outputs = [layer.output for layer in model.layers]          # all layer outputs
functor = K.function([inp, K.learning_phase()], outputs )   # evaluation function

# Testing
test = np.random.random(input_shape)[np.newaxis,...]
layer_outs = functor([test, 0.])
print('layer_outs',layer_outs)

tensorflow.python.framework.errors_impl.FailedPreconditionError:コンテナーからリソース変数デンス_1 /バイアスを読み取る際のエラー:ローカルホスト。これは、変数が初期化されていないことを意味する場合があります。見つかりません:コンテナーlocalhostは存在しません。(リソースが見つかりませんでした:localhost / dense_1 / bias)[[{{node density_1 / BiasAdd / ReadVariableOp}}]]


1
あなたの質問内のリンクが壊れている、あなたがしようとしたかのアイデア持っているためにそれらを追加してください
テオRubenach

@ThéoRubenach完了
Shir K

回答:


3

古いケラス(tensorflow 2.0以前import keras)と新しいケラス(from tensorflow import keras)を混ぜているようです。

古いkerasをtensorflow> = 2.0と一緒に使用しないようにしてください(最初のリンクのように古いドキュメントを参照しないでください)。これは新しいkerasと簡単に混同されます(厳密に非論理的なものはありません)。

from tensorflow import keras
from keras.models import Model
print(Model.__module__) #outputs 'keras.engine.training'

from tensorflow.keras.models import Model
print(Model.__module__) #outputs 'tensorflow.python.keras.engine.training'

これら2つのライブラリを混合すると、動作が非常に不安定になります。

これが完了すると、あなたが試したものからの回答を使用して、mがモデルでありmy_input_shape、モデル入力の形状、つまり1つの画像の形状(ここでは(28、28)または(1、28、28)を持っている場合)バッチ):

from tensorflow import keras as K
my_input_data = np.random.rand(*my_input_shape) 
new_temp_model = K.Model(m.input, m.layers[3].output) #replace 3 with index of desired layer
output_of_3rd_layer = new_temp_model.predict(my_input_data) #this is what you want

1つの画像があるimg場合は、直接書き込むことができますnew_temp_model.predict(img)


Rubenach 'my_input_shape'はどういう意味ですか?その変数の値は何であるべきですか?
Shir K

1
モデルの入力の形状は、モデルを定義するときに独自のコードにinput_shape=(28, 28)
含める

1
ここで私は、ランダムなデータを使用しますが、あなたのケースであなたは交換する必要がありますmy_input_dataもちろん、独自のデータで
テオRubenach

「自分のデータ」とはどういう意味ですか?内部の値は何ですか-トレーニングデータ?テストデータ?1つのオブジェクト(画像)だけにするか、オブジェクトのリスト/配列/タプル(画像)にする必要がありますか?これをさまざまに組み合わせてみましたが、どれもうまくいきませんでした。あなたが言ったように「input_shape」を設定すると、エラー「AttributeError: 'tuple' object has no attribute 'shape」
Shir K

1
私はそれに応じて私の答えを更新しました。使用するイメージは、ユースケースによって異なりますが、コードとは関係ありません。それでも混乱している場合は、別のstackexchangeサイトで新しい質問をするかもしれませんか?
テオルベナハ

3

(TF2を想定)

最も簡単な方法は、レイヤーに名前を付けて標準入力で呼び出すことです。そのため、モデルは次のようになります。

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28), name='flatten'),
    keras.layers.Dense(128, activation='relu', name='hidden'),
    keras.layers.Dense(10, activation='softmax')
])

次に、入力を作成し、

my_input = tf.random.normal((1, 28, 28)) # Should be like the standard input to your network
output_of_flatten = model.get_layer('flatten')(my_input)
output_of_hidden = model.get_layer('hidden')(output_of_flatten)

output_of_hidden あなたが探しているものです

代替アプローチ

より一般的なソリューションを探している場合、モデルがシーケンシャルであると仮定すると、次indexget_layerようなキーワードを使用できます

my_input = tf.random.normal((1, 28, 28)) # Should be like the standard input to your network
desired_index = 1  # 1 == second layer

for i in range(desired_index):
    my_input = model.get_layer(index=i)(my_input)

このループの終わりにmy_inputあなたが探しているはずです


「my_input = ...#ネットワークへの標準入力のようにする」とはどういう意味ですか?その変数の値は何であるべきですか?
Shir K

1
順次モデルが期待するもののような標準入力-入力が28x28の場合、1つの例では1x28x28配列を渡す必要があります
bluesummers

1
私の回答を
編集

「output_of_hidden」内の値を出力する方法は?現在の結果は「output_of_hidden Tensor( "hidden_​​1 / Relu:0"、shape =(1、128)、dtype = float32)」です。session&evalを使用しようとしましたが、エラーが発生します。
Shir K

1
TF2の場合、通常は呼び出す必要output_of_hidden.numpy()があり、それをnumpy配列に変換します
bluesummers
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.