【问题标题】:Dynamic batch size in Keras LSTM (TensorFlow 2.x)Keras LSTM (TensorFlow 2.x) 中的动态批量大小
【发布时间】:2022-01-18 15:01:51
【问题描述】:

我有一个包含 27k 记录作为训练集的数据框和另一个包含 4k 记录的测试数据集。两个数据集各有 25 个特征。

x_train shape: (27000, 25), 
x_test shape: (4000, 25)

训练集中数据示例:

|Subject ID|Feat_1|Feat_2|Feat_X|Hr_count|Label|
|s0001     |    89| 31   |  43  |   1    |  0  |
|s0001     |    94| 32   |  68  |   2    |  0  |
|s0001     |    38| 90   |  86  |   3    |  0  |
|s0001     |    79| 34   |  78  |   4    |  1  |
|s0001     |    85| 24   |  70  |   5    |  1  |
|s0002     |    7 | 9    |  32  |   1    |  0  |
|s0002     |    60| 56   |  72  |   2    |  0  |
|s0002     |    68| 72   |  23  |   3    |  0  |
|s0003     |    26| 88   |  1   |   1    |  0  |
|s0004     |    45| 27   |  22  |   1    |  0  |
|s0004     |    10| 80   |  67  |   2    |  0  |
|s0004     |    71| 48   |  21  |   3    |  0  |
|s0004     |    58| 9    |  60  |   4    |  1  |

Hr_count:代表每个受试者在实验中停留的小时数

标签:这是我构建分类器时的目标变量。它表示受试者在实验中停留后收到的标志

我在定义如下的 LSTM RNN 模型上训练数据:

model = Sequential()
model.add(LSTM(100, activation='tanh', return_sequences=True, input_shape=(1, 25)))
model.add(LSTM(49, activation='tanh'))
model.add(Dense(1, activation='sigmoid'))
 
model.fit(
    x_train, y_train,
    validation_data=(x_test, y_test),
    batch_size=32,
    epochs=200)

问题:

由于数据的顺序性,我想在拟合模型时定义一个动态 batch_size 参数作为训练中每个主题的最大 Hr_count 数,以便 LSTM 可以获取数据之间的关系每个主题单独(每批将仅包含每个主题的数据)。这意味着每批包含 1 个受试者的样本,按 Hr_count 排序。

在 Keras 或 TensorFlow v2.x 中似乎不具备动态 batch_size 的灵活性(与 TensorFlow v1.x 相反)...

如何将批处理大小定义为动态的 batch_size 参数?

【问题讨论】:

  • 标签 (Flag) 是 1 或 0 的二元预测。实验中每个受试者在一段时间内的进展 (hr_count) 直接有助于预测,所以我使用 LSTM,因为它记住以前的状态

标签: python tensorflow keras lstm


【解决方案1】:

您可以为每个主题创建一个调用 model.fit() 函数的循环,然后根据当前的 Hr_count 设置批量大小

for subject in list_of_subjects:
    hr_count,data = subject
    x_train,y_train = data
    model.fit(
    x_train, y_train,
    validation_data=(x_test, y_test),
    batch_size=hr_count,
    epochs=200)
    

此代码运行的列表主题必须具有形状

[[Hr_count,[x_triain,y_train]]

【讨论】:

  • x_train 和 y_train 包含什么?整个数据集?
  • 它将包含您希望模型在其上进行训练的当前主题的训练数据
  • 我没有完整的代码。 @Golden Lion,您必须询问 coder_1122。我只是提供了 for 循环,因此他可以根据 Hr_count 进行训练。
  • 我怎样才能得到这个形状的数据[[Hr_count,[x_triain,y_train]]
  • 提示使用@Golden Lion 他实现的答案:)
【解决方案2】:

我过滤了主题 ID,然后将数据段提供给 model.fit()。看起来模型学得很快。在更大的数据集上尝试。代码被泛化以允许更多功能。

import pandas as pd
from io import StringIO
import io
from keras.models import Sequential
from keras.layers import LSTM, Dense
import numpy as np
from sklearn.preprocessing import LabelEncoder

data="""SubjectID,Feat_1,Feat_2,Feat_X,Hr_count,Label
s0001,89,31,43,1,0
s0001,94,32,68,2,0
s0001,38,90,86,3,0
s0001,79,34,78,4,1
s0001,85,24,70,5,1
s0002,7 ,9 ,32,1,0
s0002,60,56,72,2,0
s0002,68,72,23,3,0
s0003,26,88,1 ,1,0
s0004,45,27,22,1,0
s0004,10,80,67,2,0
s0004,71,48,21,3,0
s0004,58,9 ,60,4,1
"""

df=pd.read_csv(io.StringIO(data),sep=",")
df.drop(columns='Hr_count',inplace=True)
encoder=LabelEncoder()
df['SubjectID']=encoder.fit_transform(df['SubjectID'])

print(df)

X_columns=[x for x in df.columns if x!='Label']
features=len(X_columns)
model = Sequential()
model.add(LSTM(100, activation='tanh', return_sequences=True, input_shape=(1, features)))
model.add(LSTM(49, activation='tanh'))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer="rmsprop", loss='binary_crossentropy', metrics=['accuracy'])


grouped=df.groupby('SubjectID')



for group in grouped:
    df_batch=pd.DataFrame(columns=['SubjectID','Feat_1','Feat_2','Feat_X','Hr_count','Label'])
    for subjectID in group:
        filter=df['SubjectID']==subjectID 
        for key,item in df[filter].dropna().iterrows():
            df_batch=df_batch.append({'SubjectID':item['SubjectID'],'Feat_1':item['Feat_1'],'Feat_2':item['Feat_2'],'Feat_X':item['Feat_X'],'Label':item['Label']},ignore_index=True)
    #print("\n",df_batch)
    X=df_batch[X_columns]
    X = np.resize(X,(X.shape[0],1,X.shape[1]))
    y=df_batch['Label']
    print("\n",X)
    model.fit(X,y,batch_size=len(X), 
          epochs=10)

输出:

  Epoch 10/10
  1/1 [==============================] - 0s 13ms/step - loss: 0.0588 - accuracy: 1.0000

【讨论】:

  • 如何使用这种方法监控验证损失?
  • 结果 = model.evaluate(x_test, y_test, batch_size=128)
  • 模型返回验证数据集的历史记录(如果使用)
猜你喜欢
  • 1970-01-01
  • 2018-07-07
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
  • 2023-04-02
相关资源
最近更新 更多