自定义神经网络时的注意事项

问题描述

`

通过继承tf.keras.Model自定义神经网络模型时遇到的一系列问题。
代码如下,

c在这里插入代码片 复制代码
class STFT_ConV2D(tf.keras.Model):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.pre_layer = tf.keras.Sequential([
            tf.keras.layers.Flatten(),
            tf.keras.layers.Dense(768, activation='relu')
        ])

        self.add = tf.keras.layers.Add()
        self.output_dense = tf.keras.layers.Dense(1, activation='sigmoid')

    def call(self, inputs):
        x, y = inputs
        x = tf.keras.layers.Conv2D(filters=3, kernel_size=8, input_shape=Input_shape_x)(x)
        x = tf.keras.layers.Conv2D(filters=3, kernel_size=16, input_shape=Input_shape_x)(x)
        x = tf.keras.layers.Conv2D(filters=1, kernel_size=32, input_shape=Input_shape_x)(x)
        x = self.pre_layer(x)

        y = tf.keras.layers.Conv2D(filters=3, kernel_size=8, input_shape=Input_shape_y)(y)
        y = tf.keras.layers.Conv2D(filters=3, kernel_size=16, input_shape=Input_shape_y)(y)
        y = tf.keras.layers.Conv2D(filters=1, kernel_size=32, input_shape=Input_shape_y)(y)
        y = self.pre_layer(y)
        output = self.add([x, y])
        output = self.output_dense(output)
        return output

产生的bug为,

markup 复制代码
  ValueError: Exception encountered when calling layer 'sequential' (type Sequential).
        
  Input 0 of layer "dense" is incompatible with the layer: expected axis -1 of input shape to have value 11368, but received input with shape (None, 210680)

x输入和y输入都使用了成员变量pre_layer,共享了pre_layer层,也就共享了pre_layer层的参数矩阵和结构。
由于x先经过三层卷积层后shape由原来的shape=(360, 256, 109, 1)变成了shape=(360, 203, 56, 1)
再经过pre_layer层里的Flatten时,除" batchsize "轴(axis=0)外,其余轴被铺平,输出shape=(360,11368)。接着处理y输入,经过三层卷积层后,shape由原来的shape=(360, 511, 513, 1)变成了shape=(360,458, 460, 1),之后执行到y = self.pre_layer(y)时,如果执行成功,则输出shape=(360,21068),此时与x的shape=(360,11368)维度冲突,从而产生异常。

要点归纳:

  1. 通过继承tf.keras.Model写神经网络模型时,每一个神经网络层只能被同一个输入占有。
  2. 所有tf.keras.layers下的层对象不能直接出现在call()方法中,必须以成员变量的形式在构造器中定义,然后在call()方法中通过self.成员变量的方式调用
  3. 卷积层tf.keras.layers.Conv2D()当神经网络第一层时,必须通过参数input_shape指定输入shape,该shape中不能包含" batchsize "轴,例如输入x的shape为(a, b, c, d),其中a代表样本数,b代表行像素,c代表列像素,d代表通道数。则应该指定input_shape=x.shape[1:],去除a所在轴,以免卷积层对该轴造成影响。

解决方案:

python 复制代码
class STFT_ConV2D(tf.keras.Model):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.conV2d_x1 = tf.keras.layers.Conv2D(filters=3, kernel_size=8, input_shape=Input_shape_x)
        self.conV2d_x2 = tf.keras.layers.Conv2D(filters=3, kernel_size=16, input_shape=Input_shape_x)
        self.conV2d_x3 = tf.keras.layers.Conv2D(filters=1, kernel_size=32, input_shape=Input_shape_x)

        self.conV2d_y1 = tf.keras.layers.Conv2D(filters=3, kernel_size=8, input_shape=Input_shape_y)
        self.conV2d_y2 = tf.keras.layers.Conv2D(filters=3, kernel_size=16, input_shape=Input_shape_y)
        self.conV2d_y3 = tf.keras.layers.Conv2D(filters=1, kernel_size=32, input_shape=Input_shape_y)

        self.flatten_x = tf.keras.layers.Flatten()
        self.flatten_y = tf.keras.layers.Flatten()

        self.dense_x = tf.keras.layers.Dense(768, activation='relu')
        self.dense_y = tf.keras.layers.Dense(768, activation='relu')

        self.add = tf.keras.layers.Add()
        self.output_dense = tf.keras.layers.Dense(1, activation='sigmoid')

    def call(self, inputs):
        # x.shape = (360, 256, 109, 1) , y.shape = (360, 511, 513, 1)
        # inputs = (x, y)
        x, y = inputs  
        x = self.conV2d_x1(x) # (360, 249, 102, 3)
        x = self.conV2d_x2(x) # (360, 234, 87, 3)
        x = self.conV2d_x3(x) # (360, 203, 56, 1)
        x = self.flatten_x(x) # (360, 11368)
        x = self.dense_x(x)  # (360, 768)

        y = self.conV2d_y1(y)
        y = self.conV2d_y2(y)
        y = self.conV2d_y3(y)
        y = self.flatten_y(y)
        y = self.dense_y(y)

        output = self.add([x, y]) # (360, 768)
        output = self.output_dense(output)
        return output
相关推荐
TSINGSEE1 分钟前
零代码自动化AI算法训练革命:企业级私有化部署DLTM自动化AI训练服务器,告别算法依赖
人工智能·深度学习·算法·机器学习·自动化·ai大模型
大囚长8 分钟前
神经网络的量子力学特征
人工智能·深度学习·神经网络
思绪无限9 小时前
YOLOv5至YOLOv12升级:木材表面缺陷检测系统的设计与实现(完整代码+界面+数据集项目)
人工智能·深度学习·目标检测·计算机视觉·木材表面缺陷检测
kishu_iOS&AI9 小时前
深度学习 —— 损失函数
人工智能·pytorch·python·深度学习·线性回归
简简单单做算法11 小时前
基于GA遗传优化双BP神经网络的时间序列预测算法matlab仿真
神经网络·算法·matlab·时间序列预测·双bp神经网络
ZhengEnCi12 小时前
01c-循环神经网络RNN详解
人工智能·深度学习
AI医影跨模态组学15 小时前
如何将深度学习MRI表型与iCCA淋巴结转移的生物学机制(KRAS突变、MUC5AC、免疫抑制微环境、大导管亚型)关联,并解释其对治疗响应的意义
人工智能·深度学习·机器学习·论文·医学·医学影像
动物园猫18 小时前
番茄叶片病害检测数据集分享(适用于YOLO系列深度学习分类检测任务)
深度学习·yolo·分类
思绪无限18 小时前
YOLOv5至YOLOv12升级:农作物害虫检测系统的设计与实现(完整代码+界面+数据集项目)
人工智能·python·深度学习·目标检测·计算机视觉·yolov12·农作物害虫检测
逻辑驱动的ken18 小时前
Java高频面试考点场景题11
java·深度学习·面试·职场和发展·高效学习