Як вивести другий шар мережі?


9

Моя модель навчається на цифрових зображеннях ( MNIST dataset). Я намагаюся надрукувати вихід другого шару моєї мережі - масив із 128 чисел.

Прочитавши багато прикладів - наприклад, це , і це , або це .

Мені не вдалося це зробити у власній мережі. Жодне з рішень не працює за власним алгоритмом.

Посилання на Colab: https://colab.research.google.com/drive/1MLbpWJmq8JZB4_zKongaHP2o3M1FpvAv?fbclid=IwAR20xRz2i6sFS-Nm6Xwfk5hztdXOuxY4tZaxaaxxaxxaxxaxxaxxaxxaxxaxxaxxaxxaxxaxxaxxa9x5axxa9x3axaxxa9x5a5a0

Я отримав багато різних повідомлень про помилки. Я намагався впоратися з кожним із них, але не міг зрозуміти це самостійно.

Що я пропускаю? Як вивести другий шар? Якщо моя форма (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 / зміщення від Container: localhost. Це може означати, що змінна була неініціалізована. Не знайдено: localhost контейнера не існує. (Не вдалося знайти ресурс: localhost / щі_1 / зміщення) [[{{вузол щільний_1 / BiasAdd / ReadVariableOp}}]]


1
Посилання у вашому запитанні розбиті, додайте їх, щоб мати уявлення про те, що ви спробували
Тео Рубенах

@ ThéoRubenach Done
Shir K

Відповіді:


3

Схоже, ви змішуєте старі кери (до tensorflow 2.0:) import kerasта нові кери ( from tensorflow import 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"? яке має бути значення цього вару?
Шир К

1
добре форма вводу вашої моделі, ви навіть маєте її у власному коді при визначенні своєї моделі:input_shape=(28, 28)
Тео Рубенах

1
тут я використовую випадкові дані, але у вашому випадку вам слід замінити my_input_dataвласні дані, звичайно,
Тео Рубенах,

Що ви маєте на увазі під власними даними? які мають бути значення всередині даних про навчання? дані тесту? це повинен бути лише 1 об’єкт (зображення) або список / масив / кортеж об'єктів (зображень)? Я спробував багато різних комбінацій цього, і жодне з цього не вийшло. Коли я встановив 'input_shape', як ви згадали, я отримав помилку '' AttributeError: 'tuple' об'єкт не має атрибута '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 це те, що ви шукаєте

Альтернативний підхід

Якщо ви шукаєте більш загальне рішення, припускаючи, що ваша модель є послідовною, ви можете використовувати подібне 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 = ... # Чи має бути як стандартний вхід у вашу мережу"? яке має бути значення цього вару?
Шир К

1
Будь-який стандартний вклад, як-от те, що очікує послідовна модель - якщо ваш вхід становить 28x28, вам слід пройти масив 1x28x28 для єдиного прикладу
bluesummers

1
Відредагував мою відповідь на
блюзмемерс

Як надрукувати значення всередині 'output_of_hidden'? Поточний результат - 'output_of_hidden Tensor ("приховано_1 / Relu: 0", shape = (1, 128), dtype = float32)'. Я намагався використовувати session & eval, але отримую помилки.
Шир К

1
Якщо в TF2, вам зазвичай потрібно зателефонувати, output_of_hidden.numpy()і він перетворить його на нумерований масив
блюзові літа
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.