Сохранение авто-кодировщика обучено уменьшать размеры - PullRequest
0 голосов
/ 11 октября 2018

Я сделал авто-кодер для уменьшения размерности, я хотел сохранить его для использования в сокращении набора тестовых данных.Вот мой код

dom_state = seed(123)
print('Rescaling Data')
y = minmax_scale(X, axis=0)
ncol = y.shape[1] #here ncol = 19
print('Encoding Dimensions')
encoding_dim = 3
input_dim = Input(shape = (ncol,))

with tf.Session(config=tf.ConfigProto(intra_op_parallelism_threads=24)) as sess:
    K.set_session(sess)
    print('Initiating Encoder Layer')
    encoded1 = Dense(20, activation = 'relu')(input_dim)
    encoded2 = Dense(10, activation = 'relu')(encoded1)
    encoded3 = Dense(5, activation = 'relu')(encoded2)
    encoded4 = Dense(encoding_dim, activation = 'relu')(encoded3)
    print('Initiating Decoder Layer')
    decoded1 = Dense(5, activation = 'relu')(encoded4)
    decoded2 = Dense(10, activation = 'relu')(decoded1)
    decoded3 = Dense(20, activation = 'relu')(decoded2)
    decoded4 = Dense(ncol, activation = 'sigmoid')(decoded3)

    print('Combine Encoder and Decoder layers')
    autoencoder = Model(input = input_dim, output = decoded4)
    print('Compiling Mode')
    autoencoder.compile(optimizer = 'Nadam', loss ='mse')
    autoencoder.fit(y, y, nb_epoch = 300, batch_size = 20, shuffle = True)
    encoder = Model(input = input_dim, output = decoded4)
    encoder.save('reduction_param.h5')

    print('Initiating Dimension Reduction')
    model = load_model('reduction_param.h5')
    encoded_input = Input(shape = (encoding_dim, ))
    encoded_out = model.predict(y)

Однако, даже если я ограничил размеры, в части model.predict (y) я все равно получаю полные 19 столбцов вместо 3. Кроме того, я также получаюошибка:

UserWarning: No training configuration found in save file: the model was *not* compiled. Compile it manually.
  warnings.warn('No training configuration found in save file:

, которую я понимаю, потому что encoder.save('reduction_param.h5') на самом деле не скомпилирован с оптимизатором.Я что-то упустил?

РЕДАКТИРОВАТЬ :

Я не знаю, является ли это правильным способом решения проблемы, в основном я тренирую MinMAXScaler () для обучениянабор данных, сохранил функции в виде маринада, а затем повторно использовал его, сохраняя при этом авто-кодировщик, в соответствии с кодом:

dom_state = seed(123)
print('Rescaling Data')
feature_space= MinMaxScaler()
feature_pkl = feature_space.fit(X)
filename = 'lc_feature_space.sav'
pickle.dump(feature_pkl, open(filename, 'wb'))
loaded_model = pickle.load(open(filename, 'rb'))
y = loaded_model.transform(X)
ncol = y.shape[1]
print(ncol)
print('Encoding Dimensions')
encoding_dim = 3
input_dim = Input(shape = (ncol,))

with tf.Session(config=tf.ConfigProto(intra_op_parallelism_threads=24)) as sess:
    K.set_session(sess)
    print('Initiating Encoder Layer')
    encoded1 = Dense(20, activation = 'relu')(input_dim)
    encoded2 = Dense(10, activation = 'relu')(encoded1)
    encoded3 = Dense(5, activation = 'relu')(encoded2)
    encoded4 = Dense(encoding_dim, activation = 'relu')(encoded3)
    print('Initiating Decoder Layer')
    decoded1 = Dense(5, activation = 'relu')(encoded4)
    decoded2 = Dense(10, activation = 'relu')(decoded1)
    decoded3 = Dense(20, activation = 'relu')(decoded2)
    decoded4 = Dense(ncol, activation = 'sigmoid')(decoded3)

    print('Combine Encoder and Deocoder layers')
    autoencoder = Model(input = input_dim, output = decoded4)
    print('Compiling Mode')
    autoencoder.compile(optimizer = 'Nadam', loss ='mse')
    autoencoder.fit(y, y, nb_epoch = 300, batch_size = 20, shuffle = True)

    print('Initiating Dimension Reduction')
    encoder = Model(input = input_dim, output = decoded4)
    encoded_input = Input(shape = (encoding_dim, ))
    encoded_out = encoder.predict(y)
    result = encoded_out[0:2]

Мой аргумент здесь заключается в том, чтобы сохранить функции набора обучающих данных в MINMAXScaler.(), преобразуйте набор тестовых данных на основе этих функций, а затем просто уменьшите их с помощью автоматического кодировщика.Тем не менее я не знаю, правильно ли это.

1 Ответ

0 голосов
/ 12 октября 2018

Я думаю, что причина, по которой вы не видите encoder для правильной работы, то есть уменьшения размерности входного тензора, заключается в том, что вы определили и сохранили неправильную модель.Вы должны использовать

encoder = Model(input = input_dim, output = encoded4 )

с выходным узлом encoded4 вместо decoded4.

...