首页 > 解决方案 > 将 model.summary() 编写为函数

问题描述

我有一个写成函数的模型,如下所示:

def __baseModel(self, nodes=300, lr=0.001):
        _model = Sequential()
        _model.add(Dense(nodes, input_dim=self.inputDim, kernel_initializer='he_normal', activation='relu'))
        _model.add(Dense(1, kernel_initializer='normal', activation='sigmoid'))
        _optimizer = self.get_optimizer(learn_rate=lr, dcy=float(self.cfg['init_decay']), eps=float(self.cfg['init_epsilon']))
        _model.compile(loss='binary_crossentropy', optimizer='Nadam', metrics=['accuracy'])
        return _model

该函数位于一个名为classifier.py. 我将在另一个名为的 python 文件中调用此函数,该文件demodel.py具有模型上的训练/预测代码。最后,main.py我想调用一个可以打印模型摘要的函数。我的问题是,我应该在哪个文件中编写一个打印出模型摘要的函数以及如何编写这样的函数?

标签: python-2.7keras

解决方案


您可以为此使用面向对象的概念,然后您不必编写自己的model.summary函数

基本上,您为keras模型使用单例设计模式/类,然后您可以从任何其他文件/模块/类访问此单例。

您仅在中创建此 Singleton 类的一个实例main.py,在任何其他文件/模块中您仅访问您在其中创建的单个实例main.py(因此 Singleton),通过此您可以从整个程序中访问相同的keras 模型:

模型单例.py

class ModelSingleton():
# Here will be the instance stored.
__instance = None



@staticmethod
def getInstance():
    """ Static access method. """
    if ModelSingleton.__instance == None:
        ModelSingleton()
    return ModelSingleton.__instance 

def __init__(self):

    self.model = self.baseModel()

    """ Virtually private constructor. """
    if ModelSingleton.__instance != None:
        raise Exception("This class is a singleton!")
    else:
        ModelSingleton.__instance = self


def baseModel(self):
   nodes=300
   lr=0.001
   model = Sequential() 
   model.add(Dense(nodes, input_dim=4, kernel_initializer='he_normal', activation='relu'))
   model.add(Dense(1, kernel_initializer='normal', activation='sigmoid')) 
   #optimizer = self.get_optimizer(learn_rate=lr, dcy=float(self.cfg['init_decay']), eps=float(self.cfg['init_epsilon']))
   model.compile(loss='binary_crossentropy', optimizer='Nadam', metrics=['accuracy'])
   print('model generated')
   return model

main.py (在这里您创建了 ModelSingleton 的单个实例,其中定义了您的 keras 模型)

import modelsingleton
import demodel

model_instance = modelsingleton.ModelSingleton()

model_instance.model.summary()

demodel.defineModel()

demodel.py(在这个你得到一个ModelSingleton create的实例main.py

import modelsingleton


def defineModel():
    model_instance = modelsingleton.ModelSingleton.getInstance()

    model_instance.baseModel()

    print('summary demodel')
    model_instance.model.summary()

上面的代码简单地打印了两个模型摘要,一个来自main.py,另一个来自demodel.py和调用baseModel()来自demodel.py(via defineModel()in main.py

我修改了https://gist.github.com/pazdera/1098129中的代码,替代编写 Singleton

另一种方法是在https://python-3-patterns-idioms-test.readthedocs.io/en/latest/Singleton.html


推荐阅读