Bir ağın ikinci katmanı nasıl çıkarılır?


9

Modelim basamaklı görüntüler ( MNIST dataset) üzerinde eğitildi . 128 numaradan oluşan bir dizi - ağımın ikinci katman çıktısını yazdırmaya çalışıyorum.

Örneğin - örneklerinden çok okuduktan sonra bu , ve bu , ya bu .

Bunu kendi ağımda yapmayı başaramadım. Çözümlerin hiçbiri kendi algoritmamda çalışmıyor.

Colab bağlantısı: https://colab.research.google.com/drive/1MLbpWJmq8JZB4_zKongaHP2o3M1FpvAv?fbclid=IwAR20xRz2i6sFS-Nm6Xwfk5hztdXOuxY4tZaDRxA9x99b9b9

Birçok farklı hata mesajı aldım. Her birini halletmeye çalıştım, ama kendi başıma anlayamadım.

Neyi kaçırıyorum? İkinci katman nasıl çıkarılır? Benim Şeklim (28,28)- tipi ve değeri ne olmalıdır input_shape?


Başarısız denemeler ve Hatalar örneğin:

(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: girişler bir liste veya grup olmalıdır.

(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: Container: localhost kaynak dense_1 / bias kaynak değişkeni okunurken hata oluştu. Bu, değişkenin başlatılmamış olduğu anlamına gelebilir. Bulunamadı: Kapsayıcı localhost mevcut değil. (Kaynak bulunamadı: localhost / dense_1 / bias) [[{{node dense_1 / BiasAdd / ReadVariableOp}}]]]



@ThéoRubenach Bitti
Shir K

Yanıtlar:


3

Eski keraları (tensorflow 2.0'dan önce import keras) ve yeni keraları ( from tensorflow import keras) karıştırdığınız anlaşılıyor .

Tensorflow> = 2.0 ile birlikte eski keras kullanmamaya çalışın (ve ilk bağlantınızdaki gibi eski belgelere başvurmayın), çünkü yenisiyle kolayca karıştırılır (kesinlikle mantıksız bir şey olmamasına rağmen):

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'

Davranış, bu iki kütüphanenin karıştırılmasında oldukça kararsız olacaktır.

Bu yapıldıktan sonra, denediğiniz şeyden bir cevap kullanarak , m modeliniz ve model my_input_shapegirdinizin şekli olmak, yani bir resmin şekli (burada (28, 28) veya (1, 28, 28)) toplu halde):

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

Bir resminiz imgvarsa doğrudan yazabilirsiniznew_temp_model.predict(img)


Rubenach 'my_input_shape' ile ne demek istiyorsun? o var'ın değeri ne olmalı?
Shir K

1
modelinizin giriş şekli, modelinizi tanımlarken kendi kodunuzda bile var:input_shape=(28, 28)
Théo Rubenach

1
burada rastgele veri kullanıyorum, ancak sizin durumunuzda my_input_datakendi verilerinizle değiştirmelisiniz
Théo Rubenach

'Kendi verileriniz' ile ne demek istiyorsun? eğitim verileri içindeki değerler ne olmalıdır? test verisi? sadece 1 nesne (resim) veya bir liste / dizi / nesne grubu (resim) olmalı mı? Bunun birçok farklı kombinasyonunu denedim ve hiçbiri işe yaramadı. Bahsettiğiniz gibi 'input_shape' ayarladığımda, '' AttributeError: 'tuple' nesnesinin 'şekil' niteliği yok 'hatası alıyorum
Shir K

1
Cevabımı buna göre güncelledim. Kullanmak istediğiniz resim, kullanım durumunuza bağlıdır, kodla ilgisi yoktur. Hala kafanız karıştıysa, başka bir stackexchange sitesinde yeni bir soru sorabilirsiniz?
Théo Rubenach

3

(TF2 olduğu varsayılarak)

Bence en basit yaklaşım, katmanlarınızı adlandırmak ve sonra bunları standart girdiyle çağırmak olacaktır, böylece modeliniz şöyle görünebilir

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

Sonra sadece bir giriş oluşturun ve

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 aradığın şey

Alternatif yaklaşım

Modelinizin sıralı olduğunu varsayarak daha genel bir çözüm arıyorsanız, bunun gibi bir indexanahtar kelime kullanabilirsiniz.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)

Bu döngünün sonunda my_inputaradığınız şey olmalı


'my_input = ... # Ağınıza standart girdi gibi olmalı' ile ne demek istiyorsun? o var'ın değeri ne olmalı?
Shir K

1
Sıralı modelin beklediği gibi herhangi bir standart giriş - girişiniz 28x28 ise, tek bir örnek için 1x28x28 dizisini geçmelisiniz
bluesummers

1
Cevabımı düzenledim
bluesummers

'Output_of_hidden' içindeki değerler nasıl yazdırılır? Geçerli sonuç 'output_of_hidden Tensor ("hidden_1 / Relu: 0", şekil = (1, 128), dtype = float32)'. Oturum ve değerlendirmeyi kullanmaya çalıştım ama hata alıyorum.
Shir K

1
TF2 ise, genellikle aramalısınız output_of_hidden.numpy()ve onu numpy dizisine dönüştürür
bluesummers
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.