【问题标题】:Tensorflow Error: Attempting to use uninitialized value beta1_power_18Tensorflow 错误:尝试使用未初始化的值 beta1_power_18
【发布时间】:2018-04-26 18:40:05
【问题描述】:

这是我在 tensorflow 中用于简单神经网络的代码:

import tensorflow as tf
import numpy as np

class Model:
    def __init__(self,input_neuron=2,hidden_neuron=10,output_neuron=2):
        self.input_neuron = input_neuron
        self.hidden_neuron = hidden_neuron
        self.output_neuron = output_neuron
        self.x = tf.placeholder(tf.float32,[None,self.input_neuron])
        self.y = tf.placeholder(tf.float32,[None,self.output_neuron])
        self.model = self.graph()
        self.sess = tf.InteractiveSession()
        self.sess.run(tf.global_variables_initializer())



    @staticmethod
    def one_hot_encode(y):
        y_ = np.zeros((len(y),2))
        for i in range(len(y)):
            y_[i,y[i][0]]=1

        return y_

    def graph(self):
        w1=tf.Variable(tf.random_normal([self.input_neuron,self.hidden_neuron]))
        l1=tf.nn.relu(tf.matmul(self.x,w1))
        w2=tf.Variable(tf.random_normal([self.hidden_neuron,self.output_neuron]))
        l2=tf.matmul(l1,w2)

        return l2

    def train(self,xTrain,yTrain):
        yTrain = self.one_hot_encode(yTrain)
        loss = tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits_v2(
                             logits=self.model,labels=self.y))
        train = tf.train.AdamOptimizer(0.1).minimize(loss)
        for epoch in range(100):
            self.sess.run(train,feed_dict={self.x:xTrain,self.y:yTrain})

    def predict(self,xTest):
        prediction = tf.argmax(self.model)
        return self.sess.run(prediction,feed_dict={x:xTest}) 

当我使用 :

运行它时
model = Model()
xTrain = np.array([[0,0],[0,1],[1,0],[1,1]])
yTrain = np.array([[0],[1],[1],[0]])
model.train(xTrain,yTrain)

我收到此错误:

FailedPreconditionError(回溯见上文):尝试使用未初始化的值 beta1_power_18

我做错了什么?

【问题讨论】:

    标签: python tensorflow neural-network


    【解决方案1】:

    您在Model 类的__init__ 中执行self.sess.run(tf.global_variables_initializer()),但仅在train() 方法中设置tf.train.AdamOptimizer()。后者还创建了一些需要初始化的变量。移动

    self.sess.run(tf.global_variables_initializer())
    

    紧随

    train = tf.train.AdamOptimizer(0.1).minimize(loss)
    

    它会起作用的。

    完整代码(已测试):

    import tensorflow as tf
    import numpy as np
    
    class Model:
        def __init__(self,input_neuron=2,hidden_neuron=10,output_neuron=2):
            self.input_neuron = input_neuron
            self.hidden_neuron = hidden_neuron
            self.output_neuron = output_neuron
            self.x = tf.placeholder(tf.float32,[None,self.input_neuron])
            self.y = tf.placeholder(tf.float32,[None,self.output_neuron])
            self.model = self.graph()
            self.sess = tf.InteractiveSession()
    
        @staticmethod
        def one_hot_encode(y):
            y_ = np.zeros((len(y),2))
            for i in range(len(y)):
                y_[i,y[i][0]]=1
    
            return y_
    
        def graph(self):
            w1=tf.Variable(tf.random_normal([self.input_neuron,self.hidden_neuron]))
            l1=tf.nn.relu(tf.matmul(self.x,w1))
            w2=tf.Variable(tf.random_normal([self.hidden_neuron,self.output_neuron]))
            l2=tf.matmul(l1,w2)
    
            return l2
    
        def train(self,xTrain,yTrain):
            yTrain = self.one_hot_encode(yTrain)
            loss = tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits_v2(
                                 logits=self.model,labels=self.y))
            train = tf.train.AdamOptimizer(0.1).minimize(loss)
            self.sess.run(tf.global_variables_initializer())
    
            for epoch in range(100):
                self.sess.run(train,feed_dict={self.x:xTrain,self.y:yTrain})
            print("Training done!")
    
        def predict(self,xTest):
            prediction = tf.argmax(self.model)
            return self.sess.run(prediction,feed_dict={x:xTest})
    
    model = Model()
    xTrain = np.array([[0,0],[0,1],[1,0],[1,1]])
    yTrain = np.array([[0],[1],[1],[0]])
    model.train(xTrain,yTrain)
    

    根据您的评论,如果您不想在每次调用train() 方法时重新初始化整个网络,那么您需要在__init__() 方法处初始化网络并使用tf.report_uninitialized_variables() 来获取所有未初始化的,仅初始化train() 中的那些。我根据this answerSalvador Dali 提出的问题编写了initialize_uninitialized() 方法。

    完整代码(已测试):

    import tensorflow as tf
    import numpy as np
    
    class Model:
        def __init__(self,input_neuron=2,hidden_neuron=10,output_neuron=2):
            self.input_neuron = input_neuron
            self.hidden_neuron = hidden_neuron
            self.output_neuron = output_neuron
            self.x = tf.placeholder(tf.float32,[None,self.input_neuron])
            self.y = tf.placeholder(tf.float32,[None,self.output_neuron])
            self.model = self.graph()
            self.sess = tf.InteractiveSession()
            self.sess.run(tf.global_variables_initializer())
    
        @staticmethod
        def one_hot_encode(y):
            y_ = np.zeros((len(y),2))
            for i in range(len(y)):
                y_[i,y[i][0]]=1
    
            return y_
    
        def graph(self):
            w1=tf.Variable(tf.random_normal([self.input_neuron,self.hidden_neuron]))
            l1=tf.nn.relu(tf.matmul(self.x,w1))
            w2=tf.Variable(tf.random_normal([self.hidden_neuron,self.output_neuron]))
            l2=tf.matmul(l1,w2)
    
            return l2
    
        def initialize_uninitialized( self ):
            uninitialized_variables = [v for v in tf.global_variables()
                if v.name.split(':')[0] in set(self.sess.run(tf.report_uninitialized_variables())) ]
            self.sess.run( tf.variables_initializer( uninitialized_variables ) )
    
        def train(self,xTrain,yTrain):
            yTrain = self.one_hot_encode(yTrain)
            loss = tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits_v2(
                                 logits=self.model,labels=self.y))
            train = tf.train.AdamOptimizer(0.1).minimize(loss)
            self.initialize_uninitialized()
    
            for epoch in range(100):
                self.sess.run(train,feed_dict={self.x:xTrain,self.y:yTrain})
            print("Training done!")
    
        def predict(self,xTest):
            prediction = tf.argmax(self.model)
            return self.sess.run(prediction,feed_dict={x:xTest}) 
    
    model = Model()
    xTrain = np.array([[0,0],[0,1],[1,0],[1,1]])
    yTrain = np.array([[0],[1],[1],[0]])
    model.train(xTrain,yTrain)
    

    【讨论】:

    • 但它不会初始化我的变量 w1 和 w2,每次我都会调用 train 方法。我需要保存这些变量,以便下次调用 model.train 时,它应该从上次保存的值开始训练
    • 根据此评论在我的答案中添加了另一个版本
    猜你喜欢
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    相关资源
    最近更新 更多