Deep Learning 深度学习 DAY4

48 阅读4分钟

torch相关

image.png

image.png

从start_dim开始到end_dim结束,将维度相乘即可得到flatten后的值

max

image.png

import torch

output = torch.tensor([[1, 2, 3], [3, 4, 5]])
predict = torch.max(output, dim=0)
print(predict)
predict = torch.max(output, dim=1)
print(predict)

image.png

_, predicted = torch.max(outputs.data, 1)

在多分类问题中,常用来返回得到结果概率最大的那个类别,转化成相应的索引

卷积神经网络(CNN)

将昨天残留下来的问题给解决了,后面验证了一下正确率是89%,还有待加强,但是刚起步不急,之后可以再调整一下参数啥的,让正确率提上去

import pandas as pd
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.utils.data import TensorDataset
from sklearn.model_selection import train_test_split

batch_size = 20

# 加载数据
train_x = pd.read_csv('images_train.csv', header=None)
train_y = pd.read_csv('labels_train.csv', header=None).values.ravel()  # 将标签转换为一维数组

x_train, x_val, y_train, y_val = train_test_split( train_x, train_y, test_size=0.2, random_state=42)


trainx=torch.tensor(x_train.values,dtype = torch.float32).reshape(48000,28,28)
trainx = torch.unsqueeze(trainx,1)
trainy=torch.tensor(y_train,dtype = torch.uint8)

testx=torch.tensor(x_val.values,dtype = torch.float32).reshape(12000,28,28)
testx = torch.unsqueeze(testx,1)
testy=torch.tensor(y_val,dtype = torch.uint8)


all_dataset = TensorDataset(trainx,trainy)
all_dataloader = torch.utils.data.DataLoader(all_dataset,batch_size=batch_size,shuffle = True)

all_testdataset = TensorDataset(testx,testy)
all_testdataloader = torch.utils.data.DataLoader(all_testdataset,batch_size=batch_size,shuffle = True)

class net(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = nn.Conv2d(1,3,3) #28-3+1 = 26
        self.pool1 = nn.MaxPool2d(2,2) # 26-2/2 +1 13
        self.conv2 = nn.Conv2d(3,9,3) #13-3+1 = 11
        self.pool2 = nn.MaxPool2d(2,1) #11-2+1=10
        self.fc1 = nn.Linear(9*10*10,100)
        self.fc2 = nn.Linear(100,50)
        self.fc3 = nn.Linear(50, 30)
        self.fc4 = nn.Linear(30, 10)

    def forward(self,x):
        x = self.pool1(F.relu(self.conv1(x)))
        x = self.pool2(F.relu(self.conv2(x)))
        x = torch.flatten(x,1)  # flatten all dimensions except batch
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = F.relu(self.fc3(x))
        x = self.fc4(x)
        return x

net = net()

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)


for epoch in range(5):  # loop over the dataset multiple times

    running_loss = 0.0
    for i, data in enumerate(all_dataloader, 0):
        # get the inputs; data is a list of [inputs, labels]
        inputs,labels = data

        # zero the parameter gradients
        optimizer.zero_grad()

        # forward + backward + optimize
        outputs = net(inputs)

        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        # print statistics
        running_loss += loss.item()
        if i % 2000 == 1999:    # print every 2000 mini-batches
            print(f'[{epoch + 1}, {i + 1:5d}] loss: {running_loss / 2000:.3f}')
            running_loss = 0.0

net.eval()

with torch.no_grad():
    total_loss = 0
    correct_predictions = 0
    total_samples = 0

    # 迭代验证集
    for data, targets in all_testdataloader:
        outputs = net(data)  # 前向传播
        loss = criterion(outputs, targets)  # 计算损失
        total_loss += loss.item() * data.size(0)  # 累加损失

        # 转换输出为类别索引
        _, predicted = torch.max(outputs.data, 1)
        correct_predictions += (predicted == targets).sum().item()  # 计算正确预测数量

        total_samples += targets.size(0)

    # 计算平均损失和准确率
    avg_loss = total_loss / total_samples
    accuracy = correct_predictions / total_samples

    print(f"Validation Loss: {avg_loss:.4f}")
    print(f"Validation Accuracy: {accuracy:.4f}")

多层感知机

同样也是python实验课的实验,主要内容是根据11个影响酒品质的因素,数据集是1439条数据,酒的品种有A B C三种,来预测酒的品种

这些代码基本上是我自己手敲上去的,有一点借鉴了之前的卷积神经网络,明天再把一些代码再理解的透彻一些,但是这个实验的正确率不高,只有86%左右,可以再调整下参数或者用其他的能优化的办法

import pandas as pd
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.utils.data import TensorDataset
from sklearn.model_selection import train_test_split

train_x=pd.read_csv("data-train.csv")
traindata=train_x.drop("target",axis = 1)
trainlabel=train_x["target"].values.ravel()
x_train, x_val, y_train, y_val = train_test_split( traindata, trainlabel, test_size=0.2, random_state=42)

batch_size=10

traindata= torch.tensor(x_train.values,dtype = torch.float32)
testdata= torch.tensor(x_val.values,dtype = torch.float32)

labels = torch.zeros(y_train.shape,dtype = torch.uint8)
labels1 = torch.zeros(y_val.shape,dtype = torch.uint8)
for i in range(len(y_train)):
    if y_train[i] == 'A':
        labels[i] = 0
    elif y_train[i] == 'B':
        labels[i] = 1
    else:
        labels[i] = 2

for i in range(len(y_val)):
    if y_val[i] == 'A':
        labels1[i] = 0
    elif y_val[i] == 'B':
        labels1[i] = 1
    else:
        labels1[i] = 2


all_dataset = TensorDataset(traindata,labels)
all_dataloader = torch.utils.data.DataLoader(all_dataset,batch_size=batch_size,shuffle = True)

all_testset = TensorDataset(testdata,labels1)
all_testloader = torch.utils.data.DataLoader(all_testset,batch_size=batch_size,shuffle = True)

class net(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1=nn.Linear(11,6)
        self.fc2=nn.Linear(6,3)

    def forward(self, x):
        x = torch.flatten(x,1)
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return x


net = net()

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)


for epoch in range(5):  # loop over the dataset multiple times

    running_loss = 0.0
    for i, data in enumerate(all_dataloader, 0):
        # get the inputs; data is a list of [inputs, labels]
        inputs,labels = data

        # zero the parameter gradients
        optimizer.zero_grad()

        # forward + backward + optimize
        outputs = net(inputs)

        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        # print statistics
        running_loss += loss.item()
    print(f'Epoch [{epoch + 1}/5], Loss: {loss.item():.4f}')

correct = 0
total = 0

net.eval()

with torch.no_grad():
    total_loss = 0
    correct_predictions = 0
    total_samples = 0

    # 迭代验证集
    for data, targets in all_testloader:
        outputs = net(data)  # 前向传播
        loss = criterion(outputs, targets)  # 计算损失
        total_loss += loss.item() * data.size(0)  # 累加损失

        # 转换输出为类别索引
        _, predicted = torch.max(outputs.data, 1)
        correct_predictions += (predicted == targets).sum().item()  # 计算正确预测数量

        total_samples += targets.size(0)

    # 计算平均损失和准确率
    avg_loss = total_loss / total_samples
    accuracy = correct_predictions / total_samples

    print(f"Validation Loss: {avg_loss:.4f}")
    print(f"Validation Accuracy: {accuracy:.4f}")