TensorFlow呼び出しKerasライブラリ関数の問題を解決します。


tenssorflowは1.4バージョンでkersを導入し、ライブラリにパッケージ化しました。今は、kersバージョンのGRUコードをTensorFlowに移植したいです。TensorFlowにはKerasライブラリがあり、大喜びしています。だから、神経ネットワーク定義部分をKerasのFunction API方式で定義します。トレーニング部分はTensorFlowを使って作成します。操作をしてから、運行しています。エラーがないので、思わず喜んでしまいました。しかし、出力結果は予想とは違っていることが分かった。もしかしてフィッティングが足りないですか?したがって、正弦波予測コサインを用いてアルゴリズムモデルを検証した。
部分的にケアレスライブラリコードを呼び出して上の図のように、正弦波で余弦波を予測します。次のような現象があります。

def interface(_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 interface(_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
波形図は以下の通りです。

改めて見ると、前に書いたのがケセラです。分かりましたから、イニシャルです。stateは更新されていませんが、どうやって更新しますか?
インターネットで大量の資料を調べました。追加すると言いました。

update_ops = []
for old_value, new_value in layers.updates:
  update_ops.append(tf.assign(old_value, new_value))
しかし加えて効果がありません。間違えましたか?それとも他のものですか?ご指摘ください。
以下は私がやったいくつかの試みです。一つ一つ詳しく説明しません。皆さん、もう具体的に展開しないようにします。問題があったら、みんなで交流してください。解決方法があります。共有できて、感謝しています。

def interface(_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:
  #   update_ops.append(tf.assign(old_value, new_value))
 
  return denoise_output, cell_init_state, cell_final_state
補足知識:TensorFlowとKeras常用方法(ピット回避)
TensorFlow
TensorFlowでは、除算演算:
1.tenssor除法は結果の精度を1級高くし、float 32/float 32=float 64のような後の計算タイプが一致しない可能性があります。
2.除算には分子分母同型が必要で、そうでなければエラーを報告します。
類似のエラーメッセージが発生しました。
-1.Type Error:x and y must have the same dtype、got tf.float 32!=tf.int 32
-2.Type Error:Input‘y’of‘Mul’Op has type float 32 that does not match type froott 64 of argment‘x’.
-3.ValueError:Tensor conversion requested dtype frot 64 for Tensor with dtype float 32:‘Tensor("Sum:0",shpe=()、dtype=float 32)'
-4.ValueError:Incomptible type conversion requested to type'int 32'for variable of type'float 32_ref
解決策:
tf.cast(a,tf.float 32)菗を同タイプに変換すればいいです。
tf.bootlean_マスター
K.gather
K.argmax
K.max
以上のTensorFlowはKerasライブラリ関数の問題点を呼び出しました。小編集は皆さんのすべての内容を共有しています。参考にしていただければと思います。よろしくお願いします。