簡體   English   中英

在Tensorflow中,如何解決``未定義全局名稱''的錯誤?

[英]In Tensorflow, how can i fix the error of “global name is not defined”?

我嘗試建立一個tensorflow模型,這是代碼,共有三個python文件。 (1)opt4_8generateData.py

#coding:utf-8
import matplotlib.pyplot as plt
import numpy as np
seed=2

def generates():
    rdm=np.random.RandomState(seed)
    X=rdm.randn(300,2)
    Y_=[int(x0*x0+x1*x1<2) for (x0,x1) in X]
    Y_c=[['red' if y else 'blue'] for y in Y_]
    #對數據集進行整理,第一個元素為-1表示跟隨第二列計算,第二個元素表示多少     #列
    X=np.vstack(X).reshape(-1,2)
    Y_=np.vstack(X).reshape(-1,1)
    return X,Y_,Y_c

(2)opt4_8forward.py

#coding:utf-8
import tensorflow as tf

def get_weight(shape,rugalarizer):
    w=tf.Variable(tf.random_normal(shape),dtype=tf.float32)
    tf.add_to_collection('losses',tf.contrib.layers.l2_regularizer(regularizer)(w))
    return w

def get_bias(shape):
    b=tf.Variable(tf.constant(0.01,shape=shape))
    return b

def forward(x,regularizer):
    w1=get_weight([2,11],regularizer)
    b1=get_bias([11])
    y1=tf.nn.relu(tf.matmul(x,w1)+b1)

    w2=get_weight([11,1],regularizer)
    b2=get_bias([1])
    y=tf.matmul(y1,w2)+b2
    return y

(3)opt4_8backward.py

#coding:utf-8
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import opt4_8generateData
import opt4_8forward

STEPS=40000
BATCH_SIZE=30
LEARNING_RATE_BASE=0.001
LEARNING_RATE_DECAY=0.999
REGULARIZER=0.01


def backward():
    x=tf.placeholder(tf.float32,shape=(None,2))
    y_=tf.placeholder(tf.float32,shape=(None,1))
    X,Y_,Y_c=opt4_8generateData.generates()
    y=opt4_8forward.forward(x,REGULARIZER)

    global_step=tf.Variable(0,trainable=False)

    learning_rate=tf.train.exponential_decay(
    LEARNING_RATE_BASE,
    global_step,
    300/BATCH_SIZE,
    LEARNING_RATE_DECAY,
    staircase=True)

    loss_mse=tf.reduce_mean(tf.square(y-y_))
    loss_total=loss_mse+tf.add_n(tf.get_collection("losses"))

    #定義反向傳播方法:包含正則化
    train_step=tf.train.AdamOptimizer(learning_rate).minimize(loss_total)

    with tf.Session() as sess:
        init_op=tf.global_variables_initializer()
        sess.run(init_op)
        for i in range(STEPS):
            start=(i*BATCH_SIZE)%300
            end=start+BATCH_SIZE
            sess.run(train_step,feed_dict={x:X[start:end],y_:Y[start:end]})
            if i%2000==0:
                loss_y=sess.run(loss_total,feed_dict={x:X,y_:Y_})                 
                print "After %d steps,loss is:%f" %(i,loss_y)

        xx,yy=np.mgrid[-3:3:.01,-3:3:.01]
        grid=np.c_[xx.ravel(),yy.ravel()]
        probs=sess.run(y,feed_dict={x:grid})
        probs=probs.reshape(xx.shape)

    plt.scatter(X[:,0],X[:,1],c=np.squeeze(Y_c))
    plt.contour(xx,yy,probs,levels=[.5])
    plt.show()

if __name__=='__main__':
    backward()

當我運行“ python opt4_8backward.py”時,出現錯誤:

Traceback (most recent call last):
  File "opt4_8backward.py", line 57, in <module>
    backward() 
  File "opt4_8backward.py", line 19, in backward
    y=opt4_8forward.forward(x,REGULARIZER)
  File "/home/yuan/tf/opt4_8forward.py", line 14, in forward
    w1=get_weight([2,11],regularizer)
  File "/home/yuan/tf/opt4_8forward.py", line 6, in get_weight
    tf.add_to_collection('losses',tf.contrib.layers.l2_regularizer(regularizer)(w))
NameError: global name 'regularizer' is not defined

我該如何解決此錯誤?非常感謝。 我檢查了我的代碼,看來我和老師的代碼沒有什么區別。

opt4_8forward.pyget_weight函數定義為:

def get_weight(shape,rugalarizer):
    w=tf.Variable(tf.random_normal(shape),dtype=tf.float32)
    tf.add_to_collection('losses',tf.contrib.layers.l2_regularizer(regularizer)(w))
    return w

在這里,函數參數名為rugalarizer ,在同一函數中,您具有以下代碼行:

tf.add_to_collection('losses',tf.contrib.layers.l2_regularizer(regularizer)(w))

因此, regularizer器未定義。 IIUC,功能必須定義為:

def get_weight(shape,regularizer):

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM