Python UnboundLocalError:局部变量';批次指数';分配前参考

Python UnboundLocalError:局部变量';批次指数';分配前参考,python,tensorflow,keras,Python,Tensorflow,Keras,这不是我的代码,这是一行,它显示了一个问题: 模型拟合(trainX,trainY,批量大小=2,历代=200,详细=2) (正如我现在所想的,这段代码很可能使用较旧版本的TF,因为“epochs”被写成“nb_epoch”) 代码的最后更新日期为:2017年1月11日 我已经尝试了互联网上的一切(其实并不多),包括查看tensorflow/keras的源代码以获得一些提示。只是为了明确我没有一个变量,在代码中称为“batch_index” 到目前为止,我已经了解了TF的不同版本(tensorf

这不是我的代码,这是一行,它显示了一个问题:

模型拟合(trainX,trainY,批量大小=2,历代=200,详细=2)

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

代码的最后更新日期为:2017年1月11日

我已经尝试了互联网上的一切(其实并不多),包括查看tensorflow/keras的源代码以获得一些提示。只是为了明确我没有一个变量,在代码中称为“batch_index”

到目前为止,我已经了解了TF的不同版本(tensorflow/tensorflow/python/keras/engine/training_array.py)。似乎所有这些都是2018年版权所有的,但有些是从函数fit_循环开始的,另一些是从model_迭代开始的(这可能是fit_循环的更新)

因此,这个“batch_index”变量只能在第一个函数中看到

我不知道我是否走在正确的方向上

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

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


def stock_prediction():
#从csv收集数据点
数据集=[]
打开(文件名)为f时:
对于n,枚举(f)中的行:
如果n!=0:
dataset.append(float(line.split(',')[1]))
dataset=np.array(数据集)
#创建数据集矩阵(X=t和Y=t+1)
def创建_数据集(数据集):
dataX=[dataset[n+1]表示范围内的n(len(dataset)-2)]
返回np.array(dataX),数据集[2:]
trainX,trainY=创建_数据集(数据集)
#创建并拟合多线性感知器模型
模型=顺序()
添加(密集(8,输入尺寸=1,激活=relu'))
模型.添加(密度(1))
compile(loss='mean\u squared\u error',optimizer='adam')
模型拟合(trainX,trainY,nb_epoch=200,批次尺寸=2,详细度=2)
#我们对明天的预测
prediction=model.predict(np.array([dataset[0]]))
结果='价格将从%s移动到%s'(数据集[0],预测[0][0])
返回结果

---------------------------------------------------------------------------
取消绑定LocalError回溯(最近一次调用上次)
在里面
14
15#我们有我们的文件,所以我们创建了神经网络并得到了预测
--->16打印(库存预测())
17
18#我们已经完成了,因此我们删除了csv文件
库存预测()
23型号。添加(密度(1))
24模型编译(loss='mean_squared_error',optimizer='adam')
--->25模型拟合(trainX,trainY,批量大小=1,epochs=200,详细=2)
26
27#我们对明天的预测
~\Anaconda3\lib\site packages\keras\engine\training.py拟合(self、x、y、批量大小、历元、冗余、回调、验证分割、验证数据、随机、类权重、样本权重、初始历元、每历元步数、验证步骤、验证频率、最大队列大小、工作者、使用多处理、**kwargs)
1176步/u历元=步/u历元,
1177验证步骤=验证步骤,
->1178验证频率=验证频率)
1179
1180 def评估(自我,
~\Anaconda3\lib\site packages\keras\engine\training\u arrays.py in fit\u loop(模型、fit\u函数、fit\u输入、out\u标签、批大小、历元、详细信息、回调、val\u函数、val\u输入、无序排列、回调度量、初始历元、每历元的步骤、验证步骤、验证频率)
211中断
212
-->213如果批次索引==len(批次)-1:#最后一批。
214如果进行验证且应运行验证(验证频率、历元):
215 val_outs=测试_回路(模型、val_功能、val_输入、,
UnboundLocalError:赋值前引用的局部变量“batch_index”
稍微澄清一下:

我试图查看我的tf/keras版本,如下所示:

来自tensorflow.python导入keras
打印(keras.\uuuu版本\uuuuu)
进口干酪
打印(keras.\uuuu版本\uuuuu)
输入张量流
打印(tensorflow.\uuuu版本\uuuu)
2.2.4-tf

2.2.5

1.14.0


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

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

如果批次为空列表,则可能出现此错误。可能是您的培训集有问题吗?

问题已解决! 我必须导入正确的库(Tensorflow而不是Keras):

不是直接导入KERA: 仅导入tensorflow工作: 显然,这与Keras的不同版本问题有关。

UnboundLocalError:赋值前引用的局部变量“batch_index”
出现问题的原因是批次列表为空!
batches==[]

它为空的原因是因为训练数据的样本数太小,无法除以批次大小

您应该检查您的数据、样本数量或
您应该将批次大小减小到允许您将样本数量除以批次大小,从而获得真实结果的程度。

此错误是因为存在空的培训数据。无论您是直接从keras导入,还是从tensorflow导入,如果您未传递正确的数据,都会出现错误,错误消息可能因导入或版本而异。Al因此,请确保在数据中传递了两条记录。如果从tensorflow导入Keras并使用

“提升值错误('空培训数据') ValueError:培训数据为空。“

如果直接,则消息将是错误消息
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
    ...
from tensorflow.python import keras.models.Sequential
from tensorflow.python import keras.layers.Dense
from tensorflow.python.keras.layers import Input, Dense
from tensorflow.python.keras.models import Sequential