Я пытаюсь преобразовать модель 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 , но я не уверен, применимы ли они к моему случаю. Очевидно, что ваша помощь приветствуется.