如何在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

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如何在 keras 中实现自定义 GRU

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

Related 相关文章

热门标签

归档