我正试图用csv中的数据给CNN+LSTM模型提供数据。我缺少的是设置一个正确的数据集来开始训练我的模型。
这是我的测试模型:
def test_model():
model = models.Sequential()
model.add(TimeDistributed(Conv1D(32, 4, strides=1, activation='relu', padding="valid"), input_shape=[None, 6, 20]))
model.add(TimeDistributed(MaxPooling1D(pool_size=2), input_shape=[None, 6, 20]))
model.add(TimeDistributed(Conv1D(64, 4, strides=1, activation='relu', padding="valid"), input_shape=[None, 6, 20]))
model.add(TimeDistributed(MaxPooling1D(pool_size=2), input_shape=[None, 6, 20]))
model.add(TimeDistributed(Flatten(), input_shape=[None, 6, 20]))
model.add(LSTM(100, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(100, activation="relu"))
model.add(Dropout(0.4))
model.add(Dense(5, activation="softmax"))
model.compile(optimizer=keras.optimizers.Adam(1e-3), loss="binary_crossentropy", metrics=["accuracy"])
return model
您可以在此处下载
test.csv
CSV数据集由6个特征+1个多标签组成。我需要每20行创建一个时间序列,所以我认为我的形状应该是[None,6,20],按时间戳值升序排列。
我是TensorFlow的新手,我不知道如何从头开始创建合适的数据集,我能够从包含图像的目录(用于CNN)加载数据集,但在这种情况下,我真的不知道该怎么做。
这是我试图生成数据集的内容:
with open('test.csv') as csvfile:
dataset = list()
reader = csv.reader(csvfile, delimiter=',')
next(reader)
count = 0
timeseries = list()
labels = list()
for row in reader:
count = count + 1
if count <= 20:
timeseries.append(
[float(row[0]), float(row[1]), float(row[2]), float(row[3]), float(row[4]), float(row[5])])
else:
dataset.append(timeseries)
labels.append(int(row[6].split("L")[-1]))
timeseries = list()
count = 0
之后,我将其转换为tf.DataSet,如下所示:
dataset = tf.data.Dataset.from_tensor_slices(dataset)
labels = tf.data.Dataset.from_tensor_slices(labels)
在这里,我得到了一个
<TensorSliceDataset shapes: (20, 6), types: tf.float32>
如我所愿。然后我用它喂了一只K-Fold:
estimator = KerasClassifier(build_fn=test_model, epochs=60, batch_size=5, verbose=0)
kfold = KFold(n_splits=10, shuffle=True)
results = cross_val_score(estimator, dataset, labels, cv=kfold)
运行cross_val_score时,我收到了以下错误:
TypeError:Singleton数组(<TensorSliceDataset形状:(20,6),类型:tf.folat32>,dtype=object)不能被视为有效集合。
我错过了什么?