【keras模型查看】模型结构、模型参数、每层输入/输出

21 篇文章 2 订阅
3 篇文章 0 订阅

查看keras模型结构

from tensorflow import keras
    
# 查看模型层及参数
deepxi.model.summary()

# 将模型结构保存为图片
model_img_name = args.ver + '-' + args.network_type + '.png'
keras.utils.plot_model(deepxi.model, model_img_name, show_shapes=True)

示例:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

查看keras模型参数

可参考:【模型参数】tensorflow1.x (slim) 和tensorflow2.x (keras) 的查看模型参数方式:https://blog.csdn.net/u010637291/article/details/108143002

# 给定keras模型,如deepxi.model, deepxi模型可参考:  https://github.com/anicolson/DeepXi

# 查看模型可训练参数
for v in deepxi.model.trainable_variables:
	print(str(v.name) + ', ' + str(v.shape)) 	# 变量名+变量shape
	print(str(v.value))							# 变量值

# 查看所有参数:
model_variables = deepxi.model.variables
for v in model_variables:
	print(str(v.name) + ', ' + str(v.shape))
	

示例:在watch窗口查看deepxi.model.trainable_variables,可查看到共有65个变量,每一个变量的名字、shape和值均可查看:
在这里插入图片描述

查看keras模型每层输入/输出

查看模型每层输出:

def print_layer_output(deepxi):
    from tensorflow.keras import backend as K

    inp = deepxi.model.input  # input
    outputs = [layer.output for layer in deepxi.model.layers]  # all layer outputs
    functors = [K.function([inp], [out]) for out in outputs]  # evaluation functions

    # Testing with a wav file
    test_x, test_x_len, _, test_x_base_names = Batch('../deepxi_dataset/deepxi_test_set/test_noisy_speech_1')
    
    print("Processing observations...")
    inp_batch, supplementary_batch, n_frames = deepxi.observation_batch(test_x, test_x_len)

  	# 模型每一层输出
    layer_outs = [func([inp_batch, 1.]) for func in functors]

	# Writing to a file
 	output = open('layer_output.txt', 'w+')
    for i in range(len(layer_outs)):  #
        for j in range(len(layer_outs[i][0][0])):
            for k in range(len(layer_outs[i][0][0][j])):
                # print(layer_outs[i][0][0][j][k], end='\t')
                output.write(str(layer_outs[i][0][0][j][k]) + ' ')
            # print()
            output.write('\n')
        # print()
        # print()
        output.write('\n')
        output.write('\n')
    print('done')
    
    return layer_outs

示例:layer_outs:可查看共有47层,每层的参数值、最大最小值及dtype等均可查看

在这里插入图片描述

在此,完成的操作有:
1)针对某一个wav文件,模型的每层输出;
2)针对一个dataset,模型的每层输出。

def print_layer_output_4wav(deepxi, wavfile = '../deepxi_dataset/deepxi_test_set/test_noisy_speech_1/6930-81414-0003_SIGNAL021_0dB.wav'):
    '''
    Generating outputs of all layers
    @param deepxi: our pretrained deepxi
    @param wavfile: a certain wav file with its dir and name.
    @return:
    '''
    from tensorflow.keras import backend as K
    from deepxi.utils import read_wav
    import numpy as np

    input = deepxi.model.input  # input
    outputs = [layer.output for layer in deepxi.model.layers]  # all layer outputs
    functors = [K.function([input], [output]) for output in outputs]  # evaluation functions

    # Reading the wav file
    (wav, _fs) = read_wav(wavfile)

    # Observing
    inp, _supplementary = deepxi.inp_tgt.observation(wav)

    # Batching
    n_frames = deepxi.inp_tgt.n_frames(len(wav))
    inp_batch = np.zeros([1, n_frames, deepxi.inp_tgt.n_feat], np.float32)
    inp_batch[0, :n_frames, :] = inp

    # outputs of all layers
    layer_outs = [func([inp_batch, 1.]) for func in functors]

    return layer_outs

def generate_train_dataset(deepxi):
    from deepxi import utils
    import math
    from deepxi.args import get_args

    args = get_args()

    if args.set_path != "set":
        args.data_path = args.data_path + '/' + args.set_path.rsplit('/', 1)[-1]  # data path.
    train_s_path = args.set_path + '/train_clean_speech'  # path to the clean speech training set.
    train_d_path = args.set_path + '/train_noise'  # path to the noise training set.
    train_s_list = utils.batch_list(train_s_path, 'clean_speech', args.data_path)
    train_d_list = utils.batch_list(train_d_path, 'noise', args.data_path)

    deepxi.train_s_list = train_s_list
    deepxi.train_d_list = train_d_list

    deepxi.mbatch_size = args.mbatch_size
    deepxi.n_examples = len(train_s_list)
    deepxi.n_iter = math.ceil(deepxi.n_examples / deepxi.mbatch_size)

    dataset = deepxi.dataset(n_epochs=200)
    return dataset


def print_layer_output_4dataset(deepxi, dataset):
    '''

    @param deepxi:
    @param dataset:
    @return:
    '''
    from tensorflow.keras import backend as K

    input = deepxi.model.input  # input
    outputs = [layer.output for layer in deepxi.model.layers]  # all layer outputs
    functors = [K.function([input], [output]) for output in outputs]  # evaluation functions

    layer_outs_batch = []
    for (inp_batch, _tgt_batch, _seq_mask_batch) in dataset.as_numpy_iterator():
        layer_outs = [func([inp_batch, 1.]) for func in functors]
        layer_outs_batch.append(layer_outs)

    return layer_outs_batch


if __name__ == '__main__':
    # pretrained model
    from quantization_test.create_load_test_model import create_model, load_variables_for_model
    deepxi = create_model()
    pretrained_deepxi = load_variables_for_model(deepxi)

    # summary model
    summary_save_model(pretrained_deepxi)

    # print variables
    print_model_variables(pretrained_deepxi)

    # print outputs of all layers, according to a wav file
    layer_outputs = print_layer_output_4wav(pretrained_deepxi)

    # print outputs of all layers, according to a dataset
    dataset = generate_train_dataset(pretrained_deepxi)
    layer_outputs_batch = print_layer_output_4dataset(pretrained_deepxi, dataset)

    print('done')

同理,可查看每层的输入:

inp = deepxi.model.input  # input
inputs = [layer.input for layer in deepxi.model.layers if (isinstance(layer, keras.layers.ReLU) or isinstance(layer, keras.layers.Activation))]  # activation layer inputs
outputs = [layer.output for layer in deepxi.model.layers if (isinstance(layer, keras.layers.ReLU) or isinstance(layer, keras.layers.Activation))]
functors_inp = [K.function([inp], [input]) for input in inputs]
functors_outp = [K.function([inp], [output]) for output in outputs]

# Testing
test_x, test_x_len, _, test_x_base_names = Batch(testing_path)
print("Processing observations...")
inp_batch, supplementary_batch, n_frames = deepxi.observation_batch(test_x, test_x_len)

layer_ins = [func(inp_batch) for func in functors_inp]
  • 13
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 要使用Java训练对话模型,您需要以下步骤: 1. 准备数据集:准备包含对话文本的数据集。数据集应该包括一个包含问题和答案对的文件,每个问题和答案应该在不同的行中。 2. 数据预处理:对数据进行预处理以准备输入模型中。这可以包括标记化、停用词去除、词干提取和向量化等步骤。 3. 训练模型:使用机器学习算法训练对话模型。Java中有多种机器学习框架可供选择,如Weka、Apache Spark、TensorFlow等。 4. 评估模型:使用测试集对模型进行评估,以了解其准确性和性能。 以下是一个使用Weka训练对话模型的示例代码: ``` import weka.core.*; import weka.core.converters.ConverterUtils.DataSource; import weka.core.stemmers.SnowballStemmer; import weka.filters.Filter; import weka.filters.unsupervised.attribute.StringToWordVector; import weka.classifiers.trees.J48; public class DialogueModel { public static void main(String[] args) throws Exception { // Load data DataSource source = new DataSource("dialogue_dataset.arff"); Instances data = source.getDataSet(); // Set class attribute data.setClassIndex(data.numAttributes() - 1); // Preprocess data StringToWordVector filter = new StringToWordVector(); filter.setInputFormat(data); filter.setStemmer(new SnowballStemmer()); Instances preprocessedData = Filter.useFilter(data, filter); // Train model J48 classifier = new J48(); classifier.buildClassifier(preprocessedData); // Evaluate model Evaluation evaluation = new Evaluation(preprocessedData); evaluation.crossValidateModel(classifier, preprocessedData, 10, new Random(1)); System.out.println(evaluation.toSummaryString()); } } ``` 此代码假定您已经将对话数据集转换为ARFF格式,并将其保存在名为“dialogue_dataset.arff”的文件中。它使用Weka库中的StringToWordVector过滤器来对数据进行预处理,并使用J48分类器训练模型。最后,它使用10折交叉验证来评估模型的性能。 ### 回答2: Java对话模型的训练代码通常涉及以下几个基本步骤: 1. 数据预处理:首先需要准备训练数据集,可以是原始的对话文本或者是已经经过标注的数据集。对于原始的对话文本,需要进行分词和去除停用词等预处理操作,以便后续的处理和训练。 2. 构建模型:在训练对话模型之前,需要选择适合的模型结构。常见的模型结构包括基于统计的模型(如n-gram模型)、基于规则的模型(如有限状态自动机)以及基于神经网络的模型(如循环神经网络、Transformer等)。根据需求和数据集特点,选择合适的模型结构。 3. 特征提取:在训练模型之前,需要从数据中提取有意义的特征以供模型使用。特征可以是词向量、句法特征、语义特征等。特征提取可以使用各种工具和库来实现,例如使用开源的机器学习库如TensorFlow、PyTorch等。 4. 模型训练:一旦模型结构和特征都准备好了,可以开始进行模型的训练。根据选定的模型结构,使用训练数据集进行模型参数的优化。这个过程通常使用反向传播算法进行梯度下降优化。训练的目标是尽可能减小模型在训练数据上的误差,提高模型的泛化能力。 5. 模型评估:在训练过程中,需要对模型进行评估以了解其性能。可以使用一部分预留的测试数据集或者交叉验证等方法来评估模型的准确性、召回率、F1值等指标。 6. 模型保存和使用:训练完成后,可以将模型保存起来供之后的使用。保存的方式可以是将模型参数保存到文件中,或者直接将整个模型保存成二进制文件。之后可以加载保存的模型,并用于对话等任务中。 这些步骤涵盖了Java对话模型训练代码的主要内容。具体的实现方式和代码实例会根据具体的模型结构和数据集特点而异。 ### 回答3: Java对话模型训练是指使用Java编程语言来实现对话模型的训练过程。对话模型训练是指利用机器学习技术,通过大量的对话数据对模型进行训练,使其能够理解和生成具有自然语言交互能力的对话。 在Java中实现对话模型训练需要借助一些机器学习库和工具。首先,我们可以使用Apache OpenNLP来进行自然语言处理,例如对文本进行分词、句法分析等。其次,可以使用深度学习框架如TensorFlow或者Keras来构建对话模型。这些框架提供了各种层和模型架构,可以用于实现循环神经网络(RNN)或者变换器(Transformer)等不同类型的对话模型。 对话模型的训练过程通常包括数据预处理、模型构建和训练三个主要步骤。在数据预处理阶段,我们需要将原始对话数据进行清洗、分词、编码等操作,以便用于后续的模型训练。接着,根据具体的模型架构,我们可以设计并构建对应的模型。最后,在训练阶段,我们可以使用梯度下降等优化算法对模型进行迭代优化,使其逐渐提高对话的准确性和流畅度。 在模型训练之后,我们可以将经过训练的模型保存下来,以便在实际应用中使用。对话模型可以应用于各种场景,例如智能客服、语音助手和聊天机器人等,通过模型的生成能力,使得机器能够更加智能地理解和回答用户的问题,提供更好的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值