tensorflow 2.0,神经网络:正弦拟合,AttributeError: module 'tensorflow' has no attribute 'placeholder'错误

新入门,安装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的变化:

1. 主要变化的简要总结

1.1. API清理

许多API在tensorflow 2.0中消失或移动。一些主要的变化包括删除tf.apptf.flagstf.logging ,转而支持现在开源的absl-py,重新安置tf.contrib中的项目,并清理主要的 tf.*命名空间,将不常用的函数移动到像 tf.math这样的子包中。一些API已被2.0版本等效替换,如tf.summary, tf.keras.metricstf.keras.optimizers
自动应用这些重命名的最简单方法是使用v2升级脚本

1.2. Eager execution

TensorFlow 1.X要求用户通过进行tf.* API调用,手动将抽象语法树(图形)拼接在一起。然后要求用户通过将一组输出张量和输入张量传递给session.run()来手动编译抽象语法树。
TensorFlow 2.0 默认Eager execution模式,马上就执行代码(就像Python通常那样),在2.0中,图形和会话应该像实现细节一样。

Eager execution的一个值得注意的地方是不在需要tf.control_dependencies() ,因为所有代码按顺序执行(在tf.function中,带有副作用的代码按写入的顺序执行)。

1.3. 没有更多的全局变量

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对象(见下文),负担被最小化。

1.4. Functions, not sessions

session.run()调用几乎就像一个函数调用:指定输入和要调用的函数,然后返回一组输出。
在TensorFlow 2.0中,您可以使用tf.function() 来装饰Python函数以将其标记为JIT编译,以便TensorFlow将其作为单个图形运行(Functions 2.0 RFC)。这种机制允许TensorFlow 2.0获得图形模式的所有好处:

  • 性能:可以优化功能(节点修剪,内核融合等)
  • 可移植性:该功能可以导出/重新导入(SavedModel 2.0 RFC),允许用户重用和共享模块化TensorFlow功能。
# 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 (支持breakcontinue)
  • if -> tf.cond
  • for _ in dataset -> dataset.reduce

AutoGraph支持控制流的任意嵌套,这使得高效和简洁地实现许多复杂的ML程序成为可能,比如序列模型、强化学习、自定义训练循环等等。

 

 

  • 9
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wenzhp1975

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值