如何通過神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)線性回歸的擬合
通過神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)線性回歸的擬合
訓(xùn)練過程
只訓(xùn)練一輪的算法是:
for 循環(huán),直到所有樣本數(shù)據(jù)使用完畢:
讀取一個(gè)樣本數(shù)據(jù)
前向計(jì)算
反向傳播
更新梯度
Python 代碼實(shí)現(xiàn)
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
class SimpleDataReader(object):
def __init__(self, data_file):
self.train_file_name = data_file
self.num_train = 0
self.XTrain = None
self.YTrain = None
# read data from file
def ReadData(self):
data = np.load(self.train_file_name)
self.XTrain = data["data"]
self.YTrain = data["label"]
self.num_train = self.XTrain.shape[0]
#end if
# get batch training data
def GetSingleTrainSample(self, iteration):
x = self.XTrain[iteration]
y = self.YTrain[iteration]
return x, y
def GetWholeTrainSamples(self):
return self.XTrain, self.YTrain
class NeuralNet(object):
def __init__(self, eta):
self.eta = eta
self.w = 0
self.b = 0
def __forward(self, x):
z = x * self.w + self.b
return z
def __backward(self, x,y,z):
dz = z - y
db = dz
dw = x * dz
return dw, db
def __update(self, dw, db):
self.w = self.w - self.eta * dw
self.b = self.b - self.eta * db
def train(self, dataReader):
for i in range(dataReader.num_train):
# get x and y value for one sample
x,y = dataReader.GetSingleTrainSample(i)
# get z from x,y
z = self.__forward(x)
# calculate gradient of w and b
dw, db = self.__backward(x, y, z)
# update w,b
self.__update(dw, db)
# end for
def inference(self, x):
return self.__forward(x)
if __name__ == '__main__':
# read data
sdr = SimpleDataReader('ch04.npz')
sdr.ReadData()
# create net
eta = 0.1
net = NeuralNet(eta)
net.train(sdr)
# result
print("w=%f,b=%f" %(net.w, net.b))
# 繪圖部分
trainX,trainY = sdr.GetWholeTrainSamples()
fig = plt.figure()
ax = fig.add_subplot(111)
# 繪制散點(diǎn)圖
ax.scatter(trainX,trainY)
# 繪制線性回歸
x = np.arange(0, 1, 0.01)
f = np.vectorize(net.inference, excluded=['x'])
plt.plot(x,f(x),color='red')
# 顯示圖表
plt.show()
TensorFlow實(shí)現(xiàn)簡單的線性回歸
線性回歸原理
根據(jù)數(shù)據(jù)建立回歸模型,w1x1+w2x2+…..+b = y,通過真實(shí)值與預(yù)測值之間建立誤差,使用梯度下降優(yōu)化得到損失最小對應(yīng)的權(quán)重和偏置。最終確定模型的權(quán)重和偏置參數(shù)。最后可以用這些參數(shù)進(jìn)行預(yù)測。
案例:實(shí)現(xiàn)線性回歸的訓(xùn)練
1 .案例確定
- 假設(shè)隨機(jī)指定100個(gè)點(diǎn),只有一個(gè)特征
- 數(shù)據(jù)本身的分布為 y = 0.7 * x + 0.8
- 這里將數(shù)據(jù)分布的規(guī)律確定,是為了使我們訓(xùn)練出的參數(shù)跟真實(shí)的參數(shù)(即0.7和0.8)比較是否訓(xùn)練準(zhǔn)確
2.API
運(yùn)算
- 矩陣運(yùn)算
tf.matmul(x, w)
- 平方
tf.square(error)
- 均值
tf.reduce_mean(error)
- 梯度下降優(yōu)化
tf.train.GradientDescentOptimizer(learning_rate)
梯度下降優(yōu)化
- learning_rate:學(xué)習(xí)率,一般為0~1之間比較小的值
- method:
- minimize(loss)
- return:梯度下降op
3.步驟分析
1 準(zhǔn)備好數(shù)據(jù)集:y = 0.8x + 0.7 100個(gè)樣本
2 建立線性模型
- 隨機(jī)初始化W1和b1
- y = W·X + b,目標(biāo):求出權(quán)重W和偏置b
3 確定損失函數(shù)(預(yù)測值與真實(shí)值之間的誤差)-均方誤差
4 梯度下降優(yōu)化損失:需要指定學(xué)習(xí)率(超參數(shù))
4.實(shí)現(xiàn)完整功能
import tensorflow as tf
import os
def linear_regression():
? ? """
? ? 自實(shí)現(xiàn)線性回歸
? ? :return: None
? ? """
? ? # 1)準(zhǔn)備好數(shù)據(jù)集:y = 0.8x + 0.7 100個(gè)樣本
? ? # 特征值X, 目標(biāo)值y_true
? ? X = tf.random_normal(shape=(100, 1), mean=2, stddev=2)
? ? # y_true [100, 1]
? ? # 矩陣運(yùn)算 X(100, 1)* (1, 1)= y_true(100, 1)
? ? y_true = tf.matmul(X, [[0.8]]) + 0.7
? ? # 2)建立線性模型:
? ? # y = W·X + b,目標(biāo):求出權(quán)重W和偏置b
? ? # 3)隨機(jī)初始化W1和b1
? ? weights = tf.Variable(initial_value=tf.random_normal(shape=(1, 1)))
? ? bias = tf.Variable(initial_value=tf.random_normal(shape=(1, 1)))
? ? y_predict = tf.matmul(X, weights) + bias
? ? # 4)確定損失函數(shù)(預(yù)測值與真實(shí)值之間的誤差)-均方誤差
? ? error = tf.reduce_mean(tf.square(y_predict - y_true))
? ? # 5)梯度下降優(yōu)化損失:需要指定學(xué)習(xí)率(超參數(shù))
? ? # W2 = W1 - 學(xué)習(xí)率*(方向)
? ? # b2 = b1 - 學(xué)習(xí)率*(方向)
? ? optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
? ? # 初始化變量
? ? init = tf.global_variables_initializer()
? ? # 開啟會(huì)話進(jìn)行訓(xùn)練
? ? with tf.Session() as sess:
? ? ? ? # 運(yùn)行初始化變量Op
? ? ? ? sess.run(init)
? ? ? ? print("隨機(jī)初始化的權(quán)重為%f, 偏置為%f" % (weights.eval(), bias.eval()))
? ? ? ? # 訓(xùn)練模型
? ? ? ? for i in range(100):
? ? ? ? ? ? sess.run(optimizer)
? ? ? ? ? ? print("第%d步的誤差為%f,權(quán)重為%f, 偏置為%f" % (i, error.eval(), weights.eval(), bias.eval()))
? ? return None5.學(xué)習(xí)率的設(shè)置、步數(shù)的設(shè)置與梯度爆炸
學(xué)習(xí)率越大,訓(xùn)練到較好結(jié)果的步數(shù)越??;學(xué)習(xí)率越小,訓(xùn)練到較好結(jié)果的步數(shù)越大。
但是學(xué)習(xí)過大會(huì)出現(xiàn)梯度爆炸現(xiàn)象。關(guān)于梯度爆炸/梯度消失 ?
在極端情況下,權(quán)重的值變得非常大,以至于溢出,導(dǎo)致 NaN 值
如何解決梯度爆炸問題(深度神經(jīng)網(wǎng)絡(luò)當(dāng)中更容易出現(xiàn))
1、重新設(shè)計(jì)網(wǎng)絡(luò)
2、調(diào)整學(xué)習(xí)率
3、使用梯度截?cái)啵ㄔ谟?xùn)練過程中檢查和限制梯度的大?。?br />4、使用激活函數(shù)
6.變量的trainable設(shè)置觀察
trainable的參數(shù)作用,指定是否訓(xùn)練
weight = tf.Variable(tf.random_normal([1, 1], mean=0.0, stddev=1.0), name="weights", trainable=False)
增加其他功能
- 增加命名空間
- 變量Tensorboard顯示
- 模型保存與加載
- 命令行參數(shù)設(shè)置
1.增加命名空間
是代碼結(jié)構(gòu)更加清晰,Tensorboard圖結(jié)構(gòu)清楚
with tf.variable_scope("lr_model"):
2.增加變量顯示
目的:在TensorBoard當(dāng)中觀察模型的參數(shù)、損失值等變量值的變化
1.收集變量
- tf.summary.scalar(name=’’,tensor) 收集對于損失函數(shù)和準(zhǔn)確率等單值變量,name為變量的名字,tensor為值
- tf.summary.histogram(name=‘’,tensor) 收集高維度的變量參數(shù)
- tf.summary.image(name=‘’,tensor) 收集輸入的圖片張量能顯示圖片
2.合并變量寫入事件文件
- merged = tf.summary.merge_all()
- 運(yùn)行合并:summary = sess.run(merged),每次迭代都需運(yùn)行
- 添加:FileWriter.add_summary(summary,i),i表示第幾次的值
def linear_regression():
# 1)準(zhǔn)備好數(shù)據(jù)集:y = 0.8x + 0.7 100個(gè)樣本
# 特征值X, 目標(biāo)值y_true
with tf.variable_scope("original_data"):
X = tf.random_normal(shape=(100, 1), mean=2, stddev=2, name="original_data_x")
# y_true [100, 1]
# 矩陣運(yùn)算 X(100, 1)* (1, 1)= y_true(100, 1)
y_true = tf.matmul(X, [[0.8]], name="original_matmul") + 0.7
# 2)建立線性模型:
# y = W·X + b,目標(biāo):求出權(quán)重W和偏置b
# 3)隨機(jī)初始化W1和b1
with tf.variable_scope("linear_model"):
weights = tf.Variable(initial_value=tf.random_normal(shape=(1, 1)), name="weights")
bias = tf.Variable(initial_value=tf.random_normal(shape=(1, 1)), name="bias")
y_predict = tf.matmul(X, weights, name="model_matmul") + bias
# 4)確定損失函數(shù)(預(yù)測值與真實(shí)值之間的誤差)-均方誤差
with tf.variable_scope("loss"):
error = tf.reduce_mean(tf.square(y_predict - y_true), name="error_op")
# 5)梯度下降優(yōu)化損失:需要指定學(xué)習(xí)率(超參數(shù))
# W2 = W1 - 學(xué)習(xí)率*(方向)
# b2 = b1 - 學(xué)習(xí)率*(方向)
with tf.variable_scope("gd_optimizer"):
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01, name="optimizer").minimize(error)
# 2)收集變量
tf.summary.scalar("error", error)
tf.summary.histogram("weights", weights)
tf.summary.histogram("bias", bias)
# 3)合并變量
merge = tf.summary.merge_all()
# 初始化變量
init = tf.global_variables_initializer()
# 開啟會(huì)話進(jìn)行訓(xùn)練
with tf.Session() as sess:
# 運(yùn)行初始化變量Op
sess.run(init)
print("隨機(jī)初始化的權(quán)重為%f, 偏置為%f" % (weights.eval(), bias.eval()))
# 1)創(chuàng)建事件文件
file_writer = tf.summary.FileWriter(logdir="./summary", graph=sess.graph)
# 訓(xùn)練模型
for i in range(100):
sess.run(optimizer)
print("第%d步的誤差為%f,權(quán)重為%f, 偏置為%f" % (i, error.eval(), weights.eval(), bias.eval()))
# 4)運(yùn)行合并變量op
summary = sess.run(merge)
file_writer.add_summary(summary, i)
return None3.模型的保存與加載
tf.train.Saver(var_list=None,max_to_keep=5)
- 保存和加載模型(保存文件格式:checkpoint文件)
- var_list:指定將要保存和還原的變量。它可以作為一個(gè)dict或一個(gè)列表傳遞.
- max_to_keep:指示要保留的最近檢查點(diǎn)文件的最大數(shù)量。創(chuàng)建新文件時(shí),會(huì)刪除較舊的文件。如果無或0,則保留所有檢查點(diǎn)文件。默認(rèn)為5(即保留最新的5個(gè)檢查點(diǎn)文件。)
使用
例如:
指定目錄+模型名字
saver.save(sess, '/tmp/ckpt/test/myregression.ckpt') saver.restore(sess, '/tmp/ckpt/test/myregression.ckpt')
如要判斷模型是否存在,直接指定目錄
checkpoint = tf.train.latest_checkpoint("./tmp/model/")
saver.restore(sess, checkpoint)4.命令行參數(shù)使用

tf.app.flags.,在flags有一個(gè)FLAGS標(biāo)志,它在程序中可以調(diào)用到我們
前面具體定義的flag_name
通過tf.app.run()啟動(dòng)main(argv)函數(shù)
# 定義一些常用的命令行參數(shù)
# 訓(xùn)練步數(shù)
tf.app.flags.DEFINE_integer("max_step", 0, "訓(xùn)練模型的步數(shù)")
# 定義模型的路徑
tf.app.flags.DEFINE_string("model_dir", " ", "模型保存的路徑+模型名字")
# 定義獲取命令行參數(shù)
FLAGS = tf.app.flags.FLAGS
# 開啟訓(xùn)練
# 訓(xùn)練的步數(shù)(依據(jù)模型大小而定)
for i in range(FLAGS.max_step):
sess.run(train_op)完整代碼
import tensorflow as tf
import os
tf.app.flags.DEFINE_string("model_path", "./linear_regression/", "模型保存的路徑和文件名")
FLAGS = tf.app.flags.FLAGS
def linear_regression():
? ? # 1)準(zhǔn)備好數(shù)據(jù)集:y = 0.8x + 0.7 100個(gè)樣本
? ? # 特征值X, 目標(biāo)值y_true
? ? with tf.variable_scope("original_data"):
? ? ? ? X = tf.random_normal(shape=(100, 1), mean=2, stddev=2, name="original_data_x")
? ? ? ? # y_true [100, 1]
? ? ? ? # 矩陣運(yùn)算 X(100, 1)* (1, 1)= y_true(100, 1)
? ? ? ? y_true = tf.matmul(X, [[0.8]], name="original_matmul") + 0.7
? ? # 2)建立線性模型:
? ? # y = W·X + b,目標(biāo):求出權(quán)重W和偏置b
? ? # 3)隨機(jī)初始化W1和b1
? ? with tf.variable_scope("linear_model"):
? ? ? ? weights = tf.Variable(initial_value=tf.random_normal(shape=(1, 1)), name="weights")
? ? ? ? bias = tf.Variable(initial_value=tf.random_normal(shape=(1, 1)), name="bias")
? ? ? ? y_predict = tf.matmul(X, weights, name="model_matmul") + bias
? ? # 4)確定損失函數(shù)(預(yù)測值與真實(shí)值之間的誤差)-均方誤差
? ? with tf.variable_scope("loss"):
? ? ? ? error = tf.reduce_mean(tf.square(y_predict - y_true), name="error_op")
? ? # 5)梯度下降優(yōu)化損失:需要指定學(xué)習(xí)率(超參數(shù))
? ? # W2 = W1 - 學(xué)習(xí)率*(方向)
? ? # b2 = b1 - 學(xué)習(xí)率*(方向)
? ? with tf.variable_scope("gd_optimizer"):
? ? ? ? optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01, name="optimizer").minimize(error)
? ? # 2)收集變量
? ? tf.summary.scalar("error", error)
? ? tf.summary.histogram("weights", weights)
? ? tf.summary.histogram("bias", bias)
? ? # 3)合并變量
? ? merge = tf.summary.merge_all()
? ? # 初始化變量
? ? init = tf.global_variables_initializer()
? ? # 創(chuàng)建saver對象
? ? saver = tf.train.Saver()
? ? # 開啟會(huì)話進(jìn)行訓(xùn)練
? ? with tf.Session() as sess:
? ? ? ? # 運(yùn)行初始化變量Op
? ? ? ? sess.run(init)
? ? ? ? # 未經(jīng)訓(xùn)練的權(quán)重和偏置
? ? ? ? print("隨機(jī)初始化的權(quán)重為%f, 偏置為%f" % (weights.eval(), bias.eval()))
? ? ? ? # 當(dāng)存在checkpoint文件,就加載模型
? ? ? ? if os.path.exists("./linear_regression/checkpoint"):
? ? ? ? ? ? saver.restore(sess, FLAGS.model_path)
? ? ? ? # 1)創(chuàng)建事件文件
? ? ? ? file_writer = tf.summary.FileWriter(logdir="./summary", graph=sess.graph)
? ? ? ? # 訓(xùn)練模型
? ? ? ? for i in range(100):
? ? ? ? ? ? sess.run(optimizer)
? ? ? ? ? ? print("第%d步的誤差為%f,權(quán)重為%f, 偏置為%f" % (i, error.eval(), weights.eval(), bias.eval()))
? ? ? ? ? ? # 4)運(yùn)行合并變量op
? ? ? ? ? ? summary = sess.run(merge)
? ? ? ? ? ? file_writer.add_summary(summary, i)
? ? ? ? ? ? if i % 10 == 0:
? ? ? ? ? ? ? ? saver.save(sess, FLAGS.model_path)
? ? return None
def main(argv):
? ? print("這是main函數(shù)")
? ? print(argv)
? ? print(FLAGS.model_path)
? ? linear_regression()
if __name__ == "__main__":
? ? tf.app.run()作業(yè):將面向過程改為面向?qū)ο?/h4>
參考代碼
# 用tensorflow自實(shí)現(xiàn)一個(gè)線性回歸案例
# 定義一些常用的命令行參數(shù)
# 訓(xùn)練步數(shù)
tf.app.flags.DEFINE_integer("max_step", 0, "訓(xùn)練模型的步數(shù)")
# 定義模型的路徑
tf.app.flags.DEFINE_string("model_dir", " ", "模型保存的路徑+模型名字")
FLAGS = tf.app.flags.FLAGS
class MyLinearRegression(object):
? ? """
? ? 自實(shí)現(xiàn)線性回歸
? ? """
? ? def __init__(self):
? ? ? ? pass
? ? def inputs(self):
? ? ? ? """
? ? ? ? 獲取特征值目標(biāo)值數(shù)據(jù)數(shù)據(jù)
? ? ? ? :return:
? ? ? ? """
? ? ? ? x_data = tf.random_normal([100, 1], mean=1.0, stddev=1.0, name="x_data")
? ? ? ? y_true = tf.matmul(x_data, [[0.7]]) + 0.8
? ? ? ? return x_data, y_true
? ? def inference(self, feature):
? ? ? ? """
? ? ? ? 根據(jù)輸入數(shù)據(jù)建立模型
? ? ? ? :param feature:
? ? ? ? :param label:
? ? ? ? :return:
? ? ? ? """
? ? ? ? with tf.variable_scope("linea_model"):
? ? ? ? ? ? # 2、建立回歸模型,分析別人的數(shù)據(jù)的特征數(shù)量--->權(quán)重?cái)?shù)量, 偏置b
? ? ? ? ? ? # 由于有梯度下降算法優(yōu)化,所以一開始給隨機(jī)的參數(shù),權(quán)重和偏置
? ? ? ? ? ? # 被優(yōu)化的參數(shù),必須得使用變量op去定義
? ? ? ? ? ? # 變量初始化權(quán)重和偏置
? ? ? ? ? ? # weight 2維[1, 1] ? ?bias [1]
? ? ? ? ? ? # 變量op當(dāng)中會(huì)有trainable參數(shù)決定是否訓(xùn)練
? ? ? ? ? ? self.weight = tf.Variable(tf.random_normal([1, 1], mean=0.0, stddev=1.0),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?name="weights")
? ? ? ? ? ? self.bias = tf.Variable(0.0, name='biases')
? ? ? ? ? ? # 建立回歸公式去得出預(yù)測結(jié)果
? ? ? ? ? ? y_predict = tf.matmul(feature, self.weight) + self.bias
? ? ? ? return y_predict
? ? def loss(self, y_true, y_predict):
? ? ? ? """
? ? ? ? 目標(biāo)值和真實(shí)值計(jì)算損失
? ? ? ? :return: loss
? ? ? ? """
? ? ? ? # 3、求出我們模型跟真實(shí)數(shù)據(jù)之間的損失
? ? ? ? # 均方誤差公式
? ? ? ? loss = tf.reduce_mean(tf.square(y_true - y_predict))
? ? ? ? return loss
? ? def merge_summary(self, loss):
? ? ? ? # 1、收集張量的值
? ? ? ? tf.summary.scalar("losses", loss)
? ? ? ? tf.summary.histogram("w", self.weight)
? ? ? ? tf.summary.histogram('b', self.bias)
? ? ? ? # 2、合并變量
? ? ? ? merged = tf.summary.merge_all()
? ? ? ? return merged
? ? def sgd_op(self, loss):
? ? ? ? """
? ? ? ? 獲取訓(xùn)練OP
? ? ? ? :return:
? ? ? ? """
? ? ? ? # 4、使用梯度下降優(yōu)化器優(yōu)化
? ? ? ? # 填充學(xué)習(xí)率:0 ~ 1 ? ?學(xué)習(xí)率是非常小,
? ? ? ? # 學(xué)習(xí)率大小決定你到達(dá)損失一個(gè)步數(shù)多少
? ? ? ? # 最小化損失
? ? ? ? train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
? ? ? ? return train_op
? ? def train(self):
? ? ? ? """
? ? ? ? 訓(xùn)練模型
? ? ? ? :param loss:
? ? ? ? :return:
? ? ? ? """
? ? ? ? g = tf.get_default_graph()
? ? ? ? with g.as_default():
? ? ? ? ? ? x_data, y_true = self.inputs()
? ? ? ? ? ? y_predict = self.inference(x_data)
? ? ? ? ? ? loss = self.loss(y_true, y_predict)
? ? ? ? ? ? train_op = self.sgd_op(loss)
? ? ? ? ? ? # 收集觀察的結(jié)果值
? ? ? ? ? ? merged = self.merge_summary(loss)
? ? ? ? ? ? saver = tf.train.Saver()
? ? ? ? ? ? with tf.Session() as sess:
? ? ? ? ? ? ? ? sess.run(tf.global_variables_initializer())
? ? ? ? ? ? ? ? # 在沒訓(xùn)練,模型的參數(shù)值
? ? ? ? ? ? ? ? print("初始化的權(quán)重:%f, 偏置:%f" % (self.weight.eval(), self.bias.eval()))
? ? ? ? ? ? ? ? # 加載模型
? ? ? ? ? ? ? ? checkpoint = tf.train.latest_checkpoint("./tmp/model/")
? ? ? ? ? ? ? ? # print(checkpoint)
? ? ? ? ? ? ? ? if checkpoint:
? ? ? ? ? ? ? ? ? ? print('Restoring', checkpoint)
? ? ? ? ? ? ? ? ? ? saver.restore(sess, checkpoint)
? ? ? ? ? ? ? ? # 開啟訓(xùn)練
? ? ? ? ? ? ? ? # 訓(xùn)練的步數(shù)(依據(jù)模型大小而定)
? ? ? ? ? ? ? ? for i in range(FLAGS.max_step):
? ? ? ? ? ? ? ? ? ? sess.run(train_op)
? ? ? ? ? ? ? ? ? ? # 生成事件文件,觀察圖結(jié)構(gòu)
? ? ? ? ? ? ? ? ? ? file_writer = tf.summary.FileWriter("./tmp/summary/", graph=sess.graph)
? ? ? ? ? ? ? ? ? ? print("訓(xùn)練第%d步之后的損失:%f, 權(quán)重:%f, 偏置:%f" % (
? ? ? ? ? ? ? ? ? ? ? ? i,
? ? ? ? ? ? ? ? ? ? ? ? loss.eval(),
? ? ? ? ? ? ? ? ? ? ? ? self.weight.eval(),
? ? ? ? ? ? ? ? ? ? ? ? self.bias.eval()))
? ? ? ? ? ? ? ? ? ? # 運(yùn)行收集變量的結(jié)果
? ? ? ? ? ? ? ? ? ? summary = sess.run(merged)
? ? ? ? ? ? ? ? ? ? # 添加到文件
? ? ? ? ? ? ? ? ? ? file_writer.add_summary(summary, i)
? ? ? ? ? ? ? ? ? ? if i % 100 == 0:
? ? ? ? ? ? ? ? ? ? ? ? # 保存的是會(huì)話當(dāng)中的變量op值,其他op定義的值不保存
? ? ? ? ? ? ? ? ? ? ? ? saver.save(sess, FLAGS.model_dir)
if __name__ == '__main__':
? ? lr = MyLinearRegression()
? ? lr.train()總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
舉例詳解Python中threading模塊的幾個(gè)常用方法
這篇文章主要介紹了舉例詳解Python中threading模塊的幾個(gè)常用方法,threading模塊用來創(chuàng)建和操作線程,是Python學(xué)習(xí)當(dāng)中的重要知識,需要的朋友可以參考下2015-06-06
python 點(diǎn)云地面點(diǎn)濾波-progressive TIN densification(PTD)算法介紹
關(guān)于地面點(diǎn)濾波的概念我們要與孤立點(diǎn)(outlier)濾波區(qū)分開,孤立點(diǎn)濾波可以理解為圖像中的去噪,去除數(shù)據(jù)測量過程中受到飛鳥、多路徑效應(yīng)所產(chǎn)生的遠(yuǎn)低于/高于其他數(shù)據(jù)的點(diǎn)。今天通過本文給大家分享python PTD點(diǎn)云地面點(diǎn)濾波的相關(guān)知識,一起看看吧2021-08-08
python實(shí)現(xiàn)回旋矩陣方式(旋轉(zhuǎn)矩陣)
今天小編就為大家分享一篇python實(shí)現(xiàn)回旋矩陣方式(旋轉(zhuǎn)矩陣),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
pytorch制作自己的LMDB數(shù)據(jù)操作示例
這篇文章主要介紹了pytorch制作自己的LMDB數(shù)據(jù)操作,結(jié)合實(shí)例形式分析了pytorch使用lmdb的相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2019-12-12
python使用struct模塊實(shí)現(xiàn)打包/解包二進(jìn)制數(shù)據(jù)
因?yàn)榫W(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)都是二進(jìn)制字節(jié)流,而?Python?只有字符串可以直接轉(zhuǎn)成字節(jié)流,對于整數(shù)、浮點(diǎn)數(shù)則無能為力了,所以?Python?提供了?struct?模塊來幫我們解決這一點(diǎn),下面我們就來看看它的用法吧2023-09-09

