簡體   English   中英

Keras model.fit UnboundLocalError

[英]Keras model.fit UnboundLocalError

我還是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

它發生在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)

我打印我的數據以確保我沒有傳入空數據,並且在進入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)

看起來像Keras的一個錯誤。

engine/training.py

elif data.__class__.__name__ == 'DataFrame':
    # test if data is a DataFrame, without pandas installed
    data = data.values

應該

elif data.__class__.__name__ == 'DataFrame':
    # test if data is a DataFrame, without pandas installed
    arrays = data.values

創建了拉取請求。


這是我如何得到它:

UnboundLocalError意味着未定義變量 - 這實際上總是編程錯誤。 在使用變量之前,故障線所屬的塊不會​​檢查任何條件。 因此,代碼假定它必須始終由此點定義。

從故障線上搜索“ arrays ”表明它是在一個大的if塊的分支中定義的。 因此,每個分支都應該在其工作過程中最終分配此變量。 事實上,他們都這樣做,除了這一個。 因此,執行此分支的執行是變量最終未定義的唯一方式。

現在,剩下的就是找出該分支中的預期代碼應該是什么。 看見那個

  • 所有其他分支本身以arrays = <something>結尾,這條線看起來就像它一樣
  • 重新分配data是一個毫無意義的操作:
    • 它在不同的分支中有不同的類型(例如,在一個arrays = data ,在另一個arrays = [data]
    • 不會在其中任何一個中重新分配,因此if塊不應該將其轉換為某種常見的表示形式 - 因此,它很可能不會被進一步使用

代碼的作者很可能寫了一個拼寫錯誤,這是他們一定想要的。 查找Pandas.DataFrame.values確認它是一個數組數組,因此將它直接賦值給稱為“數組”的東西看起來是合法的。

當您將Pandas系列或數據幀傳遞給keras估算器時,有時會出現此錯誤。 只需這樣做

df_train_x = df_train_x.values
df_test_x = df_test_x.values

然后

estimator.fit(df_train_x , df_train_y)

暫無
暫無

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

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