Làm thế nào để xuất lớp thứ hai của mạng?


9

Mô hình của tôi được đào tạo về hình ảnh chữ số ( MNIST dataset). Tôi đang cố gắng in đầu ra của lớp thứ hai trong mạng của mình - một mảng gồm 128 số.

Sau khi đọc rất nhiều ví dụ - ví dụ này , và điều này , hoặc này .

Tôi đã không quản lý để làm điều này trên mạng riêng của tôi. Cả hai giải pháp đều hoạt động với thuật toán của riêng tôi.

Liên kết với Colab: https://colab.research.google.com/drive/1MLbpWJmq8JZB4_zKongaHP2o3M1FpvAv?fbclid=IwAR20xRz2i6sFS-Nm6Xwfk5hztdXOux9

Tôi đã nhận được rất nhiều thông báo lỗi khác nhau. Tôi đã cố gắng xử lý từng người trong số họ, nhưng không thể tự mình tìm ra.

Tôi đang thiếu gì? Làm thế nào để xuất lớp thứ hai? Nếu Hình dạng của tôi là (28,28)- loại & giá trị là input_shapegì?


Thử nghiệm & Lỗi không thành công, ví dụ:

(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: đầu vào phải là một danh sách hoặc bộ dữ liệu.

(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)

tenorflow.python.framework.errors_impl.FailedPreconditionError: Lỗi trong khi đọc biến tài nguyên dense_1 / bias từ Container: localhost. Điều này có thể có nghĩa là biến không được khởi tạo. Không tìm thấy: Container localhost không tồn tại. (Không thể tìm thấy tài nguyên: localhost / dense_1 / bias) [[{{nút dense_1 / BiasAdd / ReadVariableOp}}]]


1
Liên kết trong câu hỏi của bạn bị hỏng, vui lòng thêm chúng để có ý tưởng về những gì bạn đã cố gắng
Théo Rubenach

@ ThéoRubenach Xong
Shir K

Câu trả lời:


3

Có vẻ như bạn đang trộn các máy ảnh cũ (trước tenorflow 2.0 import keras:) và máy ảnh mới ( from tensorflow import keras).

Cố gắng không sử dụng máy ảnh cũ cùng với tenorflow> = 2.0 (và không tham khảo tài liệu cũ như trong liên kết đầu tiên của bạn), vì nó dễ bị nhầm lẫn với cái mới (mặc dù không có gì là phi logic):

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'

Hành vi sẽ rất không ổn định trộn hai thư viện đó.

Khi điều này được thực hiện, sử dụng câu trả lời từ những gì bạn đã thử, là mô hình của bạn và my_input_shapelà hình dạng của mô hình đầu vào của bạn, tức là hình dạng của một hình ảnh (ở đây (28, 28) hoặc (1, 28, 28) nếu bạn có đợt):

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

Nếu bạn có một hình ảnh, imgbạn có thể viết trực tiếpnew_temp_model.predict(img)


Rubenach có ý gì khi nói 'my_input_shape'? Giá trị của var đó là bao nhiêu?
Shir K

1
cũng như hình dạng đầu vào của mô hình của bạn, thậm chí bạn có mã đó trong mã của riêng bạn khi xác định mô hình của bạn:input_shape=(28, 28)
Théo Rubenach

1
Ở đây tôi sử dụng dữ liệu ngẫu nhiên, nhưng trong trường hợp của bạn, bạn nên thay thế my_input_databằng dữ liệu của chính bạn
Théo Rubenach

"Dữ liệu của chính bạn" nghĩa là gì? những giá trị bên trong - dữ liệu đào tạo là gì? dữ liệu kiểm tra? nó chỉ nên là 1 đối tượng (hình ảnh) hay danh sách / mảng / tuple của đối tượng (hình ảnh)? Tôi đã thử nhiều kết hợp khác nhau của cái này và không cái nào trong số đó hoạt động. Khi tôi đặt 'input_shape' như bạn đã đề cập, tôi đã nhận được lỗi '' AttributionError: 'tuple' object không có thuộc tính 'hình dạng' '
Shir K

1
Tôi cập nhật câu trả lời của tôi cho phù hợp. Hình ảnh bạn muốn sử dụng tùy thuộc vào trường hợp sử dụng của bạn, nó không liên quan gì đến mã. Nếu bạn vẫn còn bối rối, có thể hỏi một câu hỏi mới trên một trang web stackexchange khác?
Théo Rubenach

3

(Giả sử TF2)

Tôi nghĩ rằng cách tiếp cận đơn giản nhất sẽ là đặt tên cho các lớp của bạn và sau đó gọi chúng với đầu vào tiêu chuẩn, để mô hình của bạn có thể trông giống như

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

Sau đó, chỉ cần tạo một đầu vào và

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 là những gì bạn đang tìm kiếm

Cách tiếp cận khác

Nếu bạn đang tìm kiếm một giải pháp tổng quát hơn, giả sử mô hình của bạn là tuần tự, bạn có thể sử dụng indextừ khóa get_layernhư thế này

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)

Ở cuối vòng lặp này my_inputsẽ là những gì bạn đang tìm kiếm


Ý bạn là gì bởi 'my_input = ... # Nên giống như đầu vào tiêu chuẩn vào mạng của bạn'? Giá trị của var đó là bao nhiêu?
Shir K

1
Bất kỳ đầu vào tiêu chuẩn nào, giống như những gì mô hình tuần tự mong đợi - nếu đầu vào của bạn là 28x28, bạn nên vượt qua mảng 1x28x28 cho một ví dụ duy nhất
bluesummers

1
Đã chỉnh sửa câu trả lời của tôi cho
bluesummers

Làm cách nào để in các giá trị bên trong 'output_of_hidden'? Kết quả hiện tại là 'output_of_hidden Tensor ("hidden_1 / Relu: 0", shape = (1, 128), dtype = float32)'. Tôi đã cố gắng sử dụng phiên & eval nhưng tôi nhận được lỗi.
Shir K

1
Nếu trong TF2, bạn thường nên gọi output_of_hidden.numpy()và nó sẽ chuyển đổi nó thành mảng numpy
bluesummers
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.