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

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

Сообщение Anonymous »

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

Из этого я могу довольно легко написать расчет, в котором 0 пикселей должны иметь большое отрицательное значение, а помеченные пиксели имеют некоторое положительное значение. Вот моя модель:
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()
mdl.compile( loss ="mse",
optimizer=keras.optimizers.Adam(learning_rate=1e-2)
)
mdl.fit(x, y, epochs=100, verbose=2)

Это не работает. Он просто тренируется выдавать 0 повсюду, что вполне разумно, учитывая, что из 512 1 выборка не равна нулю.
Если я установлю веса вручную.
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.evaluate(x, y)

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

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

Это работает хорошо, но если я ее обучу, модель сразу сходится к убытку 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»