如何通過神經(jīng)網(wǎng)絡(luò)實現(xiàn)線性回歸的擬合
通過神經(jīng)網(wǎng)絡(luò)實現(xiàn)線性回歸的擬合
訓(xùn)練過程
只訓(xùn)練一輪的算法是:
for 循環(huán),直到所有樣本數(shù)據(jù)使用完畢:
讀取一個樣本數(shù)據(jù)
前向計算
反向傳播
更新梯度
Python 代碼實現(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) # 繪制散點圖 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實現(xiàn)簡單的線性回歸
線性回歸原理
根據(jù)數(shù)據(jù)建立回歸模型,w1x1+w2x2+…..+b = y,通過真實值與預(yù)測值之間建立誤差,使用梯度下降優(yōu)化得到損失最小對應(yīng)的權(quán)重和偏置。最終確定模型的權(quán)重和偏置參數(shù)。最后可以用這些參數(shù)進(jìn)行預(yù)測。
案例:實現(xiàn)線性回歸的訓(xùn)練
1 .案例確定
- 假設(shè)隨機(jī)指定100個點,只有一個特征
- 數(shù)據(jù)本身的分布為 y = 0.7 * x + 0.8
- 這里將數(shù)據(jù)分布的規(guī)律確定,是為了使我們訓(xùn)練出的參數(shù)跟真實的參數(shù)(即0.7和0.8)比較是否訓(xùn)練準(zhǔn)確
2.API
運算
- 矩陣運算
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個樣本
2 建立線性模型
- 隨機(jī)初始化W1和b1
- y = W·X + b,目標(biāo):求出權(quán)重W和偏置b
3 確定損失函數(shù)(預(yù)測值與真實值之間的誤差)-均方誤差
4 梯度下降優(yōu)化損失:需要指定學(xué)習(xí)率(超參數(shù))
4.實現(xiàn)完整功能
import tensorflow as tf import os def linear_regression(): ? ? """ ? ? 自實現(xiàn)線性回歸 ? ? :return: None ? ? """ ? ? # 1)準(zhǔn)備好數(shù)據(jù)集:y = 0.8x + 0.7 100個樣本 ? ? # 特征值X, 目標(biāo)值y_true ? ? X = tf.random_normal(shape=(100, 1), mean=2, stddev=2) ? ? # y_true [100, 1] ? ? # 矩陣運算 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ù)測值與真實值之間的誤差)-均方誤差 ? ? 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() ? ? # 開啟會話進(jìn)行訓(xùn)練 ? ? with tf.Session() as sess: ? ? ? ? # 運行初始化變量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 None
5.學(xué)習(xí)率的設(shè)置、步數(shù)的設(shè)置與梯度爆炸
學(xué)習(xí)率越大,訓(xùn)練到較好結(jié)果的步數(shù)越??;學(xué)習(xí)率越小,訓(xùn)練到較好結(jié)果的步數(shù)越大。
但是學(xué)習(xí)過大會出現(xiàn)梯度爆炸現(xiàn)象。關(guān)于梯度爆炸/梯度消失 ?
在極端情況下,權(quán)重的值變得非常大,以至于溢出,導(dǎo)致 NaN 值
如何解決梯度爆炸問題(深度神經(jīng)網(wǎng)絡(luò)當(dāng)中更容易出現(xiàn))
1、重新設(shè)計網(wǎng)絡(luò)
2、調(diào)整學(xué)習(xí)率
3、使用梯度截斷(在訓(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()
- 運行合并:summary = sess.run(merged),每次迭代都需運行
- 添加:FileWriter.add_summary(summary,i),i表示第幾次的值
def linear_regression(): # 1)準(zhǔn)備好數(shù)據(jù)集:y = 0.8x + 0.7 100個樣本 # 特征值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] # 矩陣運算 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ù)測值與真實值之間的誤差)-均方誤差 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() # 開啟會話進(jìn)行訓(xùn)練 with tf.Session() as sess: # 運行初始化變量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)運行合并變量op summary = sess.run(merge) file_writer.add_summary(summary, i) return None
3.模型的保存與加載
tf.train.Saver(var_list=None,max_to_keep=5)
- 保存和加載模型(保存文件格式:checkpoint文件)
- var_list:指定將要保存和還原的變量。它可以作為一個dict或一個列表傳遞.
- max_to_keep:指示要保留的最近檢查點文件的最大數(shù)量。創(chuàng)建新文件時,會刪除較舊的文件。如果無或0,則保留所有檢查點文件。默認(rèn)為5(即保留最新的5個檢查點文件。)
使用
例如:
指定目錄+模型名字
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有一個FLAGS標(biāo)志,它在程序中可以調(diào)用到我們
前面具體定義的flag_name
通過tf.app.run()啟動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個樣本 ? ? # 特征值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] ? ? ? ? # 矩陣運算 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ù)測值與真實值之間的誤差)-均方誤差 ? ? 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() ? ? # 開啟會話進(jìn)行訓(xùn)練 ? ? with tf.Session() as sess: ? ? ? ? # 運行初始化變量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)運行合并變量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自實現(xiàn)一個線性回歸案例 # 定義一些常用的命令行參數(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): ? ? """ ? ? 自實現(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)重數(shù)量, 偏置b ? ? ? ? ? ? # 由于有梯度下降算法優(yōu)化,所以一開始給隨機(jī)的參數(shù),權(quán)重和偏置 ? ? ? ? ? ? # 被優(yōu)化的參數(shù),必須得使用變量op去定義 ? ? ? ? ? ? # 變量初始化權(quán)重和偏置 ? ? ? ? ? ? # weight 2維[1, 1] ? ?bias [1] ? ? ? ? ? ? # 變量op當(dāng)中會有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)值和真實值計算損失 ? ? ? ? :return: loss ? ? ? ? """ ? ? ? ? # 3、求出我們模型跟真實數(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á)損失一個步數(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())) ? ? ? ? ? ? ? ? ? ? # 運行收集變量的結(jié)果 ? ? ? ? ? ? ? ? ? ? summary = sess.run(merged) ? ? ? ? ? ? ? ? ? ? # 添加到文件 ? ? ? ? ? ? ? ? ? ? file_writer.add_summary(summary, i) ? ? ? ? ? ? ? ? ? ? if i % 100 == 0: ? ? ? ? ? ? ? ? ? ? ? ? # 保存的是會話當(dāng)中的變量op值,其他op定義的值不保存 ? ? ? ? ? ? ? ? ? ? ? ? saver.save(sess, FLAGS.model_dir) if __name__ == '__main__': ? ? lr = MyLinearRegression() ? ? lr.train()
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python 點云地面點濾波-progressive TIN densification(PTD)算法介紹
關(guān)于地面點濾波的概念我們要與孤立點(outlier)濾波區(qū)分開,孤立點濾波可以理解為圖像中的去噪,去除數(shù)據(jù)測量過程中受到飛鳥、多路徑效應(yīng)所產(chǎn)生的遠(yuǎn)低于/高于其他數(shù)據(jù)的點。今天通過本文給大家分享python PTD點云地面點濾波的相關(guān)知識,一起看看吧2021-08-08python實現(xiàn)回旋矩陣方式(旋轉(zhuǎn)矩陣)
今天小編就為大家分享一篇python實現(xiàn)回旋矩陣方式(旋轉(zhuǎn)矩陣),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12pytorch制作自己的LMDB數(shù)據(jù)操作示例
這篇文章主要介紹了pytorch制作自己的LMDB數(shù)據(jù)操作,結(jié)合實例形式分析了pytorch使用lmdb的相關(guān)操作技巧與使用注意事項,需要的朋友可以參考下2019-12-12python使用struct模塊實現(xiàn)打包/解包二進(jìn)制數(shù)據(jù)
因為網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)都是二進(jìn)制字節(jié)流,而?Python?只有字符串可以直接轉(zhuǎn)成字節(jié)流,對于整數(shù)、浮點數(shù)則無能為力了,所以?Python?提供了?struct?模塊來幫我們解決這一點,下面我們就來看看它的用法吧2023-09-09