Как я могу получить слой keras для изучения операции ANDPython

Программы на Python
Ответить
Anonymous
 Как я могу получить слой keras для изучения операции AND

Сообщение Anonymous »

Чтобы заставить keras научиться обнаруживать углы двоичного изображения прямоугольника, я свел задачу к классификации массива пикселей 3x3. Верхний левый угол, пиксели должны выглядеть вот так.
[ [0, 0, 0],
[0, 1, 1],
[0, 1, 1] ]

При этом генерируется полный набор всех возможных входных фигур.
def getData():
x = []
y = []
template = numpy.array([[ 0, 0, 0], [0, 1, 1], [0, 1, 1] ])
num = [0, 0, 0, 0, 0, 0, 0, 0, 0]
for i in range(2**9):
n = numpy.array( num ).reshape((3, 3))
x.append( n )
if numpy.all( n == template ):
y.append(1)
else:
y.append(0)
s = 0
j = 0
while s == 0:
if num[j] == 0:
num[j] = 1
s = 1
else:
num[j] = 0
j += 1
if j == len(num):
print(num)
break
return numpy.array(x), numpy.array(y)

Я смогу найти классификатор из простого одного сверточного слоя.
def createModel():
inp = keras.layers.Input((3, 3, 1))
cnn = keras.layers.Conv2D( 1, (3, 3), activation = None, use_bias=True)(inp)
cnn = keras.layers.Conv2D( 1, (1, 1), activation = "hard_sigmoid")(cnn)

return keras.models.Model(inputs = [inp], outputs=[cnn])

Используя эту простую модель, я мог установить веса и получить желаемый результат.
dw = numpy.array([ -100, -100, -100, -100, 10, 10, -100, 10, 10]).reshape((3, 3, 1, 1))
bw = numpy.array([ -35 ])
ow = numpy.array([ 1 ]).reshape((1, 1, 1, 1))
obw = numpy.array([0])

mdl.set_weights( [dw, bw, ow, obw] )
mdl.compile( loss ="mse",
optimizer=keras.optimizers.Adam(learning_rate=1e-7)
)
mdl.evaluate(x, y)

Что дает потерю:

16/16 ━━━━━━━━━━━━ ━━━━━━━━ 0 с 1 мс/шаг - потеря: 9.3703e-04

Как я могу научить сеть изучать эти веса?
Основная настройка для обучения сети такова:
mdl = createModel()
x, y = getData()
mdl.compile( loss ="mse",
optimizer=keras.optimizers.Adam(learning_rate=1e-2)
)
mdl.fit(x, y, epochs=100, verbose=2)

Это не работает, оно просто сходится к значению, которое везде дает 0, что вполне разумно, учитывая, что из 512 1 выборка не равна нулю.Некоторые другие наблюдения.

[*]Инициализируя сеть с правильными весами, модель немедленно сходится к потере 0,0038, но все равно правильно предсказывает .
[*]Использование функции взвешенных потерь просто смещает среднее значение.
[*]Балансировка набора данных путем включения более положительных примеров также смещает среднее значение.

Вот полная версия программы.
#!/usr/bin/env python3
import keras
import numpy

def createModel():
inp = keras.layers.Input((3, 3, 1))
cnn = keras.layers.Conv2D( 1, (3, 3), activation = None, use_bias=True)(inp)
cnn = keras.layers.Conv2D( 1, (1, 1), activation = "hard_sigmoid")(cnn)

return keras.models.Model(inputs = [inp], outputs=[cnn])

def getData():
x = []
y = []

template = numpy.array([[ 0, 0, 0], [0, 1, 1], [0, 1, 1] ])

num = [0, 0, 0, 0, 0, 0, 0, 0, 0]
for i in range(2**9):
n = numpy.array( num ).reshape((3, 3))
x.append( n )
if numpy.all( n == template ):
y.append(1)
print("found")
else:
y.append(0)
s = 0
j = 0
while s == 0:
if num[j] == 0:
num[j] = 1
s = 1
else:
num[j] = 0
j += 1
if j == len(num):
print(num)
break
return numpy.array(x), numpy.array(y)

mdl = createModel()
x, y = getData()

for ws in mdl.get_weights():
print(ws.shape)
dw = numpy.array([ -100, -100, -100, -100, 10, 10, -100, 10, 10]).reshape((3, 3, 1, 1))
bw = numpy.array([ -35 ])
ow = numpy.array([ 1 ]).reshape((1, 1, 1, 1))
obw = numpy.array([0])

mdl.set_weights( [dw, bw, ow, obw] )

mdl.compile( loss ="mse",
optimizer=keras.optimizers.Adam(learning_rate=1e-7)
)
mdl.evaluate(x, y)
mdl.fit(x, y, epochs=1000, batch_size=32, verbose=2)
t0 = numpy.array([[[ 0, 0, 0], [0, 1, 1], [0, 1, 1] ]])
t1 = numpy.array([[[ 1, 0, 0], [0, 1, 1], [0, 1, 1] ]])

print( mdl(t0) )
print( mdl(t1) )


Подробнее здесь: https://stackoverflow.com/questions/791 ... -operation
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»