【2020暑假学习】第一次作业:深度学习基础

视频学习

发展:

1956年美国达特茅斯会议:“人工智能” 概念诞生

1957年Rosenblatt感知机 第一次兴起

1968年专家系统

1969年Minsky提出感知机缺陷 第一次低谷

1986年Hinton和Rumelhart提出BP算法 第二次兴起

1989年Yann LeCun 反向传播在手写邮政编码上的应用、CNN

1995年Vapnik提出SVM 第二次低谷

Hinton 神经网络改名为深度学习

BP解决单层网络到单隐层 RBM单隐层到多隐层

吴恩达,使用GPU,提速70倍

2009年李菲菲,做了ImageNet数据集

ImageNet图像分类比赛,2012年转折点,Hinton和研究生,使用CNN+Dropout+RELU,错误率只有15.3%。人工智能技术的突破点,引起工业界注意。

Bengio,发明RELU函数。第一个将神经网络用于自然语言处理中。

代码练习

  • 代码最后一行的分号删除时,输出多了一行“(-0.5, 603.5, 405.5, -0.5)”是什么原因,含义是什么?(未解决)
    猜测与图本身大小604*406有关。

    # Plot all channels of a real image
    plt.subplot(121) #1代表行,2代表列,所以一共有2个图,1代表此时绘制第一个图
    plt.imshow(colony[:,:,:])
    plt.title('3-channel image')
    plt.axis('off') #不显示坐标轴
    
    # Plot one channel only
    plt.subplot(122)
    plt.imshow(colony[:,:,0])
    plt.title('1-channel image')
    plt.axis('off');
    
    image-20200722151424289
  • opencv的接口使用BGR,matplotlib.pyplot 使用RGB。Google colab解决cv2.imshow()无法使用问题如下:

    from google.colab.patches import cv2_imshow
    BGR_cat = cat[:, :, ::-1]
    cv2_imshow(BGR_cat)
    
    image-20200722155410927
  • 螺旋数据分类 传统训练函数,进来一个batch的数据,计算一次梯度,更新一次网络;梯度累加,每次获取1个batch的数据,计算1次梯度,梯度不清空,不断累加,累加一定次数后,根据累加的梯度更新网络参数。

    ”一定条件下,batchsize越大训练效果越好,梯度累加则实现了batchsize的变相扩大,如果accumulation_steps为8,则batchsize '变相' 扩大了8倍,是我们这种乞丐实验室解决显存受限的一个不错的trick,使用时需要注意,学习率也要适当放大。“

    # 反向传播前把梯度置 0 
    optimizer.zero_grad()
    # 反向传播优化 
    loss.backward()
    # 更新全部参数
    optimizer.step()
    
  • 回归分析 使用 ReLU 激活函数,收敛较快;使用 Tanh 激活函数,一开始收敛较慢,但随后也快速收敛达到较好的效果。

    Tanh的梯度在饱和区域非常平缓,接近于0,很容易造成vanishing gradient的问题,减缓收敛速度。相反,ReLU的梯度大多数情况下是常数,有助于解决深层网络的收敛问题。https://www.cnblogs.com/alexanderkun/p/6918029.html

  • 为什么使用 ReLU 激活函数是分段线性函数,使用 Tanh 激活函数是连续平稳回归?(未解决)

猫狗大战

import copy

criterion = nn.NLLLoss()
lr = 0.001
optimizer_vgg = torch.optim.Adam(model_vgg_new.classifier[6].parameters(), lr=lr, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)  #2
def train_model(model,dataloader,loader_valid,size,size_val,epochs=1,optimizer=None):
    model.train()
    
    best_acc = 0.0
    best_model_wts = copy.deepcopy(model.state_dict())

    for epoch in range(epochs):
        running_loss = 0.0
        running_corrects = 0
        count = 0
        for inputs,classes in dataloader:
            inputs = inputs.to(device)
            classes = classes.to(device)
            outputs = model(inputs)
            loss = criterion(outputs,classes)           
            optimizer = optimizer
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
            _,preds = torch.max(outputs.data,1)
            # statistics
            running_loss += loss.data.item()
            running_corrects += torch.sum(preds == classes.data)
            count += len(inputs)
        epoch_loss = running_loss / size
        epoch_acc = running_corrects.data.item() / size
        print('Train Loss: {:.4f} Acc: {:.4f}'.format(
                     epoch_loss, epoch_acc))
        
        epoch_val_acc = test_model(model,loader_valid,size=dset_sizes['valid'])
        if epoch_val_acc > best_acc:
          best_acc = epoch_val_acc
          best_model_wts = copy.deepcopy(model.state_dict())

    model.load_state_dict(best_model_wts)
    print('Best val Acc: {:4f}'.format(best_acc))
    return model
def test_model(model,dataloader,size):
    model.eval()
    predictions = np.zeros(size)
    all_classes = np.zeros(size)
    all_proba = np.zeros((size,2))
    i = 0
    running_loss = 0.0
    running_corrects = 0
    for inputs,classes in dataloader:
        inputs = inputs.to(device)
        classes = classes.to(device)
        outputs = model(inputs)
        loss = criterion(outputs,classes)           
        _,preds = torch.max(outputs.data,1)
        # statistics
        running_loss += loss.data.item()
        running_corrects += torch.sum(preds == classes.data)
        predictions[i:i+len(classes)] = preds.to('cpu').numpy()
        all_classes[i:i+len(classes)] = classes.to('cpu').numpy()
        all_proba[i:i+len(classes),:] = outputs.data.to('cpu').numpy()
        i += len(classes)  
    epoch_loss = running_loss / size
    epoch_acc = running_corrects.data.item() / size
    print('Val Loss: {:.4f} Acc: {:.4f}'.format(
                     epoch_loss, epoch_acc))
    return epoch_acc
best_model = train_model(model_vgg_new,loader_train,loader_valid,size=dset_sizes['train'], size_val=dset_sizes['valid'], epochs=10, 
            optimizer=optimizer_vgg)      
image-20200725154244865

将Drive中的文件与Colab关联,挂载到‘/content/drive’下。

from google.colab import drive
drive.mount('/content/drive')
from PIL import Image

def predict(model, img_path):
    model.eval()
    torch.no_grad()
    img = Image.open(img_path)
    img_transform = vgg_format(img).unsqueeze(0)
    img_transform = img_transform.to(device)
    outputs = model(img_transform)
    _, predicted = torch.max(outputs,1)
    return predicted
import csv
import os

f = open('/content/drive/My Drive/prediction.csv','w',encoding='utf-8')
csv_writer = csv.writer(f)

file_dir = '/content/drive/My Drive/test'
for i in range(2000):
    prediction = predict(best_model, file_dir + '/' + str(i) + '.jpg')
    print(prediction.item())
    csv_writer.writerow([str(i),str(prediction.item())])

f.close()

提交结果如下:

尝试了一下,不知道训练集和预测数据集有没有重合。有错误请指正,纠错中学习。

图片预测结果应按照0、1、2、3、4……的图片名称顺序写入csv文件。第一次遍历文件顺序写入csv文件评审得分为0。

for root, dirs, files in os.walk(file_dir):
  for file in files:
    prediction = predict(best_model, file_dir + '/' + file)
    print(prediction.item())
    csv_writer.writerow([file.strip('.jpg'),str(prediction.item())])
posted @ 2020-07-25 19:28  薄暮  阅读(198)  评论(1编辑  收藏  举报