Как передать файл tfrecord для обучения сложенному автоэнкодеру - PullRequest
0 голосов
/ 17 февраля 2019

Я не знаю, как получить число функций из файла TFRecord, чтобы сделать их входными данными для стекового автоэнкодера.

Я использовал следующую функцию для стекового автоэнкодера:

from __future__ import print_function
import keras
import numpy
from keras.models import Sequential
from keras.layers.core import *
from sklearn.model_selection import train_test_split
from app_flag import FLAGS

class StackedAutoencoder(object):
    """
    Implementation of stacked autoencoder multi-class classifier using the Keras Python package.
    This classifier is used to classify cells to cell cycle phases S, G1 or G2M.
    """
def __init__(self, features, labels, num_labels):
    self.features = features
    self.labels = labels
    self.auto_encoder = None
    self.encoding_dim = num_labels


    # fix random seed for reproducibility
    self.seed = 7
    numpy.random.seed(7)

def create_autoencoder(self):
    """
    Build the stacked auto-encoder using multiple hidden layers.
    The stacked auto-encoder is then trained and weights are freezed afterwards.
    A softmax classification layer is that appended to the last layer, replacing the input
    re-constructed layer of the auto-encoder.
    :return: Compiled classification neural network model.
    """
    self.auto_encoder = Sequential()
    self.auto_encoder.add(Dense(3000, activation='relu', input_dim=self.features.shape[1]))
    self.auto_encoder.add(Dense(1000, activation='relu'))
    self.auto_encoder.add(Dense(30, activation='relu'))

    self.auto_encoder.add(Dense(3000, activation='relu'))
    self.auto_encoder.add(Dense(self.features.shape[1], activation='sigmoid'))

    self.auto_encoder.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
    self.auto_encoder.fit(self.features, self.features,
                          epochs=10,
                          batch_size=5,
                          shuffle=True,
                          validation_split=0.33,
                          validation_data=None)

    self.auto_encoder.layers.pop()
    self.auto_encoder.add(Dense(self.encoding_dim, activation='softmax'))
    self.auto_encoder.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
    print(self.auto_encoder.summary())

    # Freeze all weights after training the stacked auto-encoder and all the classification layer
    for i in range(0, len(self.auto_encoder.layers)-1):
        self.auto_encoder.layers[i].trainable = False

    return self.auto_encoder

def evaluate_autoencoder(self):
    """
    Fit the trained neural network and validate it using splitting the dataset to training and testing sets.
    :return: Accuracy score of the classification.
    """
    self.auto_encoder.fit(self.features, self.labels,
                          epochs=10,
                          batch_size=5,
                          shuffle=True)

    X_train, X_test, Y_train, Y_test = train_test_split(self.features, self.labels, test_size=0.33, random_state=self.seed)
    #predictions = self.auto_encoder.predict_classes(X_test)
    #print(predictions)
    #print(self.label_encoder.inverse_transform(predictions))
    score = self.auto_encoder.evaluate(X_test, Y_test, batch_size=5, verbose=1)
    return score

Когда я запускаю код, я получаю сообщение об ошибке в строке:

self.auto_encoder.add(Dense(3000, activation='relu', input_dim=self.features.shape[1])) 

, указывающее:

Аргумент TypeError: float () должен быть строкой или числом.

Итак, как я могу использовать файл TFRecord для получения входной размерности (количества объектов)

...