Чтобы заставить 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
Как я могу получить слой keras для изучения операции AND ⇐ Python
Программы на Python
-
Anonymous
1731056315
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
[b]Как я могу научить сеть изучать эти веса?[/b]
Основная настройка для обучения сети такова:
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) )
Подробнее здесь: [url]https://stackoverflow.com/questions/79163417/how-can-i-get-a-keras-layer-to-learn-an-and-operation[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия