ТензорФлоу, Керас. Построить модель с логическим массивом в качестве входных данных - PullRequest
2 голосов
/ 06 марта 2019

Я новичок в машинном обучении и просто учусь. TensorFlow кажется простым для понимания и имеет простые примеры. Но я не могу найти, как построить модель, которая может принимать логический массив (0 и 1) в качестве входных данных. Во всех примерах, которые я нашел, input - это массив чисел больше 1. Может ли кто-нибудь показать мне, как построить модель с 100 логическим входным слоем и 1 выходом. Или, по крайней мере, скажите мне, где искать решение.

EDIT

Мой код:

array = []
with open("C:/temp/out.txt") as file:
    for line in file:
        array.append(list(map(int, list(line.rstrip('\n')))))

train_data = array[:2000]
test_data = array[2000:4000]
train_labels = [1] * 2000
test_labels = [1] * 2000

# Array for prediction check
check_data = array[4000:4010] # 10 correct inputs
check_data.append([0] * 100) # Incorrect data
check_data.append([1] * 100) # Incorrect data

# Converting to numpy array
check_data = np.asarray(check_data)
train_data = np.asarray(train_data)
test_data = np.asarray(test_data)
train_labels = np.asarray(train_labels)
test_labels = np.asarray(test_labels)

model = keras.Sequential()
model.add(keras.layers.Dense(100, input_shape=(100,)))
model.add(keras.layers.Dense(80))
model.add(keras.layers.Dense(20))
model.add(keras.layers.Dense(1, activation=tf.nn.sigmoid))

model.compile(optimizer=tf.train.AdamOptimizer(),
              loss='binary_crossentropy',
              metrics=['accuracy'])

model.summary()

history = model.fit(train_data,
                    train_labels,
                    epochs=2)
results = model.evaluate(test_data, test_labels)

predict = model.predict(check_data)

Резюме:

Total params: 19,821
Trainable params: 19,821
Non-trainable params: 0

Подходит история:

Epoch 1/2

  32/2000 [..............................] - ETA: 11s - loss: 0.1560 - acc: 0.9688
1664/2000 [=======================>......] - ETA: 0s - loss: 0.0039 - acc: 0.9994 
2000/2000 [==============================] - 0s 120us/step - loss: 0.0033 - acc: 0.9995

Epoch 2/2

  32/2000 [..............................] - ETA: 0s - loss: 2.7940e-07 - acc: 1.0000
1696/2000 [========================>.....] - ETA: 0s - loss: 2.6042e-07 - acc: 1.0000
2000/2000 [==============================] - 0s 30us/step - loss: 2.5141e-07 - acc: 1.0000

Оценка: * * 1016

  32/2000 [..............................] - ETA: 2s
2000/2000 [==============================] - 0s 38us/step
[6.117830600942398e-07, 1.0]

Прогнозировать:

[[0.9999987 ]
 [0.9999964 ]
 [0.99999917]
 [0.9999995 ]
 [0.99999833]
 [1.        ]
 [1.        ]
 [1.        ]
 [0.9999993 ]
 [0.9999999 ]
 [0.5781495 ]
 [1.        ]]

Как вы видите, только 100 нулей показывают, что они не верны, но 100 единиц (последний неверный ввод) является сплошным 1. Может кто-нибудь показать мне, что мне здесь не хватает?

Ответы [ 3 ]

2 голосов
/ 11 марта 2019

Итак, я попробовал приведенный выше код со случайно сгенерированными данными.Вместо 1 и 0 его 10 и 11

    array=np.round(np.random.rand(4010,100))+10 #change in data
    train_data = array[:2000]
    test_data = array[2000:4000]
    train_labels = [1] * 2000
    test_labels = [1] * 2000
    # Array for prediction check
    check_data = [list(item) for item in array[4000:4010]] # 10 correct inputs
    check_data.append([10] * 100) # Incorrect data
    check_data.append([11] * 100) # Incorrect data

Predicted Output:

    array([[1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.]], dtype=float32)

Итак, из этого вы можете сделать вывод, что 0 берется по номиналу.

В нейронных сетях каждый нейрон решает уравнение y = wx + b

, где y: выход нейрона, w = вес, x = вход в нейрон, b = смещение

Когда x = 0, y = b и x = 1, y = w + b

Поэтому, когда вход равен 0, нейрон почти отключается (значения смещения, как правило, очень малы)

Модель не узнает, что все 0 и 1 являются неправильными данными.Выходные данные для всех 0 совпадают, и выходные данные для всех 1 говорят нам, что это совпадение и что-то не так.

Кроме того, ваши данные имеют 0 и 1 с меткой 1, прикрепленной к нему.Вы не можете ожидать, что вы дадите все 1 и все 0 и ожидаете, что модель предскажет это как неправильные данные.

1 голос
/ 11 марта 2019

Посмотрите на свои этикетки:

train_labels = [1] * 2000
test_labels = [1] * 2000

Это все 1, все 1. 1. 1004 *

Конечно, ваша модель будет предсказывать 1 и только 1.

Вы должны тренировать свою модель с правильными данными.

0 голосов
/ 16 марта 2019
from keras.models import Sequential
from keras.layers import Dense
import numpy

def generate_data(n_samples):
    X = np.zeros((n_samples,100))
    y = np.zeros((n_samples))

    for i in range(n_samples):
        X[i] = np.random.randint(0,2,100)
        r = xor(X[i])
        y[i] = xor(X[i])
    return X, y

def xor(a):
    b = np.array(a,dtype=bool)
    r = b[0]
    for x in b[1:]:
        r = r ^x
    return int(r)

X, y = generate_data(1000)

model = Sequential()
model.add(Dense(100, input_dim=100, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Fit the model
model.fit(X, y, epochs=150, batch_size=10)
# evaluate the model
scores = model.evaluate(X, Y)
print("\n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))

Данные поезда

  • Мы генерируем случайный массив размером 100 только из 0 '(Ложь) и 1 (Истина).Это сэмплы (X, которые мы называем в ML)
  • Метка / цель сэмпла является логическим XOR сэмпла.(называется у в ML).Как вы можете, возможные значения меток равны 1 и 0, что делает это проблемой двоичной классификации

Модель

Простой NN из 3 слоев с 100 нейронами в 1 слое, 8 нейроновво втором слое и 1 нейрон в последнем слое. Мы выбрали 1 нейрон в последнем слое, потому что у нас есть 2 класса, и мы используем сигмовидную активацию, поэтому последний нейрон> 0,5, мы назначим выборку для класса 1, еще для класса 0

Затем мы обучаем модель, используя двоичную потерю кроссентропии, используя оптимизатор Адама для 150 эпох.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...