質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

718閲覧

学習モデルの重みを取り出したい

ryo_26

総合スコア1

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2023/03/13 08:26

ここに実現したいことを箇条書きで書いてください。
タイトルの通り、学習モデルの重みを取り出したいです。

前提

複数の学習モデルの重みの平均を取り、1つのモデルにしたいと考えています。
なお、言語はpythonを使用しています。

発生している問題・エラーメッセージ

モデルを保存する際以下の形式のファイルが保存されます。
・checkpoint
・data-00000-of-oooo1
・index
・meta

しかし、この中のどこに重みが保存されているのか、またどのように呼び出せば良いのかが分からない状態です。

該当のソースコード

def train(self): total_step = self.train_inputs.shape[0] * FLAGS.num_epoch // FLAGS.batch_size print(self.train_inputs.shape[0]) print('total step is %d' % total_step) config = tf.compat.v1.ConfigProto() config.gpu_options.allow_growth = True #メモリを必要分確保 min_validation_loss = 10 best_epoch = 0 with tf.compat.v1.Session(config=config) as sess: sess.run(tf.global_variables_initializer()) #変数の初期化 if FLAGS.restore == True: self.saver.restore(sess, self.save_path) for step in range(total_step): print(step) sample = random.sample(range(self.train_inputs.shape[0]), FLAGS.batch_size) #入力から、バッチサイズ分の要素をランダムに取り出す train_batch = self.train_inputs[sample] train_label = self.train_labels[sample] sess.run(self.optimizer, feed_dict={self.signal_input: train_batch, self.signal_label: train_label, #学習の実行 self.rnn_keep_prob: FLAGS.rnn_keep_prob, self.dense_drop_rate: FLAGS.drop_rate}) if step % 100 == 0: # print('-----------------------------------------------------------') train_loss = sess.run(self.loss, feed_dict={self.signal_input: train_batch, self.signal_label: train_label, self.rnn_keep_prob: FLAGS.rnn_keep_prob, self.dense_drop_rate: 0}) fft_train_loss = sess.run(self.fft_loss, feed_dict={self.signal_input: train_batch, self.signal_label: train_label, self.rnn_keep_prob: FLAGS.rnn_keep_prob, self.dense_drop_rate: 0}) valid_loss = sess.run(self.loss, feed_dict={self.signal_input: self.valid_inputs, self.signal_label: self.valid_labels, self.rnn_keep_prob: 1, self.dense_drop_rate: 0}) fft_valid_loss = sess.run(self.fft_loss, feed_dict={self.signal_input: self.valid_inputs, self.signal_label: self.valid_labels, self.rnn_keep_prob: 1, self.dense_drop_rate: 0}) print('current step is %d' % step) num_epoch = step * FLAGS.batch_size // self.train_inputs.shape[0] print('current epoch is %d' % (num_epoch)) print('') print('train loss is: %f' % train_loss) print('fft train loss is: %f' % fft_train_loss) print('sum_train loss is: %f' % (train_loss + fft_train_loss)) print('') print('valid loss is: %f' % valid_loss) print('fft valid loss is: %f' % fft_valid_loss) print('sum_valid real loss is: %f' % (valid_loss + fft_valid_loss)) print('minimum valid loss is: {0:0.4f} in epoch {1}'.format(min_validation_loss, best_epoch)) if valid_loss < min_validation_loss: best_epoch = num_epoch min_validation_loss = valid_loss self.saver.save(sess, self.save_path) print(self.save_path) print('best model saved!!')

試したこと

色々調べてみたのですが、他の方のやり方では、コードを一から書き直す必要があるように見えたので、少し自分には難易度が高く、打つ手がありません…

補足情報(FW/ツールのバージョンなど)

私自身機械学習に関して初心者なのと、今回初めてteratailを使用したため、かなり分かりにくい質問内容になっているかと思いますが、ご回答いただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

TensorFlow - Migrating Checkpoints - Load a TF1 checkpoint in TF2より

Python

1a = tf.Variable(0., name='a') 2b = tf.Variable(0., name='b') 3with tf.name_scope('scoped'): 4 c = tf.Variable(0., name='c') 5print("Initialized [a, b, c]: ", [a.numpy(), b.numpy(), c.numpy()]) 6saver = tf1.train.Saver(var_list=[a, b, c]) 7saver.restore(sess=None, save_path='tf1-ckpt-saved-in-eager') 8print("Restored [a, b, c]: ", [a.numpy(), b.numpy(), c.numpy()])

とあるので,既にあるself.saverに対してself.saver.restore(sess=None, save_path = '/path/to/ckpt/')として読み込めばよい.重みはそれぞれtf.Tensortf.Variableなので,.numpy()numpy.ndarrayを呼び出し,任意の演算をしたのちモデルに戻せばよいはずである.

投稿2023/03/13 23:21

編集2023/03/13 23:25
PondVillege

総合スコア1579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

TensorFlow - Migrating Checkpointsより以下のコードで重みを読み出し,表示していることから

Python

1def print_checkpoint(path): 2 reader = tf.train.load_checkpoint(path) 3 shapes = reader.get_variable_to_shape_map() 4 dtypes = reader.get_variable_to_dtype_map() 5 print(f"Checkpoint at {path}: ") 6 for key in shapes: 7 print(f"\t(key = '{key}', shape = {shapes[key]}, dtype = {dtypes[key].name}, " 8 f"value = {reader.get_tensor(key)})")

実際の重みの値はreader.get_tensor(key)で得られることがわかる.1階以上のテンソルである場合,type(reader.get_tensor(key))numpy.ndarrayとなるため,任意の演算をしたのちモデルに戻せばよいはずである.

投稿2023/03/13 23:07

編集2023/03/13 23:34
PondVillege

総合スコア1579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問