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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

3011閲覧

pythonのkerasで中間層までの重みを保存したい

blackmk

総合スコア23

Keras

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/04/18 06:49

現在,以下のようにオートエンコーダーで45→10の次元削減を行っております.

python

1 2#オートエンコーダの構築 3 4from keras.layers import Input, Dense 5from keras.models import Model 6import sklearn.model_selection 7import sklearn.datasets 8import numpy as np 9 10 11#データの読み込み 12 13X = np.loadtxt('D:/X_data.csv' , delimiter = ",") 14Y = np.loadtxt('D:/Y_data.csv' , delimiter = ",") 15 16 17X_train , X_test , Y_train , Y_test = sklearn.model_selection.train_test_split(X ,Y , test_size = 0.3) 18 19X_train = X_train.astype('float32') / 255. 20X_test = X_test.astype('float32') / 255. 21X_train = X_train.reshape((len(X_train), np.prod(X_train.shape[1:]))) 22X_test = X_test.reshape((len(X_test), np.prod(X_test.shape[1:]))) 23 24 25#オートエンコーダ本体 26 27encoding_dim = 10 28input_img = Input(shape=(45,)) 29 30encoded = Dense(128, activation='relu')(input_img) 31encoded = Dense(64, activation='relu')(encoded) 32encoded = Dense(32, activation='relu')(encoded) 33 34decoded = Dense(64, activation='relu')(encoded) 35decoded = Dense(128, activation='relu')(decoded) 36decoded = Dense(45, activation='sigmoid')(decoded) 37 38autoencoder = Model(input=input_img, output=decoded) 39autoencoder.compile(optimizer='adam', loss='binary_crossentropy') 40autoencoder.fit(X_train, X_train, 41 nb_epoch=100, 42 batch_size=16, 43 shuffle=True, 44 validation_data=(X_test, X_test)) 45 46#モデルの重みを保存 47 48autoencoder.save_weights('D:/autoencoder.h5')

最後にモデルの重みを保存しており、この重みを使って以下のようにネットワークを構築しています。

python

1import keras 2import tensorflow as tf 3from keras.models import Sequential 4from keras.layers import Dense , Activation 5from keras.models import load_model 6 7m =model = Sequential() 8 9#オートエンコーダの重みを使う 10model.add(Dense(128, input_dim=45, kernel_initializer='normal', activation='relu')) 11model.add(Dense(64, kernel_initializer='normal', activation='relu')) 12model.add(Dense(32, kernel_initializer='normal', activation='relu')) 13model.add(Dense(64, kernel_initializer='normal', activation='relu')) 14model.add(Dense(128, kernel_initializer='normal', activation='relu')) 15model.add(Dense(45, kernel_initializer='normal', activation='relu')) 16model.load_weights('D:/autoencoder.h5') 17 18#オートエンコーダから出力された値をもとに再度ネットワークを構築 19model.add(Dense(30, kernel_initializer='normal')) 20model.add(Dense(20, kernel_initializer='normal')) 21m.compile(loss='sparse_categorical_crossentropy', 22 optimizer='sgd', 23 metrics=['accuracy']) 24 25 26print(m.summary()) 27

このようにして学習しました。しかしながら、この方法では次元削減される前の値が入力値となる気がするのですが、この見解は正しいでしょうか?
その場合、次元削減する重みだけを取り出したいのですが、どのようにすればよいでしょうか?

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

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

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

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

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

quickquip

2019/04/18 09:10

> このようにして学習しました。 じゃあ上の方のソースはいったいなに? と思ってしまいますが。回答者は上の方のソースだけ見ればいいですよね?
blackmk

2019/04/18 11:00

ご指摘ありがとうございます。 仰る通りでございます。
guest

回答2

0

ベストアンサー

もしかしたら、やりたい事はこんなことなのでしょうか。

Python

1#オートエンコーダの構築 2from keras.layers import Input, Dense 3from keras.models import Model 4 5#オートエンコーダ本体 6encoding_dim = 10 7input_img = Input(shape=(45,)) 8 9encoded = Dense(128, activation='relu')(input_img) 10encoded = Dense(64, activation='relu')(encoded) 11encoded = Dense(32, activation='relu', name='encoder_out')(encoded) 12 13decoded = Dense(64, activation='relu')(encoded) 14decoded = Dense(128, activation='relu')(decoded) 15decoded = Dense(45, activation='sigmoid')(decoded) 16 17autoencoder = Model(input=input_img, output=decoded) 18autoencoder.load_weights('D:/autoencoder.h5') 19 20autoencoder.summary() 21#_________________________________________________________________ 22#Layer (type) Output Shape Param # 23#================================================================= 24#input_1 (InputLayer) (None, 45) 0 25#_________________________________________________________________ 26#dense_1 (Dense) (None, 128) 5888 27#_________________________________________________________________ 28#dense_2 (Dense) (None, 64) 8256 29#_________________________________________________________________ 30#encoder_out (Dense) (None, 32) 2080 31#_________________________________________________________________ 32#dense_3 (Dense) (None, 64) 2112 33#_________________________________________________________________ 34#dense_4 (Dense) (None, 128) 8320 35#_________________________________________________________________ 36#dense_5 (Dense) (None, 45) 5805 37#================================================================= 38#Total params: 32,461 39#Trainable params: 32,461 40#Non-trainable params: 0 41#_________________________________________________________________ 42 43#オートエンコーダよりエンコーダ部を取得 44encoder = Model(autoencoder.input, autoencoder.get_layer('encoder_out').output) 45encoder.summary() 46#Layer (type) Output Shape Param # 47#================================================================= 48#input_1 (InputLayer) (None, 45) 0 49#_________________________________________________________________ 50#dense_1 (Dense) (None, 128) 5888 51#_________________________________________________________________ 52#dense_2 (Dense) (None, 64) 8256 53#_________________________________________________________________ 54#encoder_out (Dense) (None, 32) 2080 55#================================================================= 56#Total params: 16,224 57#Trainable params: 16,224 58#Non-trainable params: 0 59#_________________________________________________________________

投稿2019/04/19 01:25

magichan

総合スコア15898

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

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

0

しかしながら、この方法では次元削減される前の値が入力値となる気がするのですが、この見解は正しいでしょうか?

「次元削減したい」というのが目的なのですから、入力値が次元削減する前の値なのは当たり前ではないでしょうか?


次元削減する重みだけを取り出したいのですが、どのようにすればよいでしょうか?

次元削減をするソースは、

python

1autoencoder = Model(input=input_img, output=decoded)

まで上のソースまで同じで、そのあと以下のように書いてください。

python

1# 保存した重みを復元する 2autoencoder.load_weights('D:/autoencoder.h5') 3 4# 入力からエンコードされる部分までのネットワークをモデルとする 5encoder = Model(input=input_img, output=encoded) 6 7# テストデータを入力して結果を取り出す 8dimetnension_reduced_data = encoder.predict(X_test)

これでどうでしょうか。

投稿2019/04/18 14:12

編集2019/04/19 01:45
quickquip

総合スコア11029

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問