簡體   English   中英

線性回歸神經網絡 Tensorflow Keras Python 程序

[英]Linear Regression Neural Network Tensorflow Keras Python program

我寫了一個小的“線性回歸神經網絡 Tensorflow Keras Python 程序”

輸入數據集是 y = mx + c 直線數據。

預測的 y 值不正確,並且給出了水平線類型的值,而不是具有一定斜率的線。

我在帶有 tensorflow、Keras 和 Jupyter notebook 的 Windows 筆記本電腦上運行了這個程序。

請問如何修復這個程序?

謝謝和最好的問候,SSJ

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
n2 = 50
count = 20
n4 = n2 + count
p = 100
m = 10
c  = 5
x = np.linspace(n2, n4, p)
y = m * x + c
x
y
plt.scatter(x,y)
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.layers.experimental import preprocessing
x_normalizer = preprocessing.Normalization(input_shape=[1,])
x_normalizer.adapt(x)
x_normalized = x_normalizer(x)
y_normalizer = preprocessing.Normalization(input_shape=[1,])
y_normalizer.adapt(y)
y_normalized = x_normalizer(y)
y_model = tf.keras.Sequential([
    y_normalizer,
    layers.Dense(1)
])
y_model.compile(optimizer='rmsprop', loss='mse', metrics = ['mae'])
y_hist = y_model.fit(x, y, epochs=100, verbose=0, validation_split = 0.2)
hist = pd.DataFrame(y_hist.history)
hist['epoch'] = y_hist.epoch
hist.head()
hist.tail()
xin = [51,53,59,64]
ypred = y_model.predict(xin)
ypred
plt.scatter(x, y)
plt.scatter(xin, ypred, color = 'r')
plt.grid(linestyle = '--')

使用 StandardScaler 而不是 Normalization

Normalizer 按行操作,StandardScaler 按列操作。 Normalizer 不會刪除均值和按偏差縮放,而是將整行縮放到單位范數。

在這里找到: StandardScaler 和 Normalizer 之間的區別

這是您處理數據的方式:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
from sklearn.preprocessing import StandardScaler
x = np.linspace(50, 70, 100).reshape(-1, 1)
y = 10 * x + 5
x_standard_scaler = StandardScaler().fit(x)
y_standard_scaler = StandardScaler().fit(y)
x_scaled = x_standard_scaler.transform(x)
y_scaled = y_standard_scaler.transform(y)

請記住,您需要兩個單獨的 x 和 y 縮放器,因此不要為此使用相同的對象。 此外,如果您想使用該縮放器來處理新數據以進行測試,請將縮放器保存在某個變量中。 一個好的做法是不要在測試數據上再次重新調整定標器。

model = Sequential([
    Dense(1, input_dim=1, activation='linear'),
])
model.compile(optimizer='rmsprop', loss='mse')
history = model.fit(x_scaled, y_scaled, epochs=1000, verbose=0, validation_split = 0.2).history
pd.DataFrame(history).plot()
plt.show()

在此處輸入圖片說明

如您所見,模型正在收斂。 繪制損失歷史有助於判斷您的模型是否正在學習是值得的。

x_test = np.linspace(20, 100, 10).reshape(-1, 1)
y_test = 10 * x_test + 5
x_test_scaled = x_standard_scaler.transform(x_test)
y_test_scaled = y_standard_scaler.transform(y_test)

如果您有要用於驗證或只是預測的測試數據,請記住再次使用標准縮放器,但不要擬合。 只有在大多數情況下,它才應該適合火車數據。

y_test_pred_scaled = model.predict(x_test_scaled)
y_test_pred = y_standard_scaler.inverse_transform(y_test_pred_scaled)
plt.scatter(x_test, y_test, s=30, label='true')
plt.scatter(x_test, y_test_pred, s=15, label='pred')
plt.legend()
plt.show()

在此處輸入圖片說明

如果您想讓您的預測重新調整回其原始范圍,請使用inverse_transform 請注意,重新縮放后對x_test預測非常接近y_test

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM