随着学习的深入,我愈发深刻的认识到一个极为尴尬的问题——随着训练集数据的增大,和迭代次数的增加,本地虚拟机已经难以重负(我的本地虚拟机2核4G)。
当运行一个简单卷积网络测试的时候(784x784=614656连接),程序崩了。。。 程序崩。。。 程序。。。 程。。。 。。。
蜜汁尴尬了我内存哥,因为金山云KDL(Kingsoft Deep-Learning platform)同时支持CPU和GPU的配置,所以我尝试将程序直接打包到KDL上运行,发现在kdl上资源有几种套餐
CPU 基础性能 CPU: 1核 内存: 2G
CPU 一般性能 CPU: 4核 内存: 8G
CPU 高级性能 CPU: 16核 内存: 30G
GPU 基础性能 CPU: 4核 内存: 30G GPU: 1卡 显存: 12G
GPU 一般性能 CPU: 8核 内存: 60G GPU: 2卡 显存: 24G
GPU 高级性能 CPU: 16核 内存: 120G GPU: 4卡 显存: 48G
本着艰苦朴素的原则,我从低到高的配置使用资源,发现cpu的基础性能和一般性能配置时,资源被瞬间占满,最终也没有办法运行下去
直到我使用了高级cpu配置,程序才得以跑通,并得到结果:
需要554秒。可能因为调试场景,我感觉这个时间太久了,不符合对于调试的时间周期需求,于是我把任务提交到GPU基础配置,依靠单卡titan 我得到一个十分惊喜的结果:
恩...我很满意。果然是工欲善其事必先利其器啊。
结论:深度学习尤其是图像识别类型的程序是相当消耗资源的,对资源的需求是个人在日常的使用中无法获得的,因此需要去云服务商处获取,目前金山云提供高性价比的基于NVDIA PASCAL架构P40的GPU物理服务器和虚拟机,同时也提供基于P40 GPU的PaaS深度学习平台,提供多样的服务,满足不同等级的计算需求。
下面po下我的代码,希望大家多提意见。
from tensorflow.examples.tutorials.mnist import inputdata
import tensorflow as tf
mnist = inputdata.readdatasets("MNISTdata/",onehot=True)
sess = tf.InteractiveSession()
def weightvariable(shape):
initial = tf.truncatednormal(shape, stddev=0.1 ) return tf.Variable(initial) def biasvariable(shape):
initial = tf.constant(0.1, shape=shape) return tf.Variable(initial) def conv2d(x,W):
return tf.nn.conv2d(x, W, strides=[1,1,1,1],padding='SAME') def maxpool2x2(x):
return tf.nn.maxpool(x, ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME') x = tf.placeholder(tf.float32,[None, 784])
y_ =tf.placeholder(tf.float32,[None,10])
ximage = tf.reshape(x, [-1,28,28,1])
Wconv1 = weightvariable([5,5,1,32])
bconv1 = biasvariable([32])
hconv1 = tf.nn.relu(conv2d(ximage,Wconv1) + bconv1)
hpool1 = maxpool2x2(hconv1)
Wconv2 = weightvariable([5,5,32,64])
bconv2 = biasvariable([64])
hconv2 = tf.nn.relu(conv2d(hpool1,Wconv2) + bconv2)
hpool2 = maxpool2x2(hconv2)
Wfc1 = weightvariable([7 7 64, 1024])
bfc1 = biasvariable([1024])
h_pool2_flat = tf.reshape(hpool2,[-1,7764])
hfc1 = tf.nn.relu(tf.matmul(hpool2flat, Wfc1) + bfc1)
keepprob = tf.placeholder(tf.float32)
h_fc1drop = tf.nn.dropout(hfc1, keepprob)
Wfc2 = weightvariable([1024,10])
bfc2 = biasvariable([10])
yconv = tf.nn.softmax(tf.matmul(hfc1drop,Wfc2) + bfc2)
crossentropy = tf.reducemean(-tf.reducesum(y * tf.log(yconv),reductionindices=[1]))
trainstep = tf.train.AdamOptimizer(1e-4).minimize(crossentropy)
correctprediction = tf.equal(tf.argmax(yconv,1),tf.argmax(y,1))
accuracy = tf.reducemean(tf.cast(correctprediction, tf.float32))
tf.globalvariablesinitializer().run()
for i in range(2000):
batch = mnist.train.nextbatch(50) if i%100 == 0: trainaccuracy = accuracy.eval(feeddict={x:batch[0], y:batch[1],keepprob: 1.0})
print ("step %d ,training accuracy %g" %(i,trainaccuracy)) trainstep.run(feeddict={x: batch[0],y: batch[1], keepprob: 0.5}) print("test accuracy %g"%accuracy.eval(feeddict={x: mnist.test.images, y:mnist.test.labels,keepprob: 1.0}))