相當重要,部落格記錄一下
# -*- coding: utf-8 -*-
# 利用鳶尾花資料集,實現前向傳播、反向傳播,視覺化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)
print
(train_db)
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)
inenumerate
(train_db)
:# batch級別的迴圈 ,每個step迴圈乙個batch
with 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和accuracy
loss = 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_grad
w1.assign_sub(lr * grads[0]
)# 引數w1自更新
b1.assign_sub(lr * grads[1]
)# 引數b自更新
# 每個epoch,列印loss資訊
print
("epoch {}, loss: {}"
.format
(epoch, loss_all/4)
)4)# 將4個step的loss求平均記錄在此變數中
loss_all =
0# loss_all歸零,為記錄下乙個epoch的loss做準備
# 測試部分
# total_correct為**對的樣本個數, total_number為測試的總樣本數,將這兩個變數都初始化為0
total_correct, total_number =0,
0for x_test, y_test in test_db:
# 使用更新後的引數進行**
y = tf.matmul(x_test, w1)
+ b1
y = tf.nn.softmax(y)
# 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_number
acc = total_correct / total_number
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(
)
從零開始用TensorFlow搭建卷積神經網路
by 蔣思源 2017年8月29日 14 50 機器之心基於 ahmet taspinar 的博文使用 tensorflow 手動搭建卷積神經網路,並提供所有 和注釋的 jupyter notebook 文件。我們將不僅描述訓練情況,同時還將提供各種背景知識和分析。所有的 和執行結果都已上傳至 gi...
TensorFlow基礎環境搭建(Windows)
本文介紹當前最流行的人工智慧分析框架tensorflow的基礎環境搭建 windows 1 python基礎環境搭建 安裝python3.6 安裝anaconda 安裝jupyter 安裝後anaconda後,直接在命令列工具裡進行安裝即可 pip install jupyter 啟動jupter ...
tensorflow安裝神坑
莫名的,我之前安裝的tensorflow又用不了了,並且不論怎麼重新安裝都會報錯。1.importerror dll load failed 找不到指定的模組。這個錯誤在我不停解除安裝不停重灌中一直存在,直到我在乙個博主安裝細節中找到 這一步網上有很多安裝方法,有pip的,有conda的。但是,大部...