如何在Keras中创建自定义卷积层

德拉克·洛厄尔(Drak Lowell)

Keras我需要一个自定义的卷积神经网络,其中输入的6x6和2x2的输出。这该怎么做?(也许有自定义层)

我创建了numpy示例(错误和缓慢的代码):

import numpy as np
from matplotlib import image as mpimg, pyplot as plt
import json

def sigmoid(x, deriv=False):
    if deriv:
        return sigmoid(x)*(1-sigmoid(x))
    return 1/(1+np.exp(-x))

def read_rect(arr, x, y, w, h):
    new_arr = np.zeros((w, h, arr.shape[2]))
    for pix_x in range(w):
        for pix_y in range(h):
            if x+pix_x >= arr.shape[0] or y+pix_y >= arr.shape[1] or x+pix_x < 0 or y+pix_y < 0:
                pass
            else:
                new_arr[pix_x, pix_y] = arr[x+pix_x, y+pix_y]
    return new_arr
    return arr[x:x+w, y:y+w]

def write_rect(arr, dat, x, y):
    new_arr = arr.copy()
    for pix_x in range(dat.shape[0]):
        for pix_y in range(dat.shape[1]):
            if x+pix_x >= new_arr.shape[0] or y+pix_y >= new_arr.shape[1]:
                pass
            else:
                new_arr[x+pix_x, y+pix_y] = dat[pix_x, pix_y]
    return new_arr

def size(l):
    l = np.array(l)
    r = 1
    for i in l.ravel():
        r *= i
    return r

class UpConv2D:
    def __init__(self, kernel_in = (10, 10, 3), kernel_out = (2, 2, 3), activation=sigmoid):
        self.kernel_in = kernel_in[:3]
        self.kernel_out = kernel_out[:3]
        self.weights = 2*np.random.random((size(self.kernel_in),size(self.kernel_out))) - 1
        self.activation = activation

    def do_pixel(self, inp):
        inp = inp.ravel()[:size(self.kernel_in)]
        out = self.activation(np.dot(inp,self.weights))
        return np.array(out.reshape(self.kernel_out))
    def call(self, inp):
        out = np.zeros(np.append(np.array(inp.shape[:2])*self.kernel_out[:2], self.kernel_out[2]))
        for x in range(inp.shape[0]):
            for y in range(inp.shape[1]):
                square_in = read_rect(inp, x-self.kernel_in[0]//2, y-self.kernel_in[1]//2, self.kernel_in[0], self.kernel_in[1])
                square_out = self.do_pixel(square_in)
                out = write_rect(out, square_out, x*self.kernel_out[0], y*self.kernel_out[1])
        return out
    def __call__(self, *args, **kwargs):
        return self.call(*args, **kwargs)

    def write_weights(self):
        return json.dumps(self.weights.tolist())
    def read_weights(self, data):
        self.weights = numpy.array(json.loads(data))

我需要为Keras做如果kernel_out为(5,6,3),inp为(100,120,3),则输出图像的形状将为(5x100,6x120,3)或(500,720,3)。因此,我创建了一个空的(零)矩阵,其空余数为(500,720,3),然后在扫描时填充该矩阵。Do_pixel是简单的一层神经网络,具有输入kernel_in和输出kernel_out。Read_rect-从图像获取矩形。Write_rect-在图像中写入矩形。这有点像高档卷积层

滚筒

如果输入为6x6,输出应该为2x2,我相信您需要简单的卷积:

Conv2D(filter_num, kernel_size=(3,3), strides=(3,3), padding='valid', activation='relu')

不要忘了从docs输入的是4D格式的

如果data_format ='channels_first',则形状为4 + D的张量:batch_shape +(通道,行,列),如果data_format ='channels_last',则为形状的4 + D张量,其形状为:batch_shape +(行,列,通道)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

自定义卷积和keras自定义层中的无类型对象用于门操作

来自分类Dev

如何在Keras中实现具有动态形状的自定义输出层?

来自分类Dev

如何在 keras 中为自定义层使用偏差

来自分类Dev

如何在Keras模型中添加卷积层?

来自分类Dev

如何在Tensorflow 2.x Keras自定义层中使用多个输入?

来自分类Dev

如何在keras中实现自定义指标?

来自分类Dev

如何在 keras 中实现自定义 GRU

来自分类Dev

在 Keras 中实现自定义层(RStudio 接口)

来自分类Dev

如何通过带有自定义滤镜的Pytorch卷积层传递彩色图像?

来自分类Dev

在 tensorflow 中创建自定义层时出错

来自分类Dev

如何在ActiveAdmin gem中创建自定义页面

来自分类Dev

如何在dart中创建自定义元素?

来自分类Dev

如何在Django中创建自定义选择字段?

来自分类Dev

如何在Android中创建自定义导航抽屉

来自分类Dev

如何在Laravel 4中创建自定义外观

来自分类Dev

如何在Drupal 7中创建自定义块?

来自分类Dev

如何在AngularJs服务中创建自定义事件

来自分类Dev

如何在Moodle中创建自定义表单?

来自分类Dev

如何在C ++中创建自定义整数序列

来自分类Dev

如何在android中创建自定义渐变?

来自分类Dev

如何在AMPL中创建自定义函数?

来自分类Dev

如何在SpriteKit中创建自定义混合模式

来自分类Dev

如何在Nginx中创建自定义位置?

来自分类Dev

如何在C#中创建自定义事件

来自分类Dev

如何在Powershell中创建自定义数组?

来自分类Dev

如何在angular中创建自定义指令

来自分类Dev

如何在Python中创建自定义分组视图?

来自分类Dev

如何在Shopify中创建自定义Web挂钩

来自分类Dev

如何在RMarkdown中创建自定义块?

Related 相关文章

热门标签

归档