簡體   English   中英

R 的 Keras 和 Python 的 Keras 之間的差異——准確性錯誤?

[英]Discrepancy between R's Keras and Python's Keras -- Accuracy bug?

我正在使用 Keras 玩一些 2D CNN 來預測自行車共享需求

R 與 Python 相比表現非常差,Python 很容易達到良好的准確性。 我認為這是因為數組形狀(以及 R 和 Python 之間的一些差異),所以我玩了一段時間,最終使用了所有可能的形狀。

我在別處創建了CombinationGrid對象,它看起來像這樣:

+------+------+------+------+-------+
| Dim1 | Dim2 | Dim3 | Dim4 | Order |
+------+------+------+------+-------+
| 8887 |    3 |    2 |    1 | F     |
|    3 | 8887 |    2 |    1 | F     |
| 8887 |    2 |    3 |    1 | C     |
|    2 | 8887 |    3 |    1 | C     |
+------+------+------+------+-------+

它是一個包含 4 維數組組合的表(在代碼中使用,在那里會更清楚)。 這是它的完整版本,只是為了可重復性


這是R代碼:

#Read data
TrainDF=read_delim(file='train.csv', delim=',')

#Subset
X_Train=TrainDF[2000:nrow(TrainDF),c('temp', 'atemp', 'humidity', 'windspeed', 'casual', 'registered')]
Y_Train=as.matrix(TrainDF[2000:nrow(TrainDF),c('count')])

#YVal
YVal=as.matrix(Y_Train)

#For loop and try all combinations
Results=list()
for(i in 1:nrow(CombinationGrid)){

  #Reshape using all possible combinations
  XVal=array_reshape(x=as.matrix(X_Train), dim=CombinationGrid[i,1:4], order=CombinationGrid[i,]$Order)

  #Keras Model
  model=keras_model_sequential() 
  model %>% 
    layer_conv_2d(filters=10, kernel_size=c(2,2), padding='same', activation='relu') %>%
    layer_conv_2d(filters=15, kernel_size=c(2,2), padding='same', activation='relu') %>%
    layer_conv_2d(filters=20, kernel_size=c(3,3), padding='same') %>%
    layer_max_pooling_2d(pool_size=c(2,2), strides=1) %>%
    layer_flatten() %>%
    layer_dense(units=30, activation='relu') %>%
    layer_dense(units=20, activation='relu') %>%
    layer_dense(units=10, activation='relu') %>%
    layer_dense(units=1)

  #Compile model
  model %>% compile(
    loss = 'mse',
    optimizer = optimizer_adam(),
    metrics = c('accuracy'))

  #Train model
  Hist=tryCatch({
    model %>% fit(XVal, YVal, epochs = 100)
  },error=function(e){
    Hist=list('metrics'=list('loss'=NA, 'acc'=NA))
  })

  #Save results
  Results[[i]]=list('Loss'=Hist$metrics$loss[length(Hist$metrics$loss)], 'Acc'=Hist$metrics$acc[length(Hist$metrics$acc)])

}

這是 Python 代碼:

#Read Combination Gird
CombinationGrid=pd.read_table('CombinationGrid.txt')

#Read Dataset
TrainDF = pd.read_csv('train.csv', parse_dates=["datetime"])

#Subset training data
X_Train= TrainDF[1999:]

#Create responser variable
YVal = X_Train[['count']]

#Turn into numpy array
YVal=np.array(YVal)

#Select only usefull parameters
X_Train = X_Train[['temp', 'atemp', 'humidity', 'windspeed', 'casual', 'registered']]

#For loop to try all combinations
Results=[]
for i in range(0,CombinationGrid.shape[0]):
    XVal = np.array(X_Train, dtype=np.float32).reshape(tuple(CombinationGrid.iloc[i,])[0:4], order=tuple(CombinationGrid.iloc[i,])[4])

    model=keras.Sequential()
    model.add(keras.layers.Conv2D(filters=10, kernel_size=[2,2], padding='same', activation='relu'))
    model.add(keras.layers.Conv2D(filters=15, kernel_size=[2,2], padding='same', activation='relu'))
    model.add(keras.layers.Conv2D(filters=20, kernel_size=[3,3], padding='same'))
    model.add(keras.layers.MaxPooling2D(pool_size=[2,2], strides=1))
    model.add(keras.layers.Flatten())
    model.add(keras.layers.Dense(units=30, activation='relu'))
    model.add(keras.layers.Dense(units=20, activation='relu'))
    model.add(keras.layers.Dense(units=10, activation='relu'))
    model.add(keras.layers.Dense(units=1))

    model.compile(optimizer='adam', loss='mse', metrics=['accuracy'])

    #Save results
    try:
        Hist=model.fit(XVal, YVal, epochs=100)
        Results.append((Hist.history['loss'][len(Hist.history['loss'])-1],Hist.history['accuracy'][len(Hist.history['accuracy'])-1]))
    except:
        Results.append((np.nan, np.nan))
pass

結果:

我保存了 R 和 Python 結果,它們在這里。 數據的所有其他數組形狀在 Python 和 R 中都失敗了(可能是因為 Y 沒有合適的形狀來匹配預測變量):

+------+------+------+------+-------+-------------+-------------+-------------+-------------+
| Dim1 | Dim2 | Dim3 | Dim4 | Order |   R Loss    |    R Acc    | Python Loss |  Python Acc |
+------+------+------+------+-------+-------------+-------------+-------------+-------------+
| 8887 |    3 |    2 |    1 | F     | 0.257986314 | 0.004726004 | 0.264519099 |  0.86125803 |
| 8887 |    2 |    3 |    1 | F     | 1.922012638 | 0.004726004 | 0.375910975 | 0.780578375 |
| 8887 |    3 |    2 |    1 | C     | 0.062438282 | 0.004726004 |  4.27717965 | 0.700686395 |
| 8887 |    2 |    3 |    1 | C     | 0.171041382 | 0.004726004 | 0.054061489 |  0.95262742 |
+------+------+------+------+-------+-------------+-------------+-------------+-------------+

如您所見,最后的 Losses 看起來很相似,但最后記錄的 Accuracy 在兩者之間有很大的不同。 我知道我在 R 和 Python 中對尺寸和形狀的理解以及它們的不同之處都有一些錯誤,但是在嘗試了所有可能的形狀並且沒有得到類似的結果之后,它變得很奇怪。 此外,R 中的 Keras Accuracy 似乎永遠不會改變!

我找不到關於此事的更多信息,只有另一篇文章說明了相反的情況

所以,發生了一些事情,這可能是我的錯,但我不知道為什么,如果我使用相同的數據,在 R 中使用 Keras 無法像在 Python 中那樣獲得好分數。 有任何想法嗎?

好吧,正如 Skeydan 在我打開的問題中向我解釋的那樣,准確性的差異在於所使用的 Keras版本

在 Python 代碼中,從import keras更改為import tensorflow.keras as keras使得 R 和 Python 之間的准確性匹配。

我在這里這里找到了更多關於這個的信息。

暫無
暫無

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

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