簡體   English   中英

如何輸出網絡的第二層?

[英]How to output the second layer of a network?

我的模型是在數字圖像( MNIST dataset )上訓練的。 我正在嘗試打印網絡第二層的輸出 - 一個 128 個數字的數組。

在閱讀了很多例子之后——比如這個這個或者這個

我沒有設法在我自己的網絡上做到這一點。 兩種解決方案都不適用於我自己的算法。

Colab 鏈接: https ://colab.research.google.com/drive/1MLbpWJmq8JZB4_zKongaHP2o3M1FpvAv ? fbclid = IwAR20xRz2i6sFS-Nm6Xwfk5hztdXOuxY4tZaDRXxAx9b986TogA

我收到了很多不同的錯誤消息。 我試圖處理它們中的每一個,但無法自己解決。

我錯過了什么? 如何輸出第二層? 如果我的外形是(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)

類型錯誤:輸入應該是列表或元組。

(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:從容器讀取資源變量dense_1/bias時出錯:本地主機。 這可能意味着該變量未初始化。 未找到:容器 localhost 不存在。 (找不到資源:localhost/dense_1/bias)[[{{nodedense_1/BiasAdd/ReadVariableOp}}]]

看起來您正在混合舊 keras(在 tensorflow 2.0 之前: import keras )和新 keras ( from tensorflow import 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'

混合這兩個庫的行為將非常不穩定。

完成后,使用您嘗試的答案,m 是您的模型,而my_input_shape是您的模型輸入的形狀,即一張圖片的形狀(此處為 (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

如果你有一張圖片img你可以直接寫new_temp_model.predict(img)

(假設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就是你要找的

替代方法

如果您正在尋找更通用的解決方案,假設您的模型是順序的,您可以像這樣使用get_layerindex關鍵字

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應該是您要查找的內容

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM