- Tensorflow中一般使用四维tensor表示一个mini_batch的图片,四个维度分别是批大小,像素行数,像素列数,通道数[batch,height,weight,channels],如tensor中的元素可以是任意内置类型,常用的为float32.
- Tensorflow
状态操作:Variable Assige AssignAdd
神经网络相关操作:SoftMax Sigmoid ReLU Convtion2D MaxPool
存档操作:Save Restore
队列和同步操作:Enqueue Dequeue MutexAcquire MutexRelease
控制流操作:Merge Switch Enter Leave NextIteratio
- tensorflow计算图的状态,就是图中所有参数的组合。Tensorflow以变量Variable来存储参数值,变量可以与tensor一样参与各种运算,区别在于tensor的值在每次计算完立即被丢弃,而变量的值在通过反向传播计算更新后会保留下来,进入到下一轮训练迭代。
- Session是驱动Tensorflow系统执行计算交互的入口。对于python来说,计算图可以在Session创建之前完成,并在tf.Session对象初始化时载入到后端执行引擎,触发计算图执行通过Run接口,也就是tf.Session.run()方法,通过这个接口我们可以将数据代入模型进行执行,并得到执行结果,训练过程由客户端的循环来控制。Session管理了运行时的一系列资源的申请和分配,并且在计算完成后必须要关闭Session以释放资源。
- Tensorflow系统架构:client->master->worker架构的分布式系统。客户端通过tf.Seeeion接口与master进行通信,并向master提交触发执行的请求,master将执行任务分配到一个或多个worker进程上,执行的结果通过master返回客户端,worker是最终负责执行计算的角色,会控制计算机的硬件设备资源。
- Cuda toolkit和cudnn库以启用gpu加速环境,cuda包括了cuda驱动以及使用cuda程序必须使用的编译器和头文件,还有一些辅助函数库。Cudnn是基于cuda toolkit编写的专门面向深度神经网络的gpu加速库.还提供了一些基于神经网络常用的计算,卷积,池化,激活等,tensorflow直接使用这些库函数来实现各种计算的gpu加速。
- Pandas内置了多种解析器,可以直接处理csv pickle json等常用的数据文件格式,甚至可以从MYSQL数据库或者操作系统的剪切板中读入数据,读入的数据为一个DataFrame类型的对象,可以改变该数据类型的维度 长度 类型等
- Scikit_learn库中提供了用于切分数据集的工具函数train_test_split(),随机打乱顺序后按比例拆分数据集
- 逻辑回归的预测问题公式:y‘ = softmax(xW+b),其中x是输入向量,大小为d*1的列向量,d是特征数,W是c*d的权重矩阵,c是分类类别数目,b是偏置向量,为c*1的列向量。Softmax是一种归一化指数函数。将向量中的元素转换为(0,1)的区间,softmax常用于输出层,用于指定唯一的分类输出。
- W和b是模型中的参数,需要通过训练来求得的部分。
- 使用placeholder声明输入数据的占位符,tensorflow有数据feed机制,在后面真正计算是,用数据替换占位符。
- 占位符placeholder需要给定三个参数,分别是输入数据的元素类型dtype,维度形状shape占位符名称标识name,维度形状使用数组指定,shape不指定默认为None,表示任意形状,一般将第一个维度作为mini_batch的维度,从第二个维度开始才是特征维度,占位符名称name用于区分计算图里的各个节点,默认也为None,系统会自动将节点设置为类似placeholder:0这样的名称
- 声明参数变量w,b。tensorflow使用变量Variable来存储和更新这些参数的值。变量声明方式是直接定义tf.Varisble()对象,初始化变量对象有两种方式,一种是从protocol buffer结构VariableDef中反序列化,另一种是通过参数指定初始值。初始值必须是一个tensor对象,或者可以通过convert_to_tensor()方法转换成tensor的python对象,tensorflow提供了多种构造随机tensor的方法,定义变量会保留初始值的维度形状。
- 构造前向传播计算图,前向传播就是网络正向计算,由输入计算出标签的过程,其中tf.matmul()是矩阵乘法算子,tf.nn.softmax()是softmax函数,在计算图的构建过程中,tensorflow会自动推算每一个节点的输入输出形状。
- 声明代价函数,机器学习算法的优化需要靠代价函数来评估优化方向,二分类问题一般使用交叉熵作为代价函数。(真实值与预测值之间的差异)
- 计算交叉熵的时候,模型输出值y_pred应该先加上一个很小的误差值,因为y_pred会非常接近0或1,无法计算log(0),进一步无法计算梯度。解决这个问题的三个办法:1、计算log()时加上一个很小的误差值,如1e-10
2、使用clip()函数限定y_pred的范围
3、当输出非法出现nan时,显式的将cost设置为0
17、加入优化算法,tensorflow内置了很多优化算法,随机梯度下降法(SGD)动量算法(Momentum)Adagrede算法ADAM算法RMSProp算法 在线学习算法FTRL,优化器会自动构建梯度计算和反向传播部分的计算图,一般对于优化算法最关键的是学习率。
18、关闭Session的方法1、Session.close()方法来关闭2、Session重载了__enter__()和__exit__()两个方法,可以使用with语句退出作用域时自动关闭对象。
18、Session启动后就正式进入了训练过程,首先使用tf.global_variables_initializer().run()方法初始化所有变量,接下来就是用一个循环将训练数据反复代入计算图执行迭代,在循环内,Session.run()是触发后端执行的入口。
19、Session.run()有两个关键的参数fetches和feed_dict.其中fetches指定需要被计算的节点,可以用数组同时指定多个节点,节点可以是算子op也可以是tensor。计算所需要的数据是由feed_dict代入,feed_dict需要传入一个字典,字典的key是输入占位符placeholder,value是真实的输入数据。Session.run()执行完计算后,会返回计算节点的结果,若节点为算子,则没有返回值,若节点是tensor则返回当前的值。
20、
代码:import pandas as pd from sklearn.model_selection import train_test_split import tensorflow as tf import numpy as np mini_batch = 32 #从csv文件中读入数据,读入的数据是一个DataFrame类型的对象 data = pd.read_csv('train.csv') #查看读入的数据 print(data.info) #取部分特征字段用于分类,并将所有缺失的字段填充为0 #DataFrame中的apply方法就是将函数应用到由列或行形成的一维数组上 data['Sex'] = data['Sex'].apply(lambda s:1 if s == 'male' else 0) data = data.fillna(0) dataset_X = data[['Sex','Age','Pclass','SibSp','Parch','Fare']] dataset_X = dataset_X.values print('dataset_X',dataset_X) #两种分类分别是幸存和死亡,Survived字段是其中一种分类的标签 #新增Deceased字段表示第二种分类的标签,取值为Survived字段取非 #Survivede为1时,Deceased取非,两者组成二分类的one_hot[0,1][1,0]标签 data['Deceased'] = data['Survived'].apply(lambda s : int(not s)) # print('data',data['Deceased']) dataset_Y = data[['Deceased','Survived']] dataset_Y = dataset_Y.values print('dataset_Y',dataset_Y) #使用sklearn的train_test_split函数将标记数据切分为训练集和测试集 #将全部标记数据随机洗牌后切分,其中验证数据占20%由test_size参数指定 ''' train_test_split是交叉验证中常用的函数,功能是从样本中随机的按比例选取train_data和test_data,形式为: X_train,X_test, y_train, y_test =cross_validation.train_test_split(train_data,train_target,test_size=0.4, random_state=0) cross_validatio为交叉验证 参数解释: train_data:所要划分的样本特征集 train_target:所要划分的样本标签 test_size:样本占比,如果是整数的话就是样本的数量 random_state:是随机数的种子。 随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。 比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。 随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则: 种子不同,产生不同的随机数;种子相同,即使实例不同也产生相同的随机数。 ''' X_train,X_test,y_train,y_test = train_test_split(dataset_X,dataset_Y,test_size=0.2,random_state=42) #声明输入数据占位符,6个特征字段,标记字段由两个字段组成 #shape参数的第一个元素为None,表示可以同时放入任意条记录 X = tf.placeholder(tf.float32,shape=[None,6]) y = tf.placeholder(tf.float32,shape=[None,2]) #声明变量 w = tf.Variable(tf.random_normal([6,2]),name = 'weights') b = tf.Variable(tf.zeros([2]),name= 'bias') #构造前向传播计算图 y_pred = tf.nn.softmax(tf.matmul(X,w)+b) #使用交叉熵作为代价函数 cross_entropy = - tf.reduce_sum(y*tf.log(y_pred+ 1e-10),reduction_indices=1) #批量样本的代价值为所有样本交叉熵的平均值 cost = tf.reduce_mean(cross_entropy) #使用随机梯度下降法优化器来最小化代价,系统自动构建反向传播部分的计算图 train_op = tf.train.GradientDescentOptimizer(0.001).minimize(cost) with tf.Session() as sess: #初始化所有变量,必须最先执行 tf.global_variables_initializer().run() #训练迭代,迭代10轮 for epoch in range(10): total_loss = 0 for i in range(len(X_train)): feed = {X:[X_train[i]],y:[y_train[i]]} #通过session.run接口触发执行 _,loss = sess.run([train_op,cost],feed_dict=feed) # print(loss,loss.type) total_loss += loss print('epoch:%04d,total_loss=%.9f'%(epoch+1,total_loss)) print('train complete') #评估校验数据集上的准确率 print(X_test.shape,y_test.shape) pred = sess.run([y_pred],feed_dict=