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

2024-05-16 22:32:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用Keras(python3.7)创建一个CNN,它接收2D矩阵输入(很像灰度图像)并输出一维向量。到目前为止,我确实取得了一些成果,但我不确定我所做的是否正确(或者我的直觉是否正确)。在

我在卷积层中输入一个100x50数组。这个二维阵列在每个位置保存峰值信息(即x轴与位置有关,y轴与频率有关,每个单元给出强度)。这张3D图显示了与thislink中给出的类似的东西。在

从我读过的(所有)文献中,我了解到CNN接受图像数据——图像被转换成像素值,然后反复卷积和汇集以获得输出。但是,我使用MatLab模拟器来获取输入数据,并且我可以访问原始2D数组,其中包含每个点峰值频率的信息。在

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

Tags: csv图像importlayerreadinputoutputsize
1条回答
网友
1楼 · 发布于 2024-05-16 22:32:44

你所做的正是将非图像数据输入到二维卷积层的策略。只要模型预测正确,你所做的就是正确的。只是CNN在非图像数据上的表现很差,或者有可能过度拟合。但话说回来,只要它表现正确,那么它就是好的。在

相关问题 更多 >