【pytorch】pytorch自定义训练vgg16和测试数据集 微调resnet18全连接层

2023-10-29

自己定义模型

测试:

  correct = 0
    total = 0
    for data in test_loader:
        img,label = data
        outputs = net(Variable(img))
        _,predict = torch.max(outputs.data,1)
        total += label.size(0)
        correct += (predict == label).sum()
        print(str(predict)+','+str(label))
    print(100*correct/total)

输出:
在这里插入图片描述
预测错误还是挺大的,居然全是1
完整代码:


```python
import torch.nn.functional as F

import torch
import torch.nn as nn
from torch.autograd import Variable

from torchvision import transforms
from torch.utils.data.dataset import Dataset
from torch.utils.data.dataloader import DataLoader
from PIL import Image

import torch.optim as optim
import os

# ***************************初始化一些函数********************************
# torch.cuda.set_device(gpu_id)#使用GPU
learning_rate = 0.0001  # 学习率的设置

# *************************************数据集的设置****************************************************************************
root = os.getcwd() + '\\data\\'  # 数据集的地址


# 定义读取文件的格式
def default_loader(path):
    return Image.open(path).convert('RGB')


class MyDataset(Dataset):
    # 创建自己的类: MyDataset,这个类是继承的torch.utils.data.Dataset
    # **********************************  #使用__init__()初始化一些需要传入的参数及数据集的调用**********************
    def __init__(self, txt, transform=None, target_transform=None,test = False,loader=default_loader):
        super(MyDataset, self).__init__()
        # 对继承自父类的属性进行初始化
        imgs = []
        fh = open(txt, 'r')
        # 按照传入的路径和txt文本参数,以只读的方式打开这个文本
        for line in fh:  # 迭代该列表#按行循环txt文本中的内
            line = line.strip('\n')
            line = line.rstrip('\n')
            # 删除 本行string 字符串末尾的指定字符,这个方法的详细介绍自己查询python
            words = line.split()

            # 用split将该行分割成列表  split的默认参数是空格,所以不传递任何参数时分割空格
            imgs.append((words[0], int(words[1])))
            # 把txt里的内容读入imgs列表保存,具体是words几要看txt内容而定
        # 很显然,根据我刚才截图所示txt的内容,words[0]是图片信息,words[1]是lable
        self.test = test
        self.imgs = imgs
        self.transform = transform
        self.target_transform = target_transform

        # *************************** #使用__getitem__()对数据进行预处理并返回想要的信息**********************

    def __getitem__(self, index):  # 这个方法是必须要有的,用于按照索引读取每个元素的具体内容
        fn, label = self.imgs[index]
        if self.test is False:
        # fn是图片path #fn和label分别获得imgs[index]也即是刚才每行中word[0]和word[1]的信息
         img_path = os.path.join("C:\\Users\\pic\\train", fn)
        else:
            img_path = os.path.join("C:\\Users\\pic\\test", fn)
        img = Image.open(img_path).convert('RGB')
        # 按照路径读取图片
        if self.transform is not None:
            img = self.transform(img)
        # 数据标签转换为Tensor
        return img, label

    # return回哪些内容,那么我们在训练时循环读取每个batch时,就能获得哪些内容
    # **********************************  #使用__len__()初始化一些需要传入的参数及数据集的调用**********************

    def __len__(self):
        # 这个函数也必须要写,它返回的是数据集的长度,也就是多少张图片,要和loader的长度作区分
        return len(self.imgs)


class Net(nn.Module):  # 定义网络,继承torch.nn.Module
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)  # 卷积层
        self.pool = nn.MaxPool2d(2, 2)  # 池化层
        self.conv2 = nn.Conv2d(6, 16, 5)  # 卷积层
        self.fc1 = nn.Linear(16 * 5 * 5, 120)  # 全连接层
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 2)  # 2个输出

    def forward(self, x):  # 前向传播

        x = self.pool(F.relu(self.conv1(x)))  # F就是torch.nn.functional
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 16 * 5 * 5)  # .view( )是一个tensor的方法,使得tensor改变size但是元素的总数是不变的。
        # 从卷基层到全连接层的维度转换

        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

IMG_MEAN = [0.485, 0.456, 0.406]
IMG_STD = [0.229, 0.224, 0.225]

net = Net()  # 初始化一个卷积神经网络leNet-
train_data = MyDataset(txt=root + 'num.txt', transform=transforms.Compose([
    transforms.RandomHorizontalFlip(),  # 水平翻转
    transforms.Resize((32, 32)),
    # 将图片缩放到指定大小(h,w)或者保持长宽比并缩放最短的边到int大小
    transforms.CenterCrop(32),
    transforms.ToTensor()])
                       )
test_data = MyDataset(txt=root+'test.txt', transform=transforms.Compose([

    transforms.Resize((32, 32)),
    # 将图片缩放到指定大小(h,w)或者保持长宽比并缩放最短的边到int大小
    transforms.CenterCrop(32),
    transforms.ToTensor()]),test=True)
train_loader = DataLoader(dataset=train_data, batch_size=227, shuffle=True,drop_last=True)
# batch_size:从样本中取多少张,每一次epoch都会输入batch_size张
print('num_of_trainData:', len(train_data))
test_loader = DataLoader(dataset=test_data, batch_size=19, shuffle=False)

def trainandsave():
    # 神经网络结构
    print('h')
    net = Net()
    optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)  # 学习率为0.001
    criterion = nn.CrossEntropyLoss()  # 损失函数也可以自己定义,我们这里用的交叉熵损失函数
    # 训练部分

    for epoch in range(10):  # 训练的数据量为10个epoch,每个epoch为一个循环
        # 每个epoch要训练所有的图片,每训练完成200张便打印一下训练的效果(loss值)

        running_loss = 0.0  # 定义一个变量方便我们对loss进行输出

        for i, data in enumerate(train_loader, 0):  # 这里我们遇到了第一步中出现的trailoader,代码传入数据
            # enumerate是python的内置函数,既获得索引也获得数据
            # get the inputs

            inputs, labels = data  # data是从enumerate返回的data,包含数据和标签信息,分别赋值给inputs和labels

            # wrap them in Variable
            inputs, labels = Variable(inputs), Variable(labels)  # # 转换数据格式用Variable

            optimizer.zero_grad()  # 梯度置零,因为反向传播过程中梯度会累加上一次循环的梯度

            # forward + backward + optimize
            outputs = net(inputs)  # 把数据输进CNN网络net
            loss = criterion(outputs, labels)  # 计算损失值
            loss.backward()  # loss反向传播
            optimizer.step()  # 反向传播后参数更新
            running_loss += loss.item()  # loss累加
            if i % 9 == 1:
                print('[%d, %5d] loss: %.3f' %
                      (epoch + 1, i + 1, running_loss / 10))  # 平均损失值
                running_loss = 0.0  # 这一个结束后,就把running_loss归零,

    print('Finished Training')
    # 保存神经网络
    torch.save(net, 'net.pkl')
    # 保存整个神经网络的结构和模型参数
    torch.save(net.state_dict(), 'net_params.pkl')

尝试运行vgg16:
在这里插入图片描述
找了很久,预测是参数的问题,输入图片是224*224,一开始改的resize但还是报错,于是改
transforms.CenterCrop((224, 224))
然后data[0]要改成item()
然后运行成功了(好慢。。)
在这里插入图片描述

class VGG16(nn.Module):
    def __init__(self, nums=2):
        super(VGG16, self).__init__()
        self.nums = nums
        vgg = []

        # 第一个卷积部分
        # 112, 112, 64
        vgg.append(nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, stride=1, padding=1))
        vgg.append(nn.ReLU())
        vgg.append(nn.Conv2d(in_channels=64, out_channels=64, kernel_size=3, stride=1, padding=1))
        vgg.append(nn.ReLU())
        vgg.append(nn.MaxPool2d(kernel_size=2, stride=2))

        # 第二个卷积部分
        # 56, 56, 128
        vgg.append(nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, stride=1, padding=1))
        vgg.append(nn.ReLU())
        vgg.append(nn.Conv2d(in_channels=128, out_channels=128, kernel_size=3, stride=1, padding=1))
        vgg.append(nn.ReLU())
        vgg.append(nn.MaxPool2d(kernel_size=2, stride=2))

        # 第三个卷积部分
        # 28, 28, 256
        vgg.append(nn.Conv2d(in_channels=128, out_channels=256, kernel_size=3, stride=1, padding=1))
        vgg.append(nn.ReLU())
        vgg.append(nn.Conv2d(in_channels=256, out_channels=256, kernel_size=3, stride=1, padding=1))
        vgg.append(nn.ReLU())
        vgg.append(nn.Conv2d(in_channels=256, out_channels=256, kernel_size=3, stride=1, padding=1))
        vgg.append(nn.ReLU())
        vgg.append(nn.MaxPool2d(kernel_size=2, stride=2))

        # 第四个卷积部分
        # 14, 14, 512
        vgg.append(nn.Conv2d(in_channels=256, out_channels=512, kernel_size=3, stride=1, padding=1))
        vgg.append(nn.ReLU())
        vgg.append(nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1))
        vgg.append(nn.ReLU())
        vgg.append(nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1))
        vgg.append(nn.ReLU())
        vgg.append(nn.MaxPool2d(kernel_size=2, stride=2))

        # 第五个卷积部分
        # 7, 7, 512
        vgg.append(nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1))
        vgg.append(nn.ReLU())
        vgg.append(nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1))
        vgg.append(nn.ReLU())
        vgg.append(nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1))
        vgg.append(nn.ReLU())
        vgg.append(nn.MaxPool2d(kernel_size=2, stride=2))

        # 将每一个模块按照他们的顺序送入到nn.Sequential中,输入要么事orderdict,要么事一系列的模型,遇到上述的list,必须用*号进行转化
        self.main = nn.Sequential(*vgg)

        # 全连接层
        classfication = []
        # in_features四维张量变成二维[batch_size,channels,width,height]变成[batch_size,channels*width*height]
        classfication.append(nn.Linear(in_features=512 * 7 * 7, out_features=4096))  # 输出4096个神经元,参数变成512*7*7*4096+bias(4096)个
        classfication.append(nn.ReLU())
        classfication.append(nn.Dropout(p=0.5))
        classfication.append(nn.Linear(in_features=4096, out_features=4096))
        classfication.append(nn.ReLU())
        classfication.append(nn.Dropout(p=0.5))
        classfication.append(nn.Linear(in_features=4096, out_features=self.nums))

        self.classfication = nn.Sequential(*classfication)

    def forward(self, x):
        feature = self.main(x)  # 输入张量x
        feature = feature.view(x.size(0), -1)  # reshape x变成[batch_size,channels*width*height]
        #feature = feature.view(-1,116224)
        result = self.classfication(feature)
        return result



net = Net()  # 初始化一个卷积神经网络leNet-
train_data = MyDataset(txt=root + 'num.txt', transform=transforms.Compose([
    transforms.RandomHorizontalFlip(),  # 水平翻转
transforms.Resize((224, 224)),

    # 将图片缩放到指定大小(h,w)或者保持长宽比并缩放最短的边到int大小
transforms.CenterCrop((224, 224)),
    transforms.ToTensor()])
                       )
test_data = MyDataset(txt=root+'test.txt', transform=transforms.Compose([

    transforms.Resize((32, 32)),
    # 将图片缩放到指定大小(h,w)或者保持长宽比并缩放最短的边到int大小
    transforms.CenterCrop(32),
    transforms.ToTensor()]),test=True)
train_loader = DataLoader(dataset=train_data, batch_size=16, shuffle=True,drop_last=True)
# batch_size:从样本中取多少张,每一次epoch都会输入batch_size张
print('num_of_trainData:', len(train_data))
test_loader = DataLoader(dataset=test_data, batch_size=19, shuffle=False)

if __name__ == '__main__':
    # trainandsave()

    vgg = VGG16()
    #vgg = VGG16(2)
    optimizer = optim.SGD(vgg.parameters(), lr=0.001, momentum=0.9)  # 学习率为0.001
    criterion = nn.CrossEntropyLoss()  # 损失函数也可以自己定义,我们这里用的交叉熵损失函数
    # 训练部分

    for epoch in range(10):  # 训练的数据量为10个epoch,每个epoch为一个循环
        # 每个epoch要训练所有的图片,每训练完成200张便打印一下训练的效果(loss值)

        running_loss = 0.0  # 定义一个变量方便我们对loss进行输出
        train_loss = 0.
        train_acc = 0.

        for i, data in enumerate(train_loader, 0):  # 这里我们遇到了第一步中出现的trailoader,代码传入数据
            # enumerate是python的内置函数,既获得索引也获得数据
            # get the inputs

            inputs, labels = data  # data是从enumerate返回的data,包含数据和标签信息,分别赋值给inputs和labels

            # wrap them in Variable
            inputs, labels = Variable(inputs), Variable(labels)  # # 转换数据格式用Variable

            optimizer.zero_grad()  # 梯度置零,因为反向传播过程中梯度会累加上一次循环的梯度

            # forward + backward + optimize
            outputs = vgg(inputs)  # 把数据输进CNN网络net
            loss = criterion(outputs, labels)  # 计算损失值
            train_loss += loss.item()
            pred = torch.max(outputs, 1)[1]
            train_correct = (pred == labels).sum()
            train_acc += train_correct.item()

            loss.backward()  # loss反向传播
            optimizer.step()  # 反向传播后参数更新
            running_loss += loss.item()  # loss累加
        print('Train Loss: {:.6f}, Acc: {:.6f}'.format(train_loss / (len(
            train_data)), train_acc / (len(train_data))))

    print('Finished Training')
    # 保存神经网络
    torch.save(net, 'net.pkl')
    # 保存整个神经网络的结构和模型参数
    torch.save(net.state_dict(), 'net_params.pkl')

尝试将损失函数修改:
optimizer = optim.Adam(vgg.parameters(), lr=1e-6) # 学习率为0.001
在这里插入图片描述
结果仍然不理想。怀疑是数据集有过大误差。

载入已有模型进行参数优化

两个主要的迁移学习场景:
Finetuning the convnet: 我们使用预训练网络初始化网络,而不是随机初始化,就像在imagenet 1000数据集上训练的网络一样。其余训练看起来像往常一样。(此微调过程对应引用中所说的初始化)
ConvNet as fixed feature extractor: 在这里,我们将冻结除最终完全连接层之外的所有网络的权重。最后一个全连接层被替换为具有随机权重的新层,并且仅训练该层。(此步对应引
用中的固定特征提取器

用加载预训练模型并重置最终的全连接层的方法进行训练。
每一个epoch都进行训练和测试。我写的是resnet18(先自己网上下载pkl文件,在pycharm里面下载太慢)

目前的全部代码:

from __future__ import print_function, division

import torch
import torch.nn as nn
import torch.optim as optim
from torch.optim import lr_scheduler
import numpy as np
import torchvision
from torchvision import datasets, models, transforms
import matplotlib.pyplot as plt
import time
import os
import copy

import torchvision.models as models

data_transforms = {
'train': transforms.Compose([
 transforms.RandomResizedCrop(224),
 transforms.RandomHorizontalFlip(),
 transforms.ToTensor(),
 transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
 ]),
 'val': transforms.Compose([
 transforms.Resize(256),
 transforms.CenterCrop(224),
 transforms.ToTensor(),
 transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
 ]),
 }

data_dir =os.getcwd() + '\\data\\'
image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x),data_transforms[x]) for x in ['train', 'val']}
dataloaders = {x: torch.utils.data.DataLoader(image_datasets[x], batch_size=4,shuffle=True) for x in ['train', 'val']}
dataset_sizes = {x: len(image_datasets[x]) for x in ['train', 'val']}
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
def imshow(inp, title=None):
 """Imshow for Tensor."""
 inp = inp.numpy().transpose((1, 2, 0))
 mean = np.array([0.485, 0.456, 0.406])
 std = np.array([0.229, 0.224, 0.225])
 inp = std * inp + mean
 inp = np.clip(inp, 0, 1)
 plt.imshow(inp)
 if title is not None:
  plt.title(title)
 plt.pause(0.001) # pause a bit so that plots are updated



def train_model(model, criterion, optimizer, scheduler, num_epochs=25):
 since = time.time()

 best_model_wts = copy.deepcopy(model.state_dict())
 best_acc = 0.0

 for epoch in range(num_epochs):
   print('Epoch {}/{}'.format(epoch, num_epochs - 1))
   print('-' * 10)

 # Each epoch has a training and validation phase
   for phase in ['train', 'val']:
    if phase == 'train':
      scheduler.step()
      model.train() # Set model to training mode
    running_loss = 0.0
    running_corrects = 0
 # Iterate over data.
    for inputs, labels in dataloaders[phase]:
 # zero the parameter gradients
     optimizer.zero_grad()

# track history if only in train
     with torch.set_grad_enabled(phase == 'train'):
      outputs = model(inputs)
      _,preds = torch.max(outputs, 1)
      loss = criterion(outputs, labels)
      if phase == 'train':

 # backward + optimize only if in training phase
       loss.backward()
       optimizer.step()
     running_loss += loss.item() * inputs.size(0)
     running_corrects += torch.sum(preds == labels.data)

    epoch_loss = running_loss / dataset_sizes[phase]
    epoch_acc = running_corrects.double() / dataset_sizes[phase]

    print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc))
# deep copy the model
    if phase == 'val' and epoch_acc > best_acc:
     best_acc = epoch_acc
     best_model_wts = copy.deepcopy(model.state_dict())

   print()
 time_elapsed = time.time() - since
 print('Training complete in {:.0f}m {:.0f}s'.format(time_elapsed // 60, time_elapsed % 60))
 print('Best val Acc: {:4f}'.format(best_acc))

 # load best model weights
 model.load_state_dict(best_model_wts)
 return model

class_names = image_datasets['train'].classes
def visualize_model(model, num_images=6):
 was_training = model.training
 model.eval()
 images_so_far = 0
 fig = plt.figure()
 with torch.no_grad():

     for i, (inputs, labels) in enumerate(dataloaders['val']):

       outputs = model(inputs)
       _, preds = torch.max(outputs, 1)
       for j in range(inputs.size()[0]):

           images_so_far += 1

       ax = plt.subplot(num_images // 2, 2, images_so_far)

       ax.axis('off')

       ax.set_title('predicted: {}'.format(class_names[preds[j]]))

       imshow(inputs.cpu().data[j])


       if images_so_far == num_images:

           model.train(mode=was_training)

       return

     model.train(mode=was_training)

model_ft = models.resnet18(pretrained=False)
pthfile = r'C:\Users\14172\PycharmProjects\pythonProject4\resnet18-5c106cde.pth'
model_ft.load_state_dict(torch.load(pthfile))


#model_ft = models.vgg16(pretrained=True)
num_ftrs = model_ft.fc.in_features
model_ft.fc = nn.Linear(num_ftrs, 2)
criterion = nn.CrossEntropyLoss()
# Observe that all parameters are being optimized
optimizer_ft = optim.SGD(model_ft.parameters(), lr=0.001, momentum=0.9)

# Decay LR by a factor of 0.1 every 7 epochs
exp_lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=7, gamma=0.1)
model_ft = train_model(model_ft, criterion, optimizer_ft, exp_lr_scheduler,num_epochs=25)
# 保存神经网络
torch.save(model_ft, 'modefresnet.pkl')
# 保存整个神经网络的结构和模型参数
torch.save(model_ft.state_dict(), 'modelresnet_params.pkl')
visualize_model(model_ft)

在这里插入图片描述
两者差距还是比较大,后期再进行调整。先记录。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【pytorch】pytorch自定义训练vgg16和测试数据集 微调resnet18全连接层 的相关文章

随机推荐

  • QTableWidget详细使用示例(里面有QMenu实现多级菜单的方法)

    目录 一 创建行表头 二 往表格里插入单元项 带图片和不带图片 三 禁止表格可编辑 四 按行或列或单个选择单元项 五 设置列宽 包括列表头的和行表头的 1 这个普通的行和列都可以设置固定宽高 2 还可以将行和列的大小设为与内容相匹配 3 不
  • 《信号与系统》解读 第1章 信号与系统概述-2:时域信号的分类--确定性信号、离散信号、周期信号、线性信号、基本信号与复合信号

    目录 1 确定性信号与随机信号 2 连续信号与离散信号 3 周期信号与非周期信号 4 线性信号与非线性信号 5 基本信号与复合信号 5 1 单位阶跃信号 基本的数字信号 5 2 单位斜变信号 基本的数字积分 5 3 自然指数信号 信号的自然
  • Python 数据分析实战案例:基于电商销售数据的 RFM 模型构建

    目录 1 背景 2 分析目标 3 数据准备 4 数据清洗 4 1 查看是否含有缺失值 4 2 查看是否有异常值 4 3 数据整理 5 具体目标分析 5 1 分析每年销售额的增长率 5 2 各个地区分店的销售额 5 3 销售淡旺季分析 5 4
  • redis过期策略

    我们使用redis的时候一般会设置过期时间 redis设置过期时间 expire 只针对顶级key有效 即哈希结构不支持过期 value为hash结构的时候 不能对hash中的某一部分进行过期设置 expire key time 以秒为单位
  • PCL 环境下安装配置CGAL 5.5

    目录 一 CGAL简介 二 Using CGAL on Windows with Visual C 1 CGAL下载 2 GMP和MPRF安装 3 boost安装与环境变量设置 三 PCL环境下配置CGAL 四 测试代码 五 结果展示 一
  • 【机器学习】贝叶斯分类器(算法原理实现及sklearn实现)

    系列文章目录 第一章 先验概率和后验概率的通俗解释 贝叶斯分类 第二章 贝叶斯公式证明及Bayesain在机器学习重要地位的理解 第三章 机器学习 贝叶斯分类器 文章目录 系列文章目录 前沿 一 贝叶斯决策论 二 极大似然估计 三 朴素贝叶
  • ddt的使用

    ddt一指data driver test 是一种测试思想 意指数据驱动 这里将的ddt是ddt库 配合unittest使用 假设我们有个登录功能需要设计测试用例 用例如下 1 正确的账号密码登录 2 错误的账号密码登录 3 账号为空登录
  • 模拟电路设计(18)---负阻型正弦波振荡器

    负阻型正弦波振荡器 具有负的微变电阻特性的电子器件称为负阻器件 在一个LC或者谐振腔振荡回路中 若以负阻器件与消耗能量的常规电阻相抵消 使得振荡回路无能量消耗 那么电路也能维持正常的振荡 在实际电路中 负阻器件肯定是有源器件 由这种形式构成
  • Swagger 常用注解

    ApiOperation描述接口的详细内容 ApiModel描述实体类的相关信息 Api用在Controller上面说明Controller的信息 ApiModelProperty用在参数上说明参数的详细信息 ApiImplicitPara
  • 美团滑块模拟登录

    本教程仅限于学术探讨 也没有专门针对某个网站而编写 禁止用于非法用途 商业活动 恶意滥用技术等 否则后果自负 观看则同意此约定 如有侵权 请告知删除 谢谢 aHR0cHM6Ly9wYXNzcG9ydC5tZWl0dWFuLmNvbS9hY2
  • Chapter 17. Network Drivers

    17 Network Drivers Linux Device Drivers 3rd Edition Book Chapter 17 Network Drivers Having discussed char and block driv
  • InnoDB行锁等待

    关键词 InnoDB 行锁 行锁等待 行锁等待超时 问题 数据库错误 Lock wait timeout exceeded try restarting transaction 什么是锁等待 Lock Wait 呢 当事务A对数据表进行DD
  • Javaweb实验:静态网页制作

    Javaweb实验 1 静态网页制作 目录 Javaweb实验 前言 一 实验目的 二 实验原理 三 实验内容 四 实验步骤 五 实验结果 六 实验内容 七 实验步骤 八 实验结果 九 思考 1 frameset和frame标签的作用是什么
  • OpenGL错误总结

    const char getGLErrorInfo int errorId switch errorId case GL INVALID ENUM return GL Invalid Enum n case GL INVALID VALUE
  • python怎么实现检验_常用统计检验的Python实现

    前言 今天给大家整理了一些使用python进行常用统计检验的命令与说明 请注意 本文仅介绍如何使用python进行不同的统计检验 对于文中涉及的假设检验 统计量 p值 非参数检验 iid等统计学相关的专业名词以及检验背后的统计学意义不做讲解
  • Could not find OpenSSL. Install an OpenSSL development package or configure CMake with -DCMAKE_US

    安装cmake时 运行 configure 报错 CMake 3 17 0 rc2 Copyright 2000 2020 Kitware Inc and Contributors Found GNU toolchain C compile
  • transformer学习笔记

    文章目录 1 模型架构 1 1 seq2seq结构 1 2 注意力机制 2 transformer各部分介绍 2 1 encoder 2 1 1 encoder的输入 2 1 2 Multi head attention 2 1 3 lay
  • QML--学习第二篇

    QML的学习 一直找不到一个很好的参考资料 七零八落 找不到一个渐进的资料 希望自己学习的过程 给大家带来一些帮助 QML之组件 依然是main cpp 当然 没有main cpp 直接可以使用qmlviewer exe 直接打开 xml当
  • 什么会影响网站网页的打开速度

    如果打开速度慢 10个人会有9个人选择离开 我归纳了大约9大影响网站打开速度的因素 但网站页面显示的速度取决于众多的因素 包括服务器性能 网络传输质量 网站的带宽 DNS解析 网页内容包括涉及到的JS代码 图片和视频的大小等等各种因素 如有
  • 【pytorch】pytorch自定义训练vgg16和测试数据集 微调resnet18全连接层

    自己定义模型 测试 correct 0 total 0 for data in test loader img label data outputs net Variable img predict torch max outputs da