簡體   English   中英

使用預訓練的ResNet50網絡的OneClass SVM模型

[英]OneClass SVM model using pretrained ResNet50 network

我正在嘗試構建用於圖像識別的OneClass分類器。 我找到了這篇文章,但是因為我沒有完整的源代碼,所以我不太了解我在做什么。

X_train, X_test, y_train, y_test = train_test_split(x, y, random_state=42)

# X_train (2250, 200, 200, 3)
resnet_model = ResNet50(input_shape=(200, 200, 3), weights='imagenet', include_top=False)
features_array = resnet_model.predict(X_train)
# features_array (2250, 7, 7, 2048)
pca = PCA(svd_solver='randomized', n_components=450, whiten=True, random_state=42)
svc = SVC(kernel='rbf', class_weight='balanced')
model = make_pipeline(pca, svc)

param_grid = {'svc__C': [1, 5, 10, 50], 'svc__gamma': [0.0001, 0.0005, 0.001, 0.005]}
grid = GridSearchCV(model, param_grid)
grid.fit(X_train, y_train)

我有2250張圖片(包括食物而不是食物),尺寸為200x200px,我發送此數據來預測 ResNet50模型的方法。 結果是(2250,7,7,2048)張量,有人知道這個維數是什么意思嗎?

當我嘗試運行grid.fit方法時出現錯誤:

ValueError: Found array with dim 4. Estimator expected <= 2.

這些是我可以做出的發現。

您將使輸出張量高於全局平均池化層。 (請參閱resnet_model.summary()以了解輸入維如何更改為輸出維)

為了進行簡單修復,請在resnet_model的頂部添加一個平均池化2d層。 (以便輸出形狀變為(2250,1,1,2048))

resnet_model = ResNet50(input_shape=(200, 200, 3), weights='imagenet', include_top=False)
resnet_op = AveragePooling2D((7, 7), name='avg_pool_app')(resnet_model.output)
resnet_model = Model(resnet_model.input, resnet_op, name="ResNet")

這通常存在於ResNet50本身的源代碼中。 基本上,我們將AveragePooling2D圖層添加到resnet50模型。 最后一行將圖層(第二行)和基線模型組合到一個模型對象中。

現在,輸出維度(feature_array)將為(2250, 1, 1, 2048) (由於添加了平均池層)。

為了避免ValueError您應該將此feature_array調整為(2250, 2048)

feature_array = np.reshape(feature_array, (-1, 2048))

在問題程序的最后一行,

grid.fit(X_train, y_train)

您已經適合使用X_train(在這種情況下為圖像)。 此處正確的變量是features_array (這被認為是圖像的摘要)。 輸入此行將糾正錯誤,

grid.fit(features_array, y_train)

要通過提取特征向量以這種方式進行更細微的調整,請查看此處 (使用神經網絡進行訓練,而不是使用PCA和SVM)。

希望這可以幫助!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM