如何使用Python將給定的圖像集進行聚類?
介紹大家好,最近在參加深度學習競賽時,遇到了一個有趣的問題,即如何將給定的圖像集進行聚類,你可能會說,這不是一個簡單的分類問題嗎?使用卷積神經網絡, 就實現(xiàn),但關鍵在于沒有合適訓練數據提供訓練。在不想自己收集數據集的情況,我們如何解決這個問題呢?這就是本文的主要內容,即將深度學習直接應用于測試數據(此處為圖像),而無需創(chuàng)建訓練數據集并在該數據集上訓練神經網絡。卷積神經網絡作為特征提取器首先我們需要討論為什么需要特征提取器?以及如何使卷積神經網絡(CNN)發(fā)揮作用。圖像數據的特征提取器:假設算法需要像特征一樣需要兩只眼睛,一只鼻子和一張嘴來將圖像分類為面部,但是在不同的圖像中,這些特征存在于不同的像素位置,因此簡單地將圖像扁平化并將其提供給算法是不起作用的。而解決這個問題剛好是CNN的卷積層發(fā)揮作用的地方。卷積層作為我們的特征提取器,并將圖像分解為越來越精細的細節(jié),我們來看一下下面的例子:
這是一只貓的圖像,這是Vgg16的第一個卷積層看到它的樣子
請注意不同的圖像,這些是我們的CNN所學習的特征圖,一些特征圖著重于輪廓,一些特征著重于紋理,而某些特征則涉及更細微的細節(jié)(如耳和嘴),下一階段的卷積層將這些特征分解得更細的細節(jié)。
上午我們知道了卷積層可以學習圖像的特定功能,那么接下來我們將實現(xiàn)編碼。實現(xiàn)CNN的卷積層網絡:以下代碼顯示了如何使用預訓練的CNN Vgg16獲得以上結果:MyModel = tf2.<a onclick="parent.postMessage({'referent':'.tensorflow.keras'}, '*')">keras.applications.VGG16(
include_top=True, weights='imagenet', input_tensor=None, input_shape=None,
pooling=None, classes=1000, classifier_activation='softmax'
)
MyModel.summary()
## lets Define a Function that can show Features learned by CNN's nth convolusion layer
def ShowMeWhatYouLearnt(<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..Image'}, '*')">Image, <a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..layer'}, '*')">layer, <a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..MyModel'}, '*')">MyModel):
<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..img'}, '*')">img = img_to_array(<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..Image'}, '*')">Image)
<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..img'}, '*')">img = np.<a onclick="parent.postMessage({'referent':'.numpy.expand_dims'}, '*')">expand_dims(<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..img'}, '*')">img, 0)
### preprocessing for img for vgg16
<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..img'}, '*')">img = tf2.<a onclick="parent.postMessage({'referent':'.tensorflow.keras'}, '*')">keras.applications.vgg16.preprocess_input(<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..img'}, '*')">img)
## Now lets define a model which will help us
## see what vgg16 sees
<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..inputs'}, '*')">inputs = <a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..MyModel'}, '*')">MyModel.inputs
<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..outputs'}, '*')">outputs = <a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..MyModel'}, '*')">MyModel.layers[<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..layer'}, '*')">layer].output
<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..model'}, '*')">model = Model(inputs=<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..inputs'}, '*')">inputs, outputs=<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..outputs'}, '*')">outputs)
<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..model'}, '*')">model.summary()
## let make predictions to see what the Cnn sees

請輸入評論內容...
請輸入評論/評論長度6~500個字