Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 一维卷积神经网络权值矩阵_Python_Numpy_Keras_Neural Network_Conv Neural Network - Fatal编程技术网

Python 一维卷积神经网络权值矩阵

Python 一维卷积神经网络权值矩阵,python,numpy,keras,neural-network,conv-neural-network,Python,Numpy,Keras,Neural Network,Conv Neural Network,我正在Keras中建立1D CNN,以便对模拟信号中的短脉冲进行分类。 我的模型如下: def one_dim_cnn_cust_model(n_kernel_1, n_kernel_2, n_outputs): input_shape = [1, 25] model = Sequential() model.add(Reshape((25, 1), input_shape=(input_shape))) model.a

我正在Keras中建立1D CNN,以便对模拟信号中的短脉冲进行分类。 我的模型如下:

    def one_dim_cnn_cust_model(n_kernel_1, n_kernel_2, n_outputs):
    
      input_shape = [1, 25]
      model = Sequential()
      model.add(Reshape((25, 1), input_shape=(input_shape)))
    
      model.add(Conv1D(filters=8, kernel_size=n_kernel_1, activation='relu', 
      input_shape=input_shape[1:]))
      model.add(Dense(16, activation='relu'))
      model.add(Conv1D(filters=8, kernel_size=n_kernel_2, activation='relu',padding="same"))
      model.add(Dropout(0.5))
      model.add(AveragePooling1D(pool_size=10))#35
    
      model.add(Flatten())
    
      model.add(Dense(16, activation='relu'))
      model.add(Dropout(0.5))
      model.add(Dense(8, activation='relu'))
      model.add(Dropout(0.5))
      model.add(Dense(n_outputs, activation='sigmoid'))
      print(model.output_shape)
      return (model)

训练后,我想提取特征、权重和偏差,以便能够在C++中实现这个简单的美国有线电视新闻网。为了确保我理解它,我实现了第一个卷积层,如下所示:

    l1_outouts_calc = np.zeros((8,10))
    kernel_size=16
    for ch in range (0,8):
        for stride in range(0, 10):
            data_section = input_vect[0, stride:stride + kernel_size]
            cnv_plus_bias = np.sum(data_section * l1_weights[ch]) + l1_bias[ch]
            l1_outouts_calc[ch,stride]=(np.max([0,cnv_plus_bias[0]]))#Relu activation
    l1_outouts_calc=l1_outouts_calc.T   
我得到了和Keras一样的结果。 权重矩阵尺寸:8x16(numpy阵列)

然后我实现了secound层,它是完全连接的。 权重矩阵尺寸:8x16(numpy阵列)

再一次,我得到了和Keras一样的结果 然后,我在尝试实现第三层(即卷积层)时遇到了误解,在完全连接层之后。 我得到了16x16x8的权重矩阵维度,我不知道如何使用Numpy在Python中实现这个层

据我所知,具有2D内核和stride constriant的一维卷积应按如下方式实现: (基于我得到的维度)

它的简单意思是在步幅上一步一步地循环,对于每个步幅,从中的数据提取兼容部分,计算每个部分与其兼容内核的卷积,然后求和。 但我不明白为什么我得到了16通道16x8矩阵的权重矩阵,以及如何使用Numpy实现它


谢谢你,希望你能回复一个简短的解释。

你说你在第一次会议后得到了与Keras相同的尺寸,但是你得到了8x16,总结显示为10x8。这是怎么回事?权重矩阵的尺寸是8x16 m。根据我的理解,输出是8X10,这是因为我需要计算FC层的输出(其尺寸是10x16)与权重3D矩阵(其尺寸是16x8)中每个通道的矩阵乘法,然后求和16个输出矩阵(权重矩阵的第三维为16)在轴0上。问题是什么时候我需要添加偏差并执行Relu?我需要一个向量一个向量地执行此2操作吗?你说你在第一次转换后得到了与Keras相同的尺寸,但你得到了8x16,摘要显示了10x8。怎么会这样?权重矩阵尺寸是8x16 m,输出是8X10,因为我了解到我需要的步幅要计算FC层(尺寸为10x16)输出与权重3D矩阵(尺寸为16x8)中每个通道的矩阵乘法,请将16个输出矩阵相加(权重矩阵的第三维为16)在轴0上。问题是何时需要添加偏差并执行Relu?是否需要逐向量执行此2操作?
    l1_outouts_calc = np.zeros((8,10))
    kernel_size=16
    for ch in range (0,8):
        for stride in range(0, 10):
            data_section = input_vect[0, stride:stride + kernel_size]
            cnv_plus_bias = np.sum(data_section * l1_weights[ch]) + l1_bias[ch]
            l1_outouts_calc[ch,stride]=(np.max([0,cnv_plus_bias[0]]))#Relu activation
    l1_outouts_calc=l1_outouts_calc.T   
    fc_outouts_calc = np.dot(l1_outouts_calc,fc_weights) + fc_bias
    fc_outouts_calc = np.maximum(fc_outouts_calc, 0)
    l3_outouts_calc = np.zeros((8, 10))
    kernel_size=16
    for weight_ch in range(0, 8):
        for stride in range(0, 10):
            sum_val = 0.0
            for din_ch in range(0, 16):
                data_section = fc_outouts_pad[din_ch, stride:stride + kernel_size]
                cnv_plus_bias = np.sum(data_section * l3_weights[weight_ch,din_ch, :])+l3_bias[weight_ch]
                                
                sum_val += np.max([0,cnv_plus_bias ]) 
            l3_outouts_calc[weight_ch, stride] = sum_val