如何利用谷歌云计算资源(Google Colab)训练自己的神经网络以及模型的保存、移植应用

深度学习的兴起,给我们带来了新的努力和尝试的方向,同时也带来了对机器计算能力的更高要求。GPU加速是当前提高计算速度的关键,但对大多数人来说,买个好的显卡代价过于昂贵。假如你不是土豪,假如你使用着计算资源极其有限的计算机,假如你想训练一个自己的深度学习神经网络并快速迭代还不想花钱升级自己的机器,那么可以参考下面的文章。

接下来,我将向你展示如何使用一台破集显笔记本利用谷歌提供的云计算资源来构建一个属于自己的深度学习模型,以及如何将训练的结果保存到你自己的计算机。这将使你得以把需要大量计算的模型迭代过程放在云端,而将需要较少计算资源的模型使用放在客户端,也即你自己的电脑。

 

 1、使用Colab Notebooks——Colaboratory

首先新建一个Colaboratory:

 

然后,进入该notebook,进行基本设置:文件名称、需要的软件环境、是否使用GPU加速(这是是主要目的)等。

点击“更改运行时类型”按钮后,在弹出的对话框,设置你需要的软硬件类型,我这里设置为:Python 3、使用GPU加速。

 

 经过上面的步骤,你就可以使用免费的云计算资源了,在里面可以尝试文件的上传、下载,导入各种工具包,编写你自己的代码并运行之等等。

2、代码段的使用

当进到这个notebook里面,它的基本使用与Jupyter Notebook类似,界面、基本操作都差不多,此外它还提供了各种现成的小点心——代码段:点开右边的隐藏窗口,就可以看到目录、代码段、文件三个选项,中间的代码段给我们提供了各种实用小功能的示例,我们可以查看各个小功能并尝试使用它,来解决特定的需求。

下图标出了使用步骤,示例是将文件保存到本地计算机的一个代码段。还有其他各种功能,大家可以按需使用。

 3、一个完整例子

通过上面的步骤,每个人都可以按照自己的想法做些事了。下面贴出我的一个例子,是关于构建一个CNN手写字体识别网络,并在线迭代训练,然后将模型保存在谷歌给我们分配的这个服务器上,最后将保存的模型下载到自己的计算机,这样的一个完整的过程。

首先,是CNN网络的构建、训练、测试、模型的保存相关代码:

# -*- coding: utf-8 -*-
"""
Created on Wed Oct 24 09:48:06 2018

@author: Leon

内容:
以LeNet-5网络为模型,搭建CNN,对mnist手写数字进行训练及测试
给关键tensor添加name,方便保存模型后的调用
"""

import tensorflow.examples.tutorials.mnist.input_data as input_data
import tensorflow as tf
import time
tf.reset_default_graph()#如果保存模型时报错,应清除已有图
mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)

x = tf.placeholder(tf.float32,[None,784],name='x')
y = tf.placeholder(tf.float32,[None,10],name='y')

def weight_variable(shape,name):  
    initial = tf.truncated_normal(shape, stddev = 0.1,name=name) # 截断正态分布  
    return tf.Variable(initial)  
  
def bias_variable(shape,name):  
    initial = tf.constant(0.1, shape=shape, name=name) # 常量0.1  
    return tf.Variable(initial)

# =============================================================================
#  第一层:卷积+激活+池化
# =============================================================================
# 卷积核5*5,通道为1,个数为32个
filter1 = weight_variable([5,5,1,32],name='filter1')
# 卷积层:步长1*1,
# Padding 有两个参数:
# SAME——输出大小为:输入大小/s;
# VALID——输出大小为:(输入大小-f+1)/s
x_img = tf.reshape(x,[-1,28,28,1],name='x_img')
conv1 = tf.nn.conv2d(x_img, filter1, strides=[1,1,1,1], padding='SAME',name='conv1')
# 激活层:加偏移,然后激活
bias1 = bias_variable([32],name='bias1')
relu1 = tf.nn.relu(conv1+bias1,name='relu1')
# 池化层:窗口大小2*2,步长2*2
pool1 = tf.nn.max_pool(relu1,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME',name='pool1')
print("第一层输出尺寸:",pool1.shape)

# =============================================================================
# 第二层:卷积+激活+池化
# =============================================================================
# 卷积核大小5*5,1通道,64个卷积核
filter2 = weight_variable([5,5,32,64],name='filter2')
# 卷积层:步长1*1
conv2 = tf.nn.conv2d(pool1,filter2,strides=[1,1,1,1],padding='SAME',name='conv2')
# 激活层:加偏移,然后激活
bias2 = bias_variable([64],name='bias2')
relu2 = tf.nn.relu(conv2+bias2,name='relu2')
# 池化层:
pool2 = tf.nn.max_pool(relu2,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME',name='pool2')
print("第二层输出尺寸:", pool2.shape)

# =============================================================================
# 第三层:全连接层
# =============================================================================
# 提取上一层输出的尺寸
shape = pool2.shape.as_list()
# 拉伸上层输出,构造本层输入
fc_input = tf.reshape(pool2,[-1,shape[1]*shape[2]*shape[3]])
# 全连接层的权重:大小为本层输入*本层神经元的个数,也即下面的:[shape[1]*shape[2]*shape[3],32]
fc_w = weight_variable([shape[1]*shape[2]*shape[3],1024], name='fc_w')
# 全连接层的偏移量:大小为本层神经元的个数——32
fc_b = bias_variable([1024],name='fc_b')
# 建立本层全连接结构,并激活
fc_out = tf.nn.relu(tf.matmul(fc_input,fc_w)+fc_b,name='fc_out')
print("第三层输出尺寸:", fc_out.shape)

# Dropout,用来防止过拟合  
# 加在输出层之前,训练过程中开启dropout,测试过程中关闭  
keep_prob = tf.placeholder(tf.float32,name='keep_prob')
fc_out_drop = tf.nn.dropout(fc_out, keep_prob,name='fc_out_drop')

# =============================================================================
# 输出层
# =============================================================================
out_w = weight_variable([1024,10],name='out_w')
out_b = bias_variable([10],name='out_b')
pred = tf.nn.softmax(tf.matmul(fc_out_drop,out_w)+out_b,name='pred')

# 定义损失函数
loss = -tf.reduce_sum(y*tf.log(pred),name='loss')
# 定义优化器:Adam优化函数
optimizer = tf.train.AdamOptimizer(learning_rate=0.001,name='optimizer').minimize(loss)

# 定义评价指标——准确率
bool_pred = tf.equal(tf.arg_max(y,1), tf.arg_max(pred,1))
accuracy = tf.reduce_mean(tf.cast(bool_pred,tf.float32),name='accuracy')

# 定义全局变量初始化
init = tf.global_variables_initializer()

# 定义保存模型类
saver = tf.train.Saver()

# 启动图
with tf.Session() as sess:
    # 执行是初始化
    sess.run(init)
    # 训练样本中,总的batch个数
    total_batch_nums = int(mnist.train.num_examples/50)
    for epoch in range(1):
        avg_loss = 0.
        time_start = time.clock()
        for i in range(total_batch_nums):
            
            batch = mnist.train.next_batch(50)
            batch_xs,batch_ys = batch
#            batch_xs = batch_xs.reshape([-1,28,28,1])
            sess.run(optimizer,feed_dict={x:batch_xs,y:batch_ys,keep_prob:0.5})
#            avg_loss += sess.run(loss, feed_dict={x:batch_xs,y:batch_ys})
        time_end = time.clock()
        
        if epoch %1 == 0:
            accuracy_eval = sess.run(accuracy, 
                                     feed_dict={x:batch_xs,y:batch_ys,keep_prob:1.0})
            print("Epoch:","%04d"%(epoch+1),
#                  "loss:","%.4f"%avg_loss,
                  "accuracy:",accuracy_eval,
                  "running time:","%g"%(time_end-time_start))
            
    saver.save(sess,'model/my_model')
    accuracy_test = sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels,keep_prob:1.0})
    print("test accuracy:",accuracy_test)

插个题外话:Colaboratory 分配给我们的临时服务器是基于Linux环境的,我们在这个Notebook里面也可以与系统进行交互,不过需要在Linux命令前加上“!”,例如:

因为我上面的代码,是将模型保存在当前目录的一个子目录“model”下的,所以通过命令:!ls model/即可列出该目录下的所有文件。

好了,接下来我们就可以把这些文件下载下来了,下面是将保存好的模型下载到本地的代码:

# 将保存的模型下载到本地
import os
from google.colab import files

dir_list = os.listdir("model")
for file in dir_list:
  path = 'model/'+file
  files.download(path)

通过上面的代码执行,你就可以在你自己浏览器的下载目录下找到刚才保存的模型了,即下面的四个文件:

最后,我们将下载到本地的 模型在自己计算机上进行应用:

# -*- coding: utf-8 -*-
"""
Created on Wed Oct 31 10:53:16 2018

@author: Leon

内容:
1、从保存的模型中,加载之前训练好的CNN网络
2、利用网络中变量的名字“name”来提取相应变量
3、对相关变量进行feed,构造feed_dict
4、最后,使用模型对新数据进行测试
"""

import tensorflow as tf
import tensorflow.examples.tutorials.mnist.input_data as input_data
mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)


with tf.Session() as sess:
    saver = tf.train.import_meta_graph("model/my_model.meta")
    saver.restore(sess,tf.train.latest_checkpoint("model/"))
    
    graph = tf.get_default_graph()
    x = graph.get_tensor_by_name("x:0")
    y = graph.get_tensor_by_name("y:0")
    keep_prob = graph.get_tensor_by_name("keep_prob:0")
    accuracy = graph.get_tensor_by_name("accuracy:0")
    
    accuracy_eval = sess.run(accuracy, feed_dict={x:mnist.test.images[:1000],y:mnist.test.labels[:1000],keep_prob:1.0})
    print("acc:",accuracy_eval)

OK,大功告成!至此,我们就完成了从使用谷歌云计算资源训练自己的模型,到将模型移植到其他机器进行测试应用的全过程,避免了因自身计算能力不足引起的迭代时耗过长的问题。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AICVHub

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值