验证性能是否可以从 MNIST 训练数据和测试数据中输出?

如何解决验证性能是否可以从 MNIST 训练数据和测试数据中输出?

import torchvision.datasets as dsets
import torchvision.transforms as transforms
import torch.nn.init
import torch.nn.functional as F
# from sklearn.linear_model import SGDClassifier # Test i did
# from sklearn.model_selection import cross_val_score

device = 'cuda' if torch.cuda.is_available() else 'cpu'
print(device)

learning_rate = 0.001
training_epochs = 15
batch_size = 100

mnist_train = dsets.MNIST(root='MNIST_data/',# Specify download path
                          train=True,# Specify True to download as training data
                          transform=transforms.ToTensor(),# Convert to tensor
                          download=True)

mnist_test = dsets.MNIST(root='MNIST_data/',# Specify download path
                         train=False,# If false is specified,download as test data
                         transform=transforms.ToTensor(),# Convert to tensor
                         download=True)

data_loader = torch.utils.data.DataLoader(dataset=mnist_train,batch_size=batch_size,shuffle=True,drop_last=True)

class CNN(torch.nn.Module):

    def __init__(self):
        super(CNN,self).__init__()
        # l layer
        # ImgIn shape=(?,28,1)
    
        self.layer1 = torch.nn.Sequential(
            torch.nn.Conv2d(1,32,kernel_size=3,stride=1,padding=1),torch.nn.ReLU(),torch.nn.MaxPool2d(kernel_size=2,stride=2))

        # 2 layer
 
        self.layer2 = torch.nn.Sequential(
            torch.nn.Conv2d(32,64,stride=2))

        # 7x7x64 inputs -> 10 outputs
        self.fc1 = torch.nn.Linear(7 * 7 * 64,100,bias=True)
        self.fc2 = torch.nn.Linear(100,10,bias=True)


    def forward(self,x):
        out = self.layer1(x)
        out = self.layer2(out)
        out = out.view(out.size(0),-1)   # Flatten for total bonding layer
        out = F.relu(self.fc1(out))
        out = self.fc2(out)
        return out

# CNN model definition
model = CNN().to(device)

criterion = torch.nn.CrossEntropyLoss().to(device)    # Softmax function included in cost function.
optimizer = torch.optim.Adam(model.parameters(),lr=learning_rate)


total_batch = len(data_loader)
print('Number of batches : {}'.format(total_batch))

def epoch_acc():
    X_test = mnist_test.test_data.view(len(mnist_test),1,28).float().to(device)
    Y_test = mnist_test.test_labels.to(device)

    prediction = model(X_test)
    correct_prediction = torch.argmax(prediction,1) == Y_test
    accuracy = correct_prediction.float().mean()
    acc = accuracy.item()

    return acc

for epoch in range(training_epochs):
    avg_cost = 0

    for X,Y in data_loader: # I take it out in a mini-batch unit
        # image is already size of (28x28),no reshape
        # label is not one-hot encoded
        X = X.to(device)
        Y = Y.to(device)

        optimizer.zero_grad()
        hypothesis = model(X)
        cost = criterion(hypothesis,Y)
        cost.backward()
        optimizer.step()

        avg_cost += cost / total_batch

    print('[Epoch: {:>4}] cost = {:>.9}'.format(epoch + 1,avg_cost) + " " + "ACC= ",epoch_acc())

# I will not proceed with learning,so torch.no_grad()
with torch.no_grad():
    X_test = mnist_test.test_data.view(len(mnist_test),1) == Y_test
    accuracy = correct_prediction.float().mean()
    print('Accuracy:',accuracy.item())

这段代码是使用CNN对MNIST进行数据分离。

如果你运行这个 在 15 个 epoch 期间,显示了成本和学习性能 (acc)。

但是,我想输出如图所示的验证性能

enter image description here

图片也是使用此代码的代码。

目前,在这段代码中,训练数据设置为 60000,测试数据设置为 10000。这里如何输出验证性能?

我可以在代码本身中找到验证性能(VallACC)吗?

或者我应该使用 sklearn 创建一个新的验证集并使用与交叉验证相同的方法吗?


2021-04-26 此代码已通过添加您上传的代码进行了修改。

import torchvision.transforms as transforms
import torch.nn.init
import torch.nn.functional as F
import numpy as np
from torch.utils.data import (
    DataLoader,random_split,SubsetRandomSampler,WeightedRandomSampler,)

device = "cuda" if torch.cuda.is_available() else "cpu"
print(device)

learning_rate = 0.001
training_epochs = 15
batch_size = 100

mnist_train = dsets.MNIST(
    root="MNIST_data/",# Specify download path
    train=True,# Specify True to download as training data
    transform=transforms.ToTensor(),# Convert to tensor
    download=True,)

mnist_test = dsets.MNIST(
    root="MNIST_data/",# Specify download path
    train=False,download as test data
    transform=transforms.ToTensor(),)

data_loader = torch.utils.data.DataLoader(
    dataset=mnist_train,drop_last=True
)


class CNN(torch.nn.Module):
    def __init__(self):
        super(CNN,1)

        self.layer1 = torch.nn.Sequential(
            torch.nn.Conv2d(1,stride=2),)

        # 2 layer

        self.layer2 = torch.nn.Sequential(
            torch.nn.Conv2d(32,)

        # 7x7x64 inputs -> 10 outputs
        self.fc1 = torch.nn.Linear(7 * 7 * 64,bias=True)

    def forward(self,-1)  # Flatten for total bonding layer
        out = F.relu(self.fc1(out))
        out = self.fc2(out)
        return out


# CNN model definition
model = CNN().to(device)

criterion = torch.nn.CrossEntropyLoss().to(device)  # Softmax function included in cost function.
optimizer = torch.optim.Adam(model.parameters(),lr=learning_rate)


total_batch = len(data_loader)
print("Number of batches : {}".format(total_batch))

valid_size = 0.2
num_train = len(mnist_train)
indices = list(range(num_train))
np.random.shuffle(indices)
split = int(np.floor(valid_size * num_train))
train_idx,valid_idx = indices[split:],indices[:split]

train_sampler = SubsetRandomSampler(train_idx)
valid_sampler = SubsetRandomSampler(valid_idx)

train_loader = torch.utils.data.DataLoader(
    mnist_train,batch_size=64,sampler=train_sampler,num_workers=2
)
valid_loader = torch.utils.data.DataLoader(
    mnist_train,batch_size=30,sampler=valid_sampler,num_workers=2
)

for i,(data,target) in enumerate(train_loader):
    # move tensor to gpu if cuda is available

    data,target = data.to(device),target.to(device)
    # clear the gradiant of all optimizer variable
    optimizer.zero_grad()
    # forward pass: compute pradictions by passing inputs
    output = model(data)
    # calculate batch loss
    loss = criterion(output,target)
    # backward pass: compute gradiant of the loss with respect to the parameters
    loss.backward()
    # update parameters by optimizing single step
    optimizer.step()
    # update training loss
    train_loss += loss.item() * data.size(0)


# validate the model

model.eval()
for batch_idx,target) in enumerate(valid_loader):
    # move tensor to gpu

    data,target.to(device)
    # forward pass: compute the validation predictions
    output = model(data)
    # calculate the loss
    loss = criterion(output,target)
    # update the validation loss
    valid_loss += loss.item() * data.size(0)

# calculate average loss
train_losses = train_loss / len(train_loader.sampler)
valid_losses = valid_loss / len(valid_loader.sampler)
scheduler.step()
# Print the train and validation loss statistic
print(
    "Epoch: {} \t Training Loss: {:.3f} \t Validation Loss: {:.3f}".format(
        epoch,train_losses,valid_losses
    )
)
# save model if validation loss decrease
if valid_losses <= valid_loss_min:
    print(
        "Validation loss decreased {:.4f}--->{:.4f}  Saving model...".format(
            valid_loss_min,valid_losses
        )
    )
    # save current model
    torch.save(model.state_dict(),"model_cifer.pt")
    valid_loss_min = valid_losses
print("Learning rate: {:.5f}".format(optimizer.state_dict()["param_groups"][0]["lr"]))

解决方法

  1. 将训练数据分成两部分进行验证和训练。

获取将用于验证的训练索引

valid_size = 0.2
num_train = len(train_data)
indices = list(range(num_train))
np.random.shuffle(indices)
split = int(np.floor(valid_size * num_train))
train_idx,valid_idx = indices[split:],indices[:split]

定义用于获取训练和验证批次的采样器

train_sampler = SubsetRandomSampler(train_idx)
valid_sampler = SubsetRandomSampler(valid_idx)

结合数据集和采样器来准备数据加载器。

train_loader = torch.utils.data.DataLoader(train_data,batch_size=64,sampler=train_sampler,num_workers=2)
valid_loader = torch.utils.data.DataLoader(train_data,batch_size=30,sampler=valid_sampler,num_workers=2)

2.使用验证数据对模型进行验证。每个epoch后会打印训练损失和验证损失,只保存验证损失最小的参数。

    for i,(data,target) in enumerate(train_loader):       
        # move tensor to gpu if cuda is available
        
        data,target = data.to(device),target.to(device)
        # clear the gradiant of all optimizer variable
        optimizer.zero_grad()
        # forward pass: compute pradictions by passing inputs
        output = model(data)
        # calculate batch loss
        loss = criterion(output,target)
        # backward pass: compute gradiant of the loss with respect to the parameters
        loss.backward()
        # update parameters by optimizing single step
        optimizer.step()
        # update training loss
        train_loss += loss.item()*data.size(0)

    
    # validate the model

    model.eval()
    for batch_idx,target) in enumerate(valid_loader):
        # move tensor to gpu
        
        data,target.to(device)
        # forward pass: compute the validation predictions
        output = model(data)
        # calculate the loss
        loss = criterion(output,target)
        # update the validation loss 
        valid_loss += loss.item()*data.size(0)

    # calculate average loss
    train_losses = train_loss/len(train_loader.sampler)
    valid_losses = valid_loss/len(valid_loader.sampler)
    scheduler.step()
    # Print the train and validation loss statistic
    print('Epoch: {} \t Training Loss: {:.3f} \t Validation Loss: {:.3f}'.format(epoch,train_losses,valid_losses))
    # save model if validation loss decrease
    if valid_losses <= valid_loss_min:
        print("Validation loss decreased {:.4f}--->{:.4f}  Saving model...".format(valid_loss_min,valid_losses))
        # save current model
        torch.save(model.state_dict(),'model_cifer.pt')
        valid_loss_min = valid_losses
    print('Learning rate: {:.5f}'.format(optimizer.state_dict()['param_groups'][0]['lr']))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-