解决keras使用cov1D函数的输入问题

时间:2021-05-22

解决了以下错误:

1.ValueError: Input 0 is incompatible with layer conv1d_1: expected ndim=3, found ndim=4

2.ValueError: Error when checking target: expected dense_3 to have 3 dimensions, but got array with …

1.ValueError: Input 0 is incompatible with layer conv1d_1: expected ndim=3, found ndim=4

错误代码:

model.add(Conv1D(8, kernel_size=3, strides=1, padding='same', input_shape=(x_train.shape))

或者

model.add(Conv1D(8, kernel_size=3, strides=1, padding='same', input_shape=(x_train.shape[1:])))

这是因为模型输入的维数有误,在使用基于tensorflow的keras中,cov1d的input_shape是二维的,应该:

1、reshape x_train的形状

x_train=x_train.reshape((x_train.shape[0],x_train.shape[1],1))
x_test = x_test.reshape((x_test.shape[0], x_test.shape[1],1))

2、改变input_shape

model = Sequential()
model.add(Conv1D(8, kernel_size=3, strides=1, padding='same', input_shape=(x_train.shape[1],1)))

大神原文:

The input shape is wrong, it should be input_shape = (1, 3253) for Theano or (3253, 1) for TensorFlow. The input shape doesn't include the number of samples.

Then you need to reshape your data to include the channels axis:

x_train = x_train.reshape((500000, 1, 3253))

Or move the channels dimension to the end if you use TensorFlow. After these changes it should work.

2.ValueError: Error when checking target: expected dense_3 to have 3 dimensions, but got array with …

出现此问题是因为ylabel的维数与x_train x_test不符,既然将x_train x_test都reshape了,那么也需要对y进行reshape。

解决办法:

同时对照x_train改变ylabel的形状

t_train=t_train.reshape((t_train.shape[0],1))
t_test = t_test.reshape((t_test.shape[0],1))

附:

修改完的代码:

import warningswarnings.filterwarnings("ignore")import osos.environ["CUDA_VISIBLE_DEVICES"] = "0"import pandas as pdimport numpy as npimport matplotlib# matplotlib.use('Agg')import matplotlib.pyplot as pltfrom sklearn.model_selection import train_test_splitfrom sklearn import preprocessingfrom keras.models import Sequentialfrom keras.layers import Dense, Dropout, BatchNormalization, Activation, Flatten, Conv1Dfrom keras.callbacks import LearningRateScheduler, EarlyStopping, ModelCheckpoint, ReduceLROnPlateaufrom keras import optimizersfrom keras.regularizers import l2from keras.models import load_modeldf_train = pd.read_csv('./input/train_V2.csv')df_test = pd.read_csv('./input/test_V2.csv')df_train.drop(df_train.index[[2744604]],inplace=True)#去掉nan值df_train["distance"] = df_train["rideDistance"]+df_train["walkDistance"]+df_train["swimDistance"]# df_train["healthpack"] = df_train["boosts"] + df_train["heals"]df_train["skill"] = df_train["headshotKills"]+df_train["roadKills"]df_test["distance"] = df_test["rideDistance"]+df_test["walkDistance"]+df_test["swimDistance"]# df_test["healthpack"] = df_test["boosts"] + df_test["heals"]df_test["skill"] = df_test["headshotKills"]+df_test["roadKills"]df_train_size = df_train.groupby(['matchId','groupId']).size().reset_index(name='group_size')df_test_size = df_test.groupby(['matchId','groupId']).size().reset_index(name='group_size')df_train_mean = df_train.groupby(['matchId','groupId']).mean().reset_index()df_test_mean = df_test.groupby(['matchId','groupId']).mean().reset_index()df_train = pd.merge(df_train, df_train_mean, suffixes=["", "_mean"], how='left', on=['matchId', 'groupId'])df_test = pd.merge(df_test, df_test_mean, suffixes=["", "_mean"], how='left', on=['matchId', 'groupId'])del df_train_meandel df_test_meandf_train = pd.merge(df_train, df_train_size, how='left', on=['matchId', 'groupId'])df_test = pd.merge(df_test, df_test_size, how='left', on=['matchId', 'groupId'])del df_train_sizedel df_test_sizetarget = 'winPlacePerc'train_columns = list(df_test.columns)""" remove some columns """train_columns.remove("Id")train_columns.remove("matchId")train_columns.remove("groupId")train_columns_new = []for name in train_columns: if '_' in name: train_columns_new.append(name)train_columns = train_columns_new# print(train_columns)X = df_train[train_columns]Y = df_test[train_columns]T = df_train[target]del df_trainx_train, x_test, t_train, t_test = train_test_split(X, T, test_size = 0.2, random_state = 1234)# scaler = preprocessing.MinMaxScaler(feature_range=(-1, 1)).fit(x_train)scaler = preprocessing.QuantileTransformer().fit(x_train)x_train = scaler.transform(x_train)x_test = scaler.transform(x_test)Y = scaler.transform(Y)x_train=x_train.reshape((x_train.shape[0],x_train.shape[1],1))x_test = x_test.reshape((x_test.shape[0], x_test.shape[1],1))t_train=t_train.reshape((t_train.shape[0],1))t_test = t_test.reshape((t_test.shape[0],1))model = Sequential()model.add(Conv1D(8, kernel_size=3, strides=1, padding='same', input_shape=(x_train.shape[1],1)))model.add(BatchNormalization())model.add(Conv1D(8, kernel_size=3, strides=1, padding='same'))model.add(Conv1D(16, kernel_size=3, strides=1, padding='valid'))model.add(BatchNormalization())model.add(Conv1D(16, kernel_size=3, strides=1, padding='same'))model.add(Conv1D(32, kernel_size=3, strides=1, padding='valid'))model.add(BatchNormalization())model.add(Conv1D(32, kernel_size=3, strides=1, padding='same'))model.add(Conv1D(32, kernel_size=3, strides=1, padding='same'))model.add(Conv1D(64, kernel_size=3, strides=1, padding='same'))model.add(Activation('tanh'))model.add(Flatten())model.add(Dropout(0.5))# model.add(Dropout(0.25))model.add(Dense(512,kernel_initializer='he_normal', activation='relu', W_regularizer=l2(0.01)))model.add(Dense(128,kernel_initializer='he_normal', activation='relu', W_regularizer=l2(0.01)))model.add(Dense(1, kernel_initializer='normal', activation='sigmoid'))optimizers.Adam(lr=0.01, epsilon=1e-8, decay=1e-4)model.compile(optimizer=optimizer, loss='mse', metrics=['mae'])model.summary()ng = EarlyStopping(monitor='val_mean_absolute_error', mode='min', patience=4, verbose=1)# model_checkpoint = ModelCheckpoint(filepath='best_model.h5', monitor='val_mean_absolute_error', mode = 'min', save_best_only=True, verbose=1)# reduce_lr = ReduceLROnPlateau(monitor='val_mean_absolute_error', mode = 'min',factor=0.5, patience=3, min_lr=0.0001, verbose=1)history = model.fit(x_train, t_train, validation_data=(x_test, t_test), epochs=30, batch_size=32768, callbacks=[early_stopping], verbose=1)predict(Y)pred = pred.ravel()

补充知识:Keras Conv1d 参数及输入输出详解

Conv1d(in_channels,out_channels,kernel_size,stride=1,padding=0,dilation=1,groups=1,bias=True)

filters:卷积核的数目(即输出的维度)

kernel_size: 整数或由单个整数构成的list/tuple,卷积核的空域或时域窗长度

strides: 整数或由单个整数构成的list/tuple,为卷积的步长。任何不为1的strides均为任何不为1的dilation_rata均不兼容

padding: 补0策略,为”valid”,”same”或”casual”,”casual”将产生因果(膨胀的)卷积,即output[t]不依赖于input[t+1:]。当对不能违反事件顺序的时序信号建模时有用。“valid”代表只进行有效的卷积,即对边界数据不处理。“same”代表保留边界处的卷积结果,通常会导致输出shape与输入shape相同。

activation:激活函数,为预定义的激活函数名,或逐元素的Theano函数。如果不指定该函数,将不会使用任何激活函数(即使用线性激活函数:a(x)=x)

model.add(Conv1D(filters=nn_params["input_filters"], kernel_size=nn_params["filter_length"], strides=1, padding='valid', activation=nn_params["activation"], kernel_regularizer=l2(nn_params["reg"])))

例:输入维度为(None,1000,4)

第一维度:None

第二维度:

output_length = int((input_length - nn_params["filter_length"] + 1))

在此情况下为:

output_length = (1000 + 2*padding - filters +1)/ strides = (1000 + 2*0 -32 +1)/1 = 969

第三维度:filters

以上这篇解决keras使用cov1D函数的输入问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章