У меня проблема с настройкой обученной последовательной сети в качестве атрибута класса для класса Api.
Точнее говоря, я использую локальный бэкэнд Python для прогнозирования регрессии с использованием тензорного потока. Сервер работает на zerorpc, с кодом ниже
def parse_port():
return 4242
def main():
addr = 'tcp://127.0.0.1:' + str(parse_port())
network = createNetwork()
s = zerorpc.Server(Api(network))
s.bind(addr)
print('start running on {}'.format(addr))
s.run()
if __name__ == '__main__':
main()
class Api(object):
# Predict the value
network = None
def __init__(self, network):
self.network = network
def predict(self, param):
try:
return network.predict(param)
except Exception as e:
return 0.0
Архитектура сети определяется в функции createNetwork. (Мне приходится создавать архитектуру вручную, поскольку в настоящее время существует ошибка, из-за которой вы не можете загрузить модель DenseFeature напрямую, только веса)
def createNetwork():
features = ['Feature1', 'Feature2', 'Feature3','Feature4', 'Feature5', 'Feature6', 'Feature7', 'Feature8', 'Feature9', 'Feature10', 'Feature11', 'Feature12', 'Feature13', "Feature14", "Output"]
predictionDataShape = np.transpose([[1],[1],[1],[1],[1],[1],[1],[1],[1],[1],[1],[1],[1],[1], [100]])
configData = pd.DataFrame(predictionDataShape, columns=features)
labels = configData.pop('Output')
ds=tf.data.Dataset.from_tensor_slices((dict(configData), labels))
ds = ds.batch(5)
# Create input feature layer
features.remove('Output')
feature_columns = []
for header in features:
feature_columns.append(feature_column_v2.numeric_column(header))
denseColumns = feature_column_v2.DenseFeatures(feature_columns)
model = tf.keras.Sequential([
denseColumns,
tf.keras.layers.Dense(256, activation="relu"),
tf.keras.layers.Dense(1, activation="relu"),
])
model.compile(optimizer=tf.keras.optimizers.RMSprop(0.001),
loss="mae",
metrics=['mean_absolute_error', 'mean_squared_error'])
model.fit(ds,
validation_data=ds,
epochs=1)
weightPath = os.path.join(os.getcwd(), 'src/python_backend/assets/weights.h5')
model.load_weights(weightPath)
return model
Когда я запускаю это, модель создается и инициализируется, но затем я получаю следующую ошибку:
AttributeError: 'Sequential' object has no attribute '__name__'
Кажется, проблема заключается в присвоении переменной Api, поскольку все работает, когда я изменяю эту переменную на что-то другое. Что я делаю неправильно?
Спасибо :)