具有矢量输出和2D图像图形输入(输入为数组)的CNN

时间:2019-08-22 14:46:09

标签: python python-3.x tensorflow keras conv-neural-network

我正在尝试在Keras(Python 3.7)中创建一个CNN,该CNN提取2D矩阵输入(非常类似于灰度图像)并输出1维矢量。到目前为止,我确实设法取得了结果,但是我不确定我在做什么是否正确(或者我的直觉是正确的)。

我在卷积层中输入了一个100x50的数组。这个2D阵列在每个位置都包含峰值信息(即,x轴与位置有关,y轴与频率有关,并且每个像元都给出​​强度)。 3D图形显示的内容类似于this链接中给出的内容。

从我阅读的所有文献中,我了解到CNN接受图像数据-图像被转换为​​像素值,然后反复进行卷积和合并以获取输出。但是,我正在使用MatLab仿真器来获取输入数据,并且可以访问原始2D数组,其中包含每个点的峰值频率信息。

我的直觉是:如果我们将每个像元标准化并将信息提供给CNN,就好像我将图像的标准化像素值也提供给CNN一样,因为我的原始2D数组还具有高度,宽度和depth = 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)

1 个答案:

答案 0 :(得分:0)

您所做的正是将非图像数据输入2d卷积层的策略。只要模型能够正确预测,您所做的就是正确的。只是CNN在非图片数据上的效果非常差,否则可能会出现过度拟合的情况。但是话又说回来,只要它能正确执行,那就好了。