tính năng trích xuất cho một mô hình được sàng lọc trước trong máy ảnh


7

Keras có một cách để trích xuất các tính năng của một mô hình đã được sàng lọc, được mô tả ở đây https://keras.io/appluggest/

from keras.applications.vgg16 import VGG16
from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input
import numpy as np

model = VGG16(weights='imagenet', include_top=False)

img_path = 'elephant.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)

features = model.predict(x)

Tôi đã thử điều này với một số hình ảnh mẫu. Vectơ x của tôi có hình dạng (100, 3, 224, 224) cho 100 quan sát, 3 cho kích thước pixel RGB và 224x224. các preprocess_inputreshapes này cho mô hình VGG (dự kiến một trật tự khác nhau).

Tuy nhiên, hình dạng đầu ra featureslà (100, 512, 7, 7). Hình dạng này là gì? Tôi muốn sử dụng các tính năng làm đầu vào cho hồi quy logistic. Vì vậy, tôi cần một hình dạng như (100, n): một hàng cho mỗi quan sát và các tính năng trong các cột. Làm cách nào để định hình lại đầu ra cho kích thước này?

Nói rằng bây giờ tôi muốn xây dựng Convnet đơn giản của riêng mình:

from keras.models import Sequential
from keras.layers import Convolution2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense

model = Sequential()
model.add(Convolution2D(32, 3, 3, input_shape=(1, 299, 299)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Convolution2D(32, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Convolution2D(64, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

Mô hình này hy vọng hình ảnh thang độ xám là đầu vào, do đó hình dạng.

Tôi phải thêm loại lớp nào để có được các tính năng của mô hình này (thứ gì đó tôi có thể nhập vào trong hồi quy logistic hoặc rừng ngẫu nhiên).

Cảm ơn

Câu trả lời:


7

Các featuresbiến có chứa các kết quả đầu ra của các lớp xoắn cuối cùng của mạng của bạn. Lớp chập cuối cùng của VGG16 tạo ra các bản đồ tính năng 512 7x7. Tất cả những gì bạn cần làm để sử dụng các tính năng này trong mô hình hồi quy logistic (hoặc bất kỳ mô hình nào khác) là định hình lại nó thành một thang đo 2D, như bạn nói.

reshaped_features = features.reshape(100, 512*7*7)

Điều này sẽ làm phẳng các bản đồ tính năng thành một vectơ một chiều dài cho mỗi trường hợp.

Mẹo: Nếu bạn không thể bận tâm tìm ra kích thước thực tế cho việc định hình lại của mình, bạn có thể thay thế 512*7*7bằng -1numpysẽ tìm ra kích thước cuối cùng sẽ lớn như thế nào.


Điều gì về trích xuất các tính năng từ lớp áp chót hoặc các lớp khác?
Raghuram

2
@Raghuram Sử dụng VGG19 keras.io/appluggest/#vgg19
christopherlovell
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.