繁体   English   中英

卷积神经网络 - 1D - 特征分类错误

[英]Convolutional Neural Network - 1D - Feature Classification Error

我正在尝试修改以下示例来为我的数据集模拟 CNN 并遇到一些错误https://machinelearningmastery.com/cnn-models-for-human-activity-recognition-time-series-classification/

X = D.replace(['Resting', 'Swimming', 'Feeding', 'Non directed motion'], [0, 1, 2, 3])
X_Label = X['Label'].to_numpy()
X_Data = X[['X_static','Y_static','Z_static','X_dynamic','Y_dynamic','Z_dynamic']].to_numpy()

X_names = ['X_static','Y_static','Z_static','X_dynamic','Y_dynamic','Z_dynamic']
X_Label_Names = np.array(['Resting', 'Swimming', 'Feeding', 'Non directed motion'])

X_Data 是一个 5600 x 6 列的 numpy 矩阵。 每列代表一种随时间变化的测量数据

X_Label 是一个 5600 x 1 的列,由 0 到 3 的值组成,表示要素或属性。 0代表休息,1代表游泳等等。

X = X_Data
y = X_Label

def load_dataset_f(X,y):
    X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.5, stratify=y, random_state=random_state
    )
    trainX = X_train
    trainy = y_train
    testX = X_test
    testy = y_test
    print(trainX)
    print(trainX.shape)
    print(trainy.shape)
    return trainX, trainy, testX, testy


# fit and evaluate a model
def evaluate_model_f(trainX, trainy, testX, testy):
    verbose, epochs, batch_size = 2, 10, 20
    n_timesteps, n_features, n_outputs = 6, 1, 1
    print('n timesteps --------------------------------------------------------------------')
    print(n_timesteps)
    model = Sequential()
    model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(n_timesteps,n_features)))
    model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
    model.add(Dropout(0.5))
    model.add(MaxPooling1D(pool_size=2))
    model.add(Flatten())
    model.add(Dense(100, activation='relu'))
    model.add(Dense(n_outputs, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    # fit network
    print(to_categorical(trainy))
    model.fit(trainX.reshape(len(trainX),6,1), to_categorical(trainy))
    # evaluate model
    _, accuracy = model.evaluate(testX, testy, batch_size=batch_size, verbose=0)
    return accuracy

def run_experiment_f(repeats=1):
    # load data
    trainX, trainy, testX, testy = load_dataset_f(X,y)
    print(trainX)
    # repeat experiment
    scores = list()
    for r in range(repeats):
        score = evaluate_model_f(trainX, trainy, testX, testy)
        score = score * 100.0
        print('>#%d: %.3f' % (r+1, score))
        scores.append(score)
    # summarize results
    summarize_results(scores)
    
load_dataset_f(X,y)

run_experiment_f()
 

我不熟悉 tensorflow 库,并且在 model.fit() 处出错,我不确定如何解决这个问题。 示例中显示的矩阵是 3D 的,因为我的数据是 2D 的,不确定这是否重要。 我如何让这个代码工作?

您需要确保Conv1D层的输入具有形状(timesteps, features) ,并且最后一个输出层的单位等于数据集中唯一标签的数量。 这是一个工作示例:

import tensorflow as tf

trainX = tf.random.normal((32, 6))
trainy = tf.random.uniform((32, 1), maxval=4)

verbose, epochs, batch_size = 2, 10, 20
n_timesteps, n_features, n_outputs = 6, 1, 4
print('n timesteps --------------------------------------------------------------------')
print(n_timesteps)
model = tf.keras.Sequential()
model.add(tf.keras.layers.Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(n_timesteps,n_features)))
model.add(tf.keras.layers.Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.MaxPooling1D(pool_size=2))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(100, activation='relu'))
model.add(tf.keras.layers.Dense(n_outputs, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# fit network
print(tf.keras.utils.to_categorical(trainy))
trainX = tf.expand_dims(trainX, axis=2)
model.fit(trainX, tf.keras.utils.to_categorical(trainy))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM