前一段时间做了一些项目,把一些笔记放在了txt中,现分享出来,自己也能够时长预习。
1) 读取文件时,将固定的文件地址,采用数组或者字符串的形式,提前表示出来,后期使用时候采用拼接操作 2) # 得到该目录下的文件 file_list = os.listdir(base_path + '/data/cnn_train/') file_list Out[6]: ['finance', 'it', 'sports'] 3) 打开一个文件 f = open(base_path + '/data/cnn_train/' + c + '/' + files, 'r', encoding='gbk', errors='ignore') 4) 使用re.sub(pattern, repl, string),进行特定字符的替换,中间参数是要替换的字符,返回需要的字符串 5) 用list()将分词后的数据变成列表的形式,便于后期处理 6) 对于数据来说,数据集是一个列表,数据的标记也是一个列表,用于后期处理 post_list(data) lebel_list(label) 7) .append()方法,在后面追加数据的时候是保持原来数据的形状的情况下实现的 a = ['d', 'e', 'w', 'o', 'uo'] b = b = ['d', 'e', 'w', 'o', 'uo'] a.append(b) ['d', 'e', 'w', 'o', 'uo', ['d', 'e', 'w', 'o', 'uo']] 8) itertools,python的内置模块 一个重要的方法:chain(),给他一个list,tuple,iterables,将他们链接在一起;返回iterables对象 a = ['deng', 'ye', 'xun'] itertools.chain(a) 9) Counter是实现的dict的一个子类,用来方便计数。from collections import Counter 统计元素出现的个数:Counter(可迭代对象),返回是一个字典,放回字符的个数。例如: a = 'abcasddejioahnfus' Counter(a) Out[27]: Counter({'a': 3, 'b': 1, 'c': 1, 'd': 2, 'e': 1, 'f': 1, 'h': 1, 'i': 1, 'j': 1, 'n': 1, 'o': 1, 's': 2, 'u': 1}) 10)存到字典里面:{x:i for i,x in enumerate(XXX)} 存到数组里面:[x for x in XXX] x = [ '的', '在', '了', '是', '和'] d = {x:i for i,x in enumerate(x)} d:{'了': 2, '和': 4, '在': 1, '是': 3, '的': 0} 11) numpy.random.permutation 随机排列一个序列,返回一个排列的序列; 函数shuffle与permutation都是对原来的数组进行重新洗牌(即随机打乱原来的元素顺序); 区别在于shuffle直接在原来的数组上进行操作,改变原来数组的顺序,无返回值。而permutation不直接在原来的数组上进行操作,而是返回一个新的打乱顺序的数组,并不改变原来的数组 np.random.permutation(np.arange(10)) Out[48]: array([3, 8, 1, 2, 9, 4, 0, 7, 5, 6]) 12) range()返回的是range object,而np.nrange()返回的是numpy.ndarray() range尽可用于迭代,而np.nrange作用远不止于此,它是一个序列,可被当做向量使用。 np.arange(10) Out[47]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 13) yield就是 return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后开始 14)tf.truncated_normal(shape,mean,stdev):shape表示生成张量的维度,mean是均值,stddev是均值。用来生成随机数,随机数与均值的差距不会超过两倍的标准差,而其它的函数则会 15)loss,计算输出值和实际值的损失,这个损失通常采用交叉熵损失。 tf.nn.softmax_cross_entropy_with_logits()函数是求交叉熵损失函数。功能:计算labels和logits之间的交叉熵。 # API 说明 tf.nn.softmax_cross_entropy_with_logits( _sentinel=None, labels=None, logits=None, dim=-1, name=None ) 解释:第一个参数基本不用;第二个参数是一个分类标签,不同的是这个分类标签labels是分类的概率,比如说[0.2,0.3,0.5],所以每一行必须为一个概率分布值 对于第三个函数,logit本身是一个函数,他把每一个概率p从[0,1]映射到正负无穷区间,形式话表示为logit=ln(p/(1-p))。理解为:原生态的,未经缩放的,视为一种未归一化的log概率。所以softmax的作用是将其归一化到0-1之间,累积和为1,经过softmax加工过的数据可以当做概率来使用。也就是说logits作为softmax的输入。 16)机器学习的任务就是最小化损失,在损失已经确定的情况下,剩下的事情就交给优化器了。本质:梯度下降算法的优化 常用的优化器: 1)tf.train.GradientDescentOptimizer(learning_rate, use_looking=False, name='GradientDescent') 功能:实现梯度下降算法的优化器,此处给一个学习速率就可以了 2)tf.train.AdagradOptimizer() 功能:实现Adagrad算法的优化器,此处给一个学习速率就可以了 3) tf.train.AdamOptimizer() 功能:实现Adam算法的优化器,默认有参数 17)np.linespace(开始,结束, 间隔),从matlab中学习得到的,构建一个等差数据 18)python 中的zip操作,可以理解成一个拉链,将两个list拉到一起来,组合后合并成一个list 例子: x = zip(['a','b','c'],[1,2,3]) list(x) Out[65]: [('a', 1), ('b', 2), ('c', 3)] 19)在python中,使用.dot()进行矩阵相乘 20)np.array()的强大功能已经体现出来了,切记一定要将数据转化成numpy array shuffle_index = np.random.permutation(np.arange(len(y))) y:[[0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19]] 如果不用np.array()就会出错,y[shuffle_index] 必须使用:np.array(y)[shuffle_index] 21)# tf.reshape(tensor, shape, name=None)的使用.功能:张量变形。和原始张量具有相同的值,但是形状改变。如果shape的一个分量是特殊值-1,则计算该维度的大小,以使总大小保持不变。特别地情况为,一个[-1]维的shape变平成1维。 # tf.random_normal()必须配合variable使用 # tf.get_variable(name, shape, initializer) 创建变量。name:变量的名称;shape变量的维度;initializer:变量初始化的方式 tf.constant_initializer:常量初始化函数 tf.random_normal_initializer:正态分布 tf.truncated_normal_initializer:截取的正态分布 tf.random_uniform_initializer:均匀分布 tf.zeros_initializer:全部是0 tf.ones_initializer:全是1 tf.uniform_unit_scaling_initializer:满足均匀分布,但不影响输出数量级的随机值 22)tf.Graph()函数非常重要 1.可以通过Tensorboard图形化界面展示出流程结构 2.整合一段代码为一个整体存在于图中 声明情况有三种:1)通过张量本身直接给出Graph;2)通过声明一个默认的,然后定义张量内容,在后面可以调用或保存;3)通过多个声明,在后面通过变量名来分别调用 对graph的操作主要有三种:1)保存;2)从pb文件中读取;3)穿插调用 23)tf.train.write_graph(一个图,保存路径,文件名, False),写一个图到一个文件中 24)加载图,tf.import_graph_def(graph_def, name='') 25)tf.nn.embedding_lookup:Looks up ids in a list of embedding tensors,在词嵌入张量中查找ids tf.nn.embedding_lookup( params, ids, partition_strategy='mod', name=None, validate_indices=True, max_norm=None ) 26)tf.expand_dims(),在特定索引的位置上增加一个维度 tf.expand_dims( input, axis=None, name=None, dim=None ) 27)卷积操作:tf.nn.conv2d(input, filter, strides, padding),给定一个4维输入和滤波器张量,计算2维卷积。输出,和输入具有相同的维度 给定输入张量的形状:[batch, in_height, in_width, in_channels],滤波器张量的形状:[filter_height, filter_width, in_channels, out_channels] 对于strides=[1, stride, stride, 1], strides[0]=strides[3]=1,默认必须 28)tf.nn.bias_add(value, bias),将偏差项bias加到value上。value是一个tensor,bias必须是1维的。value可以有不同的维度,bias要和values的最后1维度相同 29)tf.nn.max_pool(value, ksize, strides, padding, name=None);在输入张量上执行最大池化 value:需要池化的输入数据,一般是接在卷积层后面,通常为feature,shape=[batch, height, width, channels],4维数据同输入数据一致 ksize:池化窗口的大小,取一个4维向量,shape=[1, height, width, 1],不想在batch和channels做池化,这两个维度为1 strides:窗口在每一个维度上滑动的步长,一般也是shape=[1, stride, stride, 1] padding:为'VALID''SAME' 30)tf.nn.relu(features):计算非线性值,即max(features, 0),features是卷积后加上偏置的值 31)tf.concat(values, axis):沿着一个维度拼接张量。axis=0,按照行,横着接,对接到后面。 32)tf.nn.dropout(x, keep_prob):防止过拟合。x:输入tensor;keep_prob:每个元素被保留下来的概率,float类型。根据给定的keep_prob,将tensor x按照比例输出 33)tf.contrib.layers.xavier_initializer():返回一个用于初始化权重的初始化程序Xavier,保持每一层的梯度大小都差不多相同。返回初始化权重矩阵 tf.contrib.layers.xavier_initializer( uniform=True, seed=None, dtype=tf.float32 ) 34)tf.nn.l2_loss(tensor):利用L2范数计算张量的误差值,但是没有开方并且只取了L2范数的一半。output=sum(t**2)/2。在这里为什么要计算w的平方,这是一个正则化项,需要将这个损失添加到train_loss上,W的每一个数值都要计算机平方 35)tf.nn.xw_plus_b(x, weight, biases):计算机matmul(x, weight)+b 36)tf.reduce_mean(x, axis):根据输入张量的维度计算均值。axis=1是求行均值,axis=0是求列均值 tf.reduce_mean( input_tensor, axis=None, keepdims=None, name=None, reduction_indices=None, keep_dims=None ) 37)tf.argmax(input, axis):计算输入tensor的行或者列的最大值的索引。0表示按列,1表示按行。返回:一般是行或列的最大值下标向量 tf.argmax( input, axis=None, name=None, dimension=None, output_type=tf.int64 ) 38)tf.equal(x,y):返回矩阵或者向量对应位置相等的元素真值。相等返回True,不等返回False 39)tf.cast(x, dtype):类型转换函数,将一个张量转换到其它类型。dtype目标类型 40)在整个session运行之前,图中的所有variable必须要被初始化。variable的值在sess.run(inti)之后就确定了,Tensor的值要在sess.run(x)之后确定 41)tf.summary.scalar(name, tensor) 对标量数据汇总和记录,一般在画loss和accuary时用到 42)global_step在优化器train的时候使用很方便,就是统计全局执行的步数,训练到多少轮了,类似于一个钟表。 初始化:global_step = tf.Variable(0, trainalbe=False) train_op = optimizer.minimize(loss, global_step=global_step) 43)定义了词嵌入矩阵,将输入的词id转化成词向量,这里的词嵌入矩阵是可以训练的,最后将词向量结果增加了一个维度,为了匹配CNN的输入.然而研究证明,TextCnn在文本分类问题上有着更加卓越的表现 在工作用到TextCNN做query推荐,并结合先关的文献,谈几点经验: 1、TextCNN是一个n-gram特征提取器,对于训练集中没有的n-gram不能很好的提取。对于有些n-gram,可能过于强烈,反而会干扰模型,造成误分类。 2、TextCNN对词语的顺序不敏感,在query推荐中,我把正样本分词后得到的term做随机排序,正确率并没有降低太多,当然,其中一方面的原因短query本身对term的顺序要求不敏感。隔壁组有用textcnn做博彩网页识别,正确率接近95%,在对网页内容(长文本)做随机排序后,正确率大概是85%。 3、TextCNN擅长长本文分类,在这一方面可以做到很高正确率。 4、TextCNN在模型结构方面有很多参数可调,具体参看文末的文献。 44)tf.train.latest_checkpoint:发现最新保存的checkpoint文件 tf.train.latest_checkpoint( checkpoint_dir, latest_filename=None ) 45)tf.get_collection():使用默认图加载数据列表 tf.get_collection( key, scope=None ) 46)当你使用tensorflow是你会定义一个图,然后给这个图feed数据和定义一些超参,注意当网络被保存时,placeholder()是不会被保存的 在恢复网络的时候,不仅要恢复图好权重,也需要准备一个新的feed_dict,将新的训练数据喂给网络。我们可以使用graph.get_tensor_by_name('weights:0')获得已保存的operations和placeholder variables 47)np.load()和np.save()是numpy专用的二进制类型保存和加载数据,使用他读写数组很方便。 np.save(filename, X);第一个参数为存储的文件名,第二个参数为需要存储的数组(1维或者2维度) np.load(filename):将数据读出维array类型 48)含有yield函数不是一般的函数,他会把函数变成一个generator,调用此函数不会执行该函数,而是返回一个iterator对象。在for循环时,每次循环都会执行函数内部代码,执行到yield x时候,函数就返回一个迭代值,下次迭代时候就会从yield的下一条语句执行 yield 的好处是显而易见的,把一个函数改写为一个 generator 就获得了迭代能力,比起用类的实例保存状态来计算下一个 next() 的值,不仅代码简洁,而且执行流程异常清晰。 49)tf.summary.FileWriter ...create a graph... # Launch the graph in a session. sess = tf.Session() # Create a summary writer, add the 'graph' to the event file. writer = tf.summary.FileWriter(<some-directory>, sess.graph) 50)shutil模块中的rmtree移除整个目录,无论是否为空。shutil.rmtree(目录路径) 51)tf.assign():通过给value值来更新ref tf.assign( ref, value, validate_shape=None, use_locking=None, name=None ) 52)记住,在写tensorflow网络的时候,对于每一个部分都要使用tf.name_sacope('name')明确定义域,这样在tensorboard查看时比较清晰;还有,对于每一个变量,每一个常量都要有name,这一点非常重要 53)tensorboard的可视化是一个好东西,summary是概要,保存变量。 tf.summary.scalar('name', var); tf.summary.histogram('name', var); writer = tf.summary.FileWriter(logdir, sess.graph) merged = tf.summary.merge_all() summary = sess.run(merged) writer.add_summary(summary, i) 54)深度神经网络代码 def nn_layer(input_tensor, input_dim, output_dim, layer_name, act=tf.nn.relu): # 定义大节点的名字 with tf.name_scope(layer_name): with tf.name_scope('weight'): weights = tf.Variable(tf.truncated_normal([input_dim, output_dim]), dtype=tf.float32, name='weight') tf.summary.histogram('weights', weights) with tf.name_scope('bias'): biases = tf.Variable(tf.constant(0.1, dtype=tf.float32, shape=[output_dim]), name='bias') tf.summary.histogram('biases', biases) with tf.name_scope('wx_plus_b'): preactivate = tf.nn.bias_add(tf.matmul(input_tensor, weights), biases) tf.summary.histogram('preactivate', preactivate) activation = act(preactivate, name='activation') return activation 55)对于dropout和relu的两个操作,relu是包含在上一节点的操作中,是激活部分,不可缺少。所以,先relu之后再对结果dropout keep_prob是保留概率,即我们要保留的RELU的结果所占比例,tensorflow建议的语法是,让它作为一个placeholder,在run时传入 56)tf.placeholder(tf.float32, name='') 57)词频统计的最有效方式是:Counter()函数,和itertools组合使用时,必须要用*来指引 sen = [['deng'],['ye','xun'],['meihao']] Counter(list(itertools.chain(*sen))) 58)tensorflow使用训练好的模型做测试。有两种方法,第一种方法:saver.save()和saver.restore()方法,不方便在于使用模型的时候必须把模型的结构重新定义一遍,然后载入对应名字的变量值, 但是我们所希望的是能够读取一个文件然后就直接使用模型,而不是要把模型重新定义一遍;第二种方法,不需要重新定义网络结构,从文件中将保存的graph所有节点加载到当前的default中,并返回一个saver,这样在 保存的时候除了将变量的值保存下来,还保存了对应graph中的各种节点,所以模型的结构同样被保存下来。 59)data = np.array([[1,2,3],[4,5,6]];data.shape结果:(2,3),那么data.shape[1]就是取出列数 60)模型越深越宽,就越复杂,也就很难训练。要有耐心,一定要等到收敛结束再看结果 61)tf.contrib.rnn.BasicRNNCell(num_units, forget_bias=1.0, stat_is_tuple=True):最近本的RNN单元,num_units输入RNN单元的个数,隐含层神经元的个数;forget_bias=1.0不会遗忘,为0,就都忘记。stat_is_tuple默认是True,是说返回的状态用 一个元组表示,state=(c, h)。有一个状态初始化函数,zero_state(batch_size, dtype),batch_size是输入样本批次额数目. LSTM中有两个状态值,分别是c和h,对应想要的输出。其中h作为当前状态输出的同时,也是下一时间段的输入的一部分 62)例子, import tensorflow as tf batch_size = 4 input = tf.random_normal(shape=[3, batch_size, 6], dtype=tf.float32) cell = tf.nn.rnn_cell.BasicaLSTMCell(10, forget_bias=1.0, state_is_tuple=True) init_state = cell.zero_state(batch_size, dtype=tf.float32) output, final_state = tf.nn.dynamic_rnn(cell, input, inittial_state=init_state, time_major=True) # time_major如果是True,就表示RNN的steps用第一个维度表示,建议用这个,运行速度块 # 如果是True,output的维度是[steps, batch_size, depth], 反之就是[batch_size, max_time, depth],就是和输入一样的 # final_state是整个LSTM输出的最终的状态,包含c和h,c和h的维度都是[batch_size, n_hidden] 63)搭建LSTM要点 # 把784个点的字符信息还原成 28 * 28 的图片 # 下面几个步骤是实现 RNN / LSTM 的关键 #################################################################### # **步骤1:RNN 的输入shape = (batch_size, timestep_size, input_size) X = tf.reshape(_X, [-1, 28, 28]) # **步骤2:定义一层 LSTM_cell,只需要说明 hidden_size, 它会自动匹配输入的 X 的维度 lstm_cell = rnn.BasicLSTMCell(num_units=hidden_size, forget_bias=1.0, state_is_tuple=True) # **步骤3:添加 dropout layer, 一般只设置 output_keep_prob lstm_cell = rnn.DropoutWrapper(cell=lstm_cell, input_keep_prob=1.0, output_keep_prob=keep_prob) # **步骤4:调用 MultiRNNCell 来实现多层 LSTM mlstm_cell = rnn.MultiRNNCell([lstm_cell] * layer_num, state_is_tuple=True) # **步骤5:用全零来初始化state init_state = mlstm_cell.zero_state(batch_size, dtype=tf.float32) # **步骤6:方法一,调用 dynamic_rnn() 来让我们构建好的网络运行起来 # ** 当 time_major==False 时, outputs.shape = [batch_size, timestep_size, hidden_size] # ** 所以,可以取 h_state = outputs[:, -1, :] 作为最后输出 # ** state.shape = [layer_num, 2, batch_size, hidden_size], # ** 或者,可以取 h_state = state[-1][1] 作为最后输出 # ** 最后输出维度是 [batch_size, hidden_size] # outputs, state = tf.nn.dynamic_rnn(mlstm_cell, inputs=X, initial_state=init_state, time_major=False) # h_state = outputs[:, - 1, :] # 或者 h_state = state[-1][1] # *************** 为了更好的理解 LSTM 工作原理,我们把上面 步骤6 中的函数自己来实现 *************** # 通过查看文档你会发现, RNNCell 都提供了一个 __call__()函数(见最后附),我们可以用它来展开实现LSTM按时间步迭代。 # **步骤6:方法二,按时间步展开计算 outputs = list() state = init_state with tf.variable_scope('RNN'): for timestep in range(timestep_size): if timestep > 0: tf.get_variable_scope().reuse_variables() # 这里的state保存了每一层 LSTM 的状态 (cell_output, state) = mlstm_cell(X[:, timestep, :], state) outputs.append(cell_output) 64)tf.app.run()函数:用来处理flag解析,然后执行main函数。 tf.app.flags.DEFINE_boolean('self_test', False, 'True is running a self test') tf.app.flags.DEFINE_boolean('use_fp16', False, 'whta is true') FLAGS = tf.flags.FALAGS 执行过程:首先加载flags参数项,然后执行main()函数。参数是使用tf.app.flags.FLAGS中定义的 例子: import tensorflow as tf FLAGS = tf.app.flags.FLAGS # 定义 tf.app.flags.DEFINE_string('string', 'train', 'This is a string') tf.app.flags.DEFINE_float('learning_rate', 0.001, 'This is a learning_rate') tf.app.flags.DEFINE_boolean('boolean', True, 'This is a flag') def main(): print('string', FLAGS.string) print('learning_rate', FLAGS.learning_rate) print('boolean', FLAGS.boolean) if __name__ == '__mian__': tf.app.run() 65)当网络达到收敛时,要懂得调参技巧,调整方法就是保持其它参数不变,只调整一个参数,需要调整的参数有: 1)learning_rate 2)minibatch size 3)epoch 4)filter size 5)number of filter:奇数个 网络调参的主方向:1.更深的网络,2.更加复杂的结构 66)os.listdir(str):获取字符串下目录下的所有子目录 67)os.path.join(str1, str2, str3):用于拼接文件路径,其中可以传入多个参数 68)codecs:读写中英文字符,编码转换。使用:codecs.open() 67)copy.copy(obj):属于浅拷贝 68)python数据存储于读取,pickle.dump(),pickel.load() 69)@property:为默认的属性生成getter和setter方法 70)numpy.squeeze(a, axis=None):删除数组中的单维度条目,shape=1的删除 71)numpy.argsort(a, axis=1):将矩阵a按照axis排序,axis=0,行固定,改变列;axis=1,列固定,改变行。返回排序后的下标值索引。 72)numpy.random.choice(a=x, size=3,p):随机等概率地从x中选取3个数据,p指定一个分布 73)tf.reset_default_graph:清除默认的图站,重置全局默认图 74)tf.one_hot(indices, depth)返回一个one_hot 张量,indices一维的索引,就是要存放one hot哪一个为1, depth表示one hot dimension. 75)tf.add_to_collection('list_name', element):将元素element添加到列表list_name中 76)tf.get_collection('list_name'):返回名称为list_name的列表。进行样本预测的时候使用。既然是list就可以通过下标索引的方式获取数值 77)tf.get_default_graph(),一个默认的图总是被注册了,就是会出现,调用该方法就是获得当前默认图 78)tf.Graph.get_operation_by_name(name):根据名称返回操作节点 79)tf.Graph.get_tensor_by_name(name):根据名称返回tensor数据 80)未登录词:没有被收录在分词词表中但必须切分出来的词,包括各类专有名词(人名,地名,企业名),缩写词、新增词汇等。 81)停用词:对预料建设没有作用的词,的,了,而且,等等 82)元组转化为数组形式,好东西:np.array() 83)Graph是一个就像一个大容器,OP,Tensor, Variable是这个大容器的组成部分 84)模型的使用,卡了很久的解决办法,现在贴出来 checkpoint_file=tf.train.latest_checkpoint(checkpoint_directory) graph=tf.Graph() with graph.as_default(): session_conf = tf.ConfigProto(allow_safe_placement=True, log_device_placement =False) sess = tf.Session(config = session_conf) with sess.as_default(): saver = tf.train.import_meta_graph("{}.meta".format(checkpoint_file)) saver.restore(sess,checkpoint_file) input = graph.get_operation_by_name("input").outputs[0] prediction=graph.get_operation_by_name("prediction").outputs[0] #newdata=put your data here print sess.run(prediction,feed_dict={input:newdata}) 85)收获:今早对新的样本进行了模型的结果预测。遇到的问题是,传递给feed_dict{}的x数据要和原始训练模型输入的数据维度保持一致。 我们在查看一个矩阵的shape时候,显示的是矩阵的形状,如shape=[2,3],表示一个二维矩阵,第一个维度有2个元素,第二个维度有3个元素,只是代表形状,不代表具体矩阵 当传递给feed里面的占位符时候,需要实际具体的矩阵而不是形状,如二维矩阵:x_data:[[1,2],[1,1]],总之形状和具体矩阵不要混淆。 86)预测一个样本实例: # 模型预测 with tf.Session() as sess: # 加载元数据,找到流程图 new_saver = tf.train.import_meta_graph(model_path) # 加载ckpt new_saver.restore(sess, tf.train.latest_checkpoint(model_name)) # 获取节点 target = tf.get_collection('pred_network')[0] graph = tf.get_default_graph() # 获取placeholder,要注意,不同scope下的名字要一层一层的调用才能找到最终的操作.一定要使用获取该操作后的那个outputs的输出,然后取第一个 # 必须要有outputs[0],目前我还不知道这个是啥意思。 input_x = graph.get_operation_by_name('inputs/inputs').outputs[0] keep_p = graph.get_operation_by_name('keep_prob/keep_prob').outputs[0] pred_result = sess.run(target, feed_dict={input_x: x1, keep_p: 1.0}) print(pred_result) 87)tf.nn.conv1d();跟2维卷积相比,没有厚度的卷积。 tf.nn.conv1d( value, filters, stride, padding, use_cudnn_on_gpu=None, data_format=None, name=None ) value: A 3D Tensor. Must be of type float16 or float32. filters: A 3D Tensor. Must have the same type as value. stride: An integer. The number of entries by which the filter is moved right at each step. padding: 'SAME' or 'VALID' use_cudnn_on_gpu: An optional bool. Defaults to True. data_format: An optional string from "NWC", "NCW". Defaults to "NWC", the data is stored in the order of [batch, in_width, in_channels]. The "NCW" format stores data as [batch, in_channels, in_width]. name: A name for the operation (optional). 二维卷积: tf.nn.conv2d(): tf.nn.conv2d( input, filter, strides, padding, use_cudnn_on_gpu=True, data_format='NHWC', dilations=[1, 1, 1, 1], name=None ) input: A Tensor. Must be one of the following types: half, bfloat16, float32, float64. A 4-D tensor. The dimension order is interpreted according to the value of data_format, see below for details. filter: A Tensor. Must have the same type as input. A 4-D tensor of shape [filter_height, filter_width, in_channels, out_channels] strides: A list of ints. 1-D tensor of length 4. The stride of the sliding window for each dimension of input. The dimension order is determined by the value of data_format, see below for details. padding: A string from: "SAME", "VALID". The type of padding algorithm to use. use_cudnn_on_gpu: An optional bool. Defaults to True. data_format: An optional string from: "NHWC", "NCHW". Defaults to "NHWC". Specify the data format of the input and output data. With the default format "NHWC", the data is stored in the order of: [batch, height, width, channels]. Alternatively, the format could be "NCHW", the data storage order of: [batch, channels, height, width]. dilations: An optional list of ints. Defaults to [1, 1, 1, 1]. 1-D tensor of length 4. The dilation factor for each dimension of input. If set to k > 1, there will be k-1 skipped cells between each filter element on that dimension. The dimension order is determined by the value of data_format, see above for details. Dilations in the batch and depth dimensions must be 1. name: A name for the operation (optional). 88)当出现: UnicodeDecodeError: 'gbk' codec can't decode byte 0xab in position 11126: illegal multibyte sequence 解决:可以使用‘ignore’属性进行忽略,如:open(‘1.txt’,encoding=’gb18030’,errors=‘ignore’) 89)编码不正常:file_name = open('d:/a.txt', 'r', encoding='utf-8')。读取文件的时候要加上编码限制。 90)tf.ConfigProto()用来创建session的时候对session进行参数配置 tf.ConfigProto(log_device_placement=True):记录设备指派情况,可以获取operations和Tensor被指派到哪个设备上运行,会在终端打印出任何操作 tf.ConfigProto(allow_soft_placement=True):自动选择运行设备。在tf中,通过命令with tf.device('/cpu:0'),允许手动设置操作运行的设备,如果手动设置的设备不存在或者不可用,就会导致tf程序等待或异常,为了防止这种情况,可以设置tf.ConfigProto()中参数allow_soft_placement=True,允许tf自动选择一个存在并且可用的设备来运行操作。 限制GPU资源的使用 操作:session_conf = tf.ConfigProto(log_device_placement=True) sess = tf.Session(conf=session_conf) 91)采用枚举类型自动为list中的数据做索引,可以同时得到数据和索引 例子: filter_sizes = [1,2,3] for i, filter_size in enumerate(filter_sizes) 92) 建立一个时间戳,独一无二的数据。建立一个绝对路径目录,在该处您能够存储自己的数据 timestamp = str(int(time.time())) out_dir = os.path.abspath(os.path.join(os.path.curdir, "runs", timestamp)) print("Writing to {} ".format(out_dir)) 93)检查目录是否存在。一般我们需要原来就有的目录进行数据操作,以下命令可以很好地服务于我们的工作 if not os.path.exists(my_dir): os.makedirs(my_dir) 94)日期的快速格式: datetime.datetime.now().isocalendar() 格式:(2018, 31, 5) datetime.datetime.now().isoformat() 格式:'2018-08-03T15:43:30.793866' datetime.datetime.now().isoweekday() 格式: 5 95)自定义日期格式: datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') 结果:'2018-08-03 15:51:15' 96)tf.train.global_step(sess, global_step):可以获取当前global_step的值 97)比较骚的一种关于存数据的方法: sessdict{} if not qid in sessdict: sessdict[qid] = [] # 再往这个字典key=qid的值(为list)追加数据 sessdict[qid].append(val_one, val_two) 98)遍历字典中的key和value d = {'a':1, 'b':2} d.items() 99)直接对列表进行排序: list.sort(func=None, key=None, reverse=False) 当reverse=False时:为正向排序;当reverse=True时:为方向排序 key:以什么来排序 执行完后会改变原来的list,如果你不需要原来的list,这种效率稍微高点 100)operator.itmgetter()函数:operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号。 要注意,operator.itemgetter函数获取的不是值,而是定义了一个函数,通过该函数作用到对象上才能获取值。 例如:a = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)],根据第2个域和第3个域进行排序 v.sort(key=operator.itemgetter(1,2)) 101)把数字变成字符串,在打印输出的时候使用最为方便:str(28) 102)对于一个字符串,我们要处理这个字符串里面的每一个字符,那么,可以先用特殊的分隔符如' '或者' ',把他组成一个列表。如 strings = 'I am very happy' words = strings.strip().split(' ') 103)读取文件,并进行操作的最佳方式 for line in open('./folder/a.txt'): s = line.strip().split(' ') 写入文件的最佳方式 of = open('./folder/a.txt', 'w'): of.write('a b c') of.write('this is end! + ' ') of.close() 104)计算两句话的编辑距离,不用夹角余弦了。 from nltk.metrics import distance distance.edit_distance('中国的首都', '中国的首都在哪') 105)SPARQL使用 from SPARQLWrapper import SPARQLWrapper, JSON def QA(): # 初始化,endpoint对外提供服务的链接,D2RQ默认的链接:http://localhost:2020/sparql sparql = SPARQLWrapper('http://localhost:2020/sparql') # 设置查询语句 sparql.setQuery( """ PREFIX : <http://www.kgdemo.com#> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> select ?n where{ ?s rdf:type :Person. ?s :personName '巩俐'. ?s :hasActedIn ?o. ?o :movieTitle ?n. ?o :movieRating ?r. FILTER(?r >= 7) } """ ) # 设置返回个格式为JSON sparql.setReturnFormat(JSON) results = sparql.query().convert() # {'head': {'vars': ['n']}, # 'results': {'bindings': [{'n': {'type': 'literal', 'value': '2046'}}, # {'n': {'type': 'literal', 'value': 'Memoirs of a Geisha'}}, # {'n': {'type': 'literal', 'value': '荆轲刺秦王'}}, # {'n': {'type': 'literal', 'value': '大红灯笼高高挂'}}, # {'n': {'type': 'literal', 'value': '霸王别姬'}}, # {'n': {'type': 'literal', 'value': '活着'}}, # {'n': {'type': 'literal', 'value': '唐伯虎点秋香'}}, # {'n': {'type': 'literal', 'value': '秋菊打官司'}}, # {'n': {'type': 'literal', 'value': '菊豆'}}, # {'n': {'type': 'literal', 'value': 'Hong gao liang'}}, # {'n': {'type': 'literal', 'value': '画魂'}}, # {'n': {'type': 'literal', 'value': '风月'}}, # {'n': {'type': 'literal', 'value': 'Piao Liang Ma Ma'}}, # # {'n': {'type': 'literal', 'value': 'The Hand'}}]}} # 遍历找出value的值 for result in results['results']['bindings']: print(result['n']['value']) 106)mysql免安装版设置步骤 1.配置环境变量,把..in下的文件都放入到Path中 2.初始化mysql,打开cmd,执行命令:mysqld --initialize; 3.打开mysql服务,打开cmd,执行:mysqld --install; 4.启动mysql 5.是因为无法找到MySQL执行文件,需要我们配置注册表,Win+R运行输入regedit来启动注册表,找到HKEY_LOCAL_MECHINE---SYSTEM---CurrentControlSet---services: 6.设置root密码,先执行:mysqld --skip-grant-tables 7.再开启一个命令提示符,执行:mysql。之后,更改root密码:update mysql.user set password=password(“root”) where user = “root”; 8.刷新权限:flush privileges; 9.退出:quit 107)mysqldb是python便于同数据库连接的工具类,使用方便,是mysqldb的一个高级版本,兼容python2和python3 108)mysql数据库操作 查看数据库的编码格式:show variables like 'character_set_database'; 查看表的的编码格式:show create table entity_relation_info; 可以使用nvaicat数据库管理软件方便地编辑字符编码,也要不断探索其它的功能 109)mysqladmin -u root -p shutdown 再net start mysql就没有这个错误提示了~ 110)使用python编写一个类,方便使用.在一个文件中可以建立一个类,使用一个类,也就是说这个类在哪个文件夹中都行,只要导入即可 class DataSet(object): def __init__(self, data_size): self.a = 10 self.b = 11 self.c = 12 def get_batch(self): x = self.a y = self.b def get_info(self): q = self.a z = self.b # 使用这个类,构建一个对象 trainds = DataSet(100); one = trains.get_batch() 111)进行单元测试的总结 1.导入unittest包 2.定义一个Test类,继承自unittest.TestCase 3.在类中定义各种测试方法,进行测试使用 4.在主函数中使用:unittest.main()执行单元测试 112)数据库中存储的数据都是字符串 113)argpares是一个好东西,可以在执行训练函数的时候选择参数, 如:python train.py --hiden_size=200 --num_step = 35 114)SDK软件工具开发包,由第三方服务商提供的实现软件产品某项功能的工具包。通常以集合KPI和文档、范例、工具的形式出现。 SDK是专业性质的公司提供专业服务的集合。开发者不需要对产品每个功能进行开发,选择合适、稳定的SDK服务并花费很少的精力即可在 产品中 115)这个数据结构用的比较好 result = list['row_index'], list['start_index'], list['end_index'] 通过查找result的下标索引找到这3个数据 result[0],result[1],result[2] 其中,r是元组 116)repr(object):将对象转化为供解释器读取的形式,str是面向用户的,repr是面向程序员的 返回:一个对象的string形式 117)插入对c++的学习: C++中会常用到.和::和:和->,在此整理一下常用函数的区别 1.当出现A.B,那么A为结构体或者对象; 2.当出现A->B,则A为指针,->为成员提取,A->B是提取A中的成员B,A只能是指向类、结构和联合的指针 3.但出现::,那么为域运算符,A::B指作用域A中的名称B,A可以是命名空间、类、结构 4.当出现:,一般表示继承 118)C++中的结构体:属于聚合数据类型的一类,它将不同的数据类型整合在一起构成一个新的类型,相当于数据库中的一条记录。和类具有相似的作用,类就是由结构体发展而来。 119)C++中,&引用的一个重要作用就是作为函数的参数 如:void swap(int &p1, int &p2){} 常引用,既要引用提高程序的执行效率,又要保护传递给函数的数据不在函数中被改变,就应该使用常引用 声明格式:const 类型标识符 &引用名=目标变量名; 不能够通过引用对目标变量的值进行修改,从而使引用的目标成为const,达到了引用的安全性 例如: int a; const int &ra = a; ra=1;// 错误 a=1;// 正确 120)pandas将读取的数据转换为列表,方便操作,df.values.tolist()