keras fit_发电机未按预期工作

2024-05-08 17:45:13 发布

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

我目前正在尝试让fit_发电机与我的发电机一起工作,但不知怎么的,这工作不太好。。在

下面是一个例子:

import numpy as np
from keras.utils import np_utils
from keras import metrics
import keras
from keras.models import Sequential
from keras.optimizers import SGD
from keras.layers.core import Dense, Activation, Lambda, Reshape,Flatten
from keras.layers import Conv1D,Conv2D,MaxPooling2D, MaxPooling1D, Reshape
from keras.utils import np_utils
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



def generator(batch_size):

    global train_input
    train_input = np.random.randint(5,size=(5000,33,45,8,3))
    global train_output
    train_output = np.random.randint(5,size=(5000,15))
    global train_input_concat
    train_input_concat = np.empty((0,33,45,8,3))

    while True:
        for input in train_input:
            input = np.expand_dims(input,axis=0)
            train_input_concat = np.append(train_input_concat,input,axis=0)
            print train_input_concat.shape
            print input.shape
            raw_input("something")
            if (batch_size) == train_input_concat.shape[0]:
                output_train_set = train_output[:batch_size,:]
                train_output = np.delete(train_output,np.s_[:batch_size],axis=0)
                train_output_set = np_utils.to_categorical(output_train_set,145)
                train_input_set = train_input_concat
                del train_input_concat
                train_input_concat = np.empty((0,33,45,8,3))
                print train_input_set.shape
                print train_output_set.shape
                print train_output.shape
                raw_input("Something yield")
                yield train_input_set,train_output_set

def model3():
    stride = 2
    dim = 40
    total_frames_with_deltas = 45
    total_frames = 15
    window_height = 8
    splits = ((40-8)+1)/1

    kernel_number = 150#int(math.ceil(splits))
    list_of_input = [Input(shape = (total_frames_with_deltas,window_height,3)) for i in range(splits)]
    list_of_conv_output = []
    list_of_max_out = []
    for i in range(splits):
        list_of_conv_output.append(Conv2D(filters = kernel_number , kernel_size = (15,6))(list_of_input[i]))
        list_of_max_out.append((MaxPooling2D(pool_size=((2,2)))(list_of_conv_output[i])))

    merge = keras.layers.concatenate(list_of_max_out)
    print merge.shape
    reshape = Reshape((total_frames,-1))(merge)

    dense1 = Dense(units = 1000, activation = 'relu',    name = "dense_1")(reshape)
    dense2 = Dense(units = 1000, activation = 'relu',    name = "dense_2")(dense1)
    dense3 = Dense(units = 145 , activation = 'softmax', name = "dense_3")(dense2)
    #dense4 = Dense(units = 1, activation = 'linear', name = "dense_4")(dense3)


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

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

    print model.summary()

    raw_input("okay?")
    hist_current = model.fit_generator(generator(1),
                        steps_per_epoch=1,
                        epochs = 10,
                        verbose = 2,
                        validation_data = None)
model3()

这个发电机制造正确吗?。。在

因为我收到错误消息:

^{pr2}$

我不明白,因为它有一个相同的33个输入?为什么它不能读呢?在

编辑:

以下为列表:

import numpy as np
from keras.utils import np_utils
from keras import metrics
import keras
from keras.models import Sequential
from keras.optimizers import SGD
from keras.layers.core import Dense, Activation, Lambda, Reshape,Flatten
from keras.layers import Conv1D,Conv2D,MaxPooling2D, MaxPooling1D, Reshape
from keras.utils import np_utils
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



def generator(batch_size):

    global train_input
    train_input = np.random.randint(5,size=(5000,33,45,8,3))
    global train_output
    train_output = np.random.randint(5,size=(5000,15))
    global train_input_concat
    train_input_concat = np.empty((0,33,45,8,3))

    while True:
        for input in train_input:
            input = np.expand_dims(input,axis=0)
            train_input_concat = np.append(train_input_concat,input,axis=0)
            print train_input_concat.shape
            print input.shape
            raw_input("something")
            if (batch_size) == train_input_concat.shape[0]:
                output_train_set = train_output[:batch_size,:]
                train_output = np.delete(train_output,np.s_[:batch_size],axis=0)
                train_output_set = np_utils.to_categorical(output_train_set,145)
                train_input_set = train_input_concat
                del train_input_concat
                train_input_concat = np.empty((0,33,45,8,3))
                print train_input_set.shape
                print train_output_set.shape
                print train_output.shape
                input_list = np.split(train_input_set,33,axis=1)
                print len(input_list)
                yield ({'train_input': input_list},{'labels':train_output_set})

def model3():
    stride = 2
    dim = 40
    total_frames_with_deltas = 45
    total_frames = 15
    window_height = 8
    splits = ((40-8)+1)/1

    kernel_number = 150#int(math.ceil(splits))
    list_of_input = [Input(shape = (total_frames_with_deltas,window_height,3)) for i in range(splits)]
    list_of_conv_output = []
    list_of_max_out = []
    for i in range(splits):
        list_of_conv_output.append(Conv2D(filters = kernel_number , kernel_size = (15,6))(list_of_input[i]))
        list_of_max_out.append((MaxPooling2D(pool_size=((2,2)))(list_of_conv_output[i])))

    merge = keras.layers.concatenate(list_of_max_out)
    print merge.shape
    reshape = Reshape((total_frames,-1))(merge)

    dense1 = Dense(units = 1000, activation = 'relu',    name = "dense_1")(reshape)
    dense2 = Dense(units = 1000, activation = 'relu',    name = "dense_2")(dense1)
    dense3 = Dense(units = 145 , activation = 'softmax', name = "dense_3")(dense2)
    #dense4 = Dense(units = 1, activation = 'linear', name = "dense_4")(dense3)


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

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

    print model.summary()

    raw_input("okay?")
    hist_current = model.fit_generator(generator(1),
                        steps_per_epoch=1,
                        epochs = 10,
                        verbose = 2,
                        validation_data = None)
model3()

这给了我一个错误信息:

Traceback (most recent call last):
  File "test_generator.py", line 93, in <module>
    model3()
  File "test_generator.py", line 92, in model3
    validation_data = None)
  File "/usr/local/lib/python2.7/site-packages/keras/legacy/interfaces.py", line 88, in wrapper
    return func(*args, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/keras/engine/training.py", line 1868, in fit_generator
    batch_size = list(x.values())[0].shape[0]
AttributeError: 'list' object has no attribute 'shape'

Tags: offromimportinputoutputsizenptrain
1条回答
网友
1楼 · 发布于 2024-05-08 17:45:13

假设这是对具有多个输入(可能具有不同形状)的模型使用fit_generator()的情况,下面针对每个示例两个输入的自定义生成器示例可能会有所帮助:

def data_gen(input1_shape, input2_shape, batch_size):
    while True:
        input1_batch = []
        input2_batch = []
        labels_batch = []
        for i in range(batch_size):
            # Assume inp1 and inp2 are two inputs for a sample
            val = np.random.randint(0, 100)
            inp1 = np.full(input1_shape, val)
            inp2 = np.full(input2_shape, val)

            # Get label
            labels_batch.append(np.random.choice([0, 1]))

            # Parallel lists for each input
            input1_batch.append(inp1)
            input2_batch.append(inp2)

        # Yield the accumulated batch
        yield [input1_batch, input2_batch], labels_batch

相关问题 更多 >

    热门问题