首页 > 解决方案 > 具有向量输出和 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)

标签: pythonpython-3.xtensorflowkerasconv-neural-network

解决方案


您所做的正是用于将非图像数据输入到 2d 卷积层的策略。只要模型预测正确,您所做的就是正确的。只是 CNN 在非图像数据上的表现非常糟糕,否则可能会过拟合。但是话又说回来,只要它执行正确,那么它就很好。


推荐阅读