【问题标题】:How do i pass my input/output to this network?我如何将我的输入/输出传递给这个网络?
【发布时间】:2017-08-28 00:14:16
【问题描述】:

我似乎在开始学习时遇到了一些问题……我不知道为什么…… 该网络是多输入(72 个一维数组),输出是一个长度为 24 的一维数组。一维数组输出由与 145 个不同类别相关的数字组成。

所以:72 个输入 => 24 个输出

最小的工作示例 - 没有设置输入/输出。

import keras
from keras.utils import np_utils
from keras import metrics
from keras.models import Sequential
from keras.layers.core import Dense, Activation, Lambda, Reshape,Flatten
from keras.layers import Conv1D,Conv2D, MaxPooling2D, MaxPooling1D, Reshape, ZeroPadding2D
from keras.utils import np_utils
from keras.layers.advanced_activations import LeakyReLU, PReLU
from keras.layers.advanced_activations import ELU
from keras.models import Model
from keras.layers import Input, Dense
from keras.layers import Dropout
from keras import backend as K
from keras.callbacks import ReduceLROnPlateau
from keras.callbacks import CSVLogger
from keras.callbacks import EarlyStopping
from keras.models import load_model
from keras.layers.merge import Concatenate
import numpy as np

def chunks(l, n):
    """Yield successive n-sized chunks from l."""
    for i in range(0, len(l), n):
        yield l[i:i + n]

nano_train_input = []
nano_train_output = []
nano_test_input = []
nano_test_output = []

##   Creating train input:
for i in range(974):
    nano_train_input.append(np.random.random((78,684,4)))
    nano_train_output.append(np.random.randint(145,size=(228)).tolist())

##   Creating test input:
for i in range(104):
    nano_test_input.append(np.random.random((78,684,4)))
    nano_test_output.append(np.random.randint(145,size=(228)).tolist())

def model(train_input, train_output, test_input, test_output, names=0):

    #   Paper uses dimension (40 x 45 =(15 * 3))
    #   Filter size 5
    #   Pooling size
    #   I use dimension (78  x 72 = (24 * 3)
    #   Filter size 9

    print "In model"
    i = 0
    print_once = True
    data_test_output = []
    data_test_input = []
    for matrix in test_input:
        row,col,channel = matrix.shape
        remove_output = (col/3)%24
        remove_input  = col%72
        if remove_output > 0 :
            test_output[i] = test_output[i][:-(remove_output)]
        for split in chunks(test_output[i],24):
            data_test_output.append(np.array(split))
        if remove_input > 0:
            out = np.split(matrix[:,:-(remove_input),:-1],matrix[:,:-(remove_input),:-1].shape[1]/72,axis=1)
        else:
            out = np.split(matrix[:,:,:-1],matrix[:,:,:-1].shape[1]/72,axis=1)
        data_test_input.extend(out)
        del out
        i=i+1 # Increment

    i=0
    data_train_output = []
    data_train_input = []
    for matrix in train_input:
        row,col,channel = matrix.shape
        remove_output = (col/3)%24
        remove_input  = col%72
        if remove_output > 0 :
            train_output[i] = train_output[i][:-(remove_output)]
        for split in chunks(train_output[i],24):
            data_train_output.append(np.array(split))
        if remove_input > 0:
            out = np.split(matrix[:,:-(remove_input),:-1],matrix[:,:-(remove_input),:-1].shape[1]/72,axis=1)
        else:
            out = np.split(matrix[:,:,:-1],matrix[:,:,:-1].shape[1]/72,axis=1)
        data_train_input.extend(out)
        del out
        i=i+1 # Increment

    print
    print "Len:"
    print len(data_train_input)
    print len(data_train_output)
    print len(data_test_input)
    print len(data_test_output)
    print
    print "Type[0]:"
    print type(data_train_input[0])
    print type(data_train_output[0])
    print type(data_test_input[0])
    print type(data_test_output[0])
    print
    print "Type:"
    print type(data_train_input)
    print type(data_train_output)
    print type(data_test_input)
    print type(data_test_output)
    print
    print "shape of [0]:"
    print data_train_input[0].shape
    print data_train_output[0].shape
    print data_test_input[0].shape
    print data_test_output[0].shape

    list_of_input = [Input(shape = (78,3)) for i in range(72)]
    list_of_conv_output = []
    list_of_max_out = []

    for i in range(72):
        list_of_conv_output.append(Conv1D(filters = 32 , kernel_size = 6 , padding = "same", activation = 'relu')(list_of_input[i]))
        list_of_max_out.append(MaxPooling1D(pool_size=3)(list_of_conv_output[i]))

    merge = keras.layers.concatenate(list_of_max_out)

    reshape = Flatten()(merge)

    dense1 = Dense(units = 500, activation = 'relu',    name = "dense_1")(reshape)
    dense2 = Dense(units = 250, activation = 'relu',    name = "dense_2")(dense1)
    dense3 = Dense(units = 24 , activation = 'softmax', name = "dense_3")(dense2)

    model = Model(inputs = list_of_input , outputs = dense3)
    model.compile(loss="categorical_crossentropy", optimizer="adam" , metrics = [metrics.sparse_categorical_accuracy])

    reduce_lr=ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=3, verbose=1, mode='auto', epsilon=0.01, cooldown=0, min_lr=0.000000000000000000001)
    stop  = EarlyStopping(monitor='val_loss', min_delta=0, patience=5, verbose=1, mode='auto')

    print "Train!"

    print model.summary()


    hist_current = model.fit(x = ,
                        y = ,
                        shuffle=False,
                        validation_data=(,),
                        validation_split=0.1,
                        epochs=150000,
                        verbose=1,
                        callbacks=[reduce_lr,stop])

model(nano_train_input,nano_train_output,nano_test_input, nano_test_output)

输入和输出存储为 numpy.ndarrays 列表。 这是一个最小的工作示例。我应该如何将输入传递给输出?

【问题讨论】:

  • 正如我在谈话中提到的:试试data_train_output = data_train_output.reshape(data_train_output.shape[0], 24, 1)data_test_output = data_test_output.reshape(data_test_output.shape[0], 24, 1)
  • data_x_output 是一个列表,所以......重塑是不可能的......我尝试重塑列表中的所有条目。但这是不可能的..因为这将导致所有条目的形状为 (24,24,1)

标签: python-2.7 numpy keras conv-neural-network


【解决方案1】:

如果你看看你的代码和输出,你确实有你所说的:24 个输出 (data_train_outputs[0].shape)。但是,如果您查看 Keras 的层输出,您会看到以下输出:

dense_3 (Dense)                  (None, 26, 145)       36395                                        

我会说这应该是一个形状为 (None, 24)....的数组。

我建议你添加一个重塑层以获得你想要的输出!

【讨论】:

  • 为什么要重塑?合并后的 Flatten() 也可以工作.. 对吗?
【解决方案2】:

我会尝试:

merge = keras.layers.concatenate(list_of_max_out)
merge = Flatten()(merge) # or GlobalMaxPooling1D or GlobalAveragePooling1D
dense1 = Dense(500, activation = 'relu')(merge)

您可能想要应用一些东西来转换来自Convolutional 层的输出。为了做到这一点 - 你需要压缩时间/顺序维度。为了做到这一点,请尝试我提供的技术。

【讨论】:

  • 尝试将"sparse_categorical_crossentropy" 更改为"categorical_crossentropy"。与 accuracy 在指标中相同。
  • 我有 145 个不同的课程?
  • 好的,我想我发现了一个错误。你告诉过你的数据是一个1d 数组。但是您的数组是2d,形状为(78, 3)。您的数据的性质是什么?
  • 好的。我想我找到了解决方案。尝试您的第一个版本,但使用 data_train_output.reshape((data_train_output.shape[0] 24、1)) 重塑 data_train_output `
  • 你的意思只是重塑为 (24,1)
猜你喜欢
  • 2019-12-23
  • 1970-01-01
  • 2018-11-26
  • 2016-01-29
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
相关资源
最近更新 更多