新入门,安装anaconda后,设置好python运行环境,按照前辈的指引,输入第一个神经网络训练:正弦拟合。
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
def gen_data():
x = np.linspace(-np.pi,np.pi,100)
x = np.reshape(x,(len(x),1)) #重新将x变换为(100,1)的二维数组
y = np.sin(x)
return x,y
INPUT_NODE=1
HIDDEN_NODE=50
OUTPUT_NODE=1
LEARNING_RATE=0.001
def inference(input_tensor):
with tf.name_scope('Layer-1'):
weight = tf.Variable(tf.truncated_normal(shape=[INPUT_NODE,HIDDEN_NODE],stddev=0.1,dtype=tf.float32),name='weight')
#创建第一层的权重变量,(1,50)
bias = tf.Variable(tf.constant(0,dtype=tf.float32,shape=[HIDDEN_NODE]))
#设置偏置值
l1 = tf.nn.relu(tf.nn.xw_plus_b(input_tensor,weight,bias))
#tf.nn.xw_plus_b(x,w,bias)= x * w + bias
with tf.name_scope('Layer-2'):
weight = tf.Variable(tf.truncated_normal(shape=[HIDDEN_NODE,OUTPUT_NODE],stddev=0.1,dtype=tf.float32),name='weight')
bias = tf.Variable(tf.constant(0,dtype=tf.float32,shape=[OUTPUT_NODE]))
l2 = tf.nn.xw_plus_b(l1,weight,bias)
return l2
def train():
x = tf.placeholder(dtype=tf.float32,shape=[None,INPUT_NODE],name='x-input')
y_ = tf.placeholder(dtype=tf.float32,shape=[None,OUTPUT_NODE],name='y-input')
global_step = tf.Variable(0,trainable=False)
logits = inference(x)
loss = tf.reduce_mean(tf.square(y_-logits)) #均方差
train_step = tf.train.GradientDescentOptimizer(LEARNING_RATE).minimize(loss,global_step=global_step)
train_x,train_y = gen_data()
np.random.seed(200)
shuffle_index = np.random.permutation(train_x.shape[0])
shuffled_x = train_x[shuffle_index]
shuffled_y = train_y[shuffle_index]
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot(train_x,train_y,lw=5,c='r')
plt.ion()
plt.show()
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(5000000):
feed_dic = {x:shuffled_x,y_:shuffled_y}
_,train_loss = sess.run([train_step,loss],feed_dict=feed_dic)
if (i+1)%1000 == 0:
print('loss at train data: ',train_loss)
try:
ax.lines.remove(lines[0])
except:
pass
y_pre = sess.run(logits,feed_dict={x:train_x})
lines = ax.plot(train_x,y_pre,c='black')
plt.pause(0.1)
if __name__ == '__main__':
train()
运行程序,出错:AttributeError: module 'tensorflow' has no attribute 'placeholder'
一番查找,原因是电脑的tensorflow是2.0版本,程序是基于1.0的版本。
解决办法:
将
import tensorflow as tf
用以下两句代替:
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
完美运行!
附上tensorflow 2.0相较1.x的变化:
许多API在tensorflow 2.0中消失或移动。一些主要的变化包括删除tf.app
、tf.flags
和tf.logging
,转而支持现在开源的absl-py,重新安置tf.contrib
中的项目,并清理主要的 tf.*
命名空间,将不常用的函数移动到像 tf.math
这样的子包中。一些API已被2.0版本等效替换,如tf.summary
, tf.keras.metrics
和tf.keras.optimizers
。
自动应用这些重命名的最简单方法是使用v2升级脚本。
TensorFlow 1.X要求用户通过进行tf.*
API调用,手动将抽象语法树(图形)拼接在一起。然后要求用户通过将一组输出张量和输入张量传递给session.run()
来手动编译抽象语法树。
TensorFlow 2.0 默认Eager execution模式,马上就执行代码(就像Python通常那样),在2.0中,图形和会话应该像实现细节一样。
Eager execution的一个值得注意的地方是不在需要tf.control_dependencies()
,因为所有代码按顺序执行(在tf.function
中,带有副作用的代码按写入的顺序执行)。
TensorFlow 1.X严重依赖于隐式全局命名空间。当你调用tf.Variable()
时,它会被放入默认图形中,保留在那里,即使你忘记了指向它的Python变量。
然后,您可以恢复该tf.Variable
,但前提是您知道它已创建的名称,如果您无法控制变量的创建,这很难做到。结果,各种机制激增,试图帮助用户再次找到他们的变量,并寻找框架来查找用户创建的变量:变量范围、全局集合、辅助方法如tf.get_global_step()
, tf.global_variables_initializer()
、优化器隐式计算所有可训练变量的梯度等等。
TensorFlow 2.0取消了所有这些机制(Variables 2.0 RFC),支持默认机制:跟踪变量!如果你失去了对tf.Variable的追踪,就会垃圾收集回收。
跟踪变量的要求为用户创建了一些额外的工作,但是使用Keras对象(见下文),负担被最小化。
session.run()
调用几乎就像一个函数调用:指定输入和要调用的函数,然后返回一组输出。
在TensorFlow 2.0中,您可以使用tf.function()
来装饰Python函数以将其标记为JIT编译,以便TensorFlow将其作为单个图形运行(Functions 2.0 RFC)。这种机制允许TensorFlow 2.0获得图形模式的所有好处:
# TensorFlow 1.X
outputs = session.run(f(placeholder), feed_dict={placeholder: input})
# TensorFlow 2.0
outputs = f(input)
凭借能够自由穿插Python和TensorFlow代码,我们希望用户能够充分利用Python的表现力。但是可移植的TensorFlow在没有Python解释器的情况下执行-移动端、C++和JS,帮助用户避免在添加 @tf.function
时重写代码,AutoGraph将把Python构造的一个子集转换成它们等效的TensorFlow:
for
/while
-> tf.while_loop
(支持break
和 continue
)if
-> tf.cond
for _ in dataset
-> dataset.reduce
AutoGraph支持控制流的任意嵌套,这使得高效和简洁地实现许多复杂的ML程序成为可能,比如序列模型、强化学习、自定义训练循环等等。