現在,以下のようにオートエンコーダーで45→10の次元削減を行っております.
python
#オートエンコーダの構築 from keras.layers import Input, Dense from keras.models import Model import sklearn.model_selection import sklearn.datasets import numpy as np #データの読み込み X = np.loadtxt('D:/X_data.csv' , delimiter = ",") Y = np.loadtxt('D:/Y_data.csv' , delimiter = ",") X_train , X_test , Y_train , Y_test = sklearn.model_selection.train_test_split(X ,Y , test_size = 0.3) X_train = X_train.astype('float32') / 255. X_test = X_test.astype('float32') / 255. X_train = X_train.reshape((len(X_train), np.prod(X_train.shape[1:]))) X_test = X_test.reshape((len(X_test), np.prod(X_test.shape[1:]))) #オートエンコーダ本体 encoding_dim = 10 input_img = Input(shape=(45,)) encoded = Dense(128, activation='relu')(input_img) encoded = Dense(64, activation='relu')(encoded) encoded = Dense(32, activation='relu')(encoded) decoded = Dense(64, activation='relu')(encoded) decoded = Dense(128, activation='relu')(decoded) decoded = Dense(45, activation='sigmoid')(decoded) autoencoder = Model(input=input_img, output=decoded) autoencoder.compile(optimizer='adam', loss='binary_crossentropy') autoencoder.fit(X_train, X_train, nb_epoch=100, batch_size=16, shuffle=True, validation_data=(X_test, X_test)) #モデルの重みを保存 autoencoder.save_weights('D:/autoencoder.h5')
最後にモデルの重みを保存しており、この重みを使って以下のようにネットワークを構築しています。
python
import keras import tensorflow as tf from keras.models import Sequential from keras.layers import Dense , Activation from keras.models import load_model m =model = Sequential() #オートエンコーダの重みを使う model.add(Dense(128, input_dim=45, kernel_initializer='normal', activation='relu')) model.add(Dense(64, kernel_initializer='normal', activation='relu')) model.add(Dense(32, kernel_initializer='normal', activation='relu')) model.add(Dense(64, kernel_initializer='normal', activation='relu')) model.add(Dense(128, kernel_initializer='normal', activation='relu')) model.add(Dense(45, kernel_initializer='normal', activation='relu')) model.load_weights('D:/autoencoder.h5') #オートエンコーダから出力された値をもとに再度ネットワークを構築 model.add(Dense(30, kernel_initializer='normal')) model.add(Dense(20, kernel_initializer='normal')) m.compile(loss='sparse_categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) print(m.summary())
このようにして学習しました。しかしながら、この方法では次元削減される前の値が入力値となる気がするのですが、この見解は正しいでしょうか?
その場合、次元削減する重みだけを取り出したいのですが、どのようにすればよいでしょうか?
まだ回答がついていません
会員登録して回答してみよう