Bagaimana cara mengeluarkan lapisan kedua dari suatu jaringan?

9

Model saya dilatih pada gambar digit ( MNIST dataset). Saya mencoba untuk mencetak output dari lapisan kedua dari jaringan saya - sebuah array dari 128 angka.

Setelah membaca banyak contoh - misalnya ini , dan ini , atau ini .

Saya tidak berhasil melakukan ini di jaringan saya sendiri. Tidak ada solusi yang bekerja dengan algoritma saya sendiri.

Tautan ke Colab: https://colab.research.google.com/drive/1MLbpWJmq8JZB4_zKongaHP2o3M1FpvAv?fbclid=IwAR20xRz2i6sFS-Nm6Xwfk5hztdXOuxAgAxXXAgX

Saya menerima banyak pesan kesalahan yang berbeda. Saya mencoba menangani mereka masing-masing, tetapi tidak dapat menemukannya sendiri.

Apa yang saya lewatkan? Bagaimana cara mengeluarkan lapisan kedua? Jika Bentuk saya (28,28)- apa yang harus menjadi jenis & nilai input_shape?


Uji coba & Kesalahan yang gagal misalnya:

(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: input harus berupa daftar atau 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: Kesalahan saat membaca variabel sumber daya dense_1 / bias dari Container: localhost. Ini bisa berarti bahwa variabel tersebut tidak diinisialisasi. Tidak ditemukan: Container localhost tidak ada. (Tidak dapat menemukan sumber daya: localhost / dense_1 / bias) [[{{node dense_1 / BiasAdd / ReadVariableOp}}]]

Shir K
sumber
1
Tautan dalam pertanyaan Anda rusak, harap tambahkan mereka untuk mengetahui apa yang Anda coba
Théo Rubenach
@ ThéoRubenach Done
Shir K

Jawaban:

3

Sepertinya Anda mencampur keras lama (sebelum tensorflow 2.0:) import kerasdan keras baru ( from tensorflow import keras).

Cobalah untuk tidak menggunakan keras lama bersama tensorflow> = 2.0 (dan tidak merujuk pada dokumentasi lama seperti di tautan pertama Anda), karena mudah bingung dengan yang baru (meskipun tidak ada yang benar-benar tidak masuk akal):

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'

Perilaku akan sangat tidak stabil mencampurkan kedua perpustakaan itu.

Setelah ini dilakukan, gunakan jawaban dari apa yang Anda coba, m menjadi model Anda, dan my_input_shapemenjadi bentuk input model Anda yaitu bentuk satu gambar (di sini (28, 28) atau (1, 28, 28) jika Anda memiliki batch):

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

Jika Anda memiliki satu gambar, imgAnda dapat langsung menulisnew_temp_model.predict(img)

Théo Rubenach
sumber
Rubenach apa yang Anda maksud dengan 'my_input_shape'? apa yang seharusnya menjadi nilai var itu?
Shir K
1
baik bentuk input dari model Anda, Anda bahkan memilikinya dalam kode Anda sendiri ketika mendefinisikan model Anda:input_shape=(28, 28)
Théo Rubenach
1
di sini saya menggunakan data acak, tetapi dalam kasus Anda, Anda harus mengganti my_input_datadengan data Anda sendiri tentu saja
Théo Rubenach
Apa yang Anda maksud dengan 'data Anda sendiri'? apa yang seharusnya menjadi nilai-nilai di dalam - data pelatihan? menguji data? apakah hanya 1 objek (gambar) atau daftar / larik / tupel objek (gambar)? Saya mencoba berbagai kombinasi ini dan tidak ada yang berhasil. Ketika saya menetapkan 'input_shape' seperti yang Anda sebutkan, saya menerima kesalahan '' AttributeError: objek 'tuple' tidak memiliki atribut 'bentuk' '
Shir K
1
Saya memperbarui jawaban saya sesuai. Gambar yang ingin Anda gunakan tergantung pada kasus penggunaan Anda, itu tidak ada hubungannya dengan kode. Jika Anda masih bingung, mungkin bertanya pertanyaan baru di situs stackexchange lain?
Théo Rubenach
3

(Mengasumsikan TF2)

Saya pikir pendekatan yang paling mudah adalah memberi nama layer Anda, dan kemudian menyebutnya dengan input standar, sehingga model Anda mungkin terlihat seperti

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')
])

Maka cukup buat input dan

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 adalah apa yang kamu cari

Pendekatan alternatif

Jika Anda mencari solusi yang lebih umum, dengan asumsi model Anda berurutan, Anda dapat menggunakan indexkata kunci get_layerseperti ini

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)

Pada akhir dari loop ini my_inputharus apa yang Anda cari

bluesummers
sumber
apa yang Anda maksud dengan 'my_input = ... # Seharusnya seperti input standar ke jaringan Anda'? apa yang seharusnya menjadi nilai var itu?
Shir K
1
Input standar apa pun, seperti yang diharapkan oleh model berurutan - jika input Anda 28x28, Anda harus memberikan larik 1x28x28 untuk satu contoh
bluesummers
1
Mengedit jawaban saya ke
bluesummers
Bagaimana cara mencetak nilai di dalam 'output_of_hidden'? Hasil saat ini adalah 'output_of_hidden Tensor ("hidden_1 / Relu: 0", shape = (1, 128), dtype = float32)'. Saya mencoba menggunakan sesi & evaluasi tetapi saya menerima kesalahan.
Shir K
1
Jika dalam TF2, Anda biasanya harus memanggil output_of_hidden.numpy()dan itu akan mengubahnya menjadi array numpy
bluesummers