{"id":3522,"date":"2020-06-06T16:16:39","date_gmt":"2020-06-06T08:16:39","guid":{"rendered":"http:\/\/www.sniper97.cn\/?p=3522"},"modified":"2020-06-06T16:16:39","modified_gmt":"2020-06-06T08:16:39","slug":"%e3%80%90%e5%8a%a8%e6%89%8b%e5%ad%a6%e6%b7%b1%e5%ba%a6%e5%ad%a6%e4%b9%a0%e3%80%91%e7%ba%bf%e6%80%a7%e5%9b%9e%e5%bd%92","status":"publish","type":"post","link":"http:\/\/www.sniper97.cn\/index.php\/note\/deep-learning\/deep-learning-in-hand\/3522\/","title":{"rendered":"\u3010\u52a8\u624b\u5b66\u6df1\u5ea6\u5b66\u4e60\u3011\u7ebf\u6027\u56de\u5f52"},"content":{"rendered":"\n<p>\u672c\u8282\u8bb2\u8ff0\u7528tensorflow2\u5b9e\u73b0\u7ebf\u6027\u56de\u5f52\u3002<\/p>\n\n\n<p>\u7b97\u6cd5\u8bb2\u89e3\u53ca\u57fa\u7840\u5b9e\u73b0\u89c1\u3010<a rel=\"noreferrer noopener\" aria-label=\"\u5434\u6069\u8fbe\u673a\u5668\u5b66\u4e60\u2014\u2014\u7ebf\u6027\u56de\u5f52\uff08\u5728\u65b0\u7a97\u53e3\u6253\u5f00\uff09\" href=\"http:\/\/www.sniper97.cn\/index.php\/note\/machine-learning-in-action\/1396\/\" target=\"_blank\">\u5434\u6069\u8fbe\u673a\u5668\u5b66\u4e60\u2014\u2014\u7ebf\u6027\u56de\u5f52<\/a>\u3011<\/p>\n\n\n<p>\u9996\u5148\u5bfc\u5305\uff1a<\/p>\n\n\n<pre class=\"wp-block-preformatted\">import tensorflow as tf\nprint(tf.__version__)\nfrom matplotlib import pyplot as plt\nimport random\n<\/pre>\n\n\n<p>\u8f93\u51fa\uff1a<\/p>\n\n\n<pre class=\"wp-block-preformatted\">2.1.0\n<\/pre>\n\n\n<p>\u7136\u540e\u6211\u4eec\u751f\u6210\u6570\u636e\uff0c\u9996\u5148\u6a21\u62df\u4e00\u4e2a\u771f\u5b9e\u53c2\u6570w\u548cb\uff0c\u7136\u540e\u968f\u673a\u751f\u6210\u4e00\u4e9b\u6570\u636e\u901a\u8fc7\u53c2\u6570\u751f\u6210\u6570\u636e\uff0c\u7136\u540e\u52a0\u4e00\u70b9\u6df7\u6dc6\u3002<\/p>\n\n\n<p>\u8fd9\u91cc\u6211\u4eec\u9009\u75282\u4e2a\u7279\u5f81\uff0c\u751f\u62101000\u4e2a\u6570\u636e\uff0cw\u5206\u522b\u4e3a2\u548c-3.4\uff0cb\u4e3a4.2\u3002<\/p>\n\n\n<pre class=\"wp-block-preformatted\">num_inputs = 2\nnum_examples = 1000\ntrue_w = [2,-3.4]\ntrue_b = 4.2\n# \u751f\u6210\u6807\u51c6\u5dee\u4e3a1\u7684\u8f93\u5165\u6570\u636e\nfeatures = tf.random.normal((num_examples,num_inputs),stddev=1)\nlabels = true_w[0]*features[:,0]+true_w[1]*features[:,1]+true_b\n# \u968f\u673a\u52a0\u4e0a\u6807\u51c6\u5dee\u4e3a0.01\u7684\u566a\u97f3\nlabels += tf.random.normal(labels.shape,stddev=0.01)<\/pre>\n\n\n<p>\u7136\u540e\u6211\u4eec\u8f93\u51fa\u4e00\u4e0b\u7279\u5f81\u548c\u6807\u7b7e\uff1a<\/p>\n\n\n<pre class=\"wp-block-preformatted\">print(features[0],labels[0])\n<\/pre>\n\n\n<p>\u8f93\u51fa\uff1a<\/p>\n\n\n<pre class=\"wp-block-preformatted\">tf.Tensor([ 0.60977983 -0.21984003], shape=(2,), dtype=float32) tf.Tensor(6.182882, shape=(), dtype=float32)\n<\/pre>\n\n\n<p>\u753b\u51fa\u6563\u5217\u70b9\u56fe\uff1a<\/p>\n\n\n<pre class=\"wp-block-preformatted\">def set_figsize(figsize=(3.5,2.5)):\n    plt.rcParams['figure.figsize'] = figsize\nset_figsize()\nplt.scatter(features[:,1],labels,c='r',s=1)\n<\/pre>\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"192\" height=\"137\" src=\"\/wp-content\/uploads\/2020\/06\/image.png\" alt=\"\" class=\"wp-image-3524\"\/><\/figure><\/div>\n\n\n<p>\u5bf9\u6570\u636e\u8fdb\u884c\u5206\u6279\uff0c\u6bcf\u6b21\u8fd4\u56de\u4e00\u4e2a\u6279\u5927\u5c0f\u7684\u6570\u636e\uff0c\u5728\u5206\u5272\u4e4b\u524d\u8981\u8fdb\u884c\u6253\u4e71\uff0c\u5176\u4e2dtf.gather\u662f\u6839\u636eindices\u6765\u5bf9\u539f\u59cb\u6570\u636e\u8fdb\u884c\u5207\u7247\uff1a<\/p>\n\n\n<pre class=\"wp-block-preformatted\">def data_iter(batch_size,features,labels):\n    num_examples = len(features)\n    indices = list(range(num_examples))\n    random.shuffle(indices)\n    for i in range(0,num_examples,batch_size):\n        j = indices[i:min(i+batch_size,num_examples)]\n        # gather \u6839\u636eindices\u5207\u7247\n        yield tf.gather(features,axis=0,indices=j),tf.gather(labels,axis=0,indices=j)\n<\/pre>\n\n\n<p>\u6211\u4eec\u8f93\u51fa\u8bd5\u9a8c\u4e00\u4e0b\uff1a<\/p>\n\n\n<pre class=\"wp-block-preformatted\">batch_size = 64<br \/><br \/>for X,y in data_iter(batch_size,features,labels):<br \/>    print(X,y)<br \/>    break<\/pre>\n\n\n<p>\u8f93\u51fa64\u4e2a\u6570\u636e\uff1a<\/p>\n\n\n<pre class=\"wp-block-preformatted\">tf.Tensor(\n[[-1.568652    1.1892316 ]\n [ 0.02704381 -1.2114034 ]\n [ 0.54140687  0.6874146 ]\n [-0.3238443  -0.7069099 ]\n [ 0.670013    1.0555037 ]\n [ 1.4785416  -0.02862001]\n [-1.5540386  -0.90648144]\n [-2.657925   -0.34048915]\n [-0.13981636  0.45385957]\n [-0.0776669  -0.02562523]\n [ 0.15774341  1.3849018 ]\n [ 0.9904404   0.49320254]\n [-0.5353007   1.9172873 ]\n [-0.7673046   1.2029607 ]\n [ 1.9484698  -0.25718805]\n [-1.5775664   0.23291822]\n [ 1.2565771  -0.39332908]\n [ 0.5235608  -0.60813963]\n [ 0.2633382  -1.6159766 ]\n [ 1.8978524   1.3576044 ]\n [-0.40452728  0.02824024]\n [-0.6108405   0.1997418 ]\n [ 0.28169724 -1.2480029 ]\n [ 1.1958692   2.5761182 ]\n [-0.01832403  0.2854444 ]\n [ 0.02692759 -0.79011744]\n [ 1.9638565   0.14134032]\n [-0.53969157 -1.1126633 ]\n [ 1.3907293  -1.3411927 ]\n [-1.2987695   1.61959   ]\n [-2.0938413  -0.20309015]\n [-0.9750384   0.8229153 ]\n [-1.7626753   0.4005635 ]\n [ 0.22338685 -0.72602   ]\n [-0.21097755 -0.3210915 ]\n [-1.3122041   2.3579533 ]\n [-0.3418174  -1.2656993 ]\n [-1.5983564  -0.02388086]\n [-1.0887327  -0.6083594 ]\n [ 0.16343872 -1.0361065 ]\n [ 0.4365194   1.3847867 ]\n [ 0.2617833   0.9032589 ]\n [ 0.5480683   1.3676795 ]\n [-0.73368275  2.49532   ]\n [-1.5379615   0.891124  ]\n [ 0.20122519 -0.00788717]\n [ 0.5612905  -0.9636846 ]\n [-0.08743163  0.31147835]\n [ 1.6043682   0.913555  ]\n [-1.4654535  -0.648391  ]\n [-0.45734385 -2.094514  ]\n [-0.05061309  0.68695724]\n [-0.05295819  0.1176275 ]\n [ 0.5119573   0.04384377]\n [-0.88304853 -0.26165497]\n [-0.39841247  0.13567868]\n [ 1.6472635   1.2322218 ]\n [-0.1735344   0.5267474 ]\n [-0.8581472   0.30082825]\n [ 0.45566842 -0.07357331]\n [-0.747671   -0.27977103]\n [-0.40926522 -1.5160431 ]\n [ 1.0966959   1.6514026 ]\n [-0.4333734   0.10984586]], shape=(64, 2), dtype=float32) tf.Tensor(\n[-2.9873667   8.377133    2.946247    5.9545803   1.9532868   7.249343\n  4.1806116   0.03477701  2.3633275   4.1365757  -0.18981844  4.5226593\n -3.3917785  -1.4252613   8.998332    0.23443112  8.046925    7.302883\n 10.212007    3.4053535   3.2838557   2.3075964   8.993652   -2.153344\n  3.205419    6.938238    7.631661    6.9013247  11.54775    -3.912147\n  0.70706934 -0.5570358  -0.70196784  7.121228    4.8730345  -6.4330792\n  7.812588    1.0836437   4.1145034   8.063896    0.35680652  1.6736523\n  0.64509416 -5.7431006  -1.9141186   4.6364574   8.593288    2.9628947\n  4.298334    3.4748955  10.410857    1.7619439   3.6892602   5.0799007\n  3.3337908   2.9197962   3.3119173   2.0573657   1.463488    5.371661\n  3.6591358   8.535518    0.78479844  2.942409  ], shape=(64,), dtype=float32)\n<\/pre>\n\n\n<p>\u7136\u540e\u6211\u4eec\u521d\u59cb\u5316\u6211\u4eec\u7684\u53c2\u6570\uff0c\u5c31\u662fw\u548cb<\/p>\n\n\n<pre class=\"wp-block-preformatted\"># \u521d\u59cb\u5316\u53c2\u6570<br \/>w = tf.Variable(tf.random.normal((num_inputs,1),stddev=0.01))<br \/>b = tf.Variable(tf.zeros((1,)))<\/pre>\n\n\n<p>\u5b9a\u4e49\u7ebf\u6027\u4f20\u64ad\u65b9\u6cd5\uff1a<\/p>\n\n\n<pre class=\"wp-block-preformatted\">def linreg(X,w,b):<br \/>    return tf.matmul(X,w)+b<\/pre>\n\n\n<p>\u4ee3\u4ef7\u8ba1\u7b97\u65b9\u6cd5\uff1a<\/p>\n\n\n<pre class=\"wp-block-preformatted\">def squared_loss(y_hat,y):<br \/>    return (y_hat-tf.reshape(y,y_hat.shape))**2\/2<\/pre>\n\n\n<p>\u66f4\u65b0\u53c2\u6570\u65b9\u6cd5\uff1a<\/p>\n\n\n<pre class=\"wp-block-preformatted\">def sgd(params,lr,batch_size,grads):<br \/>    for i,param in enumerate(params):<br \/>        param.assign_sub(lr*grads[i]\/batch_size)<\/pre>\n\n\n<p>\u7136\u540e\u5bf9\u6240\u6709\u6570\u636e\u8fdb\u884c3\u6b21\u8ba1\u7b97\uff0c\u5373epochs=3\uff1a<\/p>\n\n\n<pre class=\"wp-block-preformatted\">lr = 0.03<br \/>num_epochs = 3<br \/>net = linreg<br \/>loss = squared_loss<br \/><br \/>for epoch in range(num_epochs):<br \/>    for X,y in data_iter(batch_size,features,labels):<br \/>        with tf.GradientTape() as t:<br \/>            t.watch([w,b])<br \/>            # \u5b9a\u4e49\u635f\u5931\u51fd\u6570<br \/>            l = loss(net(X,w,b),y)<br \/>        grads = t.gradient(l,[w,b])<br \/>        sgd([w,b],lr,batch_size,grads)<br \/>    train_l = loss(net(features,w,b),labels)<br \/>    print('epoch %d, loss %f'.format(epoch+1,tf.reduce_mean(train_l)))<\/pre>\n\n\n<p>\u6700\u540e\u8f93\u51fa\u7ed3\u679c\uff1a<\/p>\n\n\n<pre class=\"wp-block-preformatted\">print(true_w,w)<br \/>print(true_b,b)<br \/><\/pre>\n\n\n<p>\u8f93\u51fa\uff0c\u53ef\u4ee5\u770b\u52302\u548c-3.4\u5206\u522b\u62df\u5408\u5230\u4e861.6\u548c-2.6\uff0c4.2\u62df\u5408\u5230\u4e863.11\uff1a<\/p>\n\n\n<pre class=\"wp-block-preformatted\">[2, -3.4] &lt;tf.Variable 'Variable:0' shape=(2, 1) dtype=float32, numpy=\narray([[ 1.6446801],\n       [-2.5876393]], dtype=float32)&gt;\n4.2 &lt;tf.Variable 'Variable:0' shape=(1,) dtype=float32, numpy=array([3.159864], dtype=float32)&gt;<\/pre>\n\n\n<p>\u4e0b\u9762\u662f\u4e00\u4e2a\u66f4\u52a0\u7cbe\u7b80\u7684\u5b9e\u73b0\u8fc7\u7a0b\uff0c\u540c\u65f6\u6548\u679c\u4e5f\u66f4\u597d\uff0c\u4f7f\u7528\u4e86tensorflow\u7684\u9ad8\u7ea7\u5c01\u88c5\u2014\u2014keras\u3002<\/p>\n\n\n<p>\u548c\u4e4b\u524d\u4e00\u6837\uff0c\u5148\u5bfc\u5305\uff1a<\/p>\n\n\n<pre class=\"wp-block-preformatted\">import tensorflow as tf\nprint(tf.__version__)\n<\/pre>\n\n\n<p>\u8f93\u51fa\uff1a<\/p>\n\n\n<pre class=\"wp-block-preformatted\">2.1.0\n<\/pre>\n\n\n<p>\u7136\u540e\u751f\u6210\u6570\u636e\uff1a<\/p>\n\n\n<pre class=\"wp-block-preformatted\">num_input = 2\nnum_example = 1000\ntrue_w = [2,-3.4]\ntrue_b = 4.2\nfeatures = tf.random.normal(shape=(num_example,num_input),stddev=1)\nlabels = true_w[0] * features[:,0]+true_w[1]*features[:,1]+true_b\nlabels += tf.random.normal(labels.shape,stddev=0.01)\n<\/pre>\n\n\n<p>\u8fd9\u91cc\u6211\u4eec\u548c\u4e4b\u524d\u4e0d\u4e00\u6837\uff0c\u6211\u4eec\u4f7f\u7528\u5b83tensorflow\u7684dataset\u5bf9\u6570\u636e\u8fdb\u884c\u6253\u5305\uff1a<\/p>\n\n\n<pre class=\"wp-block-preformatted\">from tensorflow import data as tddata\nbatch_size = 10\n# \u5c06\u8bad\u7ec3\u6570\u636e\u7684\u7279\u5f81\u548c\u6807\u7b7e\u7ec4\u5408\ndataset = tddata.Dataset.from_tensor_slices((features,labels))\n# \u968f\u673a\u8bfb\u53d6\u5c0f\u6279\u91cf\ndataset = dataset.shuffle(buffer_size=num_example)\ndataset = dataset.batch(batch_size)\ndata_iter = iter(dataset)<\/pre>\n\n\n<p>\u8f93\u51fa\u4e00\u4e0b\u6570\u636e\uff1a<\/p>\n\n\n<pre class=\"wp-block-preformatted\">for (batch,(X, y)) in enumerate(dataset):\n    print(batch,X,y)\n    break\n<\/pre>\n\n\n<p>\u8f93\u51fa\u5982\u4e0b\uff1a<\/p>\n\n\n<pre class=\"wp-block-preformatted\">0 tf.Tensor(\n[[-1.3183944   0.88571453]\n [ 0.5582473   0.6283028 ]\n [ 0.3318851   0.30217335]\n [ 0.5585688   1.625666  ]\n [ 1.3739443  -0.2193088 ]\n [-1.1692793  -1.3866609 ]\n [ 0.76365966  1.0310326 ]\n [-1.7447253   1.4246174 ]\n [-0.4479057  -0.52858967]\n [ 0.6691452  -0.44063178]], shape=(10, 2), dtype=float32) tf.Tensor(\n[-1.4440066   3.1915112   3.8415916  -0.20795591  7.6803966   6.574926\n  2.2208211  -4.1473265   5.0976176   7.0480514 ], shape=(10,), dty<\/pre>\n\n\n<p>\u7136\u540e\u662f\u7f51\u7edc\u7ed3\u6784\u8bbe\u7f6e\u4e0e\u7f51\u7edc\u53c2\u6570\u521d\u59cb\u5316\uff1a<\/p>\n\n\n<pre class=\"wp-block-preformatted\">from tensorflow import keras\nfrom tensorflow import initializers as init\nmodel = keras.Sequential()\nmodel.add(keras.layers.Dense(1,kernel_initializer=init.RandomNormal(stddev=0.01)))\n<\/pre>\n\n\n<p>\u635f\u5931\u51fd\u6570\u5b9a\u4e49\uff1a<\/p>\n\n\n<pre class=\"wp-block-preformatted\">from tensorflow import losses\nloss = losses.MeanSquaredError()\n<\/pre>\n\n\n<p>\u53c2\u6570\u66f4\u65b0\u65b9\u6cd5\u5b9a\u4e49\uff1a<\/p>\n\n\n<pre class=\"wp-block-preformatted\">from tensorflow import optimizers\ntrainer = optimizers.SGD(learning_rate=0.03)\n<\/pre>\n\n\n<p>\u8bad\u7ec3\u8fc7\u7a0b\uff1a<\/p>\n\n\n<pre class=\"wp-block-preformatted\">9<\/pre>\n\n\n<pre class=\"wp-block-preformatted\">num_epochs =  3\nfor epoch in range(1,num_epochs+1):\n    for (batch,(X,y)) in enumerate(dataset):\n        with tf.GradientTape() as t:\n            l = loss(model(X,training=True),y)\n        grads = t.gradient(l, model.trainable_variables)\n        trainer.apply_gradients(zip(grads,model.trainable_variables))\n    l = loss(model(features),labels)\n    print('epoch %d, loss: %f' % (epoch, l))<\/pre>\n\n\n<p>\u6253\u5370\u4e00\u4e0b\u7ed3\u679c\uff0c\u53d1\u73b0\u76f8\u6bd4\u4e0a\u4e00\u4e2a\u7248\u672c\uff0c\u5177\u6709\u66f4\u597d\u7684\u62df\u5408\uff08\u56e0\u4e3a\u4f7f\u7528\u7684\u662f\u5185\u7f6e\u65b9\u6cd5\uff09\uff1a<\/p>\n\n\n<pre class=\"wp-block-preformatted\">true_w,model.get_weights()[0]\n<\/pre>\n\n\n<pre class=\"wp-block-preformatted\">([2, -3.4],\n array([[ 2.0009027],\n        [-3.4000764]], dtype=float32))<\/pre>\n\n\n<pre class=\"wp-block-preformatted\">true_b,model.get_weights()[1]\n<\/pre>\n\n\n<pre class=\"wp-block-preformatted\">(4.2, array([4.2001143], dtype=float32))<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u672c\u8282\u8bb2\u8ff0\u7528tensorflow2\u5b9e\u73b0\u7ebf\u6027\u56de\u5f52\u3002 \u7b97\u6cd5\u8bb2\u89e3\u53ca\u57fa\u7840\u5b9e\u73b0\u89c1\u3010\u5434\u6069\u8fbe\u673a\u5668\u5b66\u4e60\u2014\u2014\u7ebf\u6027\u56de\u5f52\u3011  [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_mi_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[28],"tags":[],"views":5001,"_links":{"self":[{"href":"http:\/\/www.sniper97.cn\/index.php\/wp-json\/wp\/v2\/posts\/3522"}],"collection":[{"href":"http:\/\/www.sniper97.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.sniper97.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.sniper97.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.sniper97.cn\/index.php\/wp-json\/wp\/v2\/comments?post=3522"}],"version-history":[{"count":0,"href":"http:\/\/www.sniper97.cn\/index.php\/wp-json\/wp\/v2\/posts\/3522\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.sniper97.cn\/index.php\/wp-json\/wp\/v2\/media?parent=3522"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.sniper97.cn\/index.php\/wp-json\/wp\/v2\/categories?post=3522"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.sniper97.cn\/index.php\/wp-json\/wp\/v2\/tags?post=3522"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}