Изменить форму нейронной сети на основе условия - PullRequest
1 голос
/ 21 июня 2019

Числовые данные, используя нейронные сети DL. Для этого я использую библиотеку Keras

    p   u   d    ms          action B   x    y-c pre    area       finger 
0   0   36  3   1334893336790   0   1   262 262 262     0.044444    0.0
1   0   36  3   1334893336790   2   1   262 271 0.32    0.044444    0.0
2   0   36  3   1334893336795   2   1   123 327 0.28    0.044444    0.0
3   0   36  3   1334893336800   1   1   123 327 0.28    0.044444    0.0
4   0   36  3   1334893336885   0   1   216 298 0.34    0.044444    0.0
5   0   36  3   1334893336907   2   1   216 298 0.38    0.044444    0.0
6   0   36  3   1334893336926   2   1   147 312 0.60    0.088889    0.0
7   0   36  3   1334893336949   2   1   115 328 0.63    0.044444    0.0
8   0   36  3   1334893336952   2   1   98  336 0.17    0.133333    0.0
9   0   36  3   1334893336971   1   1   98  336 0.17    0.133333    0.0
1   0   36  3   1334893337798   0   1   108 339 0.48    0.044444    0.0

Приведенный ниже код работает, но, как я понимаю, входные данные нейронной сети располагаются построчно в качестве входных данных, здесь я пытаюсь сделать ввод и вывод на основе столбца действия , как в приведенном ниже примере, когда начинается с 0 и заканчивается 1, затем включается первый вход для нейронной сети из строки [0–3] 3 и включается второй вход [4–9] 9 и т. д. Элементы в столбце действий представляют движение руки, если значение 0 означает, что палец руки нажимает на экран, либо если 1 означает, что рука была поднята с экрана, поэтому я пытаюсь разделить число n на ход при попытке ввода в нейронную сеть на основе давления пальца и подъема (удара), основанного на этой идее, ввод будет уменьшаться с 900 тыс. до 20 тыс., но каждый раз, когда ввод будет состоять из нескольких строк

the first input will be as below:
        p   u   d    ms          action B   x    y-c pre    area       finger 
    0   0   36  3   1334893336790   0   1   262 262 262     0.044444    0.0
    1   0   36  3   1334893336790   2   1   262 271 0.32    0.044444    0.0
    2   0   36  3   1334893336795   2   1   123 327 0.28    0.044444    0.0
    3   0   36  3   1334893336800   1   1   123 327 0.28    0.044444    0.0

and the second input will be :
        p   u   d    ms          action B   x    y-c pre    area       finger 
    4   0   36  3   1334893336885   0   1   216 298 0.34    0.044444    0.0
    5   0   36  3   1334893336907   2   1   216 298 0.38    0.044444    0.0
    6   0   36  3   1334893336926   2   1   147 312 0.60    0.088889    0.0
    7   0   36  3   1334893336949   2   1   115 328 0.63    0.044444    0.0
    8   0   36  3   1334893336952   2   1   98  336 0.17    0.133333    0.0
    9   0   36  3   1334893336971   1   1   98  336 0.17    0.133333    0.0

вот мой код и он работает нормально в обычном цикле для NN, но я пытаюсь изменить его, основываясь на моей идее ..

#o = no_of_click
o=0
lenf=len(dataset)
for h in dataset.index[dataset.iloc[:, 4] == 0]:
    if dataset.iloc[h+1,4]==1 :
        dataset.iloc[h+1,4]=-1
        dataset.iloc[h , 4] = -1
        o=o+1
dataset=dataset.drop(dataset[dataset.iloc[:, 4] == -1].index)
lenf=(o*2)
X = dataset.iloc[:, 2:].values #here 3to 11 for x
y = dataset.iloc[:, 1].values #here user id 2 only y

binariz = LabelBinarizer()
s = binariz.fit_transform(X[:, 0])
X = np.delete(X, [0], axis=1)
X = np.hstack([s,X])
y = binariz.fit_transform(y)
# X Features scaling
sc_X = StandardScaler()
X = sc_X.fit_transform(X)

# Splitting Data
X_train, X_test,y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

classifier = Sequential()
# Adding the input layer and the first hidden layer
classifier.add(Dense(units = 50, activation = 'relu', input_dim = X_train.shape[1]))
# Adding the second hidden layer

classifier.add(Dense(units = 50, activation = 'relu'))
# Adding the output layer
classifier.add(Dense(units = y.shape[1], activation = 'softmax'))
# Compiling the ANN
classifier.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])
# Fitting the ANN to the Training set
classifier.fit(X_train, y_train, batch_size = 100, epochs = 10)

1 Ответ

1 голос
/ 21 июня 2019

Я не уверен, правильно ли я понял ваш вопрос;Заранее извиняюсь, если я делаю неправильные предположения.

Мне кажется, что вы спрашиваете, можете ли вы изменить форму входного вектора, чтобы в одном случае он имел форму = (4,), а в другой - =(6,).

Я не верю, что вы можете, так как при добавлении плотного слоя после входного слоя этот плотный слой имеет матрицу весов, которая имеет форму (input_dims, output_dims).Это выбирается при построении графика.

Даже если бы вы могли, я не думаю, что вы захотите.Входной вектор для NN является набором функций;Похоже, что в вашем случае это набор разных измерений.Вы не хотите снабжать сеть измерением признака 0 в позиции входного тензора 0 в одном сценарии и измерением признака 4 в другом сценарии.Из-за этого сети становится сложнее понять, как обрабатывать эти значения.

Учитывая, что у вас небольшой набор функций, есть ли какая-то причина, по которой вы не просто пропускаете все данные все время?

...