TensorFlow入门-CNN

在深度学习的路上,从头开始了解一下各项技术。本人是DL小白,连续记录我自己看的一些东西,大家可以互相交流。

之前写过一些关于深度学习的简单概念,最近这段时间会看一些代码相关的东西。

本文参考:

https://blog.csdn.net/cxmscb/article/details/71023576

一、前言

以sklearn包中的python手写数字digits数据集为数据标本,基于tensorflow的CNN模型。

本篇重点在于卷积层、池化层的处理,具体的内容都标记在代码中了,直接上代码吧。

二、代码实现

import tensorflow as tf
import numpy as np
from sklearn.datasets import load_digits
from sklearn.preprocessing import MinMaxScaler, OneHotEncoder
#从sklearn中导入digits手写数据集
digits = load_digits()
#print(digits.keys())
#astype() 转换数据类型,把图片转换为float32
X_train = digits.data.astype(np.float32)
Y_train = digits.target.astype(np.float32).reshape(-1, 1)
"""""
打印出来发现,数据值一样,确保X_train为float32类型
print(digits.data)
print(X_train)

reshape(-1, 1),是根据第二个1(列数)来确定第一个行数的值
把target转换为一个列
print(digits.target.shape) --> (1797, )
print(Y_train.shape)       --> (1797, 1)

sklearn-prepprocessing 预处理数据的方法
将特征数据的分布调整为标准正态分布,高斯分布(均值为0,方差为1)
MinMaxScaler()给定一个最大值和最小值
将数据规范在[Min, Max]之间,特征中最小值为Min,最大值为Max,区间缩放,返回值为缩放到[0, 1]区间的数据
"""""
scaler = MinMaxScaler() #函数变量
X_train = scaler.fit_transform(X_train)
X = X_train.reshape(-1, 8, 8, 1)

Y = OneHotEncoder().fit_transform(Y_train).todense()
#todense()函数是什么意思?

batch_size = 8
def generatebatch(X,Y,n_examples, batch_size):
    for batch_i in range(n_examples // batch_size):
        start = batch_i*batch_size
        end = start + batch_size
        batch_xs = X[start:end]
        batch_ys = Y[start:end]
        yield batch_xs, batch_ys # 生成每一个batch

tf.reset_default_graph()
tf_X = tf.placeholder(tf.float32, [None, 8, 8, 1])
tf_Y = tf.placeholder(tf.float32, [None, 10])

#parameters
conv_filter_W1 = tf.Variable(tf.random_normal([3, 3, 1, 10]))
conv_filter_b1 = tf.Variable(tf.random_normal([10]))
#卷积层1
relu_feature_maps1 = tf.nn.relu(tf.nn.conv2d(tf_X, conv_filter_W1, strides = [1, 1, 1, 1], padding = 'SAME') + conv_filter_b1)
#池化层1
max_pool1 = tf.nn.max_pool(relu_feature_maps1, ksize = [1, 3, 3, 1], strides = [1, 2, 2, 1], padding = 'SAME')
#卷积层2
conv_filter_W2 = tf.Variable(tf.random_normal([3, 3, 10, 5]))
conv_filter_b2 = tf.Variable(tf.random_normal([5]))
conv_out2 = tf.nn.conv2d(max_pool1, conv_filter_W2, strides = [1, 2, 2, 1], padding = 'SAME') + conv_filter_b2
#BN层和激活层
#tf.nn.moments()在axis上求均值和方差
batch_mean, batch_var = tf.nn.moments(conv_out2, [0, 1, 2], keep_dims = True)
"""""
其中offset一般初始化为0,scale初始化为1,另外offset、scale的shape与mean相同
variance_epsilon这个参数设为一个很小的数就行,比如0.001。
"""
shift = tf.Variable(tf.zeros([5]))
scale = tf.Variable(tf.ones([5]))
epsilon = 1e-3
BN_out = tf.nn.batch_normalization(conv_out2, batch_mean, batch_var, shift, scale, epsilon)
relu_BN_maps2 = tf.nn.relu(BN_out)

#池化层2
max_pool2 = tf.nn.max_pool(relu_BN_maps2, ksize = [1, 3, 3, 1], strides = [1, 2, 2, 1], padding = 'SAME')
#全连接层
flatten = tf.reshape(max_pool2, [-1, 2*2*5])
fc_W1 = tf.Variable(tf.random_normal([2*2*5, 50]))
fc_b1 = tf.Variable(tf.random_normal([50]))
fc_out1 = tf.nn.relu(tf.matmul(flatten, fc_W1) + fc_b1)
#输出层
out_W1 = tf.Variable(tf.random_normal([50, 10]))
out_b1 = tf.Variable(tf.random_normal([10]))
pred = tf.nn.softmax(tf.matmul(fc_out1, out_W1) + out_b1)

#代价函数
loss = -tf.reduce_mean(tf_Y*tf.log(tf.clip_by_value(pred, 1e-11, 1.0)))
train_optimizer = tf.train.AdamOptimizer(1e-3).minimize(loss)
#预测准确率
y_pred = tf.arg_max(pred, 1)
bool_pred = tf.equal(tf.argmax(tf_Y, 1), y_pred)
accuracy = tf.reduce_mean(tf.cast(bool_pred, tf.float32))

with tf.Session() as sess:
    init = tf.global_variables_initializer()
    sess.run(init)

    for epoch in range(100):
        for batch_xs, batch_ys in generatebatch(X, Y, Y.shape[0], batch_size):
           sess.run(train_optimizer, feed_dict={tf_X: batch_xs, tf_Y: batch_ys})

        if(epoch%100 == 0):
            res = sess.run(accuracy, feed_dict = {tf_X: X, tf_Y: Y})
            print(epoch, res)
    #针对一批样本预测
    res_ypred = y_pred.eval(feed_dict = {tf_X: X, tf_Y: Y}).flatten()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值