CNN实战:tensorflow训练mnist手写数字识别

用tensorflow可以轻松的搭建卷积神经网络,layer层api的加入更是方便了整个过程。本文以mnist手写数字识别的训练为例,轻松挑战99%准确率。

准备

首先,导入必要的库和函数。

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

载入mnist数据,注意这里input_data.read_data_sets的参数reshape=Fales,以保留3维的图片数据,否则图片会被变换为向量。由于是黑白图片,所以这里的颜色通道数为1。这里image的shape为(None,28,28,1)。

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True, reshape=False)

定义数据流图结构

定义变量。这里我们不需要再定义各层网络的权重和偏差,这便是layers的方便之处,它们会被自动创建。

x = tf.placeholder(tf.float32, shape=(None,28,28,1))
y_ = tf.placeholder(tf.float32, shape=(None,10))
istrain = tf.placeholder(tf.bool) # dropout时参数用到

然后开始定义卷积网络结构,激活函数采用relu,这里使用卷积层⇒池化层⇒卷积层⇒池化层。 继续阅读“CNN实战:tensorflow训练mnist手写数字识别”

如何读取Google开源的audioset的tfrecord文件

谷歌前段时间开源的audioset可以说是音频届的imagenet了,拥有200多万的音频和500多个分类(截止2017年3月)。官方下载地址点这里。官方提供了两种数据获取方式:一种是提供音频字典信息,由自己下载相关youtube音频;另一种以1Hz采样的128维音频特征数据,tfrecord格式数据。

那么,这些tfrecord格式的数据便可按下面的方式来读取。

import numpy as np
import tensorflow as tf

sess = tf.InteractiveSession()

filename = '2a.tfrecord'
filename_queue = tf.train.string_input_producer([filename])  # 添加队列
reader = tf.TFRecordReader()
_, serialized_example = reader.read(filename_queue)
contexts, features = tf.parse_single_sequence_example(
serialized_example,
context_features={
"video_id": tf.FixedLenFeature([], tf.string),
"labels": tf.VarLenFeature(tf.int64)
},
sequence_features={
'audio_embedding': tf.FixedLenSequenceFeature([], dtype=tf.string)
})

embedding_0 = tf.decode_raw(features['audio_embedding'], tf.uint8)  # 转换格式
embedding = tf.reshape(embedding_0, [10, 128])  # 指定embedding的结构
batch = tf.train.shuffle_batch(
[embedding], batch_size=30, capacity=2000, min_after_dequeue=1000)

tf.global_variables_initializer().run()  # 初始化变量
tf.train.start_queue_runners(sess=sess)  # 启动队列

print(embedding_0.eval().shape)  # 验证embedding的shape
audio_feature = batch.eval()  # 读取数据

用tensorflow解码图片

用深度学习进行图片识别时,往往需要将各原始图片转换为相同的尺寸,并且数字化。其实,tensorflow本身就能非常方便地实现这个过程。

import tensorflow as tf

"""读取图片文件"""
file1 = tf.read_file('image.jpg')

"""解码图片,png格式用tf.image.decode_png,
channels=3表示RGB,1表示灰度"""
image = tf.image.decode_jpeg(file1, channels=3)

"""调整图片大小,size=[new_height, new_width]"""
image = tf.image.resize_images(image, size=[32,32])

"""转化图片转化为float32类型,并缩放到[0,1]之间,
也可使用 tf.cast(image, tf.float32)/255(一般图片类型最大值为255)"""
image = tf.image.convert_image_dtype(image, tf.float32)

# 在会话中运行
sess = tf.Session()
sess.run(image)

tensorflow实现mnist手写数字识别

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

# 载入数据
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

# 定义tensorflow结构
x = tf.placeholder(tf.float32, [None, 784])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y_ = tf.placeholder(tf.float32, [None, 10])

"""激励函数softmax和loss函数交叉熵"""
y = tf.nn.softmax(tf.matmul(x, W) + b)
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), axis=1))

"""或者用tf内置的loss函数,注意tf.nn.softmax_cross_entropy_with_logits已内置softmax变换"""
# y_l = tf.matmul(x,W) + b
# cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_l))

"""用梯度下降提升"""
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

"""初始化全部变量"""
init = tf.global_variables_initializer()

# 训练
sess = tf.Session()
sess.run(init)

"""进行600次更新,SGD每批次输入100个样本"""
for i in range(600):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
# 评估模型,每20步打印准确率
if i % 20 == 0:
"""tf.argmax返回最大值的index,tf.equal比较是否相等"""
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
"""转换为数字并求平均,如[True,False,False,True]转化为[1,0,0,1],平均值为0.5"""
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
"""用测试数据计算,并打印准确率"""
print(i, sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

sess.close()

tensorflow的GPU配置

以Ubuntu系统为例:

1、首先安装Cuda Toolkit
下载地址:https://developer.nvidia.com/cuda-downloads
安装步骤:

# Install repository meta-data:
sudo dpkg -i cuda-repo-<distro>_<version>_<architecture>.deb
# Update the Apt repository cache:
sudo apt-get update
# Install CUDA:
sudo apt-get install cuda

2、安装cuDNN
下载地址:https://developer.nvidia.com/cudnn
配置步骤(假设Cuda toolkit安装在/usr/local/cuda):

tar xvzf cudnn-8.0-linux-x64-v5.1-ga.tgz
sudo cp -P cuda/include/cudnn.h /usr/local/cuda/include
sudo cp -P cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

3、安装其他依赖

sudo apt-get install libcupti-dev

4、安装支持gpu版本的tensorflow

pip install tensorflow-gpu

贝叶斯算法进行负面微博识别的python实现

负面微博的识别,实际上可以理解为是文本分类的问题,正面还是负面微博?贝叶斯是文本分类的常用算法,对于中文文本来说,分词也是必不可少的步骤。python可以非常方便的实现,以下是具体过程及代码。

# -*- coding: utf-8 -*-
from __future__ import division
from __future__ import unicode_literals
import pandas as pd
import numpy as np
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.cross_validation import cross_val_predict
from sklearn.metrics import classification_report
from sklearn.pipeline import Pipeline
from random import shuffle
from sklearn.externals import joblib

# 读取标记数据-----------
# 微博文本在weibo.xlsx文件中,一行一条微博。
# 字段content为微博内容文本,
# 字段isaction为微博标识,1为负面微博,否则为0
s1 = pd.read_excel('weibo.xlsx')
s1['isaction'] = s1['isaction'].fillna(0)

# 分类数量
# 查看微博类别分布,发现数据不平衡,负面微博占比不到1/10
print(s1.groupby('isaction').size())

# 不平衡数据过采样处理----------
# 处理不平衡数据,以提升模型质量
s1_1 = s1[s1['isaction'] == 1]
# 将正类复制扩大至4份,不宜过大,否则容易过拟合
for n in range(0, 3):
s1 = pd.concat([s1, s1_1], ignore_index=True)

# 打乱数据-------------
r = np.arange(0, s1.shape[0])
shuffle(r)
s1 = s1.iloc[r, :]

#分词,使用jieba分词----------
s1['class'] = s1['content'].apply(lambda x: " ".join(jieba.cut(x)))

#词袋-----------------------
# 首先统计词频,再进行Tf-idf转换,TfidfVectorizer()封装了这两步
vectorizer = TfidfVectorizer()
vec = vectorizer.fit(s1['class'])
t1 = vec.transform(s1['class'])

# 算法-------------------
# 朴素贝叶斯常见的有高斯贝叶斯、多项式贝叶斯、伯努利贝叶斯,这里显然多项式贝叶斯更合适
nb = MultinomialNB()

# 训练及评估------------
# 这里简化处理,仅通过5折交叉验证。
# 在数据量足够的情况下,还是建议将数据集分为训练集、验证集和测试集,仅在最后检验时使用测试集
# 调节算法的alpha值,并通过循环自动评估
for n in np.arange(0.1, 1.1, 0.1):
pre = cross_val_predict(
nb.set_params(alpha=n), t1.toarray(), s1['isaction'], cv=5, n_jobs=-1)
print(nb.alpha)
print(classification_report(s1['isaction'], pre))

# 生成最终模型管道-----------
# 经过验证,alpha=0.6时效果最好,用这个参数对全部数据进行训练,生成最终模型
nb = MultinomialNB(alpha=0.6)
nb.fit(t1.toarray(), s1['isaction'])
vec_nb = Pipeline([('vec', vec), ('nb', nb)])

# 保存模型管道,下次可以直接载入使用-------
joblib.dump(vec_nb, 'vec_nb.pkl')

如何开始设计微博舆情监控系统

舆情监控对于企业来说,至少有如下三个作用:
1、了解用户的关注点;
2、了解行业热点及竞品动态;
3、快速呈现企业的负面消息,并了解原因,以便快速处理;

大体来说,舆情系统构建的流程包括:数据收集、数据处理、舆情分析、结果呈现。下面以微博信息挖掘为例,快速说明一下舆情系统的构建步骤,每一个步骤内容都有很多学问,这里仅抛砖引玉。

首先,定义问题。微博上时常有对其公司的负面消息,需要对其进行有效地回复以处理。但是,之前人工在网上逐条排查的方式,不仅较消耗人力,而且时而完成处理的时间较晚,造成负面的进一步传播。于是,我们希望能将负面微博自动识别,并将结果第一时间提供给运营或客服团队。

继续阅读“如何开始设计微博舆情监控系统”

R语言实现随机森林建模的实例

问题,用户注册七天内,通过用户的浏览行为判断用户是否会付费?

输入变量:
pv(浏览量)、hotdays(活跃天数)、time(活跃时长)、aciton(关键动作数)

目标:
ispay(是否付费)

R程序过程:

# 读取数据
a <- read.delim("~/rwork/data")

# 数据详情如下
str(a)

221003shttxxq5hzh55gtx

 

# 随机森林建模
tree<-randomForest(as.factor(ispay)~.,data=a)

pr<-predict(tree, newdata=a)

table(a$ispay,pr,
dnn=c("Actual", "Predicted"))

继续阅读“R语言实现随机森林建模的实例”