我的数据集是D:\wjd这个路径下有八个文件夹,分别是Al,Ag,Au,Cu,Mo,Cu,V,W这8个文件夹,每个文件夹下面是300张1000*1000的格式为png的ovito三色图,现在想用一种无监督方法对这个路径下D:\wjd下的8个文件夹的图片进行特征提取,然后归为两大类,一类是FCC,一类是BCC,然后把分类结果放到两个文件夹里,一个叫FCC,另外一个叫BCC可以根据这些描述,给我写程序吗
时间: 2024-02-20 16:59:34 浏览: 148
好的,根据您的需求,您可以使用深度学习中的自编码器(autoencoder)来进行无监督特征提取和分类。以下是一份基本的Python代码,可以实现您的需求:
```python
import os
import cv2
import numpy as np
from sklearn.model_selection import train_test_split
from keras.layers import Input, Dense
from keras.models import Model
# 定义自编码器模型
input_img = Input(shape=(1000, 1000, 3))
x = Dense(1024, activation='relu')(input_img)
encoded = Dense(512, activation='relu')(x)
x = Dense(1024, activation='relu')(encoded)
decoded = Dense(1000 * 1000 * 3, activation='sigmoid')(x)
autoencoder = Model(input_img, decoded)
# 编译自编码器模型
autoencoder.compile(optimizer='adam', loss='mse')
# 加载数据
data = []
labels = []
for folder in os.listdir("D:/wjd"):
if folder in ["FCC", "BCC"]:
continue
for file_name in os.listdir(os.path.join("D:/wjd", folder)):
img = cv2.imread(os.path.join("D:/wjd", folder, file_name))
data.append(img)
if folder in ["Al", "Ag", "Au"]:
labels.append(0)
else:
labels.append(1)
data = np.array(data)
labels = np.array(labels)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(data, labels, test_size=0.2, random_state=42)
# 训练自编码器模型
autoencoder.fit(X_train, X_train, epochs=10, batch_size=16, shuffle=True, validation_data=(X_test, X_test))
# 获取编码器模型
encoder = Model(input_img, encoded)
# 将所有图片编码为特征向量
features = encoder.predict(data)
# 将数据分为两类,FCC和BCC
fcc_data = features[labels == 0]
bcc_data = features[labels == 1]
# 将分类结果保存到文件夹中
os.makedirs("D:/wjd/FCC")
os.makedirs("D:/wjd/BCC")
for i, feature in enumerate(features):
if labels[i] == 0:
cv2.imwrite(os.path.join("D:/wjd/FCC", f"{i}.png"), data[i])
else:
cv2.imwrite(os.path.join("D:/wjd/BCC", f"{i}.png"), data[i])
```
这份代码会加载D:/wjd文件夹下的所有图片,然后使用自编码器模型对其进行特征提取和分类。分类结果会保存到D:/wjd/FCC和D:/wjd/BCC文件夹中。您可以根据需要对代码进行修改。
阅读全文