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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python卷积神经网络回归预测_回归[keras]的一维卷积神经网络,做

發(fā)布時(shí)間:2025/3/19 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python卷积神经网络回归预测_回归[keras]的一维卷积神经网络,做 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在上一篇博客里我介紹了如何利用keras對(duì)一個(gè)給定的數(shù)據(jù)集來(lái)完成多分類任務(wù)。

100%的分類準(zhǔn)確度驗(yàn)證了分類模型的可行性和數(shù)據(jù)集的準(zhǔn)確度。

在這篇博客當(dāng)中我將利用一個(gè)稍加修改的數(shù)據(jù)集來(lái)完成線性回歸任務(wù)。相比較以往的線性回歸處理方式,我認(rèn)為使用神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)線性回歸要簡(jiǎn)單和準(zhǔn)確得多。

數(shù)據(jù)集大小仍然是247*900,不同的是數(shù)據(jù)集的第247位變成了濕度特征的真實(shí)濕度值。

不同于分類算法得到的決策面,回歸算法得到的是一個(gè)最優(yōu)擬合線,這個(gè)線條可以最好的接近數(shù)據(jù)集中得各個(gè)點(diǎn)。

首先依舊是數(shù)據(jù)集的導(dǎo)入和劃分:

# 載入數(shù)據(jù)

df = pd.read_csv(r"C:\Users\316CJW\Desktop\畢設(shè)代碼\室內(nèi)_10_50_9.csv")

X = np.expand_dims(df.values[:, 0:246].astype(float), axis=2)#增加一維軸

Y = df.values[:, 246]

# 劃分訓(xùn)練集,測(cè)試集

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.5, random_state=0)

這里我便不做細(xì)說(shuō)了,想要了解的同學(xué)可以看一下上一篇博客。

接著是網(wǎng)絡(luò)模型的搭建:

# 定義一個(gè)神經(jīng)網(wǎng)絡(luò)

model = Sequential()

model.add(Conv1D(16, 3,input_shape=(246,1), activation='relu'))

model.add(Conv1D(16, 3, activation='relu'))

model.add(MaxPooling1D(3))

model.add(Conv1D(64, 3, activation='relu'))

model.add(Conv1D(64, 3, activation='relu'))

model.add(MaxPooling1D(3))

model.add(Conv1D(128, 3, activation='relu'))

model.add(Conv1D(128, 3, activation='relu'))

model.add(MaxPooling1D(3))

model.add(Conv1D(64, 3, activation='relu'))

model.add(Conv1D(64, 3, activation='relu'))

model.add(MaxPooling1D(3))

model.add(Flatten())

model.add(Dense(1, activation='linear'))

plot_model(model, to_file='./model_linear.png', show_shapes=True)

print(model.summary())

model.compile(optimizer='adam', loss='mean_squared_error', metrics=[coeff_determination])

為了完成回歸任務(wù),神經(jīng)網(wǎng)絡(luò)的輸出層需要被設(shè)置為一個(gè)結(jié)點(diǎn),它表示輸出每一條濕度信息的預(yù)測(cè)結(jié)果。

model.add(Dense(1, activation='linear'))

我們使用均方誤差(Mean Squared Error,MSE)做輸出層的損失函數(shù),MSE經(jīng)常被用做來(lái)比較模型預(yù)測(cè)值與真實(shí)值的偏差,在我們的任務(wù)中,通過(guò)不斷減小損失函數(shù)的值,進(jìn)而讓整個(gè)網(wǎng)絡(luò)盡可能地去擬合它真實(shí)的濕度值。

整個(gè)網(wǎng)絡(luò)模型的示意圖如下:

經(jīng)過(guò)多次調(diào)參之后,我們選用8層Conv1D來(lái)提取特征,每?jī)蓪覥onv1D后添加一層MaxPooling1D來(lái)保留主要特征,減少計(jì)算量。每層卷積層使用線性整流函數(shù)(Rectified Linear Unit, ReLU)作為激活函數(shù)。最后一層深度層輸出濕度預(yù)測(cè)值,在MSE損失函數(shù)的逼近下,濕度的預(yù)測(cè)值會(huì)愈來(lái)愈趨向于真實(shí)值。

為了可以更準(zhǔn)確的回歸數(shù)據(jù)的真實(shí)濕度值,使用的網(wǎng)絡(luò)層數(shù)明顯比分類時(shí)要更深。

為了評(píng)估網(wǎng)絡(luò)模型訓(xùn)練和測(cè)試過(guò)程的準(zhǔn)確度,我們需要自定義度量函數(shù):

決定系數(shù)

R2

(coefficient ofdetermination)常常在線性回歸中被用來(lái)表征有多少百分比的因變量波動(dòng)被回歸線描述。如果

R2

=1則表示模型完美地預(yù)測(cè)了目標(biāo)變量。

表達(dá)式:R2=SSR/SST=1-SSE/SST

其中:SST=SSR+SSE,SST(total sum of squares)為總平方和,SSR(regression sum of squares)為回歸平方和,SSE(error sum of squares) 為殘差平方和。

# 自定義度量函數(shù)

def coeff_determination(y_true, y_pred):

SS_res = K.sum(K.square( y_true-y_pred ))

SS_tot = K.sum(K.square( y_true - K.mean(y_true) ) )

return ( 1 - SS_res/(SS_tot + K.epsilon()) )

并把它運(yùn)用到編譯中來(lái):

model.compile(optimizer='adam', loss='mean_squared_error', metrics=[coeff_determination])

下面貼出整個(gè)運(yùn)行過(guò)程的完整代碼:

# -*- coding: utf8 -*-

import numpy as np

import pandas as pd

from keras.models import Sequential

from keras.utils import np_utils,plot_model

from sklearn.model_selection import cross_val_score,train_test_split

from keras.layers import Dense, Dropout,Flatten,Conv1D,MaxPooling1D

from keras.models import model_from_json

import matplotlib.pyplot as plt

from keras import backend as K

# 載入數(shù)據(jù)

df = pd.read_csv(r"C:\Users\Desktop\數(shù)據(jù)集-用做回歸.csv")

X = np.expand_dims(df.values[:, 0:246].astype(float), axis=2)#增加一維軸

Y = df.values[:, 246]

# 劃分訓(xùn)練集,測(cè)試集

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.5, random_state=0)

# 自定義度量函數(shù)

def coeff_determination(y_true, y_pred):

SS_res = K.sum(K.square( y_true-y_pred ))

SS_tot = K.sum(K.square( y_true - K.mean(y_true) ) )

return ( 1 - SS_res/(SS_tot + K.epsilon()) )

# 定義一個(gè)神經(jīng)網(wǎng)絡(luò)

model = Sequential()

model.add(Conv1D(16, 3,input_shape=(246,1), activation='relu'))

model.add(Conv1D(16, 3, activation='relu'))

model.add(MaxPooling1D(3))

model.add(Conv1D(64, 3, activation='relu'))

model.add(Conv1D(64, 3, activation='relu'))

model.add(MaxPooling1D(3))

model.add(Conv1D(128, 3, activation='relu'))

model.add(Conv1D(128, 3, activation='relu'))

model.add(MaxPooling1D(3))

model.add(Conv1D(64, 3, activation='relu'))

model.add(Conv1D(64, 3, activation='relu'))

model.add(MaxPooling1D(3))

model.add(Flatten())

model.add(Dense(1, activation='linear'))

plot_model(model, to_file='./model_linear.png', show_shapes=True)

print(model.summary())

model.compile(optimizer='adam', loss='mean_squared_error', metrics=[coeff_determination])

# 訓(xùn)練模型

model.fit(X_train,Y_train, validation_data=(X_test, Y_test),epochs=40, batch_size=10)

# # 將其模型轉(zhuǎn)換為json

# model_json = model.to_json()

# with open(r"C:\Users\Desktop\model.json",'w')as json_file:

# json_file.write(model_json)# 權(quán)重不在json中,只保存網(wǎng)絡(luò)結(jié)構(gòu)

# model.save_weights('model.h5')

#

# # 加載模型用做預(yù)測(cè)

# json_file = open(r"C:\Users\Desktop\model.json", "r")

# loaded_model_json = json_file.read()

# json_file.close()

# loaded_model = model_from_json(loaded_model_json)

# loaded_model.load_weights("model.h5")

# print("loaded model from disk")

# scores = model.evaluate(X_test,Y_test,verbose=0)

# print('%s: %.2f%%' % (model.metrics_names[1], scores[1]*100))

# 準(zhǔn)確率

scores = model.evaluate(X_test,Y_test,verbose=0)

print('%s: %.2f%%' % (model.metrics_names[1], scores[1]*100))

# 預(yù)測(cè)值散點(diǎn)圖

predicted = model.predict(X_test)

plt.scatter(Y_test,predicted)

x=np.linspace(0,0.3,100)

y=x

plt.plot(x,y,color='red',linewidth=1.0,linestyle='--',label='line')

plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來(lái)正常顯示中文標(biāo)簽

plt.rcParams['axes.unicode_minus'] = False # 用來(lái)正常顯示負(fù)號(hào)

plt.legend(["y = x","濕度預(yù)測(cè)值"])

plt.title("預(yù)測(cè)值與真實(shí)值的偏離程度")

plt.xlabel('真實(shí)濕度值')

plt.ylabel('濕度預(yù)測(cè)值')

plt.savefig('test_xx.png', dpi=200, bbox_inches='tight', transparent=False)

plt.show()

# 計(jì)算誤差

result =abs(np.mean(predicted - Y_test))

print("The mean error of linear regression:")

print(result)

在評(píng)估實(shí)驗(yàn)結(jié)果時(shí),我是輸出了決定系數(shù)的值以及回歸濕度和真實(shí)濕度的平均偏差:

可以看出99%的點(diǎn)找到了他們應(yīng)該去的歸宿,即被回歸線所掃瞄到。

平均誤差在0.0014,可以說(shuō)是一個(gè)很好的結(jié)果。

另一方面,我以真實(shí)濕度為x軸,預(yù)測(cè)濕度為y軸繪制了預(yù)測(cè)數(shù)據(jù)的散點(diǎn)圖。

從圖中可以看出預(yù)測(cè)數(shù)據(jù)較好的逼近了真實(shí)濕度值。

其實(shí)神經(jīng)網(wǎng)絡(luò)這套方法都比較相似,機(jī)器的計(jì)算代替了很多人為的推理和演算。

希望可以和大家多多交流,共同進(jìn)步(●'?'●)!

總結(jié)

以上是生活随笔為你收集整理的python卷积神经网络回归预测_回归[keras]的一维卷积神经网络,做的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。