python - 具有向量输出和 2D 图像图形输入的 CNN(输入是一个数组)
问题描述
我正在尝试在 Keras (Python 3.7) 中创建一个 CNN,它摄取 2D 矩阵输入(很像灰度图像)并输出 1 维向量。到目前为止,我确实设法得到了结果,但我不确定我所做的是否正确(或者我的直觉是否正确)。
我在卷积层中输入了一个 100x50 的数组。这个二维数组保存每个位置的峰值信息(即 x 轴与位置有关,y 轴与频率有关,每个单元格给出强度)。其 3D 图表显示类似于此链接中给出的图表。
从我读过的(所有)文献中,我了解到 CNN 接受图像数据——图像被转换为像素值,然后反复卷积和汇集以获得输出。但是,我使用 MatLab 模拟器来获取输入数据,并且可以访问包含每个点峰值频率信息的原始二维数组。
我的直觉是:如果我们对每个单元格进行归一化并将信息提供给 CNN,就好像我将图像的归一化像素值提供给 CNN,因为我的原始二维数组也有高度、宽度和深度=1 ,就像一个图像。
如果我的想法正确或错误,请赐教。
我的代码如下:
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import matplotlib.pyplot as plt
%matplotlib inline
import tensorflow as tf
import keras
'''load sample input'''
BGS1 = pd.read_csv("C:/Users/strain1_input.csv")
BGS2 = pd.read_csv("C:/Users/strain2_input.csv")
BGS3 = pd.read_csv("C:/Users/strain3_input.csv")
BGS_ = np.array([BGS1, BGS2, BGS3]) #3x100x50 array
BGS_normalized = BGS_/np.amax(BGS_)
'''load sample output'''
BFS1 = pd.read_csv("C:/Users/strain1_output.csv")
BFS2 = pd.read_csv("C:/Users/strain2_output.csv")
BFS3 = pd.read_csv("C:/Users/strain3_output.csv")
BFS_ = np.array([BFS1, BFS2, BFS3]) #3x100
BFS_normalized = BFS/50 #since max value for each cell is 50
#after splitting data into training, validation and testing sets,
output_nodes = 100
n_classes = 1
batch_size_ = 8 #so far, optimized for 8 batch size
epoch = 100
input_layer = Input(shape=(45,300,1))
conv1 = Conv2D(16,3,padding="same",activation="relu", input_shape =
(45,300,1))(input_layer)
pool1 = MaxPooling2D(pool_size=(2,2),padding="same")(conv1)
flat = Flatten()(pool1)
hidden1 = Dense(10, activation='softmax')(flat) #relu
batchnorm1 = BatchNormalization()(hidden1)
output_layer = Dense(output_nodes*n_classes, activation="softmax")(batchnorm1)
output_layer2 = Dense(output_nodes*n_classes, activation="relu")(output_layer)
output_reshape = Reshape((output_nodes, n_classes))(output_layer2)
model = Model(inputs=input_layer, outputs=output_reshape)
print(model.summary())
model.compile(loss='mean_squared_error', optimizer='adam', sample_weight_mode='temporal')
model.fit(train_X,train_label,batch_size=batch_size_,epochs=epoch)
predictions = model.predict(train_X)
解决方案
您所做的正是用于将非图像数据输入到 2d 卷积层的策略。只要模型预测正确,您所做的就是正确的。只是 CNN 在非图像数据上的表现非常糟糕,否则可能会过拟合。但是话又说回来,只要它执行正确,那么它就很好。
推荐阅读
- angular - @angular/cdk/collections DataSource 的断开方法
没有被调用 - excel - 如何将键盘快捷键添加到已经自由编码的 VBA 模块?
- amazon-web-services - 使用 aws cli 将日志流式传输到弹性
- visual-studio - 在 Visual Studio 中使用 Find in Files 命令时“整个解决方案”和“整个解决方案(包括外部项目)”选项之间的区别
- knex.js - Knexjs:事务和原始查询
- php - 如何在codeigniter中设置自定义配置类的项目值?
- direct3d - Direct3D 着色器内部编译器错误 X8000:无效字节码
- pilosa - 如何在没有完整架构的情况下列出 pilosa 中的索引名称
- python - 如何使用包装类的对象作为包装函数中的参数
- mysql - 如何为每个第一次出现的列值获取行