我正在尝试在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)
答案 0 :(得分:0)
您所做的正是将非图像数据输入2d卷积层的策略。只要模型能够正确预测,您所做的就是正确的。只是CNN在非图片数据上的效果非常差,否则可能会出现过度拟合的情况。但是话又说回来,只要它能正确执行,那就好了。