【问题标题】:UnboundLocalError: local variable 'batch_index' referenced before assignmentUnboundLocalError:分配前引用的局部变量“batch_index”
【发布时间】:2020-01-16 01:25:47
【问题描述】:

This is NOT MY code by here is the line, where it shows a problem:

model.fit(trainX, trainY, batch_size=2, epochs=200, verbose=2)

(正如我现在所想的,这段代码很可能使用的是旧版本的 TF,因为 'epochs' 写成 'nb_epoch')。

代码最后更新时间:2017年1月11日!

我已经尝试了互联网上的所有内容(不是那么多),包括查看 tensorflow/keras 的源代码以获取一些提示。只是为了说明我在代码中没有一个名为“batch_index”的变量。

到目前为止,我已经查看了不同版本的 TF (tensorflow/tensorflow/python/keras/engine/training_arrays.py)。似乎所有的版权都来自 2018 年版权,但有些以函数 fit_loop 开头,而另一些则以 model_iteration 开头(这可能是 fit_loop 的更新)。

所以,这个 'batch_index' 变量只能在第一个函数中看到。

我想知道我是否朝着正确的方向前进??!

显示代码没有意义,因为正如我所解释的,代码中首先没有这样的变量。

但是,这里是函数“stock_prediction”的一些代码,它给出了错误:


def stock_prediction():

    # Collect data points from csv
    dataset = []

    with open(FILE_NAME) as f:
        for n, line in enumerate(f):
            if n != 0:
                dataset.append(float(line.split(',')[1]))

    dataset = np.array(dataset)

    # Create dataset matrix (X=t and Y=t+1)
    def create_dataset(dataset):
        dataX = [dataset[n+1] for n in range(len(dataset)-2)]
        return np.array(dataX), dataset[2:]
        
    trainX, trainY = create_dataset(dataset)

    # Create and fit Multilinear Perceptron model
    model = Sequential()
    model.add(Dense(8, input_dim=1, activation='relu'))
    model.add(Dense(1))
    model.compile(loss='mean_squared_error', optimizer='adam')
    model.fit(trainX, trainY, nb_epoch=200, batch_size=2, verbose=2)

    # Our prediction for tomorrow
    prediction = model.predict(np.array([dataset[0]]))
    result = 'The price will move from %s to %s' % (dataset[0], prediction[0][0])

    return result


---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-19-3dde95909d6e> in <module>
     14 
     15 # We have our file so we create the neural net and get the prediction
---> 16 print(stock_prediction())
     17 
     18 # We are done so we delete the csv file

<ipython-input-18-8bbf4f61c738> in stock_prediction()
     23     model.add(Dense(1))
     24     model.compile(loss='mean_squared_error', optimizer='adam')
---> 25     model.fit(trainX, trainY, batch_size=1, epochs=200, verbose=2)
     26 
     27     # Our prediction for tomorrow

~\Anaconda3\lib\site-packages\keras\engine\training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs)
   1176                                         steps_per_epoch=steps_per_epoch,
   1177                                         validation_steps=validation_steps,
-> 1178                                         validation_freq=validation_freq)
   1179 
   1180     def evaluate(self,

~\Anaconda3\lib\site-packages\keras\engine\training_arrays.py in fit_loop(model, fit_function, fit_inputs, out_labels, batch_size, epochs, verbose, callbacks, val_function, val_inputs, shuffle, callback_metrics, initial_epoch, steps_per_epoch, validation_steps, validation_freq)
    211                     break
    212 
--> 213             if batch_index == len(batches) - 1:  # Last batch.
    214                 if do_validation and should_run_validation(validation_freq, epoch):
    215                     val_outs = test_loop(model, val_function, val_inputs,

UnboundLocalError: local variable 'batch_index' referenced before assignment

一点说明:

我尝试查看我的 tf/keras 版本,结果如​​下:

from tensorflow.python import keras
print(keras.__version__)
import keras
print(keras.__version__)
import tensorflow
print(tensorflow.__version__)

2.2.4-tf

2.2.5

1.14.0

为什么keras会显示不同的版本??

【问题讨论】:

    标签: python tensorflow machine-learning keras


    【解决方案1】:

    我在training_arrays.py (here) 中检查了您遇到错误的函数,并且如我所见,我认为问题可能出在这些语句中(从第 177 行到第 205 行):

    batches = make_batches(num_train_samples, batch_size)
    for batch_index, (batch_start, batch_end) in enumerate(batches): # the problem is here
        # do stuff
        ...
    if batch_index == len(batches) - 1:
        # do stuff
        ...
    

    如果批次是一个空列表,你可能会得到这个错误。会不会是你的训练集有问题?

    【讨论】:

    • 谢谢!所以,看起来,这是特定版本的 Keras 中的一个错误。
    • 我遇到了同样的问题。你能分享一下你是如何克服这个问题的吗? @MarkoKolaksazov
    【解决方案2】:

    问题已解决!

    我必须导入正确的库(Tensorflow 而不是直接导入 Keras):

    而不是直接导入 Keras:

    from tensorflow.python import keras.models.Sequential
    from tensorflow.python import keras.layers.Dense
    

    仅导入 tensorflow 有效:

    from tensorflow.python.keras.layers import Input, Dense
    from tensorflow.python.keras.models import Sequential
    

    显然这与 Keras 的不同版本问题有关。

    【讨论】:

    • 我尝试使用不同的 keras 版本,但没有解决问题,它只是给了我其他错误
    • 如果没有训练数据或损坏数据会出现上述错误,直接从tensorflow导入或从tensorflow导入并不能解决问题,只会改变错误消息。是的,该 keras 版本中的处理不正确,但如果训练数据不正确,错误仍然存​​在。
    【解决方案3】:
    UnboundLocalError: local variable 'batch_index' referenced before assignment
    

    问题的原因是批次列表为空! batches ==[]

    之所以为空,是因为训练数据的样本数太少,无法除以batch_size

    您应该检查您的数据、样本数量或 您应该将 batch_size 减少到允许您将样本数除以批次大小并得出真实结果的程度..

    【讨论】:

      【解决方案4】:

      这个错误是因为有空的训练数据。无论您是直接从 keras 导入还是从 tensorflow 导入,如果您没有传递正确的数据,都会出现错误,错误消息可能因导入或版本而异。还要确保您在数据中传递了几条记录。如果您从 tensorflow 导入 Keras 并使用错误将是

      "raise ValueError('空的训练数据。') ValueError:空的训练数据。”

      如果直接,那么该消息将是相关的错误消息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-10
        • 2019-12-05
        • 2017-09-19
        • 2020-09-26
        • 2022-01-02
        • 2019-03-22
        • 2019-01-24
        • 2021-07-01
        相关资源
        最近更新 更多