【问题标题】:Error while training multi dimensional data训练多维数据时出错
【发布时间】:2020-12-07 14:53:04
【问题描述】:

我正在尝试构建简单的测试,仅据我所知如何训练每个特征的数据都是多维的。

我正在尝试构建一个包含 6 个特征的数据集。每个特征都有多维度的形状

简单代码:

    import random
    import numpy as np
    import pandas as pd
    from keras.models import Sequential
    from keras.layers import Dense, Dropout
    from sklearn.model_selection import train_test_split
    from keras.utils import to_categorical
    from sklearn.preprocessing import LabelEncoder

    # 
    # step 1 - build random multi-dim features (each feature is multi-dim with random values)
    #
    df = pd.DataFrame(columns=['m', 'c', 'mm', 'cc', 't', 'target'])
    input_list = []
    for i in range (800):
        m = np.random.rand(10,20, 5, 5)
        c = np.random.rand(10, 3)
        mm = np.random.rand(10)
        cc = np.random.rand(20, 5, 6, 2)
        t = np.random.rand(10, 3)

        dict = {'m': mfccs,
                'c': chroma,
                'mm': mel,
                'cc': contrast,
                't': tonnetz,
                'target': random.randint(1, 3)}
        input_list.append(dict)

    df = df.append(input_list, ignore_index=True)
    df = df.reset_index()



    #
    # step 2 - split to train and test
    # 
    train, test = train_test_split(df, test_size=0.2)
    x_train = train.to_numpy()[:,0:6]
    y_train = train.to_numpy()[:,6]
    x_test = test.to_numpy()[:, 0:6]
    y_test = test.to_numpy()[:, 6]

    lb = LabelEncoder()
    y_train_hot = to_categorical(lb.fit_transform(y_train))
    y_test_hot = to_categorical(lb.fit_transform(y_test))
    

    #
    # step 3 - build simple model
    #
    model = Sequential()
    model.add(Dense(50, input_shape=(6,), activation='relu'))
    model.add(Dropout(0.1))
    model.add(Dense(128, activation='relu'))
    model.add(Dropout(0.25))
    model.add(Dense(128, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(3, activation='softmax'))
    model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer='adam')


    #
    # step 4 - try to fit the model
    #
    model.fit(x_train, y_train_hot, batch_size=20, epochs=20, verbose=1, validation_data=(x_test, y_test_hot))

我收到以下错误:

ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type int).

完整的错误跟踪:

Traceback (most recent call last):
  File "/home/ubadmin/PycharmProjects/VR/models/tests/multi_dim_test.py", line 74, in <module>
    main()
  File "/home/ubadmin/PycharmProjects/VR/models/tests/multi_dim_test.py", line 62, in main
    model.fit(x_train, y_train_hot, batch_size=20, epochs=20, verbose=1, validation_data=(x_test, y_test_hot))
  File "/home/ubadmin/VR/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 108, in _method_wrapper
    return method(self, *args, **kwargs)
  File "/home/ubadmin/VR/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 1063, in fit
    steps_per_execution=self._steps_per_execution)
  File "/home/ubadmin/VR/lib/python3.6/site-packages/tensorflow/python/keras/engine/data_adapter.py", line 1117, in __init__
    model=model)
  File "/home/ubadmin/VR/lib/python3.6/site-packages/tensorflow/python/keras/engine/data_adapter.py", line 265, in __init__
    x, y, sample_weights = _process_tensorlike((x, y, sample_weights))
  File "/home/ubadmin/VR/lib/python3.6/site-packages/tensorflow/python/keras/engine/data_adapter.py", line 1021, in _process_tensorlike
    inputs = nest.map_structure(_convert_numpy_and_scipy, inputs)
  File "/home/ubadmin/VR/lib/python3.6/site-packages/tensorflow/python/util/nest.py", line 635, in map_structure
    structure[0], [func(*x) for x in entries],
  File "/home/ubadmin/VR/lib/python3.6/site-packages/tensorflow/python/util/nest.py", line 635, in <listcomp>
    structure[0], [func(*x) for x in entries],
  File "/home/ubadmin/VR/lib/python3.6/site-packages/tensorflow/python/keras/engine/data_adapter.py", line 1016, in _convert_numpy_and_scipy
    return ops.convert_to_tensor(x, dtype=dtype)
  File "/home/ubadmin/VR/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 1499, in convert_to_tensor
    ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
  File "/home/ubadmin/VR/lib/python3.6/site-packages/tensorflow/python/framework/tensor_conversion_registry.py", line 52, in _default_conversion_function
    return constant_op.constant(value, dtype, name=name)
  File "/home/ubadmin/VR/lib/python3.6/site-packages/tensorflow/python/framework/constant_op.py", line 264, in constant
    allow_broadcast=True)
  File "/home/ubadmin/VR/lib/python3.6/site-packages/tensorflow/python/framework/constant_op.py", line 275, in _constant_impl
    return _constant_eager_impl(ctx, value, dtype, shape, verify_shape)
  File "/home/ubadmin/VR/lib/python3.6/site-packages/tensorflow/python/framework/constant_op.py", line 300, in _constant_eager_impl
    t = convert_to_eager_tensor(value, ctx, dtype)
  File "/home/ubadmin/VR/lib/python3.6/site-packages/tensorflow/python/framework/constant_op.py", line 98, in convert_to_eager_tensor
    return ops.EagerTensor(value, ctx.device_name, dtype)
ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type int).
  • 我错过了什么? (如何修复代码?)

  • 如何训练每个特征都包含多维数据的模型?

【问题讨论】:

    标签: python tensorflow machine-learning keras deep-learning


    【解决方案1】:

    您不能将输入作为嵌套数组传递,您的神经网络需要一个向量作为输入。您需要在将特征发送到 NN 之前将其展平。因此,在将嵌套特征发送到 NN 之前,我将它们展平,为每个实例获取一个大小为 6240 的向量(不是嵌套向量)

    您可以检查在数据框插入 (.flatten()) 中完成的展平。在展平所有特征后,我还需要连接它们,以获得大小为 6240 (np.concatenate) 的向量。我还删除了索引,因为它对模型没有信息。它是一个连续的整数

    import pandas as pd
    import numpy as np
    from keras import Sequential
    from keras.layers import Dense, Dropout
    import random
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import LabelEncoder
    from keras.utils import to_categorical
    
    df = pd.DataFrame(columns=['m', 'c', 'mm', 'cc', 't', 'target'])
    input_list = []
    for i in range (800):
        m = np.random.rand(10,20, 5, 5)
        c = np.random.rand(10, 3)
        mm = np.random.rand(10)
        cc = np.random.rand(20, 5, 6, 2)
        t = np.random.rand(10, 3)
    
        dict = {'m': m.flatten(),
                'c': c.flatten(),
                'mm': mm.flatten(),
                'cc': cc.flatten(),
                't': t.flatten(),
                'target': random.randint(1, 3)}
        input_list.append(dict)
    
    df = df.append(input_list, ignore_index=True)
    
    
    #
    # step 2 - split to train and test
    # 
    train, test = train_test_split(df, test_size=0.2)
    x_train = np.asarray([np.concatenate(x) for x in train.to_numpy()[:,0:-2]])
    y_train = train.to_numpy()[:,-1]
    x_test = np.asarray([np.concatenate(x) for x in test.to_numpy()[:, 0:-2]])
    y_test = test.to_numpy()[:,-1]
    
    
    lb = LabelEncoder()
    y_train_hot = to_categorical(lb.fit_transform(y_train))
    y_test_hot = to_categorical(lb.fit_transform(y_test))
    
    
    #
    # step 3 - build simple model
    #
    model = Sequential()
    model.add(Dense(50, activation='relu'))
    model.add(Dropout(0.1))
    model.add(Dense(128, activation='relu'))
    model.add(Dropout(0.25))
    model.add(Dense(128, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(3, activation='softmax'))
    model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer='adam')
    
    
    #
    # step 4 - try to fit the model
    #
    model.fit(x_train, y_train_hot, batch_size=20, epochs=20, verbose=1, validation_data=(x_test, y_test_hot))
    

    现在可以了。

    当您对图像使用密集架构(而不是 CNN)时,它的完成方式相同。图像是从矩阵形状(n x m x 通道)在大小为 n x m x 通道的向量中展平的

    如下例:

    img source

    【讨论】:

      猜你喜欢
      • 2014-09-17
      • 2018-03-07
      • 2019-09-02
      • 2022-01-21
      • 2020-02-03
      • 2020-12-24
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      相关资源
      最近更新 更多