TensorFlow的流行让深度学习门槛变得越来越低,只要你有Python和机器学习基础,入门和使用神经网络模型变得非常简单。TensorFlow支持Python和C++两种编程语言,再复杂的多层神经网络模型都可以用Python来实现,如果业务使用其他编程也不用担心,使用跨语言的gRPC或者HTTP服务也可以访问使用TensorFlow训练好的智能模型。

一篇文章把握TensorFlow深度学习 一篇文章把握TensorFlow深度学习(深入理解tensorflow)  深度学习 TensorFlow 第1张

ensorFlow深度学习结构

Google不仅是大数据和云核算的领导者,在机器学习和深度学习上也有很好的实践和堆集,在2015年年末开源了内部运用的深度学习结构TensorFlow。

与Caffe、Theano、Torch、MXNet等结构比较,TensorFlow在Github上Fork数和Star数都是最多的,并且在图形分类、音频处理、引荐体系和自然打量处理等场景下都有丰厚的运用。最近盛行的Keras结构底层默许运用TensorFlow,闻名的斯坦福CS231n课程运用TensorFlow作为授课和作业的编程打量,国内外多本TensorFlow书本现已在预备或许出售中,AlphaGo开发团队Deepmind也方案将神经网络运用迁移到TensorFlow中,这无不印证了TensorFlow在业界的盛行程度。

TensorFlow不仅在Github开放了源代码,在《TensorFlow: Large-Scale Machine Learning on Heterogeneous Distributed Systems》论文中也介绍了体系结构的规划与完成,其间测试过200节点规划的练习集群也是其他分布式深度学习结构所不能比美的。Google还在《Wide & Deep Learning for Recommender Systems》和《The YouTube Video Recommendation System》论文中介绍了Google Play运用商铺和YouTube视频引荐的算法模型,还供给了依据TensorFlow的代码实例,运用TensorFlow任何人都能够在ImageNet或Kaggle比赛中得到挨近State of the art的好成绩。

TensorFlow从入门到运用

毫不夸张得说,TensorFlow的盛行让深度学习门槛变得越来越低,只需你有Python和机器学习根底,入门和运用神经网络模型变得十分简略。TensorFlow支撑Python和C++两种编程打量,再杂乱的多层神经网络模型都能够用Python来完成,假如事务运用其他编程也不必忧虑,运用跨打量的gRPC或许HTTP服务也能够拜访运用TensorFlow练习好的智能模型。

那运用Python怎么编写TensorFlow运用呢?从入门到运用终究有多难呢?

下面咱们编写了一个Hello world运用,输出字符串和进行简略的运算。

  1. #Importthelibrary
  2. importtensorflowastf
  3. #Definethegraph
  4. hello_op=tf.constant('Hello,TensorFlow!')
  5. a=tf.constant(10)
  6. b=tf.constant(32)
  7. compute_op=tf.add(a,b)
  8. #Definethesessiontorungraph
  9. withtf.Session()assess:
  10. print(sess.run(hello_op))
  11. print(sess.run(compute_op))

从这段简略的代码能够了解到TensorFlow的运用十分便利,经过Python规范库的方式导入,不需求发动额定的服务。第一次触摸TensorFlow或许比较疑问,这段逻辑Python也能够完成,为什么要运用tf.constant()和tf.Session()呢?其实TensorFlow经过Graph和Session来界说运转的模型和练习,这在杂乱的模型和分布式练习上有十分大优点,将在文章的后续部分介绍到。

前面的Hello world运用并没有练习模型,接下来介绍一个逻辑回归问题与模型。咱们运用numpy构建一组线性联系的数据,经过TensorFlow完成的随机梯度算法,在练习满足长的时刻后能够主动求解函数中的斜率和截距。

  1. importtensorflowastf
  2. importnumpyasnp
  3. #Preparetraindata
  4. train_X=np.linspace(-1,1,100)
  5. train_Y=2*train_X+np.random.randn(*train_X.shape)*0.33+10
  6. #Definethemodel
  7. X=tf.placeholder(tf.float32)
  8. Y=tf.placeholder(tf.float32)
  9. w=tf.Variable(0.0,name="weight")
  10. b=tf.Variable(0.0,name="bias")
  11. loss=tf.square(Y-tf.matmul(X,w)-b)
  12. train_op=tf.train.GradientDescentOptimizer(0.01).minimize(loss)
  13. #Createsessiontorun
  14. withtf.Session()assess:
  15. sess.run(tf.initialize_all_variables())
  16. epoch=1
  17. foriinrange(10):
  18. for(x,y)inzip(train_X,train_Y):
  19. _,w_value,b_value=sess.run([train_op,w,b],
  20. feed_dict={X:x,Y:y})
  21. print("Epoch:{},w:{},b:{}".format(epoch,w_value,b_value))
  22. epoch+=1

上面的代码能够在TensorFlow_examples项目中找到,经过练习,咱们看到输出的斜率w约为2,截距b约为10,与咱们构建的数据之间的相关联系十分符合!留意在TensorFlow代码中并没有完成最小二乘法等算法,也没有if-else来操控代码逻辑,完全是由数据驱动并且依据梯度下降算法动态调整Loss值学习出来的。这样咱们即便换了其他数据集,乃至换成图画分类等其他范畴的问题,无需修正代码也能够由机器主动学习,这也是神经网络和TensorFlow强壮的当地。

  1. Epoch:1,w:-0.909195065498352,b:9.612462043762207
  2. Epoch:2,w:0.296161413192749,b:10.418954849243164
  3. Epoch:3,w:1.108984351158142,b:10.283171653747559
  4. Epoch:4,w:1.5482335090637207,b:10.143315315246582
  5. Epoch:5,w:1.7749555110931396,b:10.063009262084961
  6. Epoch:6,w:1.8906776905059814,b:10.020986557006836
  7. Epoch:7,w:1.9495772123336792,b:9.999467849731445
  8. Epoch:8,w:1.9795364141464233,b:9.988500595092773
  9. Epoch:9,w:1.994771122932434,b:9.982922554016113
  10. Epoch:10,w:2.0025179386138916,b:9.980087280273438

前面的模型只要w和b两个变量,假如数据处于非线性联系就难以得到很好的成果,因而咱们主张运用深层神经网络,这也是TensorFlow规划要点就要处理的深度学习模型。咱们知道Google在2014年凭仗Inception模型赢下了ImageNet全球比赛,里边代码便是依据TensorFlow完成的,下面是较为杂乱的模型界说代码。

  1. withtf.op_scope([inputs],scope,'inception_v3'):withscopes.arg_scope([ops.conv2d,ops.fc,ops.batch_norm,ops.dropout],is_training=is_training):withscopes.arg_scope([ops.conv2d,ops.max_pool,ops.avg_pool],stride=1,padding='VALID'):#299x299x3end_points['conv0']=ops.conv2d(inputs,32,[3,3],stride=2,scope='conv0')#149x149x32end_points['conv1']=ops.conv2d(end_points['conv0'],32,[3,3],scope='conv1')#147x147x32end_points['conv2']=ops.conv2d(end_points['conv1'],64,[3,3],padding='SAME',scope='conv2')#147x147x64end_points['pool1']=ops.max_pool(end_points['conv2'],[3,3],stride=2,scope='pool1')#73x73x64end_points['conv3']=ops.conv2d(end_points['pool1'],80,[1,1],scope='conv3')#73x73x80end_points['conv4']=ops.conv2d(end_points['conv3'],192,[3,3],scope='conv4')#71x71x192end_points['pool2']=ops.max_pool(end_points['conv4'],[3,3],stride=2,scope='pool2')#35x35x192net=end_points['pool2']

运用TensorFlow现已封装好的全衔接网络、卷积神经网络、RNN和LSTM,咱们现已能够组合出各种网络模型,完成Inception这样的多层神经网络如凑集Lego相同简略。但在挑选优化算法、生成TFRecords、导出模型文件和支撑分布式练习上,管中窥豹有比较多的细节,接下来咱们将在一篇文章的篇幅内介绍避实就虚TensorFlow相关的中心运用技巧。

TensorFlow中心运用技巧

为了介绍TensorFlow的各种用法,咱们将运用deep_recommend_system(https://github.com/tobegit3hub/deep_recommend_system)

这个开源项目,它完成了TFRecords、QueueRunner、Checkpoint、TensorBoard、Inference、GPU支撑、分布式练习和多层神经网络模型等特性,并且能够容易拓宽完成Wide and deep等模型,在实践的项目开发中能够直接下载运用。

1. 预备练习数据

一般TensorFlow运用代码包括Graph的界说和Session的运转,代码量不大能够封装到一个文件中,如cancer_classifier.py文件。练习前需求预备样本数据和测试数据,一般数据文件是空格或许逗号分隔的CSV文件,但TensorFlow主张运用二进制的TFRecords格局,这样能够支撑QueuRunner和Coordinator进行多线程数据读取,并且能够经过batch size和epoch参数来操控练习时单次batch的巨细和对样本文件迭代练习多少轮。假如直接读取CSV文件,需求在代码中记载下一次读取数据的指针,并且在样本无法悉数加载到内存时运用十分不便利。

在data目录,项目现已供给了CSV与TFRecords格局转化东西generate_csv_tfrecords.py,参阅这个脚本你就能够parse恣意格局的CSV文件,转成TensorFlow支撑的TFRecords格局。无论是大数据仍是小数据,经过简略的脚本东西就能够直接对接TensorFlow,项目中还供给print_csv_tfrecords.py脚原本调用API直接读取TFRecords文件的内容。

  1. defgenerate_tfrecords(input_filename,output_filename):
  2. print("Starttoconvert{}to{}".format(input_filename,output_filename))
  3. writer=tf.python_io.TFRecordWriter(output_filename)
  4. forlineinopen(input_filename,"r"):
  5. data=line.split(",")
  6. label=float(data[9])
  7. features=[float(i)foriindata[:9]]
  8. example=tf.train.Example(features=tf.train.Features(feature={
  9. "label":
  10. tf.train.Feature(float_list=tf.train.FloatList(value=[label])),
  11. "features":
  12. tf.train.Feature(float_list=tf.train.FloatList(value=features)),
  13. }))
  14. writer.write(example.SerializeToString())
  15. writer.close()
  16. print("Successfullyconvert{}to{}".format(input_filename,
  17. output_filename))

2. 承受命令行参数

有了TFRecords,咱们就能够编写代码来练习神经网络模型了,但众所周知,深度学习有过多的Hyperparameter需求调优,咱们就优化算法、模型层数和不同模型都需求不断调整,这时候运用命令行参数是十分便利的。

TensorFlow底层运用了python-gflags项目,然后封装成tf.app.flags接口,运用起来十分简略和直观,在实践项目中一般会提早界说命令行参数,特别在后面将会说到的Cloud Machine Learning服务中,经过参数来简化Hyperparameter的调优。

  1. #Definehyperparameters
  2. flags=tf.app.flags
  3. FLAGS=flags.FLAGS
  4. flags.DEFINE_boolean("enable_colored_log",False,"Enablecoloredlog")
  5. flags.DEFINE_string("train_tfrecords_file",
  6. "./data/a8a/a8a_train.libsvm.tfrecords",
  7. "TheglobpatternoftrainTFRecordsfiles")
  8. flags.DEFINE_string("validate_tfrecords_file",
  9. "./data/a8a/a8a_test.libsvm.tfrecords",
  10. "TheglobpatternofvalidateTFRecordsfiles")
  11. flags.DEFINE_integer("feature_size",124,"Numberoffeaturesize")
  12. flags.DEFINE_integer("label_size",2,"Numberoflabelsize")
  13. flags.DEFINE_float("learning_rate",0.01,"Thelearningrate")
  14. flags.DEFINE_integer("epoch_number",10,"Numberofepochstotrain")
  15. flags.DEFINE_integer("batch_size",1024,"Thebatchsizeoftraining")
  16. flags.DEFINE_integer("validate_batch_size",1024,
  17. "Thebatchsizeofvalidation")
  18. flags.DEFINE_integer("batch_thread_number",1,
  19. "Numberofthreadstoreaddata")
  20. flags.DEFINE_integer("min_after_dequeue",100,
  21. "Theminimalnumberafterdequeue")
  22. flags.DEFINE_string("checkpoint_path","./sparse_checkpoint/",
  23. "Thepathofcheckpoint")
  24. flags.DEFINE_string("output_path","./sparse_tensorboard/",
  25. "Thepathoftensorboardeventfiles")
  26. flags.DEFINE_string("model","dnn","Supportdnn,lr,wide_and_deep")
  27. flags.DEFINE_string("model_network","128328","Theneuralnetworkofmodel")
  28. flags.DEFINE_boolean("enable_bn",False,"Enablebatchnormalizationornot")
  29. flags.DEFINE_float("bn_epsilon",0.001,"Theepsilonofbatchnormalization")
  30. flags.DEFINE_boolean("enable_dropout",False,"Enabledropoutornot")
  31. flags.DEFINE_float("dropout_keep_prob",0.5,"Thedropoutkeepprob")
  32. flags.DEFINE_boolean("enable_lr_decay",False,"Enablelearningratedecay")
  33. flags.DEFINE_float("lr_decay_rate",0.96,"Learningratedecayrate")
  34. flags.DEFINE_string("optimizer","adagrad","Theoptimizertotrain")
  35. flags.DEFINE_integer("steps_to_validate",10,
  36. "Stepstovalidateandprintstate")
  37. flags.DEFINE_string("mode","train","Supporttrain,export,inference")
  38. flags.DEFINE_string("saved_model_path","./sparse_saved_model/",
  39. "Thepathofthesavedmodel")
  40. flags.DEFINE_string("model_path","./sparse_model/","Thepathofthemodel")
  41. flags.DEFINE_integer("model_version",1,"Theversionofthemodel")
  42. flags.DEFINE_string("inference_test_file","./data/a8a_test.libsvm",
  43. "Thetestfileforinference")
  44. flags.DEFINE_string("inference_result_file","./inference_result.txt",
  45. "Theresultfilefrominference")

3. 界说神经网络模型

预备完数据和参数,最重要的仍是要界说好网络模型,界说模型参数能够很简略,创立多个Variable即可,也能够做得比较杂乱,例如运用运用tf.variable_scope()和tf.get_variables()接口。为了确保每个Variable都有共同的姓名,并且能都容易地修正隐层节点数和网络层数,咱们主张参阅项目中的代码,特别在界说Variables时留意要绑定CPU,TensorFlow默许运用GPU或许导致参数更新过慢。

  1. #Definethemodel
  2. input_units=FEATURE_SIZE
  3. hidden1_units=10
  4. hidden2_units=10
  5. hidden3_units=10
  6. hidden4_units=10
  7. output_units=LABEL_SIZE
  8. deffull_connect(inputs,weights_shape,biases_shape):
  9. withtf.device('/gpu:0'):
  10. weights=tf.get_variable("weights",weights_shape,
  11. initializer=tf.random_normal_initializer())
  12. biases=tf.get_variable("biases",biases_shape,
  13. initializer=tf.random_normal_initializer())
  14. returntf.matmul(inputs,weights)+biases
  15. deffull_connect_relu(inputs,weights_shape,biases_shape):
  16. returntf.nn.relu(full_connect(inputs,weights_shape,biases_sha
转载请说明出处
知优网 » 一篇文章把握TensorFlow深度学习(深入理解tensorflow)

发表评论

您需要后才能发表评论