import tensorflow as tf # NumPy是一個科學計算工具包,這里通過numpy工具包生成模擬數據集 from numpy.random import RandomState # 定義一批訓練數據batch大小 batch_size = 8 w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1)) w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1)) # 在shape的一個維度上使用None可以方便使用不同batch的大小。 # 在訓練時將數據分成比較小的batch,但在測試時,可以一次性使用所有數據。 # 當數據比較小時這樣比較方便測試數據,但當數據量大時,大的batch會導致內存溢出 x = tf.placeholder(tf.float32, shape=(None, 2), name="x-input") y_ = tf.placeholder(tf.float32, shape=(None, 1), name="y-input") # 定義前項傳播的過程 a = tf.matmul(x, w1) y = tf.matmul(a, w2) # 定義損失函數和和反向傳播算法 y = tf.sigmoid(y) # 定義損失函數,刻畫預測值與真實值之間的差距 cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0)) + (1 - y_) * tf.log(tf.clip_by_value(1-y, 1e-10, 1.0))) train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy) # 通過隨機數生成一個模擬數據集 rdm = RandomState(1) dataset_size = 128 X = rdm.rand(dataset_size, 2) # 定義規則來給出樣本標簽,在這里x1 + x2 < 1被認為正樣本 # 而其他為負樣本。和TensorFlow游樂場不同,這里使用0代表負樣本,1代表正 # 大部分解決分類問題的神經網絡都會采用0,1表示 Y = [[int(x1 + x2 < 1)] for (x1, x2) in X] # 定義會話 with tf.Session() as sess: # 定義初始化變量 init_op = tf.global_variables_initializer() sess.run(init_op) print(sess.run(w1)) print(sess.run(w2)) # 設定訓練輪數 STEPS = 10000 for i in range(STEPS): # 每次選取batch_size個樣本進行訓練 start = (i * batch_size) % dataset_size end = min(start + batch_size, dataset_size) # 通過選取的樣本訓練神經網絡並更新參數 sess.run(train_step, feed_dict={x: X[start:end], y_: Y[start:end]}) if i % 1000 == 0: # 每隔一段時間計算所有數據上的交叉熵並輸出 total_cross_entropy = sess.run(cross_entropy, feed_dict={x: X, y_: Y}) print("After %d training step(s), cross entropy on all data is %g" % (i, total_cross_entropy)) print(sess.run(w1)) print(sess.run(w2)) """ 輸出: [[-0.8113182 1.4845988 0.06532937] [-2.4427042 0.0992484 0.5912243 ]] [[-0.8113182 ] [ 1.4845988 ] [ 0.06532937]] After 0 training step(s), cross entropy on all data is 1.89805 After 1000 training step(s), cross entropy on all data is 0.655075 After 2000 training step(s), cross entropy on all data is 0.626172 After 3000 training step(s), cross entropy on all data is 0.615096 After 4000 training step(s), cross entropy on all data is 0.610309 After 5000 training step(s), cross entropy on all data is 0.608679 After 6000 training step(s), cross entropy on all data is 0.608231 After 7000 training step(s), cross entropy on all data is 0.608114 After 8000 training step(s), cross entropy on all data is 0.608088 After 9000 training step(s), cross entropy on all data is 0.608081 [[ 0.08782727 0.51795506 1.7529843 ] [-2.2372198 -0.20525953 1.0744455 ]] [[-0.49522772] [ 0.40552336] [-1.0061253 ]] """