假设我现在要使用pytorch框架做深度学习,已知我有一些火焰图像,还有一张excel表格,命名为"CDS.csv",在表格中有一列参数,标题为“temperature”,一张火焰图像对应表格中的一行参数,也就是说,我要通过图像识别,使卷积神经网络在接收到火焰图像时,自动判断它对应的参数是多少,不使用CUDA,改成使用CPU加速,请以此为背景,写出完整的代码,并加上注释,并且解释每个变量代表的含义
时间: 2023-06-16 11:02:48 浏览: 94
好的,以下是代码:
```python
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.transforms as transforms
import pandas as pd
import os
from PIL import Image
# 定义数据集类,继承自torch.utils.data.Dataset
class FlameDataset(torch.utils.data.Dataset):
def __init__(self, csv_file, root_dir, transform=None):
"""
csv_file: 包含参数的csv文件
root_dir: 包含图像的文件夹路径
transform: 可选的图像变换操作
"""
self.flame_frame = pd.read_csv(csv_file) # 读取csv文件
self.root_dir = root_dir
self.transform = transform
def __len__(self):
return len(self.flame_frame)
def __getitem__(self, idx):
if torch.is_tensor(idx):
idx = idx.tolist()
img_name = os.path.join(self.root_dir, self.flame_frame.iloc[idx, 0]) # 获取图像文件名
image = Image.open(img_name) # 打开图像
temperature = self.flame_frame.iloc[idx, 1] # 获取对应参数
if self.transform:
image = self.transform(image)
return image, temperature
# 定义卷积神经网络模型
class FlameCNN(nn.Module):
def __init__(self):
super(FlameCNN, self).__init__()
self.conv1 = nn.Conv2d(3, 6, 5) # 第一个卷积层,输入通道数为3,输出通道数为6,卷积核大小为5x5
self.pool = nn.MaxPool2d(2, 2) # 最大池化层,池化核大小为2x2
self.conv2 = nn.Conv2d(6, 16, 5) # 第二个卷积层,输入通道数为6,输出通道数为16,卷积核大小为5x5
self.fc1 = nn.Linear(16 * 5 * 5, 120) # 第一个全连接层,输入节点数为16*5*5,输出节点数为120
self.fc2 = nn.Linear(120, 84) # 第二个全连接层,输入节点数为120,输出节点数为84
self.fc3 = nn.Linear(84, 1) # 第三个全连接层,输入节点数为84,输出节点数为1,即对应的参数
def forward(self, x):
x = self.pool(torch.relu(self.conv1(x))) # 第一层卷积、激活、池化
x = self.pool(torch.relu(self.conv2(x))) # 第二层卷积、激活、池化
x = x.view(-1, 16 * 5 * 5) # 展开
x = torch.relu(self.fc1(x)) # 第一个全连接层、激活
x = torch.relu(self.fc2(x)) # 第二个全连接层、激活
x = self.fc3(x) # 第三个全连接层,无激活
return x
# 创建数据集
transform = transforms.Compose([transforms.Resize((32, 32)), transforms.ToTensor()])
dataset = FlameDataset(csv_file="CDS.csv", root_dir="flame_images", transform=transform)
# 创建数据加载器
dataloader = torch.utils.data.DataLoader(dataset, batch_size=4, shuffle=True, num_workers=0)
# 创建模型
model = FlameCNN()
# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
# 训练模型
for epoch in range(10):
running_loss = 0.0
for i, data in enumerate(dataloader, 0):
# 获取输入和目标参数
inputs, targets = data
# 将参数转为浮点数张量
targets = targets.float()
# 将梯度清零
optimizer.zero_grad()
# 前向传播、计算损失、反向传播、更新参数
outputs = model(inputs)
loss = criterion(outputs, targets)
loss.backward()
optimizer.step()
# 统计损失
running_loss += loss.item()
if i % 2000 == 1999: # 每2000个小批量数据打印平均损失
print('[%d, %5d] loss: %.3f' %
(epoch + 1, i + 1, running_loss / 2000))
running_loss = 0.0
print('Finished Training')
# 测试模型
dataiter = iter(dataloader)
images, labels = dataiter.next()
# 输出预测结果
outputs = model(images)
predicted = outputs.detach().numpy().flatten()
print("Predicted values: ", predicted)
print("Actual values: ", labels.numpy())
```
注释如下:
1. `FlameDataset`:定义数据集类,包括读取csv文件和图像文件的操作,以及可选的图像变换操作。
2. `FlameCNN`:定义卷积神经网络模型,包括卷积层、池化层和全连接层。
3. `transform`:图像变换操作,包括调整尺寸和转换为张量。
4. `dataset`:创建数据集对象,包括csv文件和图像文件的路径以及图像变换操作。
5. `dataloader`:创建数据加载器对象,包括数据集对象、批量大小、是否打乱数据和使用的进程数。
6. `model`:创建卷积神经网络模型对象。
7. `criterion`:定义损失函数,使用均方误差。
8. `optimizer`:定义优化器,使用随机梯度下降法。
9. 训练模型:使用数据加载器迭代训练数据,每个小批量数据进行前向传播、计算损失、反向传播和更新参数的操作。在每个epoch结束后,打印平均损失。
10. 测试模型:使用数据加载器获取一批测试数据,并输出模型的预测结果和实际结果。
阅读全文