自学 tensorflow有一段时间了,陆续看了好几本书,但是因为时间久远问题,看教材决是被卡,很多时候也百度不出个答案来,没办法只能先选条捷径,以后再回来慢慢被 tensorflow的各内部程序吧,要不可真要从入门到放弃咯~~~
这几天在了解 tflearn时,发现tensorlayer,感觉这个做突破口比较好,所以决定开始入坑学起~~
https://download.csdn.net/download/u011276167/10367858 电子版下载在这~~
我用的系统是 windows7和windows10,anaconda, py3.5和py3.6,tensorflow1.8.0~~cpu,tensorlayer1.8.0,电脑很破~~所以训练时都是按最低要求来训练~
http://tensorlayercn.readthedocs.io/zh/latest/ 中文版文档在这~~
http://tensorlayer.readthedocs.io/en/latest/ 英文版文档在这~~
那从教材《一起玩转tensorlayer》的第二章的2.4开始吧~~
import tensorflow as tf
# x = tf.ones([2, 3])
# x = tf.constant([1, 2, 3, 4], shape=[2,2])
# sess = tf.Session()
# a = sess.run(x)
# print(a)
# print(x.get_shape())
# print(x.get_shape().as_list())
# sess = tf.InteractiveSession()
# x = tf.constant([1, 1, 2, 1], shape=[2,2])
# print(sess.run(x))
# y = tf.constant([5, 4, 3], shape=[2,2])
# print(sess.run(y))
# a = sess.run(tf.matmul(x,y))
# print(a)
# # matmul是矩阵行元素乘对应列再相加
# # multiply是矩阵各元素对应位置相乘,要求两矩阵必须同样大小
# b = sess.run(tf.multiply(x,y))
# print(b)
# c = sess.run(x*y)
# print(c)
# x = tf.placeholder(tf.float32, shape=[None, 3], name='x1')
# w = tf.Variable([[1.0, 2.0, 3.0]])
# y = tf.matmul(x, tf.transpose(w))
# w.initializer.run()
# out = sess.run(y, feed_dict={x: [[1.0,2.0,3.0],[1.0,1.0,1.0]]})
# # 1*1+2*2+3*3=14
# print(out)
#
import tensorlayer as tl
X_train, y_train, X_val, y_val, X_test, y_test = tl.files.load_mnist_dataset(shape=[-1,784])
print(X_train.shape, y_train.shape)
print(X_val.shape, y_val.shape)
print(X_test.shape, y_test.shape)
sess = tf.InteractiveSession()
x=tf.placeholder(tf.float32, shape=[None, 784], name='x')
y_=tf.placeholder(tf.int64, shape=[None, ], name='y_')
network = tl.layers.InputLayer(x, name='input')
network = tl.layers.DropoutLayer(network, keep=0.8, name='drop1')
network = tl.layers.DenseLayer(network, 800, tf.nn.relu, name='relu1')
network = tl.layers.DropoutLayer(network, keep=0.5, name='drop2')
network = tl.layers.DenseLayer(network, 800, tf.nn.relu, name='relu2')
network = tl.layers.DropoutLayer(network, keep=0.5, name='drop3')
network = tl.layers.DenseLayer(network, 10, tf.identity, name = 'output')
y = network.outputs
y_op = tf.argmax(tf.nn.softmax(y),1)
cost = tl.cost.cross_entropy(y,y_,name='entropy')
correct_prediction = tf.equal(tf.argmax(y,1),y_)
acc = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
train_params = network.all_params
train_op = tf.train.AdamOptimizer(learning_rate=0.0001).minimize(cost, var_list=train_params)
tl.layers.initialize_global_variables(sess)
network.print_params()
network.print_layers()
tl.utils.fit(sess, network, train_op, cost, X_train, y_train, x, y_,
acc=acc, batch_size=600, n_epoch=500, print_freq=25,
X_val=X_val, y_val=y_val, eval_train=False)
tl.utils.test(sess, network, acc, X_test, y_test, x, y_, batch_size=None, cost=cost)
tl.files.save_npz(network.all_params , name='model.npz')
sess.close()
输出如下:这里MINST数据集会自动下载的,我这是之前下载过,所以没显示出来
[TL] Load or Download MNIST > data\mnist
[TL] data\mnist\train-images-idx3-ubyte.gz
[TL] data\mnist\t10k-images-idx3-ubyte.gz
(50000, 784) (50000,)
(10000, 784) (10000,)
(10000, 784) (10000,)
[TL] InputLayer input: (?, 784)
[TL] DropoutLayer drop1: keep:0.800000 is_fix:False
[TL] DenseLayer relu1: 800 relu
[TL] DropoutLayer drop2: keep:0.500000 is_fix:False
[TL] DenseLayer relu2: 800 relu
[TL] DropoutLayer drop3: keep:0.500000 is_fix:False
[TL] DenseLayer output: 10 identity
[TL] param 0: relu1/W:0 (784, 800) float32_ref (mean: 7.646034646313637e-05, median: 7.379607268376276e-05, std: 0.08799773454666138)
[TL] param 1: relu1/b:0 (800,) float32_ref (mean: 0.0 , median: 0.0 , std: 0.0 )
[TL] param 2: relu2/W:0 (800, 800) float32_ref (mean: 9.20881939237006e-06, median: 0.00012011492071906105, std: 0.08787252753973007)
[TL] param 3: relu2/b:0 (800,) float32_ref (mean: 0.0 , median: 0.0 , std: 0.0 )
[TL] param 4: output/W:0 (800, 10) float32_ref (mean: 0.0022586837876588106, median: 0.001404931303113699, std: 0.08736483752727509)
[TL] param 5: output/b:0 (10,) float32_ref (mean: 0.0 , median: 0.0 , std: 0.0 )
[TL] num of params: 1276810
[TL] layer 0: drop1/mul:0 (?, 784) float32
[TL] layer 1: relu1/Relu:0 (?, 800) float32
[TL] layer 2: drop2/mul:0 (?, 800) float32
[TL] layer 3: relu2/Relu:0 (?, 800) float32
[TL] layer 4: drop3/mul:0 (?, 800) float32
[TL] layer 5: output/Identity:0 (?, 10) float32
[TL] Start training the network ...
[TL] Epoch 1 of 500 took 13.302852s
[TL] val loss: 0.593346
[TL] val acc: 0.806667
[TL] Epoch 25 of 500 took 13.056165s
[TL] val loss: 0.152897
[TL] val acc: 0.958646
[TL] Epoch 50 of 500 took 14.379701s
[TL] val loss: 0.103411
[TL] val acc: 0.971458
[TL] Epoch 75 of 500 took 13.523496s
[TL] val loss: 0.081572
[TL] val acc: 0.976250
[TL] Epoch 100 of 500 took 15.612597s
[TL] val loss: 0.069241
[TL] val acc: 0.979896
[TL] Epoch 125 of 500 took 15.480233s
[TL] val loss: 0.064424
[TL] val acc: 0.980729
[TL] Epoch 150 of 500 took 15.531174s
[TL] val loss: 0.061136
[TL] val acc: 0.982292
[TL] Epoch 175 of 500 took 14.595490s
[TL] val loss: 0.057786
[TL] val acc: 0.983229
[TL] Epoch 200 of 500 took 14.600940s
[TL] val loss: 0.055876
[TL] val acc: 0.983854
[TL] Epoch 225 of 500 took 14.647618s
[TL] val loss: 0.055536
[TL] val acc: 0.983542
[TL] Epoch 250 of 500 took 14.723672s
[TL] val loss: 0.054065
[TL] val acc: 0.984375
[TL] Epoch 275 of 500 took 14.559059s
[TL] val loss: 0.053935
[TL] val acc: 0.984896
[TL] Epoch 300 of 500 took 14.629505s
[TL] val loss: 0.053766
[TL] val acc: 0.985833
[TL] Epoch 325 of 500 took 14.594821s
[TL] val loss: 0.055415
[TL] val acc: 0.984583
[TL] Epoch 350 of 500 took 14.608483s
[TL] val loss: 0.053293
[TL] val acc: 0.985313
[TL] Epoch 375 of 500 took 14.612728s
[TL] val loss: 0.054767
[TL] val acc: 0.984896
[TL] Epoch 400 of 500 took 14.606371s
[TL] val loss: 0.056266
[TL] val acc: 0.985208
[TL] Epoch 425 of 500 took 14.596624s
[TL] val loss: 0.055784
[TL] val acc: 0.985833
[TL] Epoch 450 of 500 took 14.591042s
[TL] val loss: 0.054977
[TL] val acc: 0.985521
[TL] Epoch 475 of 500 took 14.641674s
[TL] val loss: 0.054210
[TL] val acc: 0.986146
[TL] Epoch 500 of 500 took 14.607706s
[TL] val loss: 0.054516
[TL] val acc: 0.985729
[TL] Total training time: 7349.427401s
[TL] Start testing the network ...
[TL] test loss: 0.047028
[TL] test acc: 0.987600
[TL] [*] model.npz saved
[Finished in 7355.9s]
这里有个小坑,tl.layers.initialize_global_variables(sess) 我第一次运行时报错,说是要用原始的tf.global_variables_initializer(),改成原始的tf.global_variables_initializer()后,报错消失,但是network.print_params()和network.print_layers()没反应,没有输出任何东东~~
经过一番折腾,发现我用pip install tensorlayer时anaconda自动帮我安上1.9.1版本的tensorlayer了,而我用的tensorflow是1.8.0的,然后我想pip install tensorlayer==1.8.0时外源又不行了~~果断用 pip install tensorlayer==1.8.0 -i http://pypi.doubanio.com/simple/, 但是又不行,说是http不安全,然后百度了下说是加了个s 就成功了~~
pip install tensorlayer==1.8.0 -i https://pypi.doubanio.com/simple/
豆瓣源真好,真全~~
运行了很久,然后在 py文件的同目录生成了model 文件,并存了下载来的MINST数据集,最后我用的是sublime运行的,网上有打补丁的方法,但是我没改快捷键,因为默认的F7运行键就很好用了,要想中途停下来就:工具》取消编译就行了
PS:差点漏了个重要的:
tl.utils.fit(sess, network, train_op, cost, X_train, y_train, x, y_,
acc=acc, batch_size=600, n_epoch=500, print_freq=25,
X_val=X_val, y_val=y_val, eval_train=False,tensorboard=True)
这里加个tensorboard=True是可以生成EVENT的,然后也可以用tensorboard看调参过程