轉 | tensorflow和python操作中的筆記

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對象
    for c in itertools.chain('ABC', 'XYZ'):
        print c
        # 迭代效果:'A' 'B' 'C' 'X' 'Y' 'Z'
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 {}\n".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)對於一個字符串,我們要處理這個字符串裏面的每一個字符,那麼,可以先用特殊的分隔符如'\t'或者' ',把他組成一個列表。如
    strings = 'I am very happy'
    words = strings.strip().split(' ')
103)讀取文件,並進行操作的最佳方式
    for line in open('./folder/a.txt'):
        s = line.strip().split('\t')
    寫入文件的最佳方式
    of = open('./folder/a.txt', 'w'):
        of.write('a b c')
        of.write('this is end! + '\n')
    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.配置環境變量,把..\bin\下的文件都放入到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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章