-
偏置偏置偏置
查看全部 -
留痕跡查看全部
-
多分類邏輯斯蒂回歸模型
查看全部 -
1.雖然神經元模型簡單,但是花在數據處理和訓練模型上的時間也不少。在多分類時重用這部分代碼,只要修改模型即可。
2.修改模型(多個神經元(10個)多分類實現邏輯斯蒂回歸):(單層神經網絡:10個神經元)
(做修改的地方)
?for filename in filenames:
????????????data, labels = load_data(filename)
????????????# 不需要在做filter
????????????all_data.append(data)
????????????all_labels.append(labels)
?
# [None], y:label,[0,5,6,3,...]
y = tf.placeholder(tf.int64, [None]) ????
?
# (3072, 10)
w = tf.get_variable('w', [x.get_shape()[-1], 10], ??# 多分類
???????????????????initializer=tf.random_normal_initializer(0, 1)) ??#initializer表示初始化,這里使用正態分布,均值為0,方差為1
# (10, )
b = tf.get_variable('b', [10],
???????????????????initializer=tf.constant_initializer(0.0)) ??# b使用常量初始化
# get_variable表示獲取變量,如果已經定義好了就使用,如果沒有就定義
?
# [None, 3072] * [3072, 10] = [None, 10]
y_ = tf.matmul(x, w) + b
?
# mean square loss
'''
# 因為是多分類,使用softmax
# course:1+e^x
# api:e^x/sum(e^x)
# 歸一化
# p_y:每個樣本都是一個分布,10個值加起來等于1,[[0.01,0.9,...0.03], []...]
p_y = tf.nn.softmax(y_)
# 多分類的loss,可以使用one-hot編碼把y也變成一個分布
# 5 -> [0,0,0,0,0,1,0,0,0,0]
y_one_hot = tf.one_hot(y, 10, dtype=tf.float32)
loss = tf.reduce_mean(tf.square(y_one_hot - p_y)) ??# ?類型不一致需要變換
'''
?
loss = tf.losses.sparse_softmax_cross_entropy(labels=y, logits=y_)
# y_ -> softmax
# y -> one_hot
# loss = ylogy_
?
# 得到的是index,是一個int值
predict = tf.argmax(y_, 1)
# [1, 0, 1, 1, 0, 1,...]
correct_prediction = tf.equal(predict, y) ??# bool
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float64))
3.API不會的時候要學會查文檔。
4.jupyter notebook的一些用法:
查看全部 -
1.# 執行計算圖,首先要初始化變量
init = tf.global_variables_initializer()
batch_size = 20
train_steps = 100000 ???# 因為是一個神經元,所以還是挺快的
test_steps = 100 ?# 20 * 200 = 2000 張圖片
?
# 對于tensorflow來說,在構建好計算圖后,需要開啟一個會話session
# 打開會話之后,就可以執行計算圖了
with tf.Session() as sess:
????sess.run(init)
????for i in range(train_steps):
????????batch_data, batch_labels = train_data.next_batch(batch_size)
????????# 在會話中執行計算圖使用sess.run()方法,如果加了train_op,就說明在這次run中我們就去訓練了,如果沒有,就是在測試模式下
????????# feed_dict:要喂入的數據,因為前面x和y都是placeholder,所以需要輸入數據,x和y應該輸入的是CIFAR-10的數據,分別是圖片數據和label數據
????????# 需要在CIFAR-10數據集上循環遍歷整個數據,使得feed_dict拿到的是不同的數據
????????# 為了達到這種處理模式,我們需要對CIFAR-10的數據集做一些處理
????????loss_val, acc_val, _ = sess.run(
????????????[loss, accuracy, train_op],
????????????feed_dict={x: batch_data, y: batch_labels}) ??
????????# 打印log
????????if (i+1) % 500 == 0:
????????????print('[Train] Step: %d, loss: %4.5f, acc: %4.5f' % (i+1, loss_val, acc_val))
????????if (i+1) % 5000 == 0:
????????????# 因為test不用shuffle,所以遍歷完之后拋出異常,所以需要在遍歷完一次之后重新創建CifarData類
????????????test_data = CifarData(test_filenames, False)
????????????all_test_acc_val = [] ???# 需要做一個總的test上的結果,所以需要把這些結果加起來做平均
????????????for j in range(test_steps):
????????????????test_batch_data, test_batch_labels = test_data.next_batch(batch_size)
????????????????test_acc_val = sess.run([accuracy], feed_dict={x: test_batch_data, y: test_batch_labels})
????????????????all_test_acc_val.append(test_acc_val)
????????????test_acc = np.mean(all_test_acc_val)
????????????print('[Test] Step: %d, acc: %4.5f' % (i+1, test_acc))
????????????# 兩次測試準確率是一樣的,說明沒有學習到什么東西,我們需要做一下改進——》CifarData
2.# 為什么不做歸一化準確率在大約0.5呢?因為它的數值比較大,而且它的數值都在0-1之間,所以導致它的預測會偏向一方或另一方,類似于sigmoid
????????self._data = self._data / 127.5 - 1 ???# 一般來說,我們會把圖像縮放到-1到1之間,所以進行縮放:歸一化
查看全部 -
1.如何執行計算圖:
# 執行計算圖,首先要初始化變量
init = tf.global_variable_initializer()
# 對于tensorflow來說,在構建好計算圖后,需要開啟一個會話session
# 打開會話之后,就可以執行計算圖了
with tf.Session() as sess:
?????# 在會話中執行計算圖使用sess.run()方法,如果加了train_op,就說明在這次run中我們就去訓練了,如果沒有,就是在測試模式下
????# feed_dict:要喂入的數據,因為前面x和y都是placeholder,所以需要輸入數據,x和y應該輸入的是CIFAR-10的數據,分別是圖片數據和label數據
????# 需要在CIFAR-10數據集上循環遍歷整個數據,使得feed_dict拿到的是不同的數據
????# 為了達到這種處理模式,我們需要對CIFAR-10的數據集做一些處理
sess.run([loss, accuracy, train_op], feed_dict={x: }) ???
?
# CIFAR-10數據處理的方法
class CifarData:
????# 初始化:filenames,文件名說明對于訓練數據集和測試數據集是分開的
????# need_shuffle:對于訓練集來說,在訓練的時候,過完一遍數據之后,需要shuffle一下數據,就是使得數據更加散亂,散亂代表數據之間沒有依賴關系,使得泛化能力更強,這是機器學習中一個常用的概念
????# 對于測試集來說,因為不需要訓練,所以不需要shuffle
????def __init__(self, filenames, need_shuffle):
????????# 把數據讀進來
????????all_data = []
????????all_labels = []
????????for filename in filenames:
????????????data, labels = load_data(filename)
????????????# 因為我們要做的是一個二分類的問題,所以我們只用CIFAR-10的0和1兩個分類,在這里需要做一個filter
????????????# 因為data和labels的數目是一樣的,所以我們把它們打包到一起
????????????for item, label in zip(data, labels):
????????????????# 如果類別是0,1的話,就把數據和label放進來
????????????????if label in [0, 1]:
????????????????????all_data.append(item)
????????????????????all_labels.append(label)
????????# 把最后的值合并并且轉化為numpy的矩陣
????????self._data = np.vstack(all_data) ????# 從縱向上把數據合并到一起,因為all_data定義是一個一個向量
????????self._labels = np.hstack(all_labels) ?# 從橫向上合并到一起,因為label實際上是一個一維向量
????????# 測試
????????print(self._data.shape)
????????print(self._labels.shape)
????
????????self._num_examples = self._data.shape[0] ?# 數量
????????self._need_shuffle = need_shuffle ??# shuffle開關
????????self._indicator = 0 ??# 表示訓練集已經遍歷到哪個位置了
????????if self._need_shuffle:
????????????self._shuffle_data()
????
????# 因為all_data和all_labels都是numpy的數據結構,所以我們可以用numpy的方法來做
????def _shuffle_data(self):
????????# np.random.permutation這個函數會做一個混排,從0到_num_examples,如[0, 1, 2, 3, 4, 5] -> [5, 3, 2, 4, 0, 1]
????????p = np.random.permutation(self._num_examples)
????????# p只是得到一個排列,需要把數據放進來
????????# _data和_labels應該做一樣的shuffle,否則會錯亂
????????self._data = self._data[p]
????????self._labels = self._labels[p]
????????
????def next_batch(self, batch_size):
????????'''return batch_size examples as a batch.'''
????????end_indicator = self._indicator + batch_size ?# 對應于_indicator,這個表示結束位置
????????if end_indicator > self._num_examples:
????????????if self._need_shuffle:
????????????????self._shuffle_data()
????????????????self._indicator = 0
????????????????end_indicator = batch_size
????????????else:
????????????????raise Exception('have no more examples')
????????# 當end_indicator=batch_size時,如果還比_num_examples大,就需要拋出異常了
????????if end_indicator > self._num_examples:
????????????raise Exception('batch size is larger than all examples')
????????batch_data = self._data[self._indicator: end_indicator] ??# 需要把這個范圍內的數據放到結果中
????????batch_labels = self._labels[self._indicator: end_indicator]
????????self._indicator = end_indicator
????????return batch_data, batch_labels
?
train_filenames = [os.path.join(CIFAR_DIR, 'data_batch_%d' % i) for i in range(1,6)]
test_filenames = [os.path.join(CIFAR_DIR, 'test_batch')]
?
train_data = CifarData(train_filenames, True)
查看全部 -
1.# 為了使函數具有更好的泛化能力,定義一個load_data
# 用于從pickle文件將數據讀取進來
def load_data(filename):
????'''read data from data file.'''
????with open(filename, 'rb') as f:
????????data = cPickle.load(f, encoding='bytes')
????????return data[b'data'], data[b'labels']
?
# 先搭建tensorflow計算圖,再執行
x = tf.placeholder(tf.float32, [None, 3072]) ????# None表示可變性
# [None]
y = tf.placeholder(tf.int64, [None]) ????
?
# (3072, 1)
w = tf.get_variable('w', [x.get_shape()[-1], 1], ??# 因為是二分類,所以只有一個輸出結果,定義為1
???????????????????initializer=tf.random_normal_initializer(0, 1)) ??#initializer表示初始化,這里使用正態分布,均值為0,方差為1
# (1, )
b = tf.get_variable('b', [1],
???????????????????initializer=tf.constant_initializer(0.0)) ??# b使用常量初始化
# get_variable表示獲取變量,如果已經定義好了就使用,如果沒有就定義
?
# [None, 3072] * [3072, 1] = [None, 1]
y_ = tf.matmul(x, w) + b
# [None, 1]
p_y_1 = tf.nn.sigmoid(y_) ??# 概率值
# 因為y維度不一樣,所以需要進行一下reshape
# [None, 1]
y_reshaped = tf.reshape(y, (-1, 1))
y_reshaped_float = tf.cast(y_reshaped, tf.float32)
?
# 用平方差作為損失函數
loss = tf.reduce_mean(tf.square(y_reshaped_float - p_y_1)) ??# ?類型不一致需要變換
?
predict = p_y_1 > 0.5 ???# true:1 ??false:0
# [1, 0, 1, 1, 0, 1,...]
correct_prediction = tf.equal(tf.cast(predict, tf.int64), y_reshaped) ??# bool
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float64))
?
# 定義梯度下降的方法
with tf.name_scope('train_op'):
????train_op = tf.train.AdamOptimizer(1e-3).minimize(loss) ???# 最小化loss,到這里,計算圖構建完成
查看全部 -
1.?神經元的Tensorflow實現:
使用的數據集是:CIFAR-10
The CIFAR-10 dataset consists of 60000 32x32 colour images in 10 classes, with 6000 images per class. There are 50000 training images and 10000 test images.?
?
CIFAR-10文件里是python版本的文件,所以它們是pickle的數據格式。如果想要檢查里面的文件格式是什么,需要導入cPickle,因為里面的數據使用numpy存的,所以需要導入numpy。
2.jupyter notebook可以使用tab鍵補全變量名。
3.加載數據集:
import _pickle as cPickleimport numpy as np
import os
?
CIFAR_DIR = './cifar-10-batches-py'
print(os.listdir(CIFAR_DIR))
?
with open(os.path.join(CIFAR_DIR, 'data_batch_1'), 'rb') as f:
????data = cPickle.load(f, encoding='bytes')
????print(type(data))
????print(data.keys())
????print(type(data[b'data']))
????print(type(data[b'labels']))
????print(type(data[b'batch_label']))
????print(type(data[b'filenames']))
????print(data[b'data'].shape)
????print(data[b'data'][0:2])
????print(data[b'labels'][0:2])
????print(data[b'batch_label'])
????print(data[b'filenames'][0:2])
????
# 32 * 32 = 1024 * 3 = 3072
# RR-GG-BB = 3072
?
image_arr = data[b'data'][100]
image_arr = image_arr.reshape((3, 32, 32)) ???# 32 32 3 三通道不一致,所以需要再做一下變換,如果解析的時候順序不對,那么報錯
image_arr = image_arr.transpose((1, 2, 0)) ???# 把1,2位置上的往前放,把0位置上的放在最后,如果通道順序不對,那么圖片的方向會發生變化
?
import matplotlib.pyplot as plt ?????# 顯示圖像的庫
from matplotlib.pyplot import imshow
%matplotlib inline ?????# 這樣可以直接顯示在notebook上,而不是再打開一個另外的框
?
imshow(image_arr) ???# 顯示圖片
查看全部 -
1.?如何調整神經網絡使得目標函數最小呢?在這里,我們不能像解方程一樣神經網絡參數解出來,找到最優參數,為什么呢?第一個因為現在的參數數目眾多,求解起來會非常的耗時;第二點是因為約束條件是數據,就是說我們要在數據集上調整參數使得目標函數最小,但是對于很多的機器學習應用來說,它的數據是變化的,比如說很多應用都采集不同的數據,每天都有增加,今天數據集上的最優參數可能到明天就不是最優了,所以導致我們不能用直接求解的方式。那么如何求呢?
下山算法:找到方向,走一步。
神經網絡中有類似的算法,叫做梯度下降算法。
在這個過程中,影響最大的參數是α,這是一個預先設定好的值,當然可以在訓練過程中不斷去調整,但這不是學習出來的,而是人為設置的。它的大小完完全全影響著整個網絡的學習程度:
2 Tensorflow介紹:
Google Brain的第二代機器學習框架
開源社區活躍
可擴展性好,在分布式下支持的特別好,可以很輕松地用tensorflow擴展到多臺機器上,一機一卡擴展到一機多卡或者多機多卡這樣的情況
API健全,對用戶友好
3.?計算圖模型:
為什么要講計算圖模型呢?因為它和求解神經網絡是有關系的的。神經網絡的結構是定義好的,但是它的輸入x是用戶自己產生的,所以我們在定義神經網絡的時候并不知道數據是什么,我們要在定義好神經網絡之后才可以把數據輸入進來,才可以求解,去調整神經網絡參數,使神經網絡可以符合這個數據,所以這是tensorflow使用計算圖模型的一個基礎。
查看全部 -
1.?多分類邏輯斯底回歸模型:——多個神經元
?
一個神經元需要一個W,兩個神經元需要兩個W,所以由向量擴展成矩陣。
2.?多分類問題比二分類問題具有更廣泛的適用性。
?
?
3.?多分類和二分類的邏輯斯蒂回歸模型也可以被認為是神經網絡。
4.?如何調整神經網絡可以使神經網絡學到數據中的規律?
目標函數:衡量對數據的擬合程度,在機器學習領域中通常也被稱為損失函數。舉例:
?
(1)平方差損失
(2)交叉熵損失
?
神經網絡訓練:調整參數使模型在訓練集上的損失函數最小。
查看全部 -
1.?邏輯斯底回歸模型在深度學習出現之前是最賺錢的一個算法。為什么最賺錢呢?因為百度、谷歌的主要現金業務廣告點擊率預估在深度學習出現之前就用的這個模型,所以說是最賺錢的。
2.?神經元——最小的神經網絡
?
?
如上圖所示,W和b定義的是一個分類線或分類面,看下圖:
?
3.二分類邏輯斯底回歸模型:
查看全部 -
1.?機器學習是什么——無序數據轉化為價值的方法
機器學習價值——從數據中抽取規律,并用來預測未來
2.?機器學習應用舉例:
分類問題——圖像識別、垃圾郵件識別
回歸問題——股價預測、房價預測
(分類問題給出的是一個label,而回歸問題給出的是一個實數)
排序問題——點擊率預估、推薦
生成問題——圖像生成、圖像風格轉換、圖像文字描述生成
3.?機器學習應用流程:
?
4.?.機器學習崗位職責:
數據處理(采集+去噪)
模型訓練(特征+模型)
模型評估與優化(MSE、F1-Score、AUC+調參)
模型應用(A/B測試)
5.
?
6.深度學習與機器學習:
機器學習是實現人工智能的方法。
深度學習是實現機器學習算法的技術。深度學習的算法實際上可以用機器學習其他算法實現,但是深度學習可以結合大數據使算法達到更好的效果,這是其他算法不能達到的。
7.?深度學習算法集合:
卷積神經網絡:圖像生成、圖像分類等
循環神經網絡:用來處理不定長數據的。不定長數據指的是輸入的長度是不一樣的。比如說它可以是文本數據,比如說一個文本分類問題。
(循環神經網絡在NLP領域使用的比較廣泛,卷積神經網絡在CV領域使用的比較廣泛)
自動編碼器
稀疏編碼
深度信念網絡、限制波爾茲曼機
深度學習+強化學習=深度強化學習(交叉領域):alpha-go等
8.?深度學習進展:
圖像分類:IMAGENET比賽
機器翻譯:循環神經網絡加了attention
圖像生成:轉換,上色可以幫助二次元漫畫家上色、字體、圖像特性化
AlphaGo:CNN
查看全部 -
梯度下降法
學習率相當于步長
查看全部 -
單個神經元->sigmod(激活函數)->二分類邏輯斯蒂回歸模型
多輸出神經元->softmax->多分類邏輯斯蒂回歸模型
目標函數:衡量對數據的擬合程度(損失)
神經網絡訓練目的:調整參數,使模型在訓練集上的損失函數最小
查看全部 -
機器學習是什么:無序數據轉化為價值的方法
機器學習價值:從數據中抽取規律,并用來預測未來
深度學習是機器學習的一個子方向
機器學習是實現人工智能的方法
深度學習是實現機器學習算法的技術
深度學習算法集合:
????????卷積神經網絡(CNN)
????????循環神經網絡(處理不定長數據)
????????自動編碼器、稀疏編碼、深度信念網絡、限制玻爾茲曼機
查看全部
舉報