Как устранить несоответствие формы тензора при построении экземпляра «Оценщика» из данной модели керас? - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь преобразовать модель Keras в Tensorflow Estimator.

У меня 1200 образцов входных данных для обучения. Каждая входная выборка состоит из 6 временных рядов длиной 100. Эти входные данные должны быть сопоставлены с 4 классами. Таким образом, X_train имеет форму (1200,100,6) и y_train, один из которых в горячем виде кодируется как (1200,4). Итак, функция main() выглядит так:

def main():
    # Defining constants
    series_len = 100
    num_classes = 4
    file_name = '..\\dnn-training-data\\RF_cycle_database.pkl'

    # Importing the data
    X_train, y_train, _, _ = import_train_test_data(file_name, style='classic')

    # Defining the model
    inp = Input(shape=(series_len, num_classes), name='input_node')
    stacked_net = create_model(inp, n_classes=num_classes)
    model = Model(inp, stacked_net)

    # Compile model
    learn_rate = 0.001
    optimizer = Adam(lr=learn_rate)
    model.compile(loss='categorical_crossentropy',
                  optimizer=optimizer,
                  metrics=['accuracy'])

    #convert to an Estimator
    # the model_dir states where the graph and checkpoint files will be saved to
    estimator_model = tf.keras.estimator.model_to_estimator(keras_model=model,
                                                        model_dir='./tf_models')

    estimator_model.train(input_fn=input_function(X_train, y_train, True))

input_function() выглядит так:

def input_function(features, labels=None, shuffle=False):
    input_fn = tf.estimator.inputs.numpy_input_fn(
        x={"input_node": features},
        y=labels,
        shuffle=shuffle,
        batch_size=5,
        num_epochs=1
    )
    return input_fn

И я создаю модель:

def create_model(input_layer,
                 n_classes=4,
                 dropout_rate=0.5,
                 filters=(64, 128),
                 cnn_layers_num=6):

    conv1 = Conv1D(filters[1], 1)(input_layer)
    bn1 = BatchNormalization()(conv1)
    actv1 = Activation('relu')(bn1)

    inc1 = inception(actv1, filters, dropout=dropout_rate)

    repeated_block = Dropout(dropout_rate)(inc1)
    for _ in range(cnn_layers_num):
        repeated_block = normalized_inception(repeated_block, filters, dropout=dropout_rate)

    # interpretation model
    interp1 = Dense(20, activation='relu')(repeated_block)
    interp2 = Dense(15, activation='relu')(interp1)
    feature_extraction = Dropout(dropout_rate)(interp2)


    lstm = LSTM(filters[1], return_sequences=True)(feature_extraction )
    lstm_flat = Flatten()(lstm)
    bn2 = BatchNormalization()(lstm_flat)

    output = Dense(n_classes, activation='softmax')(bn2)

    return output

Однако при запуске моего кода у меня появляется InvalidArgumentError:

Назначение требует соответствия форм обоих тензоров. lhs shape = [1,6,128] rhs shape = [1,4,128] [[Узел: save / Assign_61 = Назначить [T = DT_FLOAT, _class = ["loc: @ conv1d_1 / kernel"], use_locking = true, validate_shape = true, _device = "/ job: localhost / replica: 0 / task: 0 / device: CPU: 0 "] (conv1d_1 / kernel, save / RestoreV2: 66)]]

Я видел другие посты в stackoverflow, которые предлагают удалить контрольных точек или использовать атрибут name , но я не уверен, применимы ли они к моему случаю. Очевидно, что ваша помощь приветствуется.

...