TensorFlow呼叫Keras庫函式存在的問題

2021-08-21 05:27:42 字數 3172 閱讀 7693

tensorflow在1.4版本引入了keras,封裝成庫。現想將keras版本的gru**移植到tensorflow中,看到tensorflow中有keras庫,大喜,故將神經網路定義部分使用keras的function api方式進行定義,訓練部分則使用tensorflow來進行編寫。一頓操作之後,執行,沒有報錯,不由得一喜。但是輸出結果,發現,和預期的不一樣。難道是欠擬合?故採用正弦波**余弦來驗證演算法模型。

部分呼叫keras庫**如上圖所示,用正弦波**余弦波,出現如下現象:

def inte***ce(_input):

tmp = tf.keras.layers.dense(10)(_input)

vad_gru = tf.keras.layers.gru(24, return_sequences=true)(tmp)

denoise_output = tf.keras.layers.dense(1)(vad_gru)

return denoise_output

波形是斷斷續續的。而且最後不收斂。

執行n久。。。之後

基本斷定是程式本身的問題,於是通過排查,發現應該是gru的initial_state沒有進行更新導致的。導致波形是斷斷續續的,沒有學習到前一次網路的輸出。於是,決定不使用keras庫實現一遍:

部分**如下:

def inte***ce(_input):

tmp = tf.keras.layers.dense(10)(_input)

gru_cell = tf.nn.rnn_cell.grucell(vad_cell_size)

with tf.name_scope('initial_state'):

cell_init_state = gru_cell.zero_state(batch_size, dtype=tf.float32)

cell_outputs, cell_final_state = tf.nn.dynamic_rnn(

gru_cell, tmp, initial_state=cell_init_state, time_major=false)

denoise_output = tf.keras.layers.dense(1)(cell_outputs)

return denoise_output, cell_init_state, cell_final_state

波形圖如下(這才是gru的正確開啟方式啊~):

再回頭看之前寫的呼叫keras,既然知道了是initial_state沒有更新,那麼如何進行更新呢?

網上查詢了大量的資料,說要加上

update_ops = 

for old_value, new_value in layers.updates:

但是加上去沒有效果,是我加錯了還是其他的,大家歡迎指出來

以下是我做的一些嘗試,就不一一詳細說明了,大家看一下,具體不再展開,有問題大家交流一下,有解決方法的,能夠分享出來,感激不盡~

def inte***ce(_input):

# input_layer = tf.keras.layers.input([none, 1])

# input_layer = tf.keras.layers.input(batch_shape=(50, 20, 1))

tmp = tf.keras.layers.dense(10)(_input)

# tmp = tf.keras.layers.dense(24)(tmp)

# with tf.variable_scope('vad_gru', reuse=tf.auto_reuse):

# vad_gru, final_state = tf.keras.layers.gru(24, return_sequences=true, return_state=true, stateful=true)(tmp)

# print(vad_gru)

# _initial_state = vad_gru.zero_state(50, tf.float32)

# tf.get_variable_scope().reuse_variables()

# vad_gru = tf.contrib.

# tmp = tf.reshape(tmp, [-1, time_steps, vad_cell_size])

gru_cell = tf.nn.rnn_cell.grucell(vad_cell_size)

# gru_cell = tf.keras.layers.grucell(self.vad_cell_size)

with tf.name_scope('initial_state'):

cell_init_state = gru_cell.zero_state(batch_size, dtype=tf.float32)

cell_outputs, cell_final_state = tf.nn.dynamic_rnn(

gru_cell, tmp, initial_state=cell_init_state, time_major=false)

# print(cell_outputs.get_shape().as_list())

# cell_outputs = tf.reshape(cell_outputs, [-1, vad_cell_size])

denoise_output = tf.keras.layers.dense(1)(cell_outputs)

print(denoise_output.get_shape().as_list())

# model = tf.keras.models.model(input_layer, denoise_output)

# update_ops =

# for old_value, new_value in model.layers[1].updates:

return denoise_output, cell_init_state, cell_final_state

c 呼叫Tensorflow模組

最近在搞kinect人體骨架識別的研究,因為姿勢識別要用到深度學習方面的東西,而現在比較流行的深度學習框架是tensorflow,對python支援的相當好,我的專案是用c 寫的,難免這兩種語言做互動,接下來我就c 如何調python做一下總結。一,建乙個win32控制台專案c tensorflow...

c 呼叫tensorflow的例子

乙個很簡單的例子,使用c 呼叫tensorflow。首先需要安裝windows 版本的tensowflow,使用64位的python3.5,如果沒有安裝,需要首先安裝python3.5 然後以管理員方式進入命令列,執行 pip install tensorflow starcorefactory s...

git獲取Android指定版本的kernel核心

git clone git kernel 在這裡需要提一下的就是,git有本地的分支跟遠端伺服器分支兩個概念,當clone整個common.git的時候,本地只有android 2.6.36這個分支的,使用下面命令可以檢視當前目錄的本地分支 git branch bing bing laptop a...