windows下使用tensorflow简单实现CNN

来源:互联网 发布:台湾庄园知乎 编辑:程序博客网 时间:2024/06/06 04:00

一般情况下,tensorflow都会安装在Linux服务器上,方便模型的训练。但是我们想要学习tensorflow或者本地调试tensorflow,windows下的开发还是更方便舒服一些,下面介绍一下windows下使用tensorflow,及用tensorflow简单实现CNN的方法。

1、windows安装tensorflow
1)首先安装python
目前tensorflow1.2版本需要安装python3.5以上64位才能支持,可以从官网找合适的版本下载,我这里安装的python3.5.2。
2)最简单的安装tensorflow步骤,在cmd下输入命令
python -m pip install tensorflow
等待安装完成。
3)进入python,输入import tensorflow as tf 回车判断是否安装成功。

2、简单实现CNN
首先整体实现见如下代码:

#coding=utf-8import tensorflow as tf#import datafrom tensorflow.examples.tutorials.mnist import input_datamnist = input_data.read_data_sets('MNIST_data/',one_hot=True)#model parameteriters = 1000batch_size = 128drop_prob = 0.5learning_rate = 0.001#inputx = tf.placeholder("float", [None,784])y = tf.placeholder('float', [None,10])#model variableweights = {    #convolution layer 1,28*28*1卷积后变成24*24*32    'conv_w1' : tf.Variable(tf.random_normal([5,5,1,32])),    'conv_b1' : tf.Variable(tf.random_normal([32])),    #convolution layer 2,池化并卷积后7*7*64    'conv_w2' : tf.Variable(tf.random_normal([5,5,32,64])),    'conv_b2' : tf.Variable(tf.random_normal([64])),    #全连接层相当于加上输出只有两层,由于数据集太小,增加全连接层后发现已经难以训练了。    #full connection layer 1    'conn_w1' : tf.Variable(tf.random_normal([7*7*64,512])),    'conn_b1' : tf.Variable(tf.random_normal([512])),    #full connection layer 2    'conn_w2' : tf.Variable(tf.random_normal([512,10])),    'conn_b2' : tf.Variable(tf.random_normal([10])),    #full connection layer 3#     'conn_w3' : tf.Variable(tf.random_normal([512,128])),#     'conn_b3' : tf.Variable(tf.random_normal([128])),    #output layer 4#     'conn_w4' : tf.Variable(tf.random_normal([128,10])),#     'conn_b4' : tf.Variable(tf.random_normal([10])),    }def conv2d(x,w,b):    '''卷积和relu操作'''    '''x为输入tensor,由四维组成,分别为[一个batch的数量, height, width, 图像通道数];过滤器也为四维tensor,分别为[height,width,图像通道数,卷积核个数];striders对应输入各个维度上的滑动步长'''    xw = tf.nn.conv2d(x, w, strides=[1,1,1,1],padding='SAME')    xwb = tf.nn.bias_add(xw, b)    return tf.nn.relu(xwb)def max_pool(x,k=2):    '''最大池化操作'''    return tf.nn.max_pool(x, ksize=[1,k,k,1], strides=[1,k,k,1],padding='SAME')def conv_network(x,weights,drop_prob):    '''卷积神经网整体流程'''    #将输入转换成卷积输入    x = tf.reshape(x, [-1,28,28,1])    #送入第一层卷积    conv1 = conv2d(x, weights['conv_w1'], weights['conv_b1'])    pool1 = max_pool(conv1, 2)    #第二层卷积    conv2 = conv2d(pool1, weights['conv_w2'], weights['conv_b2'])    pool2 = max_pool(conv2, 2)    #将池化输出reshape后送入全连接层    conn1 = tf.reshape(pool2,[-1,7*7*64])    conn1 = tf.nn.relu(tf.add(tf.matmul(conn1,weights['conn_w1']),weights['conn_b1']))    conn1 = tf.nn.dropout(conn1, keep_prob=drop_prob)#     conn2 = tf.nn.relu(tf.add(tf.matmul(conn1,weights['conn_w2']),weights['conn_b2']))#     conn2 = tf.nn.dropout(conn2, keep_prob=drop_prob)#     #     conn3 = tf.nn.relu(tf.add(tf.matmul(conn2,weights['conn_w3']),weights['conn_b3']))#     conn3 = tf.nn.dropout(conn3, keep_prob=drop_prob)    out = tf.add(tf.matmul(conn1,weights['conn_w2']),weights['conn_b2'])    return outpred = conv_network(x, weights, drop_prob)loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=pred))optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss) init = tf.global_variables_initializer()with tf.Session() as session:    session.run(init)    for iter in range(iters):        batch_x,batch_y = mnist.train.next_batch(batch_size)        _,cost = session.run([optimizer,loss],feed_dict={x:batch_x,y:batch_y})        print("iter:",iter,"cost:",cost)    accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.arg_max(pred, 1), tf.arg_max(y,1)),'float'))    accuracy = accuracy.eval(feed_dict={x:mnist.test.images,y:mnist.test.labels})    print("accuarcy:",accuracy)