Keras model.fit UnboundLocalError

Nat*_*Bat 3 python keras

我还是keras和python的新手,我收到一个我似乎无法理解的错误.错误是:

Traceback (most recent call last):
  File "/Users/N/PycharmProjects/hw2/hw2_1.py", line 35, in <module>
model.fit(trainingInp, trainingOut, epochs=10, batch_size=1)
  File "/Library/Python/2.7/site-packages/keras/models.py", line 893, in fit
initial_epoch=initial_epoch)
  File "/Library/Python/2.7/site-packages/keras/engine/training.py", line 1555, in fit
batch_size=batch_size)
  File "/Library/Python/2.7/site-packages/keras/engine/training.py", line 1409, in _standardize_user_data
exception_prefix='input')
  File "/Library/Python/2.7/site-packages/keras/engine/training.py", line 126, in _standardize_input_data
array = arrays[i]
UnboundLocalError: local variable 'arrays' referenced before assignment
Run Code Online (Sandbox Code Playgroud)

它发生在model.fit()中.我的模型是这样的:

model = Sequential()
model.add(Dense(3, activation='sigmoid', input_dim=8))
model.add(Dropout(0.5))
model.add(Dense(10, activation='sigmoid'))

model.compile(loss='mean_squared_error', optimizer='sgd', metrics=['accuracy'])
print trainingInp
print trainingOut
model.fit(trainingInp, trainingOut, epochs=10, batch_size=1)
Run Code Online (Sandbox Code Playgroud)

我打印我的数据以确保我没有传入空数据,并且在进入model.fit()之前它正确打印.

我不太确定如何解决它,因为我不知道问题是什么.似乎问题是batch_size,但我认为允许批量大小为1.

以下是我获取数据的方式.我保证数据没有任何空值.

#read and categorize data
data = pandas.read_csv('cars.data.txt', delim_whitespace=True, header=None)

#turn class into an integer
enc = pandas.factorize(data['class'])
data["enc"] = enc[0]


#split the data set and make class into a matrix of outputs
trainingSet, testingSet = train_test_split(data, test_size=0.3)

trainingInp = trainingSet.iloc[:,1:9]
trainingOut = keras.utils.to_categorical(trainingSet['enc'], num_classes=10)

testingInp = testingSet.iloc[:,1:9]
testingOut = keras.utils.to_categorical(testingSet['enc'], num_classes=10)
Run Code Online (Sandbox Code Playgroud)

iva*_*eev 8

看起来像Keras的一个错误.

engine/training.py,

elif data.__class__.__name__ == 'DataFrame':
    # test if data is a DataFrame, without pandas installed
    data = data.values
Run Code Online (Sandbox Code Playgroud)

应该

elif data.__class__.__name__ == 'DataFrame':
    # test if data is a DataFrame, without pandas installed
    arrays = data.values
Run Code Online (Sandbox Code Playgroud)

创建了拉取请求.


这是我如何得到它:

UnboundLocalError意味着没有定义变量 - 这实际上总是一个编程错误.在使用变量之前,故障线所属的块不会​​检查任何条件.因此,代码假定它必须始终由此点定义.

arrays从故障线搜索" "表示它正在大块的分支中定义if.因此,每个分支都应该在其工作过程中最终分配此变量.事实上,他们都这样做,除了这一个.因此,执行此分支的执行是变量最终未定义的唯一方式.

现在,剩下的就是找出该分支中的预期代码应该是什么.看见那个

  • 所有其他分支单独结束arrays = <something>,这条线看起来就像它,并且
  • 重新分配data是一个毫无意义的操作:
    • 它在不同的分支中有不同的类型(例如,在一个arrays = data和另一个分支中arrays = [data])
    • 没有在任何一个中重新分配,所以该if块不应该将其转换为一些常见的表示 - 因此,它很可能不会被进一步使用

代码的作者很可能写了一个拼写错误,这是他们一定想要的.查找Pandas.DataFrame.values确认它是一个数组数组,因此将它直接分配给称为"数组"的东西看起来是合法的.


小智 6

当您将Pandas系列或数据帧传递给keras估算器时,有时会出现此错误.只需这样做

df_train_x = df_train_x.values
df_test_x = df_test_x.values
Run Code Online (Sandbox Code Playgroud)

然后

estimator.fit(df_train_x , df_train_y)
Run Code Online (Sandbox Code Playgroud)