TensorFlow的流行让深度学习门槛变得越来越低,只要你有Python和机器学习基础,入门和使用神经网络模型变得非常简单。TensorFlow支持Python和C++两种编程语言,再复杂的多层神经网络模型都可以用Python来实现,如果业务使用其他编程也不用担心,使用跨语言的gRPC或者HTTP服务也可以访问使用TensorFlow训练好的智能模型。
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运用,输出字符串和进行简略的运算。
- #Importthelibrary
- importtensorflowastf
- #Definethegraph
- hello_op=tf.constant('Hello,TensorFlow!')
- a=tf.constant(10)
- b=tf.constant(32)
- compute_op=tf.add(a,b)
- #Definethesessiontorungraph
- withtf.Session()assess:
- print(sess.run(hello_op))
- print(sess.run(compute_op))
从这段简略的代码能够了解到TensorFlow的运用十分便利,经过Python规范库的方式导入,不需求发动额定的服务。第一次触摸TensorFlow或许比较疑问,这段逻辑Python也能够完成,为什么要运用tf.constant()和tf.Session()呢?其实TensorFlow经过Graph和Session来界说运转的模型和练习,这在杂乱的模型和分布式练习上有十分大优点,将在文章的后续部分介绍到。
前面的Hello world运用并没有练习模型,接下来介绍一个逻辑回归问题与模型。咱们运用numpy构建一组线性联系的数据,经过TensorFlow完成的随机梯度算法,在练习满足长的时刻后能够主动求解函数中的斜率和截距。
- importtensorflowastf
- importnumpyasnp
- #Preparetraindata
- train_X=np.linspace(-1,1,100)
- train_Y=2*train_X+np.random.randn(*train_X.shape)*0.33+10
- #Definethemodel
- X=tf.placeholder(tf.float32)
- Y=tf.placeholder(tf.float32)
- w=tf.Variable(0.0,name="weight")
- b=tf.Variable(0.0,name="bias")
- loss=tf.square(Y-tf.matmul(X,w)-b)
- train_op=tf.train.GradientDescentOptimizer(0.01).minimize(loss)
- #Createsessiontorun
- withtf.Session()assess:
- sess.run(tf.initialize_all_variables())
- epoch=1
- foriinrange(10):
- for(x,y)inzip(train_X,train_Y):
- _,w_value,b_value=sess.run([train_op,w,b],
- feed_dict={X:x,Y:y})
- print("Epoch:{},w:{},b:{}".format(epoch,w_value,b_value))
- epoch+=1
上面的代码能够在TensorFlow_examples项目中找到,经过练习,咱们看到输出的斜率w约为2,截距b约为10,与咱们构建的数据之间的相关联系十分符合!留意在TensorFlow代码中并没有完成最小二乘法等算法,也没有if-else来操控代码逻辑,完全是由数据驱动并且依据梯度下降算法动态调整Loss值学习出来的。这样咱们即便换了其他数据集,乃至换成图画分类等其他范畴的问题,无需修正代码也能够由机器主动学习,这也是神经网络和TensorFlow强壮的当地。
- Epoch:1,w:-0.909195065498352,b:9.612462043762207
- Epoch:2,w:0.296161413192749,b:10.418954849243164
- Epoch:3,w:1.108984351158142,b:10.283171653747559
- Epoch:4,w:1.5482335090637207,b:10.143315315246582
- Epoch:5,w:1.7749555110931396,b:10.063009262084961
- Epoch:6,w:1.8906776905059814,b:10.020986557006836
- Epoch:7,w:1.9495772123336792,b:9.999467849731445
- Epoch:8,w:1.9795364141464233,b:9.988500595092773
- Epoch:9,w:1.994771122932434,b:9.982922554016113
- Epoch:10,w:2.0025179386138916,b:9.980087280273438
前面的模型只要w和b两个变量,假如数据处于非线性联系就难以得到很好的成果,因而咱们主张运用深层神经网络,这也是TensorFlow规划要点就要处理的深度学习模型。咱们知道Google在2014年凭仗Inception模型赢下了ImageNet全球比赛,里边代码便是依据TensorFlow完成的,下面是较为杂乱的模型界说代码。
- 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文件的内容。
- defgenerate_tfrecords(input_filename,output_filename):
- print("Starttoconvert{}to{}".format(input_filename,output_filename))
- writer=tf.python_io.TFRecordWriter(output_filename)
- forlineinopen(input_filename,"r"):
- data=line.split(",")
- label=float(data[9])
- features=[float(i)foriindata[:9]]
- example=tf.train.Example(features=tf.train.Features(feature={
- "label":
- tf.train.Feature(float_list=tf.train.FloatList(value=[label])),
- "features":
- tf.train.Feature(float_list=tf.train.FloatList(value=features)),
- }))
- writer.write(example.SerializeToString())
- writer.close()
- print("Successfullyconvert{}to{}".format(input_filename,
- output_filename))
2. 承受命令行参数
有了TFRecords,咱们就能够编写代码来练习神经网络模型了,但众所周知,深度学习有过多的Hyperparameter需求调优,咱们就优化算法、模型层数和不同模型都需求不断调整,这时候运用命令行参数是十分便利的。
TensorFlow底层运用了python-gflags项目,然后封装成tf.app.flags接口,运用起来十分简略和直观,在实践项目中一般会提早界说命令行参数,特别在后面将会说到的Cloud Machine Learning服务中,经过参数来简化Hyperparameter的调优。
- #Definehyperparameters
- flags=tf.app.flags
- FLAGS=flags.FLAGS
- flags.DEFINE_boolean("enable_colored_log",False,"Enablecoloredlog")
- flags.DEFINE_string("train_tfrecords_file",
- "./data/a8a/a8a_train.libsvm.tfrecords",
- "TheglobpatternoftrainTFRecordsfiles")
- flags.DEFINE_string("validate_tfrecords_file",
- "./data/a8a/a8a_test.libsvm.tfrecords",
- "TheglobpatternofvalidateTFRecordsfiles")
- flags.DEFINE_integer("feature_size",124,"Numberoffeaturesize")
- flags.DEFINE_integer("label_size",2,"Numberoflabelsize")
- flags.DEFINE_float("learning_rate",0.01,"Thelearningrate")
- flags.DEFINE_integer("epoch_number",10,"Numberofepochstotrain")
- flags.DEFINE_integer("batch_size",1024,"Thebatchsizeoftraining")
- flags.DEFINE_integer("validate_batch_size",1024,
- "Thebatchsizeofvalidation")
- flags.DEFINE_integer("batch_thread_number",1,
- "Numberofthreadstoreaddata")
- flags.DEFINE_integer("min_after_dequeue",100,
- "Theminimalnumberafterdequeue")
- flags.DEFINE_string("checkpoint_path","./sparse_checkpoint/",
- "Thepathofcheckpoint")
- flags.DEFINE_string("output_path","./sparse_tensorboard/",
- "Thepathoftensorboardeventfiles")
- flags.DEFINE_string("model","dnn","Supportdnn,lr,wide_and_deep")
- flags.DEFINE_string("model_network","128328","Theneuralnetworkofmodel")
- flags.DEFINE_boolean("enable_bn",False,"Enablebatchnormalizationornot")
- flags.DEFINE_float("bn_epsilon",0.001,"Theepsilonofbatchnormalization")
- flags.DEFINE_boolean("enable_dropout",False,"Enabledropoutornot")
- flags.DEFINE_float("dropout_keep_prob",0.5,"Thedropoutkeepprob")
- flags.DEFINE_boolean("enable_lr_decay",False,"Enablelearningratedecay")
- flags.DEFINE_float("lr_decay_rate",0.96,"Learningratedecayrate")
- flags.DEFINE_string("optimizer","adagrad","Theoptimizertotrain")
- flags.DEFINE_integer("steps_to_validate",10,
- "Stepstovalidateandprintstate")
- flags.DEFINE_string("mode","train","Supporttrain,export,inference")
- flags.DEFINE_string("saved_model_path","./sparse_saved_model/",
- "Thepathofthesavedmodel")
- flags.DEFINE_string("model_path","./sparse_model/","Thepathofthemodel")
- flags.DEFINE_integer("model_version",1,"Theversionofthemodel")
- flags.DEFINE_string("inference_test_file","./data/a8a_test.libsvm",
- "Thetestfileforinference")
- flags.DEFINE_string("inference_result_file","./inference_result.txt",
- "Theresultfilefrominference")
3. 界说神经网络模型
预备完数据和参数,最重要的仍是要界说好网络模型,界说模型参数能够很简略,创立多个Variable即可,也能够做得比较杂乱,例如运用运用tf.variable_scope()和tf.get_variables()接口。为了确保每个Variable都有共同的姓名,并且能都容易地修正隐层节点数和网络层数,咱们主张参阅项目中的代码,特别在界说Variables时留意要绑定CPU,TensorFlow默许运用GPU或许导致参数更新过慢。
- #Definethemodel
- input_units=FEATURE_SIZE
- hidden1_units=10
- hidden2_units=10
- hidden3_units=10
- hidden4_units=10
- output_units=LABEL_SIZE
- deffull_connect(inputs,weights_shape,biases_shape):
- withtf.device('/gpu:0'):
- weights=tf.get_variable("weights",weights_shape,
- initializer=tf.random_normal_initializer())
- biases=tf.get_variable("biases",biases_shape,
- initializer=tf.random_normal_initializer())
- returntf.matmul(inputs,weights)+biases
- deffull_connect_relu(inputs,weights_shape,biases_shape):
- returntf.nn.relu(full_connect(inputs,weights_shape,biases_sha
知优网 » 一篇文章把握TensorFlow深度学习(深入理解tensorflow)