日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

利用TensorFlow2.0为胆固醇、血脂、血压数据构建时序深度学习模型(python完整源代码)

發布時間:2025/4/5 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用TensorFlow2.0为胆固醇、血脂、血压数据构建时序深度学习模型(python完整源代码) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

背景數據描述

膽固醇、高血脂、高血壓是壓在廣大中年男性頭上的三座大山,如何有效的監控他們,做到早發現、早預防、早治療尤為關鍵,趁著這個假期我就利用TF2.0構建了一套時序預測模型,一來是可以幫我預發疾病,二來也可以體驗下TF2.0的特性。

先來看下數據結構:

?

  • date表示的是測量日期

  • cholesterol代表膽固醇數值

  • blood_fat代表血脂

  • blood_pressure代表血壓

整個的建模思路就是將這三個數值一起構建時序模型,因為這三個指標不能獨立來看,他們是相互有影響的,互為特征和目標值。

代碼詳解

廢話不多說,我們先看下完整的代碼,代碼比較長,我把整個代碼分為數據探查、網絡構建、模型訓練、模型保存和預測這4個模塊進行拆分并講解,可以參見代碼中的注釋進行模塊區分。環境使用的是python3.7、TensorFlow2.0版本。(完整代碼見文末)

1 數據探查

?

在數據探查模塊使用了pandas將數據讀取進來,然后用diff函數構建了時序數據的增長率曲線圖,因為做時序數據預測,更多地是去看數據的增長或者降低趨勢。通過matplotlib可以把數據的成長曲線畫出來:

?

2 網絡結構構建

?

使用的是標準的lstm網絡結構,可以通過model.summary函數將深度學習網絡結構打印出來,如下圖所示:

?

3 模型訓練

?

在模型訓練環節主要是構建了收斂函數MSPE,MSPE是一種殘差收斂算法,具體計算公式比較簡單:

(y_true - y_pred)**2/(tf.maximum(y_true**2,1e-7))

?

4 模型存儲和預測

?

第四部分先使用model.save這個TF的官方模型保持函數將模型保存到本地,建議盡量使用這種官方的模型保持方案。

?

然后load模型對象,用model.predict函數對下一階段的3個指標數據做一個預測。最終的預測結果存放在arr_predict對象中,預測結果為:

[[0.26552328,0.33151102,0]]

?

以上預測的是數據的增長率,假設最后一階段的三個指標的數據分別為4.5、3.2、119,那么最終下一階段的預測值就是:

[[4.5+0.26552328,3.2+0.33151102,119+0]]

?

完整代碼如下,有興趣的同學可以跑一跑玩一玩。

import numpy as np

import pandas as pd?

import matplotlib.pyplot as plt

import tensorflow as tf?

from tensorflow.keras import models,layers,losses,metrics,callbacks

import os

import datetime?

?

#1.數據探查-------------------------------------

?

df = pd.read_csv("/Users/garvin/Downloads/data.txt",sep = "\t")

print(df)

dfdata = df.set_index("date")

dfdiff = dfdata.diff(periods=1).dropna()

dfdiff = dfdiff.reset_index("date")

?

dfdiff.plot(x = "date",y = ["cholesterol","blood_fat","blood_pressure"],figsize=(10,6))

plt.xticks(rotation=60)

dfdiff = dfdiff.drop("date",axis = 1).astype("float32")

plt.show()

?

WINDOW_SIZE = 1

?

def batch_dataset(dataset):

? ? dataset_batched = dataset.batch(WINDOW_SIZE,drop_remainder=True)

? ? return dataset_batched

?

ds_data = tf.data.Dataset.from_tensor_slices(tf.constant(dfdiff.values,dtype = tf.float32)) \

? ?.window(WINDOW_SIZE,shift=1).flat_map(batch_dataset)

?

ds_label = tf.data.Dataset.from_tensor_slices(

? ? tf.constant(dfdiff.values[WINDOW_SIZE:],dtype = tf.float32))

?

#We put all data into one batch for better efficiency since the data volume is small.

ds_train = tf.data.Dataset.zip((ds_data,ds_label)).batch(38).cache()

?

?

#2.構建網絡結構-------------------------------------

?

class Block(layers.Layer):

? ? def __init__(self, **kwargs):

? ? ? ? super(Block, self).__init__(**kwargs)

? ??

? ? def call(self, x_input,x):

? ? ? ? x_out = tf.maximum((1+x)*x_input[:,-1,:],0.0)

? ? ? ? return x_out

? ??

? ? def get_config(self):??

? ? ? ? config = super(Block, self).get_config()

? ? ? ? return config

?

tf.keras.backend.clear_session()

x_input = layers.Input(shape = (None,3),dtype = tf.float32)

x = layers.LSTM(3,return_sequences = True,input_shape=(None,3))(x_input)

x = layers.LSTM(3,return_sequences = True,input_shape=(None,3))(x)

x = layers.LSTM(3,return_sequences = True,input_shape=(None,3))(x)

x = layers.LSTM(3,input_shape=(None,3))(x)

x = layers.Dense(3)(x)

?

?

x = Block()(x_input,x)

model = models.Model(inputs = [x_input],outputs = [x])

model.summary()

?

#Customized loss function, consider the ratio between square error and the prediction

class MSPE(losses.Loss):

? ? def call(self,y_true,y_pred):

? ? ? ? err_percent = (y_true - y_pred)**2/(tf.maximum(y_true**2,1e-7))

? ? ? ? mean_err_percent = tf.reduce_mean(err_percent)

? ? ? ? return mean_err_percent

? ??

? ? def get_config(self):

? ? ? ? config = super(MSPE, self).get_config()

? ? ? ? return config

#3.模型訓練-------------------------------------

?

?

optimizer = tf.keras.optimizers.Adam(learning_rate=0.01)

model.compile(optimizer=optimizer,loss=MSPE(name = "MSPE"))

?

stamp = datetime.datetime.now().strftime("%Y%m%d-%H%M%S")

logdir = os.path.join('data', 'autograph', stamp)

?

?

tb_callback = tf.keras.callbacks.TensorBoard(logdir, histogram_freq=1)

#Half the learning rate if loss is not improved after 100 epoches

lr_callback = tf.keras.callbacks.ReduceLROnPlateau(monitor="loss",factor = 0.5, patience = 100)

#Stop training when loss is not improved after 200 epoches

stop_callback = tf.keras.callbacks.EarlyStopping(monitor = "loss", patience= 200)

callbacks_list = [tb_callback,lr_callback,stop_callback]

?

history = model.fit(ds_train,epochs=10,callbacks = callbacks_list)

?

#4.模型保存和預測-------------------------------------

?

?

model.save('tf_model_savedmodel', save_format="tf")

?

print('export saved model.')

?

?

dfresult = dfdiff[["cholesterol","blood_fat","blood_pressure"]].copy()

dfresult.tail()

#print(dfresult.values[-1:,:])

arr_predict = model.predict(tf.constant(tf.expand_dims(dfresult.values[-1:,:],axis = 0)))

print(arr_predict)

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的利用TensorFlow2.0为胆固醇、血脂、血压数据构建时序深度学习模型(python完整源代码)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。