नेटवर्क की दूसरी लेयर को आउटपुट कैसे करें?


9

मेरा मॉडल अंकों की छवियों ( MNIST dataset) पर प्रशिक्षित है । मैं अपने नेटवर्क की दूसरी परत के आउटपुट को प्रिंट करने की कोशिश कर रहा हूं - 128 नंबर की एक सरणी।

उदाहरण के लिए - उदाहरण के एक बहुत पढ़ने के बाद यह , और यह , या यह

मैंने अपने नेटवर्क पर ऐसा करने का प्रबंधन नहीं किया। न ही मेरे अपने एल्गोरिथ्म के समाधान का काम।

कोलाब से लिंक करें: https://colab.research.google.com/drive/1MLbpWJmq8JZB4_zKongaHP2o3M1FpvAv?fbclid=IwAR20xnz2i6sFS-Nm6Xwfk5hztdXOzYZxdrxxdrxxx

मुझे बहुत सारे त्रुटि संदेश मिले। मैंने उनमें से प्रत्येक को संभालने की कोशिश की, लेकिन यह अपने आप नहीं हो सका।

मैं क्या खो रहा हूँ? दूसरी लेयर को आउटपुट कैसे करें? यदि मेरा आकार है (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)

टेंसोरफ़्लोफ़्थॉन.फ़्रामवर्क.errors_impl.FailedPreconditionError: कंटेनर से संसाधन चर dense_1 / पूर्वाग्रह को पढ़ते समय त्रुटि: लोकलहोस्ट। इसका मतलब यह हो सकता है कि चर असमान था। नहीं मिला: कंटेनर लोकलहोस्ट मौजूद नहीं है। (संसाधन नहीं मिल सका: लोकलहोस्ट / dense_1 / पूर्वाग्रह) [[{{नोड dense_1 / BiasAdd / ReadVariableOp}}]]


1
आपके प्रश्न के लिंक टूटे हुए हैं, कृपया उन्हें जोड़ने का विचार करें कि आपने क्या प्रयास किया है
Théo Rubenach

@ ThéoRubenach हो गया
शिर के

जवाबों:


3

लगता है कि आप पुराने केर (टेंसरफ़्लो 2.0: से पहले import keras) और नए कारसे ( from tensorflow import keras) से पहले मिश्रण कर रहे हैं ।

टेनसफ़्लो के साथ पुराने केरस का उपयोग न करने की कोशिश करें> = 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 का मान क्या होना चाहिए?
शिर के

1
अच्छी तरह से अपने मॉडल के इनपुट का आकार, आपके पास अपने मॉडल को परिभाषित करते समय अपने कोड में भी होता है:input_shape=(28, 28)
Théo Rubenach

1
यहाँ मैं यादृच्छिक डेटा का उपयोग करता हूं, लेकिन आपके मामले में आपको my_input_dataअपने स्वयं के डेटा को बदलना चाहिए
थियो रूबेनच

Own अपने डेटा ’से आपका क्या तात्पर्य है? क्या मान होना चाहिए - प्रशिक्षण डेटा? परीक्षण डेटा? क्या यह केवल 1 ऑब्जेक्ट (छवि) या एक सूची / सरणी / ऑब्जेक्ट्स (छवियों) का टपल होना चाहिए? मैंने इसके कई अलग-अलग संयोजनों की कोशिश की और इसमें से कोई भी काम नहीं किया। जब मैंने 'input_shape' सेट किया था, जैसा कि मैंने उल्लेख किया है, तो मुझे त्रुटि '' AttributeError: 'tuple' ऑब्जेक्ट का कोई गुण 'आकार' नहीं मिला है
Shir K

1
मैंने उसी हिसाब से अपना जवाब अपडेट किया। आपके द्वारा उपयोग की जाने वाली छवि आपके उपयोग के मामले पर निर्भर करती है, इसका कोड से कोई लेना-देना नहीं है। यदि आप अभी भी भ्रमित हैं, तो एक और स्टैकएक्सचेंज साइट पर एक नया सवाल पूछ सकते हैं?
थोयो रूबेनच

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 का मान क्या होना चाहिए?
शिर के

1
कोई भी मानक इनपुट, जैसे कि अनुक्रमिक मॉडल क्या उम्मीद करता है - यदि आपका इनपुट 28x28 है, तो आपको एकल उदाहरण के लिए 1x28x28 सरणी पास करनी चाहिए
ब्लूज़ुमर

1
मेरे जवाब को
संपादित

'Output_of_hidden' के अंदर मान कैसे प्रिंट करें? वर्तमान परिणाम 'output_of_hidden Tensor ("hidden_1 / Relu: 0", आकृति = (1, 128), dtype = float32) है। मैंने सत्र और eval का उपयोग करने की कोशिश की, लेकिन मुझे त्रुटियां मिलीं।
शायर के

1
अगर TF2 में, आपको आमतौर पर कॉल करना चाहिए output_of_hidden.numpy()और यह इसे numpy array में बदल देगा
bluesummers
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.