네트워크의 두 번째 계층을 출력하는 방법은 무엇입니까?


9

내 모델은 숫자 이미지 ( MNIST dataset)로 훈련되었습니다 . 네트워크의 두 번째 레이어 출력을 인쇄하려고합니다-128 숫자의 배열.

예를 들어 - 예를 많이 읽고 나면 , , 또는이 .

내 네트워크에서이 작업을 수행하지 못했습니다. 솔루션 중 어느 것도 내 알고리즘으로 작동하지 않습니다.

Colab에 연결 : https://colab.research.google.com/drive/1MLbpWJmq8JZB4_zKongaHP2o3M1FpvAv?fbclid=IwAR20xRz2i6sFS-Nm6Xwfk5hztdXOuxY4tZaDRXxAx3b986gA9-IaTT

다른 오류 메시지가 많이 나타납니다. 나는 그들 각각을 처리하려고 노력했지만 내 스스로 그것을 알아낼 수 없었습니다.

내가 무엇을 놓치고 있습니까? 두 번째 레이어를 출력하는 방법? 내 모양이 (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 : 컨테이너에서 로컬 변수 dense_1 / bias를 읽는 동안 오류가 발생했습니다 : localhost. 이는 변수가 초기화되지 않았 음을 의미 할 수 있습니다. 찾을 수 없음 : 컨테이너 localhost가 없습니다. (자원을 찾을 수 없음 : localhost / dense_1 / bias) [[{{node dense_1 / BiasAdd / ReadVariableOp}}]]


1
귀하의 질문에 대한 링크가 깨졌습니다. 시도한 것에 대한 아이디어를 얻으려면 링크를 추가하십시오.
Théo Rubenach

@TheoRubenach 완료
Shir K

답변:


3

오래된 keras (tensorflow 2.0 이전 :) import keras와 새로운 keras ( from tensorflow import keras)를 혼합 한 것 같습니다 .

tensorflow> = 2.0과 함께 오래된 keras를 사용하지 마십시오 (첫 번째 링크에서와 같이 이전 문서를 참조하지 마십시오).

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'

이 두 라이브러리를 혼합하면 동작이 매우 불안정합니다.

이 작업이 완료되면 시도한 답변 , m 모델, 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

'자신의 데이터'란 무엇을 의미합니까? 훈련 데이터 내부의 가치는 무엇인가? 테스트 데이터? 객체 (이미지)가 하나입니까 아니면 객체 (이미지)의 목록 / 배열 / 튜플이어야합니까? 나는 이것의 많은 다른 조합을 시도했지만 그중 아무것도 작동하지 않았습니다. 언급 한대로 'input_shape'을 설정하면 ''AttributeError : 'tuple'객체에 'shape'속성이 없습니다.
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", shape = (1, 128), dtype = float32)'입니다. session & eval을 사용하려고했지만 오류가 발생합니다.
Shir K

1
TF2의 경우, 일반적으로 호출해야 output_of_hidden.numpy()하며 NumPy와 배열로 변환합니다
bluesummers
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.