

tensorflowにて、文章予測の機械学習を学んでいます。最初はpythonのコードをメモ帳に保存し、Powershellにコピペして行っていました（①）が、Pycharmで実行することにしました（②）。  
<https://www.tensorflow.org/tutorials/text/text_generation?hl=ja>  
のコードを用いています。トレーニング後に、保存されたチェックポイントを読み込む際に、今までの①の方法では、重みを読み込み、文章生成にも反映されていたのですが、②の方法では、重みが読み込まれていないようです。  
EPOCH=100で学習した後の①、②の結果はそれぞれ以下の通りです。(最初の数十文字だけ書きます。)

①:オマエタチに告告した。ケータブさん。お祭えと申し合わせが10月15分を経つ物の話。老人は死んですか？」 ときかれた。誰も居を止める魔境になりたい」
じゃ、風のように巡りかけて…。

②:オマエタチは駒泉鄭別萎Ο供望合膳休孤軋巨赦輻友熨＝蹴執消ば輝+刃折錬★湖ュ拘拍昇雪閣査的ｇ卑律屑版菩穫ざ童腫己揮庭為ず募鉛姫責貧O鹿○猿  
②の結果は、重みづけを行っていない最初の文章予測と類似していることから、重みが正しくロードされていないのだと思います。  
正確に言うと、一つの.pyファイルでモデルの学習から文章生成までを行えば結果は①のようになります。  
しかし、保存したチェックポイントを読み込み、モデルを構築し、文章生成しようとすると、②のようになってしまいます。①の方法では正しく出力されるにも関わらずです。  
しかし、Pycharmで実行する際もエラーなどは出ず、トレーニングチェックポイントの読み込みの  
`model.load_weights(tf.train.latest_checkpoint(checkpoint_dir))`  
の結果は  
`./training_checkpoints2\ckpt_100`  
と読み込みされているようです。モデルの構築に関しても、参考サイトと同じものを用いています。

[code]

    def build_model(vocab_size, embedding_dim, rnn_units_1, batch_size):
      model = tf.keras.Sequential([
        tf.keras.layers.Embedding(vocab_size, embedding_dim,
                                  batch_input_shape=[batch_size, None]),
        tf.keras.layers.GRU(rnn_units_1,
                            return_sequences=True,
                            stateful=True,
                            recurrent_initializer='glorot_uniform'),
        tf.keras.layers.Dense(vocab_size)
      ])
      return model
    
    model = build_model(vocab_size, embedding_dim, rnn_units_1, batch_size=1)
    
[/code]

どのようにすれば解決できますか？  
以下に、チェックポイントの読み込みから文章生成までのコードを書きます。

[code]

    import tensorflow as tf
    import numpy as np
    import os
    import time
    os.chdir('C:\\Users\\ahwes\\deeplearning_Pycharm')
    f = open('C:\\Users\\ahwes\\Documents\\test\\source.txt', 'r',encoding="utf-8")
    h = open('C:\\Users\\ahwes\\PycharmProjects\\pythonProject\\output.txt','w',encoding="utf-8")
    text = f.read()
    vocab = sorted(set(text))
    char2idx = {u:i for i, u in enumerate(vocab)}
    idx2char = np.array(vocab)
    text_as_int = np.array([char2idx[c] for c in text])
    seq_length = 100
    examples_per_epoch = len(text)//(seq_length+1)
    char_dataset = tf.data.Dataset.from_tensor_slices(text_as_int)
    sequences = char_dataset.batch(seq_length+1, drop_remainder=True)
    vocab_size = len(vocab)
    embedding_dim = 256
    rnn_units_1 = 1024
    checkpoint_dir = './training_checkpoints2'
    tf.train.latest_checkpoint(checkpoint_dir)
    print(tf.train.latest_checkpoint(checkpoint_dir))
    def build_model(vocab_size, embedding_dim, rnn_units_1, batch_size):
      model = tf.keras.Sequential([
        tf.keras.layers.Embedding(vocab_size, embedding_dim,
                                  batch_input_shape=[batch_size, None]),
        tf.keras.layers.GRU(rnn_units_1,
                            return_sequences=True,
                            stateful=True,
                            recurrent_initializer='glorot_uniform'),
        tf.keras.layers.Dense(vocab_size)
      ])
      return model
    
    model = build_model(vocab_size, embedding_dim, rnn_units_1, batch_size=1)
    model.load_weights(tf.train.latest_checkpoint(checkpoint_dir))
    
    model.build(tf.TensorShape([1, None]))
    model.summary()
    
    def generate_text(model, start_string):
      num_generate = 2000
      input_eval = [char2idx[s] for s in start_string]
      input_eval = tf.expand_dims(input_eval, 0)
      text_generated = []
      temperature = 0.8
      model.reset_states()
      for i in range(num_generate):
          predictions = model(input_eval)
          predictions = tf.squeeze(predictions, 0)
          predictions = predictions / temperature
          predicted_id = tf.random.categorical(predictions, num_samples=1)[-1,0].numpy()
          input_eval = tf.expand_dims([predicted_id], 0)
          text_generated.append(idx2char[predicted_id])
      return (start_string + ''.join(text_generated))
    
    h.write(generate_text(model, start_string=u"オマエタチ"))
    f.close()
    h.close()
    
[/code]


CC BY-SA 4.0
2023-04-15T04:07:52.390
94526
2023-04-15T04:07:52.390
57863
question
python tensorflow pycharm
tensorflowについて:terminalから実行する場合とpycharmから実行する場合とで結果が異なってしまう