python导入函数,其他语句发生执行

我们引入number文件中的Net(神经网络),但是发现他执行了number文件的训练代码。
Net文件如下:

import torch
import torchvision
from torch import nn

from torch.utils.data import DataLoader
import torch.nn.functional as F
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
epoch = 10
batch_size_train = 64
batch_size_test = 1000
lr = 0.01
monentum = 0.5
log_interval = 10
random_seed = 1
torch.manual_seed(random_seed)

# 加载训练集
train_loader = torch.utils.data.DataLoader(
    torchvision.datasets.MNIST('./data/see', train=True, download=True,
                               transform=torchvision.transforms.Compose([
                                   torchvision.transforms.ToTensor(),
                                   torchvision.transforms.Normalize(
                                       (0.1307,), (0.3081,))
                               ])),
    batch_size=batch_size_train, shuffle=True)

# 加载测试集
test_loader = torch.utils.data.DataLoader(
    torchvision.datasets.MNIST('./data/', train=False, download=True,
                               transform=torchvision.transforms.Compose([
                                   torchvision.transforms.ToTensor(),
                                   torchvision.transforms.Normalize(
                                       (0.1307,), (0.3081,))
                               ])),
    batch_size=batch_size_test, shuffle=True)


class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 30, kernel_size=5, padding=2)
        self.conv2 = nn.Conv2d(30, 60, kernel_size=5, padding=2)
        self.conv2_drop = nn.Dropout2d()
        self.fc1 = nn.Linear(2940, 50)
        self.fc2 = nn.Linear(50, 10)

    def forward(self, x):
        x = F.relu(F.max_pool2d(self.conv1(x), 2))
        x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))

        x = x.view(-1, 2940)
        x = F.relu(self.fc1(x))
        x = F.dropout(x, training=self.training)
        x = self.fc2(x)
        return F.log_softmax(x)


print(__name__)

    network = Net()
    network = network.to(device)
    optimizer = torch.optim.SGD(network.parameters(), lr=lr, momentum=monentum)
    train_losses = []
    train_counter = []
    test_losses = []
    test_counter = [i * len(train_loader.dataset) for i in range(epoch + 1)]
    loss_fn = nn.CrossEntropyLoss()
    loss_fn = loss_fn.to(device)


    def train(epoch):
        network.train()
        for batch_idx, (data, target) in enumerate(train_loader):
            data = data.to(device)
            target = target.to(device)
            optimizer.zero_grad()
            output = network(data)
            loss = loss_fn(output, target)
            loss.backward()
            optimizer.step()

            # 每10次batch, 记录一个模型.
            if batch_idx % log_interval == 0:
                print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
                    epoch, batch_idx * len(data), len(train_loader.dataset),
                           100. * batch_idx / len(train_loader), loss.item()))
                train_losses.append(loss.item())
                train_counter.append(
                    (batch_idx * 64) + ((epoch - 1) * len(train_loader.dataset))
                )
                torch.save(network.state_dict(), './model.pth')
                torch.save(optimizer.state_dict(), './optimizer.pth')


    def test():
        network.eval()
        test_loss = 0
        correct = 0
        with torch.no_grad():
            for batch_index, (data, target) in enumerate(test_loader):
                data = data.to(device)
                target = target.to(device)
                output = network(data)
                test_loss += loss_fn(output, target).item()
                pred = output.data.max(1, keepdim=True)[1]
                correct += pred.eq(target.data.view_as(pred)).sum()
        test_loss /= len(test_loader.dataset)
        test_losses.append(test_loss)
        print('\nTest set: Avg. loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
            test_loss, correct, len(test_loader.dataset),
            100. * correct / len(test_loader.dataset))
        )


    for epoch in range(1, epoch + 1):
        train(epoch)
        test()

会发现我们导入Net类,却执行了这里面的语句。
这是因为python是脚本语言,import number会扫描number的所有语句,当遇到语句时会发生执行。所以我们如果把语句写入
if name == main 那么执行语句,就不会执行。
当我们执行入口是当前文件时__name__ = main,其他情况下为文件名。
所以我们执行test,只有在test中__name__ = main,当进入number扫描时,name = number, 不等于__main__ 所以不会执行语句。
那么修改后如下

import torch
import torchvision
from torch import nn

from torch.utils.data import DataLoader
import torch.nn.functional as F
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
epoch = 10
batch_size_train = 64
batch_size_test = 1000
lr = 0.01
monentum = 0.5
log_interval = 10
random_seed = 1
torch.manual_seed(random_seed)

# 加载训练集
train_loader = torch.utils.data.DataLoader(
    torchvision.datasets.MNIST('./data/see', train=True, download=True,
                               transform=torchvision.transforms.Compose([
                                   torchvision.transforms.ToTensor(),
                                   torchvision.transforms.Normalize(
                                       (0.1307,), (0.3081,))
                               ])),
    batch_size=batch_size_train, shuffle=True)

# 加载测试集
test_loader = torch.utils.data.DataLoader(
    torchvision.datasets.MNIST('./data/', train=False, download=True,
                               transform=torchvision.transforms.Compose([
                                   torchvision.transforms.ToTensor(),
                                   torchvision.transforms.Normalize(
                                       (0.1307,), (0.3081,))
                               ])),
    batch_size=batch_size_test, shuffle=True)


class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 30, kernel_size=5, padding=2)
        self.conv2 = nn.Conv2d(30, 60, kernel_size=5, padding=2)
        self.conv2_drop = nn.Dropout2d()
        self.fc1 = nn.Linear(2940, 50)
        self.fc2 = nn.Linear(50, 10)

    def forward(self, x):
        x = F.relu(F.max_pool2d(self.conv1(x), 2))
        x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))

        x = x.view(-1, 2940)
        x = F.relu(self.fc1(x))
        x = F.dropout(x, training=self.training)
        x = self.fc2(x)
        return F.log_softmax(x)


print(__name__)
if __name__ == "__main__":
    network = Net()
    network = network.to(device)
    optimizer = torch.optim.SGD(network.parameters(), lr=lr, momentum=monentum)
    train_losses = []
    train_counter = []
    test_losses = []
    test_counter = [i * len(train_loader.dataset) for i in range(epoch + 1)]
    loss_fn = nn.CrossEntropyLoss()
    loss_fn = loss_fn.to(device)


    def train(epoch):
        network.train()
        for batch_idx, (data, target) in enumerate(train_loader):
            data = data.to(device)
            target = target.to(device)
            optimizer.zero_grad()
            output = network(data)
            loss = loss_fn(output, target)
            loss.backward()
            optimizer.step()

            # 每10次batch, 记录一个模型.
            if batch_idx % log_interval == 0:
                print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
                    epoch, batch_idx * len(data), len(train_loader.dataset),
                           100. * batch_idx / len(train_loader), loss.item()))
                train_losses.append(loss.item())
                train_counter.append(
                    (batch_idx * 64) + ((epoch - 1) * len(train_loader.dataset))
                )
                torch.save(network.state_dict(), './model.pth')
                torch.save(optimizer.state_dict(), './optimizer.pth')


    def test():
        network.eval()
        test_loss = 0
        correct = 0
        with torch.no_grad():
            for batch_index, (data, target) in enumerate(test_loader):
                data = data.to(device)
                target = target.to(device)
                output = network(data)
                test_loss += loss_fn(output, target).item()
                pred = output.data.max(1, keepdim=True)[1]
                correct += pred.eq(target.data.view_as(pred)).sum()
        test_loss /= len(test_loader.dataset)
        test_losses.append(test_loss)
        print('\nTest set: Avg. loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
            test_loss, correct, len(test_loader.dataset),
            100. * correct / len(test_loader.dataset))
        )


    for epoch in range(1, epoch + 1):
        train(epoch)
        test()

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值