小编Nic*_*ick的帖子

输入维度到keras的一维卷积网络

真的很难理解keras中卷积1d 的输入维度:

输入形状

具有形状的3D张量:(样本,步骤,input_dim).

输出形状

具有形状的3D张量:(samples,new_steps,nb_filter).由于填充,步骤值可能已更改.

我希望我的网络采用价格的时间序列(按顺序排列101)并输出4个概率.我当前的非卷积网络做得相当好(训练集为28000)看起来像这样:

standardModel = Sequential()
standardModel.add(Dense(input_dim=101, output_dim=100, W_regularizer=l2(0.5), activation='sigmoid'))
standardModel.add(Dense(4, W_regularizer=l2(0.7), activation='softmax'))
Run Code Online (Sandbox Code Playgroud)

为了改善这一点,我想从输入层创建一个特征映射,该映射具有长度为10的本地接收字段(因此具有10个共享权重和1个共享偏差).然后,我想使用最大池并将其馈入40个左右神经元的隐藏层,然后在外层输出4个带有softmax的神经元.

图片(很抱歉!)

理想情况下,卷积层将采用2d张量维度:

(minibatch_size,101)

并输出3d张量的尺寸

(minibatch_size,91,no_of_featuremaps)

但是,keras层似乎需要输入中称为step的维度.我已经尝试了解这一点,但仍然没有完全理解.在我的情况下,步骤为1,因为向量中的每个步骤都是1的时间增加?另外,new_step是什么?

另外,如何将汇集层的输出(3d张量)转换为适合标准隐藏层(即密集keras层)的输入,形式为2d张量?

更新:在给出非常有用的建议之后,我尝试制作一个卷积网络,如下所示:

conv = Sequential()
conv.add(Convolution1D(64, 10, input_shape=(1,101)))
conv.add(Activation('relu'))
conv.add(MaxPooling1D(2))
conv.add(Flatten())
conv.add(Dense(10))
conv.add(Activation('tanh'))
conv.add(Dense(4))
conv.add(Activation('softmax'))
Run Code Online (Sandbox Code Playgroud)

conv.Add(Flatten())行抛出一个超出有效边界误差的范围.有趣的是,这个代码不会引发此错误:

conv = Sequential()
conv.add(Convolution1D(64, 10, input_shape=(1,101)))
conv.add(Activation('relu'))
conv.add(MaxPooling1D(2))
conv.add(Flatten())
Run Code Online (Sandbox Code Playgroud)

print conv.input_shape
print conv.output_shape
Run Code Online (Sandbox Code Playgroud)

结果是

(None, 1, 101
(None, -256)
Run Code Online (Sandbox Code Playgroud)

被退回

更新2:

conv.add(Convolution1D(64, 10, input_shape=(1,101)))
Run Code Online (Sandbox Code Playgroud)

conv.add(Convolution1D(10, 10, input_shape=(101,1))
Run Code Online (Sandbox Code Playgroud)

它开始工作了.但是,输入(无,101,1)到1d转换层或(无,1,101)之间是否有任何重要的区别?为什么(无,1,101)不起作用?

python neural-network theano conv-neural-network keras

22
推荐指数
1
解决办法
1万
查看次数

将sbyte []转换为bool []并将char []转换为short []

无论如何都要明确地施放/胁迫

  • sbyte[]byte[]bool[]
  • char[]short[]/ushort[]

在CIL你经常会看到诸如此类的东西

stelem Type sbyte (ldloc pArray) ldc_i4 1 ldc_i4 0 
Run Code Online (Sandbox Code Playgroud)

pArray[1] = true哪里做的pArray是一维类型的数组bool[].我想在c#中复制这个

(sbyte[])pArray[1] = 1;
Run Code Online (Sandbox Code Playgroud)

不幸的是,C#编译器不允许这样做.

c# casting

12
推荐指数
2
解决办法
902
查看次数

在httplisteners authenticationselectordelegate中给出身份验证被拒绝的消息

我目前正在使用httplistener authenticationselector委托进行Windows身份验证和ip检查,它的工作非常出色,因为它拒绝并允许应有的客户端。

但是,问题在于,当有人被拒绝时,他们会收到403 http响应,这似乎被大多数浏览器解释为黑屏。我想做的是发回一条消息,说“访问被拒绝:您的IP已被列入白名单”。

这可能吗?

下面是该代表的摘要(目前可以正常运行)。

AuthenticationSchemeSelector pIPChecker = pRequest =>
{
    if (!pfunIPChecker(pRequest.RemoteEndPoint.Address))
    {
        LogHelper.writeToEventLog(
            "WARNING, BANNED IP: " + pRequest.RemoteEndPoint.Address.MapToIPv4().ToString() + "attempted to login", 
            EventLogEntryType.Warning,
            LogHelper.EventLogID.PermissionFailure);

        return AuthenticationSchemes.None;
    }

    return AuthenticationSchemes.Anonymous;
}
Run Code Online (Sandbox Code Playgroud)

c# system.net httplistener

7
推荐指数
1
解决办法
116
查看次数

git checkout 新旧 csproj 格式之间的 slns

我们最近在我们的解决方案上运行了 csproj 迁移工具,包含 156 个项目:

dotnet tool install --global Project2015To2017.Migrate2019.Tool
Run Code Online (Sandbox Code Playgroud)

尽管我们必须做一些修改,但效果非常好。然而,它引起了一个问题,即更改前后分支之间的切换会导致 assemblyinfo 出现问题。

错误是:

Duplicate 'global::System.Runtime.Versioning.TargetFrameworkAttribute' attribute [PROJECTNAME] 
Run Code Online (Sandbox Code Playgroud)

我相信这是因为新格式放置了 assemblyinfo.cs 而旧式 csproj 不知何故选择了它?您可以在此处看到文件出现问题的地方:

PROJECTNAMEe\obj\x64\Debug\.NETFramework,Version=v4.7.2.AssemblyAttributes.cs
Run Code Online (Sandbox Code Playgroud)

这可以通过运行来修复:

1.  Close Visual studio/Rider
2.  git clean -xfd
3.  Get-ChildItem . -Include obj, .vs -Recurse -force | Remove-Item -Recurse -Force
4.  Rebuild solution
Run Code Online (Sandbox Code Playgroud)

现在这可行了,但令人恼火的是我们必须不断提醒自己这样做。有没有办法修改我们的新csprojs以使其不这样做?

c# msbuild csproj

6
推荐指数
1
解决办法
256
查看次数

表达式获取数组的长度

如果你有一个Type of Type Array而不是一个特定的数组类型,比如int [],那么如何生成一个表达式,该表达式可以快速获取长度,而无需执行整个属性获取malarkay.

例如在下面

ParameterExpression para3 = Expression.Parameter(typeof(int[]), "p3");
ParameterExpression para4 = Expression.Parameter(typeof(Array), "p4");

Type pt1 = para3.Type.GetElementType();
Type pt2 = para4.Type.GetElementType();

MethodInfo mArrayLength = Strong.Instance<Array>.Property<int>(a => a.Length).GetGetMethod();

Expression asdf5 = Expression.ArrayLength(para3);
Expression asdf6 = Expression.ArrayLength(para4);
Expression asdf7 = Expression.Call(para4, mArrayLength);
Run Code Online (Sandbox Code Playgroud)

mArrayLength只是Array类型的Length属性的get方法.

这里的表达式为asdf5,因为para5的类型为int [],但asdf6 不起作用,因为para6的类型只是Array类型.asdf7确实有效.

我想要的是有效地使用ldlen指令,它只需要一个Object,而不是调用一个方法.这仅仅是表达式树库的限制吗?

您可以使用反射编辑该字段,甚至可以编译表达式!但是尝试运行委托将导致操作可能破坏运行时异常的稳定性.

Array parr = new int[5];

Expression pArraylength = Expression.ArrayLength(para3);
pOperandFieldInfo.SetValue(pArraylength, para4);

Expression<Func<Array, int>> pexchanger = (Expression<Func<Array, int>>)Expression.Lambda(pArraylength, para4);
Func<Array, int> pFunc = pexchanger.Compile();
int pint = pFunc(parr);
Run Code Online (Sandbox Code Playgroud)

c# arrays cil expression-trees

1
推荐指数
1
解决办法
150
查看次数