当前位置:   article > 正文

(6-4-2 ) 特征抽取——主成分分析(PCA)_torch pca

torch pca

6.4.2  主成分分析(PCA)

主成分分析(Principal Component Analysis,PCA)是一种线性降维方法,通过将数据投影到新的低维子空间,保留最大方差的特征,以实现维度降低和噪声削减。例如下面是一个使用PyTorch实现主成分分析(PCA)方法进行特征抽取的例子,本实例将使用PCA降低图像数据的维度,并使用降维后的数据训练一个简单的神经网络模型。

实例6-3:PyTorch使用特征选择方法制作神经网络模型(源码路径:daima\6\zhu.py

实例文件zhu.py的具体实现代码如下所示。

  1. # 加载MNIST数据集
  2. transform = transforms.Compose([transforms.ToTensor()])
  3. train_loader = torch.utils.data.DataLoader(datasets.MNIST('./data', train=True, download=True, transform=transform), batch_size=64, shuffle=True)
  4. # 提取数据并进行PCA降维
  5. X = []
  6. y = []
  7. for images, labels in train_loader:
  8. images = images.view(images.size(0), -1) # 将图像展平为向量
  9. X.append(images)
  10. y.append(labels)
  11. X = torch.cat(X, dim=0).numpy()
  12. y = torch.cat(y, dim=0).numpy()
  13. num_components = 20 # 选择降维后的维度
  14. pca = PCA(n_components=num_components)
  15. X_pca = pca.fit_transform(X)
  16. # 划分数据集
  17. X_train, X_test, y_train, y_test = train_test_split(X_pca, y, test_size=0.2, random_state=42)
  18. # 定义简单的神经网络模型
  19. class SimpleModel(nn.Module):
  20. def __init__(self, input_dim, output_dim):
  21. super(SimpleModel, self).__init__()
  22. self.fc = nn.Linear(input_dim, output_dim)
  23. def forward(self, x):
  24. return self.fc(x)
  25. # 设置模型参数
  26. input_dim = num_components
  27. output_dim = 10 # 类别数
  28. learning_rate = 0.01
  29. num_epochs = 10
  30. # 初始化模型、损失函数和优化器
  31. model = SimpleModel(input_dim, output_dim)
  32. criterion = nn.CrossEntropyLoss()
  33. optimizer = optim.SGD(model.parameters(), lr=learning_rate)
  34. # 训练模型
  35. for epoch in range(num_epochs):
  36. inputs = torch.tensor(X_train, dtype=torch.float32)
  37. labels = torch.tensor(y_train, dtype=torch.long)
  38. optimizer.zero_grad()
  39. outputs = model(inputs)
  40. loss = criterion(outputs, labels)
  41. loss.backward()
  42. optimizer.step()
  43. if (epoch+1) % 1 == 0:
  44. print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')
  45. # 在测试集上评估模型性能
  46. with torch.no_grad():
  47. inputs = torch.tensor(X_test, dtype=torch.float32)
  48. labels = torch.tensor(y_test, dtype=torch.long)
  49. outputs = model(inputs)
  50. _, predicted = torch.max(outputs.data, 1)
  51. accuracy = (predicted == labels).sum().item() / labels.size(0)
  52. print(f'Accuracy on test set: {accuracy:.2f}')

在这个例子中,首先加载了MNIST数据集并进行了数据预处理。然后,将图像数据展平为向量,并使用PCA对数据进行降维。接下来,定义了一个简单的神经网络模型,使用降维后的数据进行训练。最后,在测试集上评估了模型的性能。执行后会输出:

  1. Epoch [1/10], Loss: 2.3977
  2. Epoch [2/10], Loss: 2.3872
  3. Epoch [3/10], Loss: 2.3768
  4. Epoch [4/10], Loss: 2.3665
  5. Epoch [5/10], Loss: 2.3563
  6. Epoch [6/10], Loss: 2.3461
  7. Epoch [7/10], Loss: 2.3360
  8. Epoch [8/10], Loss: 2.3260
  9. Epoch [9/10], Loss: 2.3160
  10. Epoch [10/10], Loss: 2.3061
  11. Accuracy on test set: 0.18

下面是一个使用TensorFlow使用主成分分析(PCA)方法进行特征抽取的例子,并保存处理后的模型。

实例6-4:Tensorflow使用PCA方法制作神经网络模型并保存(源码路径:daima\6\tzhu.py

实例文件tzhu.py的具体实现代码如下所示。

  1. import tensorflow as tf
  2. from tensorflow.keras.datasets import mnist
  3. from tensorflow.keras.layers import Input, Dense
  4. from tensorflow.keras.models import Model
  5. from sklearn.decomposition import PCA
  6. from sklearn.model_selection import train_test_split
  7. # 加载MNIST数据集
  8. (X_train, y_train), (X_test, y_test) = mnist.load_data()
  9. X_train = X_train.reshape(-1, 28 * 28) / 255.0 # 归一化
  10. X_test = X_test.reshape(-1, 28 * 28) / 255.0
  11. # 使用PCA进行降维
  12. num_components = 20 # 选择降维后的维度
  13. pca = PCA(n_components=num_components)
  14. X_train_pca = pca.fit_transform(X_train)
  15. X_test_pca = pca.transform(X_test)
  16. # 划分数据集
  17. X_train_split, X_val_split, y_train_split, y_val_split = train_test_split(X_train_pca, y_train, test_size=0.1, random_state=42)
  18. # 定义神经网络模型
  19. input_layer = Input(shape=(num_components,))
  20. x = Dense(128, activation='relu')(input_layer)
  21. output_layer = Dense(10, activation='softmax')(x)
  22. model = Model(inputs=input_layer, outputs=output_layer)
  23. # 编译模型
  24. model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
  25. # 训练模型
  26. batch_size = 64
  27. epochs = 10
  28. history = model.fit(X_train_split, y_train_split, batch_size=batch_size, epochs=epochs, validation_data=(X_val_split, y_val_split))
  29. # 保存模型
  30. model.save('pca_model.h5')
  31. print("Model saved")
  32. # 在测试集上评估模型性能
  33. test_loss, test_accuracy = model.evaluate(X_test_pca, y_test, verbose=0)
  34. print(f'Test accuracy: {test_accuracy:.4f}')
  35. # 加载保存的模型
  36. loaded_model = tf.keras.models.load_model('pca_model.h5')
  37. # 在测试集上评估加载的模型性能
  38. loaded_test_loss, loaded_test_accuracy = loaded_model.evaluate(X_test_pca, y_test, verbose=0)
  39. print(f'Loaded model test accuracy: {loaded_test_accuracy:.4f}')

上述代码的实现流程如下:

  1. 数据加载和预处理:代码开始加载MNIST手写数字数据集,并对图像数据进行预处理,将图像展平为向量,并进行归一化(将像素值从0到255缩放到0到1之间)。
  2. PCA降维:使用PCA算法对训练集的图像数据进行降维,将原始高维数据转换为包含更少特征的低维数据。这将有助于减少数据的维度,并保留数据中的主要信息。
  3. 数据划分:划分降维后的训练集为训练集和验证集,以便在训练模型时进行验证。
  4. 神经网络模型定义:定义了一个简单的神经网络模型,该模型接受PCA降维后的数据作为输入,并包含一个隐层和一个输出层。
  5. 模型编译:编译神经网络模型,指定优化器和损失函数。
  6. 模型训练:使用划分后的训练集对神经网络模型进行训练。训练过程将执行一定数量的epoch(迭代次数),在每个epoch中,模型将根据训练数据进行参数更新,并在验证集上计算性能指标。
  7. 保存模型:保存经过训练的神经网络模型为一个HDF5文件(扩展名为.h5),以便以后加载和使用。
  8. 模型性能评估:使用测试集评估经过训练的神经网络模型的性能,计算并输出测试准确率。
  9. 加载模型和再次评估:加载之前保存的模型,然后使用相同的测试集对加载的模型进行评估,计算并输出加载模型的测试准确率。

执行后会输出:

  1. Epoch 1/10
  2. 844/844 [==============================] - 4s 4ms/step - loss: 0.4939 - accuracy: 0.8608 - val_loss: 0.2515 - val_accuracy: 0.9273
  3. Epoch 2/10
  4. 844/844 [==============================] - 3s 3ms/step - loss: 0.2107 - accuracy: 0.9376 - val_loss: 0.1775 - val_accuracy: 0.9498
  5. Epoch 3/10
  6. 844/844 [==============================] - 4s 5ms/step - loss: 0.1604 - accuracy: 0.9521 - val_loss: 0.1490 - val_accuracy: 0.9577
  7. Epoch 4/10
  8. 844/844 [==============================] - 5s 6ms/step - loss: 0.1363 - accuracy: 0.9592 - val_loss: 0.1332 - val_accuracy: 0.9612
  9. Epoch 5/10
  10. 844/844 [==============================] - 3s 4ms/step - loss: 0.1218 - accuracy: 0.9630 - val_loss: 0.1236 - val_accuracy: 0.9640
  11. Epoch 6/10
  12. 844/844 [==============================] - 3s 3ms/step - loss: 0.1115 - accuracy: 0.9654 - val_loss: 0.1166 - val_accuracy: 0.9638
  13. Epoch 7/10
  14. 844/844 [==============================] - 3s 4ms/step - loss: 0.1034 - accuracy: 0.9681 - val_loss: 0.1091 - val_accuracy: 0.9658
  15. Epoch 8/10
  16. 844/844 [==============================] - 3s 4ms/step - loss: 0.0978 - accuracy: 0.9697 - val_loss: 0.1104 - val_accuracy: 0.9653
  17. Epoch 9/10
  18. 844/844 [==============================] - 2s 3ms/step - loss: 0.0934 - accuracy: 0.9712 - val_loss: 0.1063 - val_accuracy: 0.9657
  19. Epoch 10/10
  20. 844/844 [==============================] - 2s 3ms/step - loss: 0.0890 - accuracy: 0.9727 - val_loss: 0.1034 - val_accuracy: 0.9670
  21. Model saved
  22. Test accuracy: 0.9671
  23. Loaded model test accuracy: 0.9671

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/911397
推荐阅读
相关标签
  

闽ICP备14008679号