tensorflow实现的一个最基本cnn

原理可以参考

https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/

以及《神经网络与深度学习》

上代码:

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

"""
the cnn we are going to make:
conv?relu?pool?affine?relu?affine?softmax
"""

# ==fc== straightforward
def relu(X):
    return tf.maximum(X, tf.zeros_like(X))

# ==fc== fully connected layer calculator
def affine(X, W, b):
    n = X.get_shape()[0].value # number of samples
    X_flat = tf.reshape(X, [n, -1])
    return tf.matmul(X_flat, W) + b

def flatten(X, window_h, window_w, window_c, out_h, out_w, stride=1, padding=0):
    X_padded = tf.pad(X, [[0, 0], [padding, padding], [padding, padding], [0, 0]])
    windows = []
    for y in range(out_h):
        for x in range(out_w):
            window = tf.slice(X_padded, [0, y * stride, x * stride, 0], [-1, window_h, window_w, -1])
            windows.append(window)
    stacked = tf.stack(windows)  # shape : [out_h, out_w, n, filter_h, filter_w, c]
    return tf.reshape(stacked, [-1, window_c * window_w * window_h])

# ==fc==
def max_pool(X, pool_h, pool_w, padding, stride):
    n, h, w, c = [d.value for d in X.get_shape()]
    out_h = (h + 2 * padding - pool_h) // stride + 1
    out_w = (w + 2 * padding - pool_w) // stride + 1
    X_flat = flatten(X, pool_h, pool_w, c, out_h, out_w, stride, padding)
    pool = tf.reduce_max(tf.reshape(X_flat, [out_h, out_w, n, pool_h * pool_w, c]), axis=3)
    return tf.transpose(pool, [2, 0, 1, 3])

def convolution(X, W, b, padding, stride):
    n, h, w, c = map(lambda d: d.value, X.get_shape())
    filter_h, filter_w, filter_c, filter_n = [d.value for d in W.get_shape()]
    out_h = (h + 2 * padding - filter_h) // stride + 1
    out_w = (w + 2 * padding - filter_w) // stride + 1
    X_flat = flatten(X, filter_h, filter_w, filter_c, out_h, out_w, stride, padding)
    W_flat = tf.reshape(W, [filter_h * filter_w * filter_c, filter_n])
    z = tf.matmul(X_flat, W_flat) + b  # b: 1 X filter_n
    return tf.transpose(tf.reshape(z, [out_h, out_w, n, filter_n]), [2, 0, 1, 3])

def softmax(X):
    X_centered = X - tf.reduce_max(X) # to avoid overflow
    X_exp = tf.exp(X_centered)
    exp_sum = tf.reduce_sum(X_exp, axis=1)
    return tf.transpose(tf.transpose(X_exp) / exp_sum)

def accuracy(network, t):
    t_predict = tf.argmax(network, axis=1)
    t_actual = tf.argmax(t, axis=1)
    return tf.reduce_mean(tf.cast(tf.equal(t_predict, t_actual), tf.float32))

#==fc== load data
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True, reshape=False)
#==fc== set batch size
batch_size = 100
#==fc== get the first batch data
example_X, example_ys = mnist.train.next_batch(batch_size)

# ==fc== create session
session = tf.InteractiveSession()

X = tf.placeholder(‘float‘, [batch_size, 28, 28, 1])
t = tf.placeholder(‘float‘, [batch_size, 10])

filter_h, filter_w, filter_c, filter_n = 5, 5, 1, 30
W1 = tf.Variable(tf.random_normal([filter_h, filter_w, filter_c, filter_n], stddev=0.01))
b1 = tf.Variable(tf.zeros([filter_n]))

conv_layer = convolution(X, W1, b1, padding=2, stride=1)

conv_activation_layer = relu(conv_layer)

pooling_layer = max_pool(conv_activation_layer, pool_h=2, pool_w=2, padding=0, stride=2)

batch_size, pool_output_h, pool_output_w, filter_n = [d.value for d in pooling_layer.get_shape()]

# number of nodes in the hidden layer
hidden_size = 100

W2 = tf.Variable(tf.random_normal([pool_output_h*pool_output_w*filter_n, hidden_size], stddev=0.01))
b2 = tf.Variable(tf.zeros([hidden_size]))

affine_layer1 = affine(pooling_layer, W2, b2)

init = tf.global_variables_initializer()
init.run()
affine_layer1.eval({X:example_X, t:example_ys})[0]

affine_activation_layer1 = relu(affine_layer1)

affine_activation_layer1.eval({X:example_X, t:example_ys})[0]
output_size = 10
W3 = tf.Variable(tf.random_normal([hidden_size, output_size], stddev=0.01))
b3 = tf.Variable(tf.zeros([output_size]))

affine_layer2 = affine(affine_activation_layer1, W3, b3)

init = tf.global_variables_initializer()
init.run()

affine_layer2.eval({X:example_X, t:example_ys})[0]

softmax_layer = softmax(affine_layer2)

softmax_layer.eval({X:example_X, t:example_ys})[0]

def cross_entropy_error(y, t):
    return -tf.reduce_mean(tf.log(tf.reduce_sum(y * t, axis=1)))

loss = cross_entropy_error(softmax_layer, t)

loss.eval({X:example_X, t:example_ys})

learning_rate = 0.1
trainer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)

# number of times to iterate over training data
training_epochs = 2

# number of batches
num_batch = int(mnist.train.num_examples/batch_size)
num_batch

for epoch in range(training_epochs):
    avg_cost = 0
    for _ in range(num_batch):
        train_X, train_ys = mnist.train.next_batch(batch_size)
        trainer.run(feed_dict={X:train_X, t:train_ys})
        avg_cost += loss.eval(feed_dict={X:train_X, t:train_ys}) / num_batch

    print("Epoch:", ‘%04d‘ % (epoch+1), "cost=", "{:.9f}".format(avg_cost), flush=True)

test_x = mnist.test.images[:batch_size]
test_t = mnist.test.labels[:batch_size]

accuracy(softmax_layer, t).eval(feed_dict={X:test_x, t:test_t})

session.close()

  

时间: 2024-10-23 16:54:59

tensorflow实现的一个最基本cnn的相关文章

使用TensorFlow 来实现一个简单的验证码识别过程

本文我们来用 TensorFlow 来实现一个深度学习模型,用来实现验证码识别的过程,这里识别的验证码是图形验证码,首先我们会用标注好的数据来训练一个模型,然后再用模型来实现这个验证码的识别. 1.验证码准备 这里我们使用 python 的 captcha 库来生成即可,这个库默认是没有安装的,所以这里我们需要先安装这个库,另外我们还需要安装 pillow 库 安装好之后,我们就可以用如下代码来生成一个简单的图形验证码 可以看到图中的文字正是我们所定义的内容,这样我们就可以得到一张图片和其对应的

tensorflow训练自己的数据集实现CNN图像分类

利用卷积神经网络训练图像数据分为以下几个步骤 读取图片文件 产生用于训练的批次 定义训练的模型(包括初始化参数,卷积.池化层等参数.网络) 训练 1 读取图片文件 1 def get_files(filename): 2 class_train = [] 3 label_train = [] 4 for train_class in os.listdir(filename): 5 for pic in os.listdir(filename+train_class): 6 class_train

【TensorFlow】一文弄懂CNN中的padding参数

在深度学习的图像识别领域中,我们经常使用卷积神经网络CNN来对图像进行特征提取,当我们使用TensorFlow搭建自己的CNN时,一般会使用TensorFlow中的卷积函数和池化函数来对图像进行卷积和池化操作,而这两种函数中都存在参数padding,该参数的设置很容易引起错误,所以在此总结下. 1.为什么要使用padding 在弄懂padding规则前得先了解拥有padding参数的函数,在TensorFlow中,主要使用tf.nn.conv2d()进行(二维数据)卷积操作,tf.nn.max_

tensorflow 1.0 学习:用CNN进行图像分类

tensorflow升级到1.0之后,增加了一些高级模块: 如tf.layers, tf.metrics, 和tf.losses,使得代码稍微有些简化. 任务:花卉分类 版本:tensorflow 1.0 数据:http://download.tensorflow.org/example_images/flower_photos.tgz 花总共有五类,分别放在5个文件夹下. 闲话不多说,直接上代码,希望大家能看懂:) # -*- coding: utf-8 -*- from skimage im

以horovd的HorovodAllreduceOp为例,学习如何在tensorflow上添加一个新的操作OP

参考: http://www.tensorfly.cn/tfdoc/how_tos/adding_an_op.html 添加新的OP需要3步(下述所有代码在here): 1. 定义 Op 的接口 // 1. 定义 Op 的接口 // REGISTER_OP()向 TensorFlow 系统注册来定义 Op 的接口,该OP就是HorovodAllreduceOp. // 在注册时, 指定 Op 的名称: REGISTER_OP("HorovodAllreduce") // 输入(类型和名

使用TensorFlow动手实现一个Char-RNN

https://blog.csdn.net/thriving_fcl/article/details/72565455 前言 学习RNN的时候很多人应该都有看过Andrej Karpathy写的The Unreasonable Effectiveness of Recurrent Neural Networks,使用基于字符粒度的RNN让机器学会自己生成文本,比如令自己训练的RNN学会写歌词.写代码.写小说.写诗,听着就很新奇. github上虽然已经有实现好的Char RNN,比如 1. ht

用tensorflow神经网络实现一个简易的图片分类器

文章写的不清晰请大家原谅QAQ 这篇文章我们将用 CIFAR-10数据集做一个很简易的图片分类器. 在 CIFAR-10数据集包含了60,000张图片.在此数据集中,有10个不同的类别,每个类别中有6,000个图像.每幅图像的大小为32 x 32像素.虽然这么小的尺寸通常给人类识别正确的类别带来了困难,但它实际上是对计算机模型的简化并且减少了分析图像所需的计算.                                                                CIFA

tensorflow框架学习 (九)—— CNN卷积神经网络的实现

一.卷积神经网络 1.关于卷积神经网络的知识,这里推荐一个博客,可以通过几篇博文来了解卷积神经网络:https://www.cnblogs.com/pinard/category/894694.html 2.关于张量经过卷积与池化后数据各维度大小的变化: 设原图片数据维度为$batch*width*height*channel$:$batch$为图片张数,$width$为图宽,$height$为图高,$channel$为图通道数. 卷积: 设卷积核为$padding*cwidth*cheight

基于卷积神经网络(CNN)的中文垃圾邮件检测

前言 跳过废话,直接看正文 文本分类任务是一个经久不衰的课题,其应用包括垃圾邮件检测.情感分析等. 传统机器学习的做法是先进行特征工程,构建出特征向量后,再将特征向量输入各种分类模型(贝叶斯.SVM.神经网络等)进行分类. 随着深度学习的发展以及RNN.CNN的陆续出现,特征向量的构建将会由网络自动完成,因此我们只要将文本的向量表示输入到网络中就能够完成自动完成特征的构建与分类过程. 就分类任务而言,CNN比RNN更为合适.CNN目前在图像处理方向应用最为广泛,在文本处理上也有一些的应用.本文将