tensorflow创建多个并行模型学习

本文介绍了如何使用TensorFlow构建并行模型,如LSTM-Dense结构,通过`tf.keras.Model()`方法替代Sequential。通过实例演示了模型的创建、数据准备以及并行层权重调整的基本原理。
摘要由CSDN通过智能技术生成

简单了解tensorflow的都知道,调用tf.keras.Sequential()方法就能创建一个tf的“模型对象”,模型的具体结构可以通过参数传入,也可以通过model.add()方法进行完善,最终通过model.compile()方法完成模型的构建。具体如下:

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
#引用自https://tensorflow.google.cn/tutorials/quickstart/beginner?hl=zh-cn

但通过此种方式创建的模型,各层间是前后顺序关系,前一层把自己学到的东西反馈给后一层,其结构图如下:

那么如何利用tf构建相互并行的层呢?通过tf.keras.Model()方法能很好的实现。以下利用Model方法构建简单的2层(LSTM-Dense)并行模型,并创建数据集进行训练与预测。

模型构建

import tensorflow as tf
from tensorflow import keras
import numpy as np
import pandas as pd
#定义输入层
input_1 = keras.layers.Input(shape=(5,1),name='input_1 ')
  #name参数是对该层的命名,未传入时会自动生成
input_2 = keras.layers.Input(shape=(5,1),name='input_2 ')
  #构建并行层的具体模型
LSTM_1 = keras.layers.LSTM(24)(input_1)  #(input_1)表示LSTM_1层与input_1层相连
LSTM_2 = keras.layers.LSTM(24)(input_2)

dense_1 = keras.layers.Dense(1)(LSTM_1)
dense_2 = keras.layers.Dense(1)(LSTM_2)

#合并并定义输出层
cate = keras.layers.Concatenate()([dense_1,dense_2])
output = keras.layers.Dense(1)(cate)

my_model = keras.models.Model([input_1,input_2],output) 
  #MODEL的输入参数分别为模型的输入层、输出层,本案例中输入层有两个input_1,input_2

my_model.compile(optimizer='adam',loss='mse')

通过以上代码生成的模型架构图(可通过tf.keras.utils.plot_model方法查看):

 至此,模型构建完成,下面构造一个训练集对模型进行训练

数据准备

#数据集创建
train_data = pd.DataFrame([i for i in range(0,100,3)],columns={'first'})
train_data['second'] = [i for i in range(0,200,6)]
train_data['target'] = train_data.iloc[:,0] + train_data.iloc[:,1]

#因为是LSTM模型,需要将数据分割
def split_data(dataset,col=None,window=5,step=1): 
    #window为滑动窗口大小,step为预测步长
    X,y = [],[]
    for i in range(len(dataset)):
        fir = i
        sec = fir + window
        thi = sec + step
        if thi < len(dataset):            
            X.append(dataset.iloc[fir:sec,col])
            y.append(dataset.iloc[sec,-1])
            
    return np.array(X),np.array(y)

#分割数据
X_1,y = split_data(train_data,col=0)
X_2,y = split_data(train_data,col=1)

数据的大概特征如下,target=first+second,

X_1、X_2分别为input的输入,y是预测目标。

 模型训练及预测

#训练
my_model.fit(x=[X_1,X_2],y=y,epochs=200,batch_size=5)

#测试集
test_1 = np.array([i for i in range(87,87+3*5,3,)]).reshape(1,5,1)
test_2 = np.array([i for i in range(174,174+6*5,6,)]).reshape(1,5,1)

#预测
my_model.predict([test_1,test_2])

 大概的流程就是如此,可以发现多层并行模型的构建与使用Sequential方法创建模型仅在构建以及数据准备上有些许不同,差异不是很大。本次学习以模型的构建和数据的准备为主,能把流程跑通就行,因此最终预测结果不是很好,但流程中各并行模型在最终合并时的权重如何调整?具体模型的设计等还需要再进行学习,希望有相关经验的前辈也能提出不足与建议。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值