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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【神经网络计算】——神经网络实现鸢尾花分类

發布時間:2023/12/1 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【神经网络计算】——神经网络实现鸢尾花分类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本blog為觀看MOOC視頻與網易云課堂所做的筆記
課堂鏈接:
人工智能實踐:TensorFlow筆記
吳恩達機器學習

疑問與思考

為什么按照batch喂入數據

之前看的視頻里面處理數據都是一次性將所有數據喂入,現在看的這個視頻對數據進行了分組投入。這是為何?
參考鏈接:

深度學習中的batch理解(batch size一次喂給神經網絡的數據大小量)
用CNN做圖像分類的時候,為什么要一批一批地輸入數據?

對樣本數據的處理方法:
傳統的梯度下降法:用全部樣本計算迭代時的梯度
隨機梯度下降法(在線梯度下降法):一次只喂一個樣本
batch梯度下降法:每次喂一部分樣本讓其完成本輪迭代
區別舉例:一次性喂500個樣本并迭代一次,跟一次喂1個樣本迭代500次相比
第一種是將參數一次性更新500個樣本的量,第二種是迭代的更新500次參數。
1、在同等的計算量之下(一定的時間內),使用整個樣本集的收斂速度要遠慢于使用少量樣本的情況。換句話說,要想收斂到同一個最優點,使用整個樣本集時,雖然迭代次數少,但是每次迭代的時間長,耗費的總時間是大于使用少量樣本多次迭代的情況的。
2、樣本量少的時候會帶來很大的方差,會導致在下降到很差的局部最小值、鞍點震蕩出收斂處,有利于向全局最小值邁進。
當樣本量很多時,方差很小,對梯度的估計要準確和穩定的多,可能導致深陷局部最小值、鞍點,導致訓練效果不如意
3、與GPU性能有關,GPU性能越好,同時訓練的數據就越多,batch就可以越大。

代碼以及展示

把打亂后的數據集中前120個數據取出來作為訓練集,后30個為測試集
輸入特征是4個,所以輸入節點是4。只用一層網絡,輸出節點是分類數:3
第一層for循環針對數據集,第二層for循環針對batch。
訓練集120個數據,batch是32個,,每個step只能喂入32組數據,需要batch級別循環4次。
所以除以4,得到每個循環得到的平均loss。
代碼:

# 利用鳶尾花數據集,實現前向傳播、反向傳播,可視化loss曲線# 導入所需模塊 import tensorflow as tf from sklearn import datasets from matplotlib import pyplot as plt import numpy as np# 導入數據,分別為輸入特征和標簽 x_data = datasets.load_iris().data y_data = datasets.load_iris().target# 隨機打亂數據(因為原始數據是順序的,順序不打亂會影響準確率) # seed: 隨機數種子,是一個整數,當設置之后,每次生成的隨機數都一樣(為方便教學,以保每位同學結果一致) np.random.seed(116) # 使用相同的seed,保證輸入特征和標簽一一對應 np.random.shuffle(x_data) np.random.seed(116) np.random.shuffle(y_data) tf.random.set_seed(116)# 將打亂后的數據集分割為訓練集和測試集,訓練集為前120行,測試集為后30行 x_train = x_data[:-30] y_train = y_data[:-30] x_test = x_data[-30:] y_test = y_data[-30:]# 轉換x的數據類型,否則后面矩陣相乘時會因數據類型不一致報錯 x_train = tf.cast(x_train, tf.float32) x_test = tf.cast(x_test, tf.float32)# from_tensor_slices函數使輸入特征和標簽值一一對應。(把數據集分批次,每個批次batch組數據) train_db = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(32) test_db = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32)# 生成神經網絡的參數,4個輸入特征故,輸入層為4個輸入節點;因為3分類,故輸出層為3個神經元 # 用tf.Variable()標記參數可訓練 # 使用seed使每次生成的隨機數相同(方便教學,使大家結果都一致,在現實使用時不寫seed) w1 = tf.Variable(tf.random.truncated_normal([4, 3], stddev=0.1, seed=1)) b1 = tf.Variable(tf.random.truncated_normal([3], stddev=0.1, seed=1))lr = 0.1 # 學習率為0.1 train_loss_results = [] # 將每輪的loss記錄在此列表中,為后續畫loss曲線提供數據 test_acc = [] # 將每輪的acc記錄在此列表中,為后續畫acc曲線提供數據 epoch = 500 # 循環500輪 loss_all = 0 # 每輪分4個step,loss_all記錄四個step生成的4個loss的和# 訓練部分 for epoch in range(epoch): #數據集級別的循環,每個epoch循環一次數據集for step, (x_train, y_train) in enumerate(train_db): #batch級別的循環 ,每個step循環一個batchwith tf.GradientTape() as tape: # with結構記錄梯度信息y = tf.matmul(x_train, w1) + b1 # 神經網絡乘加運算y = tf.nn.softmax(y) # 使輸出y符合概率分布(此操作后與獨熱碼同量級,可相減求loss)y_ = tf.one_hot(y_train, depth=3) # 將標簽值轉換為獨熱碼格式,方便計算loss和accuracyloss = tf.reduce_mean(tf.square(y_ - y)) # 采用均方誤差損失函數mse = mean(sum(y-out)^2)loss_all += loss.numpy() # 將每個step計算出的loss累加,為后續求loss平均值提供數據,這樣計算的loss更準確# 計算loss對各個參數的梯度grads = tape.gradient(loss, [w1, b1])# 實現梯度更新 w1 = w1 - lr * w1_grad b = b - lr * b_gradw1.assign_sub(lr * grads[0]) # 參數w1自更新b1.assign_sub(lr * grads[1]) # 參數b自更新# 每個epoch,打印loss信息print("Epoch {}, loss: {}".format(epoch, loss_all/4))train_loss_results.append(loss_all / 4) # 將4個step的loss求平均記錄在此變量中loss_all = 0 # loss_all歸零,為記錄下一個epoch的loss做準備# 測試部分# total_correct為預測對的樣本個數, total_number為測試的總樣本數,將這兩個變量都初始化為0total_correct, total_number = 0, 0for x_test, y_test in test_db:# 使用更新后的參數進行預測y = tf.matmul(x_test, w1) + b1y = tf.nn.softmax(y)pred = tf.argmax(y, axis=1) # 返回y中最大值的索引,即預測的分類# 將pred轉換為y_test的數據類型pred = tf.cast(pred, dtype=y_test.dtype)# 若分類正確,則correct=1,否則為0,將bool型的結果轉換為int型correct = tf.cast(tf.equal(pred, y_test), dtype=tf.int32)# 將每個batch的correct數加起來correct = tf.reduce_sum(correct)# 將所有batch中的correct數加起來total_correct += int(correct)# total_number為測試的總樣本數,也就是x_test的行數,shape[0]返回變量的行數total_number += x_test.shape[0]# 總的準確率等于total_correct/total_numberacc = total_correct / total_numbertest_acc.append(acc)print("Test_acc:", acc)print("--------------------------")# 繪制 loss 曲線 plt.title('Loss Function Curve') # 圖片標題 plt.xlabel('Epoch') # x軸變量名稱 plt.ylabel('Loss') # y軸變量名稱 plt.plot(train_loss_results, label="$Loss$") # 逐點畫出trian_loss_results值并連線,連線圖標是Loss plt.legend() # 畫出曲線圖標 plt.show() # 畫出圖像# 繪制 Accuracy 曲線 plt.title('Acc Curve') # 圖片標題 plt.xlabel('Epoch') # x軸變量名稱 plt.ylabel('Acc') # y軸變量名稱 plt.plot(test_acc, label="$Accuracy$") # 逐點畫出test_acc值并連線,連線圖標是Accuracy plt.legend() plt.show()

總結

以上是生活随笔為你收集整理的【神经网络计算】——神经网络实现鸢尾花分类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。