如何使用Tensorflow建立神经网络并且预测


前言

我总结的建立神经网络的具体步骤,和一些细节,以及提供案例仅供参考


一、配置环境

  • python3.8版本
  • Tensorflow 2.12版本
  • keras 2.11版本

二、训练模型步骤(Train_model.py)

1.导入数据集,第三方库,编写实用函数

  • 数据集
    在这里插入图片描述

  • 需要预测的特征

  • 在这里插入图片描述

  • 导入数据集,将特征和目标分开存放

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import tensorflow as tf
from keras import Sequential
from keras.layers import Dense
import pickle

def load_x(filename):
    X = np.loadtxt(filename, delimiter=',')
    return X

def load_y(filename):
    y = np.loadtxt(filename, delimiter=',')
    return y


def eval_mse(y, yhat):
    m = len(y)
    err = (yhat - y) ** 2
    err = np.sum(err)
    err = err / (2 * m)
    return (err)

X = load_x("dataX.txt")
y = load_y("datay.txt")

2.数据归一化

  • 当你的数据集里面的值相差过大的时候,可以进行归一化,这样训练模型的速度会更快
  • 如果数据集的size很小,可以进行复制,增大size,减少训练次数
Xs = StandardScaler()
Xn = Xs.fit_transform(X)
X_new = np.tile(Xn, (20000, 1))
ys = StandardScaler()
yn = ys.fit_transform(y)
y_new = np.tile(yn, (20000, 1))

3.建立模型,进行编译,训练模型

  • 可以先将数据集进行划分:训练集,交叉验证集,测试集
  • 定义层数,层的神经元,激活函数,lambada,损失函数,优化器,训练次数
X_train, X_, y_train, y_ = train_test_split(X_new,y_new,test_size=0.4, random_state=1)
X_cv, X_test, y_cv, y_test = train_test_split(X_,y_,test_size=0.50, random_state=1)
# print(X_train.shape,y_train.shape)

model = Sequential([
    Dense(units=32,activation="relu",kernel_regularizer=tf.keras.regularizers.L2(0.1)),
    Dense(units=16, activation="relu", kernel_regularizer=tf.keras.regularizers.L2(0.1)),
    Dense(units=2)
])

model.compile(
    loss=tf.keras.losses.MeanSquaredError(),
    optimizer="adam"
)

model.fit(
    X_train,y_train,
    epochs=10
)

4.模型存储和调用

  • 当你训练完模型后,可以对模型进行存储,这样就不用一直训练模型,去进行预测或者别的操作。然后新建文件进行调用即可
"""
当前文件
"""
pickle_out = open("model.p", "wb")
pickle.dump(model, pickle_out)
pickle_out.close()

二、调用模型步骤 (Using_model.py)

1.调用模型

  • 使用pickle将模型存储为model.p文件
import numpy as np
from sklearn.model_selection import train_test_split
import pickle

from sklearn.preprocessing import StandardScaler

pickle_in = open("model.p", "rb")
model = pickle.load(pickle_in)

2.模型预测

  • 由于存储了模型,这样每次预测的时候只需要调用模型即可,但是我们需要重新导入数据集,重复训练模型的步骤1和2
def load_x(filename):
    X = np.loadtxt(filename, delimiter=',')
    return X

def load_y(filename):
    y = np.loadtxt(filename, delimiter=',')
    return y
def eval_mse(y, yhat):
    m = len(y)
    err = (yhat - y) ** 2
    err = np.sum(err)
    err = err / (2 * m)
    return (err)

X = load_x("dataX.txt")
y = load_y("datay.txt")

Xs = StandardScaler()
Xn = Xs.fit_transform(X)
X_new = np.tile(Xn, (20000, 1))
ys = StandardScaler()
yn = ys.fit_transform(y)
y_new = np.tile(yn, (20000, 1))

X_train, X_, y_train, y_ = train_test_split(X_new,y_new,test_size=0.4, random_state=1)
X_cv, X_test, y_cv, y_test = train_test_split(X_,y_,test_size=0.50, random_state=1)
  • 对数据集进行归一化后,预测所输入的特征也要先进行归一化,得到的也是归一化后的预测值,此时需要进行逆归一化,得到结果
  • 还需注意的是,当你输入一个特征的时候不能对这一个特征进行归一化,需要把这个特征加入的特征的数据集里,然后重新计算均值和方差,得到归一化的结果,然后将逆归一化的预测结果加入到目标数据集
filename = "dataX.txt"
a = float(input("please Input One values: "))
b = float(input("please Input One values: "))
c = float(input("please Input One values: "))

with open(filename,'a') as file_object:
    file_object.write(f"\n{a},{b},{c}")
X = load_x("dataX.txt")
Xs_new = StandardScaler()
Xn_new = Xs.fit_transform(X)



x_norm = np.array([Xn_new[-1]])
y_pre = model.predict(x_norm)
y_INV = ys.inverse_transform(y_pre)
print(y_INV)

filename= "datay.txt"
with open(filename,'a') as file_object:
    file_object.write(f"\n{y_INV[0][0]},{y_INV[0][1]}")

3.计算模型输出损失,训练集,测试集的均方误差

  • 看看模型训练的效果
s = model.evaluate(X_train, y_train, verbose=0)
print(s)

y_pre_cv = model.predict(X_cv)
err_cv = eval_mse(y_cv,y_pre_cv)
print(err_cv)

y_pre_train = model.predict(X_train)
err_train = eval_mse(y_train,y_pre_train)
print(err_train)

y_pre_test = model.predict(X_test)
y_pre = ys.inverse_transform(y_pre_test)
y_test = ys.inverse_transform(y_test)
print(f"Predictions of Test:\n{y_pre} \n True Values:\n{y_test}")
  • 看到预测的测试集结果是有误差的,但是不大
    在这里插入图片描述

在这里插入图片描述

  • 输入[73.39,3.9635,0.988],[75.55,4.0975,1.0268]得到预测结果。
    在这里插入图片描述

总结

  • 可以通过增多神经网络的层数,每一次的神经元,调整lambada参数,来让神经网络的预测更加的准确
  • 通过观察训练集的误差和交叉验证集的误差,如果大概相等且很小,那么恭喜!你的模型训练的很好了!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苇名城的芦苇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值