【发布时间】:2019-08-22 14:46:09
【问题描述】:
我正在尝试在 Keras (Python 3.7) 中创建一个 CNN,它接收 2D 矩阵输入(很像灰度图像)并输出 1 维向量。到目前为止,我确实设法得到了结果,但我不确定我所做的是否正确(或者我的直觉是否正确)。
我在卷积层中输入了一个 100x50 的数组。这个二维数组保存每个位置的峰值信息(即 x 轴与位置有关,y 轴与频率有关,每个单元格给出强度)。此 3D 图表显示的内容类似于this 链接中给出的内容。
从我读过的(所有)文献中,我了解到 CNN 接受图像数据——图像被转换为像素值,然后反复卷积和汇集以获得输出。但是,我使用 MatLab 模拟器来获取输入数据,并且可以访问包含每个点的峰值频率信息的原始二维数组。
我的直觉是:如果我们对每个单元格进行归一化并将信息提供给 CNN,就好像我将图像的归一化像素值提供给 CNN,因为我的原始二维数组也有高度、宽度和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)
【问题讨论】:
-
不清楚您对推理的哪一部分有疑问。是标准化吗?是不是您的二维矩阵不是实际图像?
-
抱歉,我的问题并不清楚。我不清楚的部分是我的 2D 矩阵不是实际图像。它适用于我的 CNN,但我读过的所有文献都只提到了将 CNN 输入作为图像数据。谢谢:)
标签: python python-3.x tensorflow keras conv-neural-network