如何使用python神经网络实现图片分类


import numpy as np
import cv2
import os

from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split

from keras.models import Sequential
from keras.layers import Dense, Flatten, Dropout, Activation, Conv2D, MaxPooling2D
import joblib
from keras.models import load_model

main_dir = "file/"


def get_category(root):
    category = root.split(os.path.sep)[1]
    return category


def create_test_data(path):
    X = []
    y = []

    for root, dirs, files in os.walk(path):
        for file in files:
            if 'DS' in file:
                continue
            filepath = os.path.join(root, file)
            category = get_category(filepath)
            img_array = cv2.imread(filepath, cv2.IMREAD_GRAYSCALE)
            new_img_array = cv2.resize(img_array, size=(80, 80))
            X.append(new_img_array)
            y.append(category)
    return X, y


def process_data(X, y):
    X = np.array(X).reshape(-1, 80, 80, 1)
    y = np.array(y)
    X = X / 255.0
    return X, y


def build_model1(class_num,X_shape):

    model = Sequential()
    model.add( Conv2D(64, (3, 3), activation='relu', input_shape=X_shape) )
    model.add(MaxPooling2D(pool_size=(2, 2)))

    model.add( Dense(class_num, activation='softmax') )

    model.compile(loss="sparse_categorical_crossentropy",
                  optimizer="adam",
                  metrics=["accuracy"])
    return model


from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier


def build_model2():

    model = RandomForestRegressor(n_estimators=100, random_state=42)

    return model


X, y = create_test_data(main_dir)
X, y_labels = process_data(X, y)

print(X.shape)
class_num = len(np.unique(y))

label_encoder = LabelEncoder()

y  = label_encoder.fit_transform(y_labels)

model1 = build_model1(class_num ,X.shape[1:])

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4,random_state=10)

history = model1.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=2, batch_size=10)
evaluation_result = model1.evaluate(X_test,y_test)
print(f"Loss: {evaluation_result[0]:.4f}")
print(f"Accuracy: {evaluation_result[1]*100:.2f}%")

model2 = build_model2()

model2.fit( X_train.reshape( X_train.shape[0],-1) , y_train, validation_data=(X_test.shape[0],-1, y_test))
evaluation_result = model1.evaluate(X_test,y_test)
print(f"Loss: {evaluation_result[0]:.4f}")
print(f"Accuracy: {evaluation_result[1]*100:.2f}%")


model1.save("model1.h5")
joblib.dump(model2, "model2.joblib")

joblib.dump(label_encoder, "label_encoder.joblib")

loaded_model1 = load_model('model.h5')  # Keras模型使用load_model加载

loaded_model2 = joblib.load('model2.joblib')  # 使用joblib加载随机森林模型

loaded_label_encoder = joblib.load("label_encoder.joblib")  # 使用joblib加载标签编码器

y_new_encoded = loaded_label_encoder.transform(y_test)

predictions1 = loaded_model1.predict(X_test)

predictions2 = loaded_model2.predict(X_test)

predicted_classes1 = np.argmax(predictions1, axis=1)

print("Model 1 Predictions (Classes):", predicted_classes1)
print("Model 2 Predictions:", predictions2)









Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐