tensorflow練習12:利用圖片預測年齡與性別
深度學習在影象分類領域已經取得長足地進展,以下以一個有趣的例子來學習影象分類演算法。
訓練資料:人臉資料集(連結: https://pan.baidu.com/s/1gf4FQD1 密碼: ddkx)
環境:tensorflow,python3.5
1)載入資料集並對資料進行處理
age_table = ['(0, 2)', '(4, 6)', '(8, 12)', '(15, 20)', '(25, 32)', '(38, 43)', '(48, 53)', '(60, 100)']
sex_table = ['f', 'm']#性別
# AGE==True 訓練年齡模型,False,訓練行性別模型
AGE = True
if AGE == True:
labels_size = len(age_table) # 年齡
else:
labels_size = len(sex_table) # 性別
face_set_fold = 'AdienceBenchmarkOfUnfilteredFacesForGenderAndAgeClassification'
#載入圖片目錄檔案
fold_0_data = os.path.join(face_set_fold, 'fold_0_data.txt')
fold_1_data = os.path.join(face_set_fold, 'fold_1_data.txt' )
fold_2_data = os.path.join(face_set_fold, 'fold_2_data.txt')
fold_3_data = os.path.join(face_set_fold, 'fold_3_data.txt')
fold_4_data = os.path.join(face_set_fold, 'fold_4_data.txt')
face_image_set = os.path.join(face_set_fold, 'aligned')#圖片資料庫
def parse_data(fold_x_data):
data_set = []
with open(fold_x_data, 'r' ) as f:
line_one = True
for line in f:
tmp = []
if line_one == True:
line_one = False
continue#捨棄第一行標題
tmp.append(line.split('\t')[0])#user_id
tmp.append(line.split('\t')[1])#xx.jpg
tmp.append(line.split('\t')[3])#年齡
tmp.append(line.split('\t')[4])#性別
file_path = os.path.join(face_image_set, tmp[0])#目錄級
if os.path.exists(file_path):
#返回所有匹配的檔案路徑列表。它只有一個引數pathname,定義了檔案路徑匹配規則
filenames = glob.glob(file_path + "/*.jpg")#返回所有圖片的列表
for filename in filenames:
if tmp[1] in filename:
break
if AGE == True:
if tmp[2] in age_table:
data_set.append([filename, age_table.index(tmp[2])])#檔名,年齡表
else:
if tmp[3] in sex_table:
data_set.append([filename, sex_table.index(tmp[3])])
return data_set#返回資料集
data_set_0 = parse_data(fold_0_data)
data_set_1 = parse_data(fold_1_data)
data_set_2 = parse_data(fold_2_data)
data_set_3 = parse_data(fold_3_data)
data_set_4 = parse_data(fold_4_data)
data_set = data_set_0 + data_set_1 + data_set_2 + data_set_3 + data_set_4#資料集串聯
shuffle(data_set)#隨機排序
根據檔案中的資料,處理得到需要用到的資料;(注:解壓aligned檔案)
2)定義資料結構
# 縮放影象大小
IMAGE_WIDTH = 227
IMAGE_HEIGHT = 227
# 讀取縮放影象
jpg_data = tf.placeholder(dtype=tf.string)
docode_jpg = tf.image.decode_jpeg(jpg_data, channels=3)
#Returns:A `Tensor` of type `uint8`. 3-D with shape `[height, width, channels]`.
resize = tf.image.resize_images(docode_jpg, [IMAGE_HEIGHT, IMAGE_WIDTH])
resize = tf.cast(resize, tf.uint8) / 255
def resize_image(file_name):
with tf.gfile.FastGFile(file_name, 'r') as f:
image_data = f.read()
with tf.Session() as sess:
image = sess.run(resize, feed_dict={jpg_data: image_data})
return image
pointer = 0#指標指示
def get_next_batch(data_set, batch_size=128):#獲取一個batch資料
global pointer
batch_x = []
batch_y = []
for i in range(batch_size):
batch_x.append(resize_image(data_set[pointer][0]))
batch_y.append(data_set[pointer][1])
pointer += 1
return batch_x, batch_y
batch_size = 128
num_batch = len(data_set) // batch_size
X = tf.placeholder(dtype=tf.float32, shape=[batch_size, IMAGE_HEIGHT, IMAGE_WIDTH, 3])
Y = tf.placeholder(dtype=tf.int32, shape=[batch_size])
3)定義網路結構,3層卷積、池化,2層卷積;
def conv_net(nlabels, images, pkeep=1.0):
"""定義卷積網路的結構"""
weights_regularizer = tf.contrib.layers.l2_regularizer(0.0005)
# 預設變數域為con_net
with tf.variable_scope("conv_net", "conv_net", [images]) as scope:
# 給卷積層和全連線層設定預設引數
with tf.contrib.slim.arg_scope([convolution2d, fully_connected], weights_regularizer=weights_regularizer,
biases_initializer=tf.constant_initializer(1.),
weights_initializer=tf.random_normal_initializer(stddev=0.005), trainable=True):
# 給卷積層權重設定預設引數
with tf.contrib.slim.arg_scope([convolution2d],
weights_initializer=tf.random_normal_initializer(stddev=0.01)):
#卷積層1:濾波器(7*7),步長4,輸出濾波器數:96
conv1 = convolution2d(images, 96, [7, 7], [4, 4], padding='VALID',
biases_initializer=tf.constant_initializer(0.), scope='conv1')
pool1 = max_pool2d(conv1, 3, 2, padding='VALID', scope='pool1')
norm1 = tf.nn.local_response_normalization(pool1, 5, alpha=0.0001, beta=0.75, name='norm1')
#卷積層2:
conv2 = convolution2d(norm1, 256, [5, 5], [1, 1], padding='SAME', scope='conv2')
pool2 = max_pool2d(conv2, 3, 2, padding='VALID', scope='pool2')
norm2 = tf.nn.local_response_normalization(pool2, 5, alpha=0.0001, beta=0.75, name='norm2')
#卷積層3:
conv3 = convolution2d(norm2, 384, [3, 3], [1, 1], biases_initializer=tf.constant_initializer(0.),
padding='SAME', scope='conv3')
pool3 = max_pool2d(conv3, 3, 2, padding='VALID', scope='pool3')
flat = tf.reshape(pool3, [-1, 384 * 6 * 6], name='reshape')
#兩層全連線
full1 = fully_connected(flat, 512, scope='full1')
drop1 = tf.nn.dropout(full1, pkeep, name='drop1')
full2 = fully_connected(drop1, 512, scope='full2')
drop2 = tf.nn.dropout(full2, pkeep, name='drop2')
#輸出域
with tf.variable_scope('output') as scope:
weights = tf.Variable(tf.random_normal([512, nlabels], mean=0.0, stddev=0.01), name='weights')
biases = tf.Variable(tf.constant(0.0, shape=[nlabels], dtype=tf.float32), name='biases')
output = tf.add(tf.matmul(drop2, weights), biases, name=scope.name)
return output
4)訓練
def training():#訓練
logits = conv_net(labels_size, X)#經過卷積、池化、全連線後的結果
def optimizer(eta, loss_fn):
global_step = tf.Variable(0, trainable=False)
optz = lambda lr: tf.train.MomentumOptimizer(lr, 0.9)
lr_decay_fn = lambda lr, global_step: tf.train.exponential_decay(lr, global_step, 100, 0.97, staircase=True)
return tf.contrib.layers.optimize_loss(loss_fn, global_step, eta, optz, clip_gradients=4.,
learning_rate_decay_fn=lr_decay_fn)
def loss(logits, labels):
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels)
cross_entropy_mean = tf.reduce_mean(cross_entropy)
regularization_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
total_loss = cross_entropy_mean + 0.01 * sum(regularization_losses)
loss_averages = tf.train.ExponentialMovingAverage(0.9)
loss_averages_op = loss_averages.apply([cross_entropy_mean] + [total_loss])
with tf.control_dependencies([loss_averages_op]):
total_loss = tf.identity(total_loss)
return total_loss
# loss
total_loss = loss(logits, Y)
# optimizer
train_op = optimizer(0.001, total_loss)
saver = tf.train.Saver(tf.global_variables())
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print("開始訓練:")
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
global pointer
epoch = 0
while epoch < 51:#50個epoch
pointer = 0
for batch in range(num_batch):
batch_x, batch_y = get_next_batch(data_set, batch_size)#獲取資料
_, loss_value = sess.run([train_op, total_loss], feed_dict={X: batch_x, Y: batch_y})
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
print("%d th epoch %d th batch loss:%f "%(epoch+1, batch+1, loss_value))
i = 1
if epoch % 5 == 0:
print("第%d次儲存模型" % i)
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
saver.save(sess, './age.module' if AGE == True else './sex.module', global_step=epoch)
epoch += 1
i += 1
training()
相關推薦
tensorflow練習12:利用圖片預測年齡與性別
深度學習在影象分類領域已經取得長足地進展,以下以一個有趣的例子來學習影象分類演算法。 訓練資料:人臉資料集(連結: https://pan.baidu.com/s/1gf4FQD1 密碼: ddkx) 環境:tensorflow,python3.5 1)載
實測 《Tensorflow實例:利用LSTM預測股票每日最高價(二)》的結果
直接 batch Language name 開盤 num 完全 tor 運行 近期股市行情牛轉熊,大盤一直下探!由3200跌到了2700,想必很多人被深套了。這時想起人工智能能否預測股市趨勢?RNN能否起作用? 這時便從網上找下教程,發現網上有個例子,
人工智慧深度學習-Tensorflow例項:利用LSTM預測股票每日最高價
LSTM全稱長短期記憶人工神經網路(Long-Short Term Memory),是對RNN的變種。舉個例子,假設我們試著去預測“I grew up in France… 中間隔了好多好多字……I speak fluent __”下劃線的詞。我們拍腦瓜子想這個詞應該是French。對於迴圈神經網路
Tensorflow例項:利用LSTM預測股票每日最高價(二)
根據股票歷史資料中的最低價、最高價、開盤價、收盤價、交易量、交易額、跌漲幅等因素,對下一日股票最高價進行預測。 實驗用到的資料長這個樣子: label是標籤y,也就是下一日的最高價。列C——I為輸入特徵。 本例項用前5800個數據做訓練資料。
Tensorflow例項:利用LSTM預測股票每日最高價(一)
這一部分主要涉及迴圈神經網路的理論,講的可能會比較簡略。 什麼是RNN RNN全稱迴圈神經網路(Recurrent Neural Networks),是用來處理序列資料的。在傳統的神經網路模型中,從輸入層到隱含層再到輸出層,層與層之間是全連線的,每層之間
區塊鏈鼻祖比特幣之12:(SPV) 節點與Bloom 過濾器
(SPV) 節點 並非所有的節點都有能力儲存完整的區塊鏈。許多比特幣客戶端被設計成運行在空間和功率受限的裝置上,如智慧電話、平板電腦、嵌入式系統等。對於這樣的裝置,通過簡化的支付驗證(SPV)的方式可以使它們在不必儲存完整區塊鏈的情況下進行工作。這種型別的
從零開始Desire HD刷機指南——第十一章:利用第三方recovery備份與還原系統
原文地址:http://blog.sina.com.cn/s/blog_722b43a60100q5jf.html 本教程由symen 原創,轉載請註明出處。 上一章我們介紹瞭如何把第三方recovery 刷進手機,本章來介紹如何利用它來備份與還原系統。 先來看一下
Keras之MLP:利用MLP【Input(8)→(12)(relu)→O(sigmoid+二元交叉)】模型實現預測新資料(利用糖尿病資料集的八個特徵預測一個0或1)
Keras之MLP:利用MLP【Input(8)→(12)(relu)→O(sigmoid+二元交叉)】模型實現預測新資料(利用糖尿病資料集的八個特徵預測一個0或1) 輸出結果 實現程式碼 # load and prepare the dataset
Keras之MLPR:利用MLPR演算法(3to1【視窗法】+【Input(3)→(12+8)(relu)→O(mse)】)實現根據歷史航空旅客數量資料集(時間序列資料)預測下月乘客數量問題
Keras之MLPR:利用MLPR演算法(3to1【視窗法】+【Input(3)→(12+8)(relu)→O(mse)】)實現根據歷史航空旅客數量資料集(時間序列資料)預測下月乘客數量問題 輸出結果 設計思路
Keras之DNN:利用DNN【Input(8)→(12+8)(relu)→O(sigmoid)】模型實現預測新資料(利用糖尿病資料集的八個特徵預測一個0或1)
Keras之DNN:利用DNN【Input(8)→(12+8)(relu)→O(sigmoid)】模型實現預測新資料(利用糖尿病資料集的八個特徵預測一個0或1) 輸出結果 [1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0,
Keras之DNN:利用DNN演算法【Input(8)→12+8(relu)→O(sigmoid)】利用糖尿病資料集訓練、評估模型(利用糖尿病資料集中的八個引數特徵預測一個0或1結果)
Keras之DNN:利用DNN演算法【Input(8)→12+8(relu)→O(sigmoid)】利用糖尿病資料集訓練、評估模型(利用糖尿病資料集中的八個引數特徵預測一個0或1結果) 輸出結果 設計思路 實現程式碼 1、 2、
tensorflow 12:雙隱層+softmax迴歸實現mnist圖片識別之二
概述 tensorflow的自帶例程用兩個檔案演示了“全連線層+softmax迴歸”實現mnist圖片識別的功能。一個檔案是mnist.py,在之前一篇文章《tensorflow 11:雙隱層+softmax迴歸實現mnist圖片識別》已經介紹過了。不過mnis
ML之PLiR之LARS:利用LARS演算法求解ElasticNet迴歸型別(包括類別編碼+屬性重要程度排序)問題(實數值年齡預測)
ML之PLiR之LARS:利用LARS演算法求解ElasticNet迴歸型別(包括類別編碼+屬性重要程度排序)問題(實數值年齡預測) 輸出結果 設計思路 核心程式碼 xCoded = [] for row i
EL之GB(GBM):利用GB對(鮑魚物理指標)迴歸(性別屬性編碼)問題(整數值年齡預測)建模
EL之GB(GBM):利用GB對(鮑魚物理指標)迴歸(性別屬性編碼)問題(整數值年齡預測)建模 輸出結果 設計思路 核心程式碼 #T1 nEst = 2000 depth = 5 learnRate = 0.003 maxFeatures
Windows64位安裝GPU版TensorFlow 0.12,Power Shell下輸入:安裝Tensorflow的全教程
unless 設置環境變量 log api err 化工 查看 aid nbsp 推薦使用powershell,只需要在cmd指令窗口輸入powershell即可 下載64位Python3.5(一定要3.5!!)可以通過Python 3.5 from python.org
Android異步載入學習筆記之四:利用緩存優化網絡載入圖片及ListView載入優化
角度 thread 下午 出發 easy code cat height back 假設不做不論什麽處理。直接用網絡載入圖片在網速快的情況下可能沒什麽不好的感覺。可是假設使用移動流量或是網絡不好的時候。問題就來了,要麽用戶會抱怨流量使用太多。要麽抱怨圖
SVM:利用SVM算法實現手寫圖片識別(數據集50000張圖片)—Jason niu
圖片 clas 識別 fit ati ade loader test part import mnist_loader # Third-party libraries from sklearn import svm def svm_baseline():
TF:利用TF的train.Saver載入曾經訓練好的variables(W、b)以供預測新的數據
oat tor range mage true com 技術 int num import tensorflow as tf import numpy as np W = tf.Variable(np.arange(6).reshape((2, 3)), dtype=t
DL之perceptron:利用perceptron感知機對股票實現預測
DL之perceptron:利用perceptron感知機對股票實現預測 import numpy as np import operator import os # create a dataset which contains 3 samples with 2 classes def
JS練習:切換圖片
程式碼: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script>