วิธีการส่งออกเลเยอร์ที่สองของเครือข่าย


9

แบบจำลองของฉันได้รับการฝึกฝนในภาพหลัก ( MNIST dataset) ฉันพยายามพิมพ์ผลลัพธ์ของเลเยอร์ที่สองของเครือข่ายของฉัน - อาเรย์ของ 128 ตัวเลข

หลังจากที่ได้อ่านจำนวนมากตัวอย่างเช่น - นี้ , และ , หรือนี้

ฉันไม่ได้จัดการกับสิ่งนี้บนเครือข่ายของฉันเอง วิธีแก้ปัญหาทั้งสองไม่ทำงานในอัลกอริทึมของฉันเอง

เชื่อมโยงไปยัง Colab: https://colab.research.google.com/drive/1MLbpWJmq8JZB4_zKongaHP2o3M1FpVAv?fbclid=IwAR20xRz2i6sFS-Nm6Xwfk5hztdXOuxY4tZaAxXAxaAxaXa9a9X9A

ฉันได้รับข้อความแสดงข้อผิดพลาดมากมาย ฉันพยายามที่จะจัดการกับแต่ละคน แต่ไม่สามารถคิดได้ด้วยตัวเอง

ฉันพลาดอะไรไป วิธีการส่งออกเลเยอร์ที่สอง? ถ้ารูปร่างของฉันคือ(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: อินพุตควรเป็น list หรือ tuple

(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 (ไม่สามารถค้นหาทรัพยากร: localhost / dense_1 / bias) [[{{node dense_1 / BiasAdd / ReadVariableOp}}]]


1
ลิงก์ในคำถามของคุณเสียโปรดเพิ่มพวกเขาเพื่อให้มีความคิดในสิ่งที่คุณได้ลอง
Théo Rubenach

@ ThéoRubenach Done
Shir K

คำตอบ:


3

ดูเหมือนว่าคุณกำลังผสม keras แบบเก่า (ก่อนที่จะมีชื่อว่า tensorflow 2.0:) import kerasและ keras ใหม่ ( from tensorflow import keras)

พยายามที่จะไม่ใช้ keras เก่าควบคู่กับ tensorflow> = 2.0 (และไม่อ้างอิงเอกสารเก่าเหมือนในลิงค์แรกของคุณ) เนื่องจากมันสับสนกับตัวใหม่ได้ง่าย (แม้ว่าจะไม่มีเหตุผลที่เคร่งครัด):

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'

พฤติกรรมจะไม่เสถียรอย่างมากเมื่อรวมสองไลบรารีนี้เข้าด้วยกัน

เมื่อทำสิ่งนี้เสร็จแล้วให้ใช้คำตอบจากสิ่งที่คุณพยายามทำตัวเป็นแบบจำลองของคุณและ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)


Rubenach คุณหมายถึงอะไรโดย 'my_input_shape' สิ่งที่ควรเป็นค่าของ var นั้น?
Shir K

1
รูปร่างของอินพุทของโมเดลคุณมีอยู่ในโค้ดของคุณเองเมื่อกำหนดโมเดล:input_shape=(28, 28)
Théo Rubenach

1
ที่นี่ฉันใช้ข้อมูลสุ่ม แต่ในกรณีของคุณคุณควรแทนที่my_input_dataด้วยข้อมูลของคุณเองแน่นอน
Théo Rubenach

'ข้อมูลของคุณเอง' หมายถึงอะไร สิ่งที่ควรเป็นค่าภายใน - ข้อมูลการฝึกอบรม? ข้อมูลการทดสอบ? มันควรจะเป็นเพียง 1 วัตถุ (ภาพ) หรือรายการ / อาร์เรย์ / ทูเปิลของวัตถุ (ภาพ)? ฉันลองชุดค่าผสมที่แตกต่างกันจำนวนมากและไม่สามารถใช้งานได้ เมื่อฉันตั้งค่า 'input_shape' ตามที่คุณกล่าวถึงฉันได้รับข้อผิดพลาด '' AttributeError: 'tuple' วัตถุไม่มีแอตทริบิวต์ 'รูปร่าง' '
Shir K

1
ฉันปรับปรุงคำตอบของฉันตาม ภาพที่คุณต้องการใช้ขึ้นอยู่กับกรณีการใช้งานของคุณมันไม่มีอะไรเกี่ยวข้องกับรหัส หากคุณยังสับสนอยู่อาจถามคำถามใหม่ในไซต์ stackexchange อื่นได้หรือไม่
Théo Rubenach

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 คือสิ่งที่คุณกำลังมองหา

วิธีการทางเลือก

หากคุณกำลังมองหาวิธีแก้ปัญหาที่กว้างกว่าสมมติว่าแบบจำลองของคุณเรียงตามลำดับคุณสามารถใช้indexคำหลักget_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 = ... # ควรเป็นเหมือนอินพุตมาตรฐานสำหรับเครือข่ายของคุณ' สิ่งที่ควรเป็นค่าของ var นั้น?
Shir K

1
อินพุตมาตรฐานใด ๆ เช่นเดียวกับแบบจำลองลำดับที่คาดหวัง - หากอินพุตของคุณคือ 28x28 คุณควรส่งอาร์เรย์ 1x28x28 สำหรับตัวอย่างเดียว
bluesummers

1
แก้ไขคำตอบของฉันไปที่
bluesummers

จะพิมพ์ค่าใน 'output_of_hidden' ได้อย่างไร? ผลลัพธ์ปัจจุบันคือ 'output_of_hidden Tensor ("hidden_1 / Relu: 0", รูปร่าง = (1, 128), dtype = float32)' ฉันพยายามใช้เซสชัน & eval แต่ฉันได้รับข้อผิดพลาด
Shir K

1
หากอยู่ใน TF2 คุณควรโทรหาoutput_of_hidden.numpy()และมันจะแปลงเป็นอาร์เรย์ที่ไม่มีค่า
bluesummers
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.