使用 pytorch 在 Colab 上使用 GPU

如何解决使用 pytorch 在 Colab 上使用 GPU

我尝试在 Colab 上使用 GPU,但是使用 GPU 时训练模型大约需要 400 秒,而选择 CPU 时训练它需要 200 秒,所以我认为某处有问题..

>

我哪里做错了?

import torch
from torch import Tensor
import dlc_practical_prologue as prologue
import time
import matplotlib.pyplot as plt


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

#%% Exercise1

def sigma(x):
    return torch.tanh(x)

def dsigma(x):
    return 1-torch.pow(torch.tanh(x),2)

#%% Exercise2

def loss(v,t):    
    return torch.sum(torch.pow(t-v,2))

def dloss(v,t):
    #print(v.size(),t.size())
    return -2*(t-v)


#%% Exercise3

def forward_pass(w1,b1,w2,b2,x):
    s1 = w1.mv(x) + b1
    x1 = sigma(s1)
    #print(b1.size())
    s2 = w2.mv(x1) + b2
    x2 = sigma(s2)
    #print(s2.size(),x2.size())
    return x,s1,x1,s2,x2


def backward_pass(w1,t,x,x2,dl_dw1,dl_db1,dl_dw2,dl_db2):
    #print(dl_db2.size(),(dsigma(s2) * dloss(x2,t)).size())
    dl_db2_temp = dsigma(s2) * dloss(x2,t)
    dl_dw2_temp = dl_db2_temp.unsqueeze(0).t() * x1.unsqueeze(0)
    dl_db1_temp = w2.t().mv(dl_db2_temp)
    dl_dw1_temp = dl_db1_temp.unsqueeze(0).t() * x.unsqueeze(0)
    return dl_dw1 + dl_dw1_temp,dl_db1 + dl_db1_temp,dl_dw2 + dl_dw2_temp,dl_db2 + dl_db2_temp


#%% Exercise4

train_data,train_target,test_data,test_target = prologue.load_data(cifar = False,one_hot_labels = True,normalize = True,flatten = True)

train_data = train_data.to(dev)
train_target = train_target.to(dev)
test_data = test_data.to(dev)
test_target = test_target.to(dev)

train_target = train_target * 0.9
test_target = test_target * 0.9
print(train_target.is_cuda)

epsilon = 1e-6
w1 = torch.empty((50,784),device=dev).normal_(0,epsilon)
b1 = torch.empty((50),epsilon)
w2 = torch.empty((10,50),epsilon)
b2 = torch.empty((10),epsilon)
print(w1.is_cuda)

dl_dw1 = torch.zeros((50,device=dev)
dl_db1 = torch.zeros((50),device=dev)  
dl_dw2 = torch.zeros((10,device=dev)  
dl_db2 = torch.zeros((10),device=dev)  

eta = 0.1 / train_target.size(0)
nb_simul = 1000
error_train = torch.zeros(nb_simul,device=dev)
error_test = torch.zeros(nb_simul,device=dev)

t1 = time.time()

for i in range(nb_simul):
    dl_dw1 = torch.zeros((50,device=dev)
    dl_db1 = torch.zeros((50),device=dev)  
    dl_dw2 = torch.zeros((10,device=dev)  
    dl_db2 = torch.zeros((10),device=dev)

    for j in range(train_target.size(0)):
        x,x2 = forward_pass(w1,train_data[j])
        #print(x.is_cuda)
        #print(x2.is_cuda)
        dl_dw1,dl_db2 = backward_pass(w1,train_target[j],dl_db2)
        #print(dl_dw1.is_cuda)

    w1 = w1 - eta * dl_dw1
    w2 = w2 - eta * dl_dw2
    b1 = b1 - eta * dl_db1
    b2 = b2 - eta * dl_db2
    #print(w1.is_cuda)
    


    for j in range(train_target.size(0)):
        x_train,s1_train,x1_train,s2_train,x2_train = forward_pass(w1,train_data[j])
        _,predict = x2_train.max(0)
        _,value = train_target[j].max(0)
        if predict != value:
            error_train[i] += 1
    
    #print('error on training: ',error_train)


    for j in range(test_target.size(0)):
        x_test,s1_test,x1_test,s2_test,x2_test = forward_pass(w1,test_data[j])
        _,predict = x2_test.max(0)
        _,value = test_target[j].max(0)
        if predict != value:
            error_test[i] += 1

    #print('error on test: ',error_test)


t2 = time.time()
print(t2-t1)

#%% Plot

abs_x = torch.arange(1,nb_simul+1,1)
plt.plot(abs_x,error_train)
plt.plot(abs_x,error_test)
print(error_train[-1])
print(error_test[-1])

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com(将#修改为@)

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

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?